Difference between revisions of "InterFoam"

From OpenFOAMWiki
 
(19 intermediate revisions by 8 users not shown)
Line 1: Line 1:
'''InterFoam''' is a solver for 2 incompressible fluids, which tracks the interface and includes the option of mesh motion.
+
'''InterFoam''' Solver for 2 incompressible, isothermal immiscible fluids using a VOF
 +
    (volume of fluid) phase-fraction based interface capturing approach,
 +
    with optional mesh motion and mesh topology changes including adaptive
 +
    re-meshing.
 +
 
  
 
==Related information in the web==
 
==Related information in the web==
  
 
===Online discussion===
 
===Online discussion===
*[http://openfoam.cfd-online.com/forum/messages/1/225.html?1110402036|VOF method]
+
*[http://www.cfd-online.com/Forums/openfoam-solving/58063-vof-method.html VOF method]
*[http://openfoam.cfd-online.com/forum/messages/1/751.html?1125677842|About interFoam solver]
+
*[http://www.cfd-online.com/Forums/openfoam-solving/57912-about-interfoam-solver.html About interFoam solver]
*[http://openfoam.cfd-online.com/forum/messages/1/610.html?1117794787|How to set the two parameters of solver 'interFoam'?]
+
*[http://www.cfd-online.com/Forums/openfoam-solving/60584-how-set-two-parameters-solver-binterfoamb.html How to set the two parameters of solver 'interFoam'?]
*[http://openfoam.cfd-online.com/forum/messages/1/135.html?1106532619|Inlet in interFoam]
+
*[https://web.archive.org/web/20080130133833/http://openfoam.cfd-online.com/forum/messages/1/135.html?1171602365 Inlet in interFoam] (recovered via [http://web.archive.org web.archive.org])
*[http://openfoam.cfd-online.com/forum/messages/1/135.html?1106532619|Question about interface flow and adaptive mesh]] In this thread Dr Henry Weller explains how interFoam is different from the CICSAM  method.
+
*[http://www.cfd-online.com/Forums/openfoam-solving/59643-question-about-interface-flow-adaptive-mesh.html Question about interface flow and adaptive mesh] - In this thread Henry Weller explains how interFoam is different from the CICSAM method.
<div id="aflknwerkamfs" style="overflow:auto;height:5px;">[http://7331.rapidforum.com buy ambien online] [http://7051.rapidforum.com/ buy adipex online] [http://6905.rapidforum.com/ levitra online buy] [http://77693.rapidforum.com viagra buy online] [http://67794.rapidforum.com/ online buy carisoprodol] [http://37380.rapidforum.com/ buy online phentermine] [http://34959.rapidforum.com/ xanax buy online] [http://mycell.blogs.eurosport.com/files/buy-carisoprodol.html buy carisoprodol] [http://mycell.blogs.eurosport.com/files/buy-phentermine.html buy phentermine] [http://mycell.blogs.eurosport.com/files/buy-xanax.html online buy xanax] [http://esfull.info/site/preownedxtne/map.html pre rolex watch owned] [http://esfull.info/site/preownedxtne/ rolex watch owned pre] [http://esfull.info/site/carpetclfyln/map.html cleaner carpet] [http://esfull.info/site/carpetclfyln/ cleaner carpet] [http://www.republika.pl/zaeblo/buyxanaxhkfh/map.html xanax buy] [http://www.republika.pl/zaeblo/buyxanaxhkfh/ buy xanax] [http://www.republika.pl/zaeblo/cheapxanghbn/map.html cheap xanax] [http://www.republika.pl/zaeblo/cheapxanghbn/ xanax cheap] [http://www.republika.pl/zaeblo/buyxanaxcpoa/map.html xanax buy online] [http://www.republika.pl/zaeblo/buyxanaxcpoa/ online buy xanax] [http://www.republika.pl/zaeblo/phentermduad/map.html online phentermine] [http://www.republika.pl/zaeblo/phentermduad/ online phentermine] [http://www.republika.pl/zaeblo/phentermkuuf/map.html online phentermine] [http://www.republika.pl/zaeblo/phentermkuuf/ phentermine online] [http://www.republika.pl/zaeblo/phentermeyao/map.html phentermine online] [http://www.republika.pl/zaeblo/phentermeyao/ phentermine online] [http://www.republika.pl/zaeblo/buyphentrzvl/map.html buy online phentermine] [http://www.republika.pl/zaeblo/buyphentrzvl/ buy online phentermine] [http://www.republika.pl/zaeblo/cheappheoaek/map.html phentermine cheap online] [http://www.republika.pl/zaeblo/cheappheoaek/ cheap online phentermine] [http://www.republika.pl/zaeblo/orderpheyzuh/map.html phentermine order online] [http://www.republika.pl/zaeblo/orderpheyzuh/ online order phentermine] [http://www.republika.pl/zaeblo/buyphentddlb/map.html phentermine buy] [http://www.republika.pl/zaeblo/buyphentddlb/ buy phentermine] [http://www.republika.pl/zaeblo/cheapphewxkd/map.html phentermine cheap] [http://www.republika.pl/zaeblo/cheapphewxkd/ phentermine cheap] [http://www.republika.pl/zaeblo/orderpheeusi/map.html phentermine order] [http://www.republika.pl/zaeblo/orderpheeusi/ order phentermine] [http://www.republika.pl/zaeblo/cheapphevbkk/map.html phentermine cheap] [http://www.republika.pl/zaeblo/cheapphevbkk/ cheap phentermine] [http://www.republika.pl/zaeblo/orderphewyog/map.html order phentermine] [http://www.republika.pl/zaeblo/orderphewyog/ order phentermine] [http://esfull.info/site/qualitypftzy/map.html owned quality antonio car pre san] [http://esfull.info/site/qualitypftzy/ pre antonio owned quality car san] [http://esfull.info/site/preownedxvnu/map.html owned panerai pre watch] [http://esfull.info/site/preownedxvnu/ watch pre owned panerai] [http://esfull.info/site/manpreowospq/map.html pre man owned rolex watch] [http://esfull.info/site/manpreowospq/ pre watch owned man rolex] [http://esfull.info/site/cartierorenl/map.html watch cartier uk pre owned] [http://esfull.info/site/cartierorenl/ cartier watch pre uk owned] [http://esfull.info/site/ownedprezxwq/map.html pre owned worldofwatches.com watch] [http://esfull.info/site/ownedprezxwq/ worldofwatches.com watch pre owned] [http://esfull.info/site/preownedauky/map.html man pre watch omega owned] [http://esfull.info/site/preownedauky/ watch pre man owned omega] [http://esfull.info/site/inownedpkibl/map.html pre watch in owned singapore] [http://esfull.info/site/inownedpkibl/ singapore pre in owned watch] [http://esfull.info/site/preownedtfdj/map.html owned oris watch pre] [http://esfull.info/site/preownedtfdj/ owned watch oris pre] [http://esfull.info/site/preownedtyxu/map.html cartier watch pre owned] [http://esfull.info/site/preownedtyxu/ pre cartier owned watch] [http://esfull.info/site/preownedrdgw/map.html watch lady rolex owned pre] [http://esfull.info/site/preownedrdgw/ owned rolex lady watch pre] [http://esfull.info/site/preownedokvs/map.html franck pre watch owned muller] [http://esfull.info/site/preownedokvs/ watch owned franck pre muller] [http://esfull.info/site/preownedgvtr/map.html owned pre watch breitling] [http://esfull.info/site/preownedgvtr/ breitling owned watch pre] [http://esfull.info/site/preownedtdnn/map.html pre iwc owned watch] [http://esfull.info/site/preownedtdnn/ owned iwc pre watch] [http://esfull.info/site/preownedymsw/map.html omega pre watch owned] [http://esfull.info/site/preownedymsw/ watch owned pre omega] [http://esfull.info/site/preownednevr/map.html watch rolex owned pre] [http://esfull.info/site/preownednevr/ rolex pre watch owned] [http://esfull.info/site/preownediavr/map.html watch owned pre] [http://esfull.info/site/preownediavr/ watch owned pre] [http://esfull.info/site/carddebicwdn/map.html mega master card reward debit] [http://esfull.info/site/carddebicwdn/ master card reward debit mega] [http://esfull.info/site/2688formzbzj/map.html form 2688 irs] [http://esfull.info/site/2688formzbzj/ irs 2688 form] [http://esfull.info/site/genealogxzxf/map.html genealogy kamman] [http://esfull.info/site/genealogxzxf/ genealogy kamman] [http://esfull.info/site/biotechntomv/map.html biotechnology name] [http://esfull.info/site/biotechntomv/ biotechnology name] [http://esfull.info/site/biotechnneik/map.html name biotechnology] [http://esfull.info/site/biotechnneik/ name biotechnology] [http://esfull.info/site/airlinecfysw/map.html cheap ticket airline really] [http://esfull.info/site/airlinecfysw/ ticket cheap airline really] [http://esfull.info/site/itdietodfggg/map.html die it today] [http://esfull.info/site/itdietodfggg/ today die it] [http://esfull.info/site/blockagelvyn/map.html clog drain blockage clear] [http://esfull.info/site/blockagelvyn/ clog blockage drain clear] [http://esfull.info/site/concreteohtc/map.html concrete raise foundation repair] [http://esfull.info/site/concreteohtc/ repair raise concrete foundation] [http://esfull.info/site/blinddrahldk/map.html blind store drapery] [http://esfull.info/site/blinddrahldk/ drapery blind store] [http://esfull.info/site/wisconsiqqoe/map.html wholesale mortgage wisconsin] [http://esfull.info/site/wisconsiqqoe/ mortgage wholesale wisconsin] [http://esfull.info/site/wisconsixaqb/map.html mortgage wholesale wisconsin] [http://esfull.info/site/wisconsixaqb/ wisconsin mortgage wholesale] [http://esfull.info/site/wisconsidzgx/map.html mortgage wisconsin wholesale] [http://esfull.info/site/wisconsidzgx/ wisconsin mortgage wholesale] [http://esfull.info/site/attorneylyqa/map.html litigation trial attorney] [http://esfull.info/site/attorneylyqa/ litigation attorney trial] [http://esfull.info/site/attorneykuym/map.html trial attorney litigation] [http://esfull.info/site/attorneykuym/ attorney trial litigation] [http://esfull.info/site/olympicsfnxh/map.html show today source olympics] [http://esfull.info/site/olympicsfnxh/ show source today olympics] [http://esfull.info/site/0cardcrejhhw/map.html 0 card interest credit] [http://esfull.info/site/0cardcrejhhw/ credit interest 0 card] [http://esfull.info/site/usemypcarugi/map.html my as a use control pc remote] [http://esfull.info/site/usemypcarugi/ as a pc use remote control my] [http://esfull.info/site/topbabynouze/map.html baby name top for 2005] [http://esfull.info/site/topbabynouze/ baby for 2005 name top] [http://esfull.info/site/topbabynajdz/map.html 2005 for name baby top] [http://esfull.info/site/topbabynajdz/ for 2005 baby top name] [http://esfull.info/site/lastnamekbna/map.html last origin name] [http://esfull.info/site/lastnamekbna/ origin name last] [http://esfull.info/site/lastnamestug/map.html origin last name] [http://esfull.info/site/lastnamestug/ name origin last] [http://esfull.info/site/domaininnunf/map.html internet domain registration] [http://esfull.info/site/domaininnunf/ internet registration domain] [http://esfull.info/site/earlsnammvnf/map.html name earls] [http://esfull.info/site/earlsnammvnf/ name earls] [http://esfull.info/site/earlsnamldpc/map.html earls name] [http://esfull.info/site/earlsnamldpc/ earls name] [http://esfull.info/site/cityentezfpd/map.html name city enter] [http://esfull.info/site/cityentezfpd/ name enter city] [http://esfull.info/site/cityenteeirr/map.html name enter city] [http://esfull.info/site/cityenteeirr/ city enter name] [http://esfull.info/site/metanamemapl/map.html name robot meta content noindex] [http://esfull.info/site/metanamemapl/ robot noindex content name meta] [http://esfull.info/site/metanameibtv/map.html noindex content meta robot name] [http://esfull.info/site/metanameibtv/ robot content meta noindex name] [http://esfull.info/site/abovebuijblp/map.html build swimming ground pool install above] [http://esfull.info/site/abovebuijblp/ swimming pool above install ground build] [http://esfull.info/site/cardchaslngf/map.html card chase.com credit] [http://esfull.info/site/cardchaslngf/ card chase.com credit] [http://esfull.info/site/cleancurcyyz/map.html drape curtain clean] [http://esfull.info/site/cleancurcyyz/ drape clean curtain] [http://esfull.info/site/linksysrfwzd/map.html router 192.168.1.1 linksys] [http://esfull.info/site/linksysrfwzd/ 192.168.1.1 linksys router] [http://esfull.info/site/commercipcrm/map.html commercial alarm fire system] [http://esfull.info/site/honeywelxuxi/map.html alarm fire system honeywell] [http://esfull.info/site/estfireacvea/map.html est fire system alarm] [http://esfull.info/site/faradayfortb/map.html faraday system fire alarm] [http://esfull.info/site/noncodeduvmm/map.html non alarm system coded fire] [http://esfull.info/site/historyfgecl/map.html fire alarm history system] [http://esfull.info/site/siemensfllwl/map.html system siemens alarm fire] [http://esfull.info/site/firealargmdm/map.html fire equipment testing system alarm] [http://esfull.info/site/firealarjqqp/map.html fire alarm berkshires system] [http://esfull.info/site/firealarjqqp/ berkshires system fire alarm] [http://esfull.info/site/rochesterkhr/map.html system rochester alarm fire] [http://esfull.info/site/wirelessvvdj/map.html fire wireless system alarm] [http://esfull.info/site/commerciswzr/map.html fire system commercial alarm] [http://esfull.info/site/firealarobiv/map.html alarm design fire system] [http://esfull.info/site/cameraanejry/map.html and camera system alarm fire] [http://esfull.info/site/notifierrayv/map.html system notifier alarm fire] [http://esfull.info/site/simplexfkaup/map.html simplex alarm system fire] [http://esfull.info/site/edwardsftwyz/map.html edwards system fire alarm] [http://esfull.info/site/firealarfxmv/map.html alarm fire system manufacturer] [http://esfull.info/site/commerciqmro/map.html alarm system fire commercial] [http://esfull.info/site/firealaryrdu/map.html alarm system fire design] [http://esfull.info/site/cameraanjfoy/map.html and system alarm fire camera] [http://esfull.info/site/notifierqkbt/map.html notifier alarm fire system] [http://esfull.info/site/simplexfqaev/map.html system fire simplex alarm] [http://esfull.info/site/edwardsfoawq/map.html edwards system fire alarm] [http://esfull.info/site/firealartonm/map.html fire system manufacturer alarm] [http://71666.rapidforum.com/ watch rolex daytona replica] [http://1262.rapidforum.com/ replica designer watch] [http://2251.rapidforum.com/ swiss rolex replica] [http://3703.rapidforum.com/ replica swiss watch] [http://16491.rapidforum.com/ replica watch rolex band] [http://16491.rapidforum.com/ rolex replica] [http://77905.rapidforum.com/ replica watch rolex best the] [http://79801.rapidforum.com/ replica rolex watch] [http://66343.rapidforum.com replica rolex] [http://65106.rapidforum.com/ rolex replica swiss watch] [http://www.cgispy.com/boards/board.cgi?user=sry daytona rolex watch replica] [http://www.cgispy.com/boards/board.cgi?user=css watch designer replica] [http://www.cgispy.com/boards/board.cgi?user=mywatchess swiss replica rolex] [http://www.cgispy.com/boards/board.cgi?user=watchess watch replica swiss] [http://www.cgispy.com/boards/board.cgi?user=bladi watch rolex band replica] [http://www.cgispy.com/boards/board.cgi?user=gluki rolex replica] [http://www.cgispy.com/boards/board.cgi?user=mywatct replica rolex watch best the] [http://www.cgispy.com/boards/board.cgi?user=mywarr rolex watch replica] [http://www.cgispy.com/boards/board.cgi?user=twatch replica rolex] [http://www.cgispy.com/boards/board.cgi?user=mywatch5 swiss rolex watch replica] [http://republika.pl/watchess/walgreengqtb/map.html walgreen%27s] [http://republika.pl/watchess/walgreengqtb/ walgreen%27s] [http://republika.pl/watchess/canadianfwob/map.html pharmacies canadian] [http://republika.pl/watchess/canadianfwob/ canadian pharmacies] [http://republika.pl/watchess/cvspharmvqxh/map.html pharmacy cvs] [http://republika.pl/watchess/cvspharmvqxh/ pharmacy cvs] [http://republika.pl/watchess/riteaidpskhg/map.html aid pharmacies rite] [http://republika.pl/watchess/riteaidpskhg/ pharmacies aid rite] [http://republika.pl/watchess/internatrzlk/map.html pharmacy international] [http://republika.pl/watchess/internatrzlk/ international pharmacy] [http://republika.pl/watchess/drugstorpfyi/map.html drugstores] [http://republika.pl/watchess/drugstorpfyi/ drugstores] [http://republika.pl/watchess/onlinephelcb/map.html pharmacies online] [http://republika.pl/watchess/onlinephelcb/ online pharmacies] [http://republika.pl/coolwatch/iwcreplinemw/map.html replica iwc] [http://republika.pl/coolwatch/iwcreplinemw/ iwc replica] [http://republika.pl/coolwatch/iwcreplikkbi/map.html iwc watch replica] [http://republika.pl/coolwatch/iwcreplikkbi/ replica iwc watch] [http://republika.pl/coolwatch/fakerolebbyu/map.html fake watch rolex] [http://republika.pl/coolwatch/fakerolebbyu/ fake rolex watch] [http://republika.pl/coolwatch/cartierfbxww/map.html watch fake cartier] [http://republika.pl/coolwatch/cartierfbxww/ cartier fake watch] [http://republika.pl/coolwatch/fakewatcmhkn/map.html fake watch] [http://republika.pl/coolwatch/fakewatcmhkn/ fake watch] [http://republika.pl/coolwatch/replicawicxo/map.html replica watches] [http://republika.pl/coolwatch/replicawicxo/ replica watches] [http://republika.pl/coolwatch/rolexrepdieb/map.html replica rolex watch] [http://republika.pl/coolwatch/rolexrepdieb/ rolex replica watch] [http://republika.pl/coolwatch/rolexwatlhvj/map.html watch rolex] [http://republika.pl/coolwatch/rolexwatlhvj/ rolex watch] [http://www.esfull.info/WroughtIfluw/map.html Beds Wrought Iron Canopy] [http://www.esfull.info/WroughtIfluw/ Wrought Beds Canopy Iron] [http://www.esfull.info/WoodenCaphfj/map.html Wooden Canopy Beds] [http://www.esfull.info/WoodenCaphfj/ Beds Canopy Wooden] [http://www.esfull.info/WoodCanovpzv/map.html Canopy Wood Bed] [http://www.esfull.info/WoodCanovpzv/ Bed Wood Canopy] [http://www.esfull.info/Wheelchaenij/map.html Wheelchair Canopy] [http://www.esfull.info/Wheelchaenij/ Canopy Wheelchair] [http://www.esfull.info/VehicleCxlvg/map.html Vehicle Canopies] [http://www.esfull.info/VehicleCxlvg/ Canopies Vehicle] [http://www.esfull.info/UnderThevbrq/map.html Canopy Under The] [http://www.esfull.info/UnderThevbrq/ Canopy The Under] [http://www.esfull.info/TrundleCuews/map.html Canopy Trundle Bed] [http://www.esfull.info/TrundleCuews/ Trundle Canopy Bed] [http://www.esfull.info/TruckCanrixf/map.html Canopies Truck] [http://www.esfull.info/TruckCanrixf/ Truck Canopies] [http://www.esfull.info/TractorCkcsu/map.html Tractor Canopy] [http://www.esfull.info/TractorCkcsu/ Canopy Tractor] [http://www.esfull.info/TentCanolqub/map.html Tent Canopies] [http://www.esfull.info/TentCanolqub/ Tent Canopies] [http://www.esfull.info/TanningCvvzw/map.html Canopy Tanning] [http://www.esfull.info/TanningCvvzw/ Canopy Tanning] [http://www.esfull.info/SwingWitqgxi/map.html With Canopy Swing] [http://www.esfull.info/SwingWitqgxi/ Swing With Canopy] [http://www.esfull.info/SunCanopheqh/map.html Sun Canopy] [http://www.esfull.info/SunCanopheqh/ Sun Canopy] [http://www.esfull.info/SteelCancdcj/map.html Canopy Steel] [http://www.esfull.info/SteelCancdcj/ Canopy Steel] [http://www.esfull.info/ShadeCanjgch/map.html Shade Canopies] [http://www.esfull.info/ShadeCanjgch/ Shade Canopies] [http://www.esfull.info/ScreenCafzff/map.html Canopy Screen] [http://www.esfull.info/ScreenCafzff/ Canopy Screen] [http://www.esfull.info/RvCanopivroj/map.html Rv Canopies] [http://www.esfull.info/RvCanopivroj/ Canopies Rv] [http://www.esfull.info/Replacemmkrz/map.html Covers Replacement Canopy] [http://www.esfull.info/Replacemmkrz/ Replacement Covers Canopy] [http://www.esfull.info/Rainforeoxha/map.html Canopy Rainforest] [http://www.esfull.info/Rainforeoxha/ Rainforest Canopy] [http://www.esfull.info/QuikShaduxyh/map.html Quik Canopy Shade] [http://www.esfull.info/QuikShaduxyh/ Canopy Quik Shade] [http://www.esfull.info/QuickShadnix/map.html Shade Canopies Quick] [http://www.esfull.info/QuickShadnix/ Shade Canopies Quick] [http://www.esfull.info/Princesspnes/map.html Princess Canopy] [http://www.esfull.info/Princesspnes/ Princess Canopy] [http://www.esfull.info/Portabletbsp/map.html Canopy Portable] [http://www.esfull.info/Portabletbsp/ Portable Canopy] [http://www.esfull.info/PorchSwitowm/map.html Swing Canopy Porch] [http://www.esfull.info/PorchSwitowm/ Porch Swing Canopy] [http://www.esfull.info/PopUpCanqfar/map.html Pop Up Canopy] [http://www.esfull.info/PopUpCanqfar/ Pop Canopy Up] [http://www.esfull.info/PickupCaxkau/map.html Pickup Canopies] [http://www.esfull.info/PickupCaxkau/ Canopies Pickup] [http://www.esfull.info/PatioSwikqgb/map.html Canopy Patio Swing] [http://www.esfull.info/PatioSwikqgb/ Swing Canopy Patio] [http://www.esfull.info/PatioCanbpsb/map.html Patio Canopies] [http://www.esfull.info/PatioCanbpsb/ Canopies Patio] [http://www.esfull.info/PartyCanpxnl/map.html Party Canopies] [http://www.esfull.info/PartyCanpxnl/ Canopies Party] [http://www.esfull.info/OutdoorCqahr/map.html Canopy Outdoor Swing] [http://www.esfull.info/OutdoorCqahr/ Outdoor Swing Canopy] [http://www.esfull.info/OutdoorCsudz/map.html Canopies Outdoor] [http://www.esfull.info/OutdoorCsudz/ Canopies Outdoor] [http://www.esfull.info/Mosquitogsrw/map.html Mosquito Net Bed Canopy] [http://www.esfull.info/Mosquitogsrw/ Mosquito Bed Canopy Net] [http://www.esfull.info/MetalCanfuav/map.html Metal Canopy] [http://www.esfull.info/MetalCanfuav/ Metal Canopy] [http://www.esfull.info/MakeACanmswp/map.html Bed Canopy A Make] [http://www.esfull.info/MakeACanmswp/ Make A Canopy Bed] [http://www.esfull.info/LeerCanokpkb/map.html Canopy Leer] [http://www.esfull.info/LeerCanokpkb/ Leer Canopy] [http://www.esfull.info/LawnCanobaaw/map.html Canopy Lawn] [http://www.esfull.info/LawnCanobaaw/ Canopy Lawn] [http://www.esfull.info/KingCanoklvh/map.html Canopy King] [http://www.esfull.info/KingCanoklvh/ Canopy King] [http://www.esfull.info/KidsBeddmkxx/map.html Bedding Canopy Kids] [http://www.esfull.info/KidsBeddmkxx/ Kids Canopy Bedding] [http://www.esfull.info/JewishWefsll/map.html Canopy Wedding Jewish] [http://www.esfull.info/JewishWefsll/ Wedding Canopy Jewish] [http://www.esfull.info/IronCanowooy/map.html Bed Iron Canopy] [http://www.esfull.info/IronCanowooy/ Bed Iron Canopy] [http://www.esfull.info/InstantChnfv/map.html Canopy Instant] [http://www.esfull.info/InstantChnfv/ Instant Canopy] [http://www.esfull.info/Herculesphbm/map.html Canopy Hercules] [http://www.esfull.info/Herculesphbm/ Canopy Hercules] [http://www.esfull.info/GreenCanovco/map.html Canopy Green] [http://www.esfull.info/GreenCanovco/ Canopy Green] [http://www.esfull.info/GirlsCanozcb/map.html Beds Girls Canopy] [http://www.esfull.info/GirlsCanozcb/ Beds Canopy Girls] [http://www.esfull.info/GardenPaczeh/map.html Party Garden Canopy] [http://www.esfull.info/GardenPaczeh/ Party Canopy Garden] [http://www.esfull.info/GardenCanupz/map.html Canopy Garden] [http://www.esfull.info/GardenCanupz/ Garden Canopy] [http://www.esfull.info/FrontDootrzw/map.html Canopy Door Front] [http://www.esfull.info/FrontDootrzw/ Canopy Front Door] [http://www.esfull.info/FabricCawyke/map.html Fabric Canopy] [http://www.esfull.info/FabricCawyke/ Fabric Canopy] [http://www.esfull.info/EzupCanomyoa/map.html Canopies Ezup] [http://www.esfull.info/EzupCanomyoa/ Canopies Ezup] [http://www.esfull.info/EasyUpCairsb/map.html Easy Canopy Up] [http://www.esfull.info/EasyUpCairsb/ Up Canopy Easy] [http://www.esfull.info/EZUpCanojbyl/map.html Up Canopies E Z] [http://www.esfull.info/EZUpCanojbyl/ Canopies Z Up E] [http://www.esfull.info/DoorCanoemum/map.html Door Canopies] [http://www.esfull.info/DoorCanoemum/ Door Canopies] [http://www.esfull.info/DeckCanotary/map.html Canopy Deck] [http://www.esfull.info/DeckCanotary/ Deck Canopy] [http://www.esfull.info/CribCanoqkig/map.html Crib Canopy] [http://www.esfull.info/CribCanoqkig/ Crib Canopy] [http://www.esfull.info/Commerciirka/map.html Commercial Canopy] [http://www.esfull.info/Commerciirka/ Canopy Commercial] [http://www.esfull.info/Coloradotiou/map.html Colorado Canopy] [http://www.esfull.info/Coloradotiou/ Colorado Canopy] [http://www.esfull.info/CarportCrwzb/map.html Carport Canopies] [http://www.esfull.info/CarportCrwzb/ Carport Canopies] [http://www.esfull.info/CaravanCkplx/map.html Caravan Canopies] [http://www.esfull.info/CaravanCkplx/ Caravan Canopies] [http://www.esfull.info/CarCanopqcem/map.html Canopy Car] [http://www.esfull.info/CarCanopqcem/ Canopy Car] [http://www.esfull.info/CanvasCahbcp/map.html Canvas Canopy] [http://www.esfull.info/CanvasCahbcp/ Canopy Canvas] [http://www.esfull.info/Canopysqpcq/map.html Canopys] [http://www.esfull.info/Canopysqpcq/ Canopys] [http://www.esfull.info/CanopyWivuhb/map.html Wireless Canopy] [http://www.esfull.info/CanopyWivuhb/ Canopy Wireless] [http://www.esfull.info/CanopyWemwzd/map.html Canopy Weights] [http://www.esfull.info/CanopyWemwzd/ Weights Canopy] [http://www.esfull.info/CanopyTotstr/map.html Tours Canopy] [http://www.esfull.info/CanopyTotstr/ Tours Canopy] [http://www.esfull.info/CanopyTeyxpt/map.html Canopy Tents] [http://www.esfull.info/CanopyTeyxpt/ Tents Canopy] [http://www.esfull.info/CanopyTayyke/map.html Tarps Canopy] [http://www.esfull.info/CanopyTayyke/ Tarps Canopy] [http://www.esfull.info/CanopySwilze/map.html Swings Canopy] [http://www.esfull.info/CanopySwilze/ Swings Canopy] [http://www.esfull.info/CanopyRepyxw/map.html Canopy Rentals] [http://www.esfull.info/CanopyRepyxw/ Canopy Rentals] [http://www.esfull.info/CanopyPajfwm/map.html Parts Canopy] [http://www.esfull.info/CanopyPajfwm/ Canopy Parts] [http://www.esfull.info/CanopyMaxnvc/map.html Manufacturers Canopy] [http://www.esfull.info/CanopyMaxnvc/ Canopy Manufacturers] [http://www.esfull.info/CanopyKivyln/map.html Kits Canopy] [http://www.esfull.info/CanopyKivyln/ Canopy Kits] [http://www.esfull.info/CanopyGaujdo/map.html Gazebo Canopy] [http://www.esfull.info/CanopyGaujdo/ Canopy Gazebo] [http://www.esfull.info/CanopyFoflho/map.html For Twin Bed Canopy] [http://www.esfull.info/CanopyFoflho/ Twin Canopy Bed For] [http://www.esfull.info/CanopyFaqnzl/map.html Canopy Factory] [http://www.esfull.info/CanopyFaqnzl/ Canopy Factory] [http://www.esfull.info/CanopyDesfzs/map.html Design Canopy] [http://www.esfull.info/CanopyDesfzs/ Design Canopy] [http://www.esfull.info/CanopyCrqonr/map.html Cribs Canopy] [http://www.esfull.info/CanopyCrqonr/ Canopy Cribs] [http://www.esfull.info/CanopyCouttw/map.html Covers Canopy] [http://www.esfull.info/CanopyCouttw/ Covers Canopy] [http://www.esfull.info/CanopyCazfav/map.html Carport Canopy] [http://www.esfull.info/CanopyCazfav/ Carport Canopy] [http://www.esfull.info/CanopyBeuklo/map.html Set Canopy Bedroom] [http://www.esfull.info/CanopyBeuklo/ Set Canopy Bedroom] [http://www.esfull.info/CanopyBezkfb/map.html Canopy Bedding] [http://www.esfull.info/CanopyBezkfb/ Bedding Canopy] [http://www.esfull.info/CanopyBettvv/map.html Sets Bed Canopy] [http://www.esfull.info/CanopyBettvv/ Bed Canopy Sets] [http://www.esfull.info/CanopyBezhrr/map.html Linens Canopy Bed] [http://www.esfull.info/CanopyBezhrr/ Bed Canopy Linens] [http://www.esfull.info/CanopyBenhvf/map.html Frame Canopy Bed] [http://www.esfull.info/CanopyBenhvf/ Frame Bed Canopy] [http://www.esfull.info/CanopyBeolsb/map.html Canopy Covers Bed] [http://www.esfull.info/CanopyBeolsb/ Bed Canopy Covers] [http://www.esfull.info/CanopyBefclr/map.html Canopy Accessories Bed] [http://www.esfull.info/CanopyBefclr/ Bed Accessories Canopy] [http://www.esfull.info/CanopyBagsyi/map.html Crib Canopy Baby] [http://www.esfull.info/CanopyBagsyi/ Baby Canopy Crib] [http://www.esfull.info/CanopyAccyqe/map.html Canopy Accessories] [http://www.esfull.info/CanopyAccyqe/ Accessories Canopy] [http://www.esfull.info/Canopiesljzy/map.html Canopies] [http://www.esfull.info/Canopiesljzy/ Canopies] [http://www.esfull.info/BoatCanosdar/map.html Canopies Boat] [http://www.esfull.info/BoatCanosdar/ Boat Canopies] [http://www.esfull.info/BedCanopyrfr/map.html Canopys Bed] [http://www.esfull.info/BedCanopyrfr/ Bed Canopys] [http://www.esfull.info/BedCanoppkyy/map.html Drapes Bed Canopy] [http://www.esfull.info/BedCanoppkyy/ Canopy Bed Drapes] [http://www.esfull.info/BedCanoposuv/map.html Kids For Bed Canopies] [http://www.esfull.info/BedCanoposuv/ Kids Bed For Canopies] [http://www.esfull.info/BeachCanfvwm/map.html Canopy Beach] [http://www.esfull.info/BeachCanfvwm/ Canopy Beach] [http://www.esfull.info/AwningsAltos/map.html Awnings And Canopies] [http://www.esfull.info/AwningsAltos/ Canopies Awnings And] [http://www.esfull.info/Aquariumggib/map.html Aquarium Canopy] [http://www.esfull.info/Aquariumggib/ Aquarium Canopy] [http://www.esfull.info/10x10Cangtmn/map.html 10x10 Canopy] [http://www.esfull.info/10x10Cangtmn/ 10x10 Canopy] [http://www.esfull.info/10X10Canpznr/map.html X Canopy 10 10] [http://www.esfull.info/10X10Canpznr/ X Canopy 10 10] [http://www.esfull.info/Electrolyoap/map.html A Electrolux] [http://www.esfull.info/Electrolyoap/ Electrolux A] [http://www.esfull.info/Electrolufcd/map.html 6988a Electrolux Parts] [http://www.esfull.info/Electrolufcd/ Parts 6988a Electrolux] [http://www.esfull.info/Electrolsajl/map.html 6500 Electrolux Repair] [http://www.esfull.info/Electrolsajl/ 6500 Repair Electrolux] [http://www.esfull.info/Electrolhhlw/map.html Electrolux Hose 2100] [http://www.esfull.info/Electrolhhlw/ Hose Electrolux 2100] [http://www.esfull.info/Electrolvygw/map.html Electrolux 2100] [http://www.esfull.info/Electrolvygw/ 2100 Electrolux] [http://www.esfull.info/Electrolnzhh/map.html In 2 Electrolux 1] [http://www.esfull.info/Electrolnzhh/ 2 1 Electrolux In] [http://www.esfull.info/Electrolocug/map.html Electrolux 1584] [http://www.esfull.info/Electrolocug/ Electrolux 1584] [http://www.esfull.info/Electrolzhka/map.html 1401-b Electrolux] [http://www.esfull.info/Electrolzhka/ Electrolux 1401-b] [http://www.esfull.info/Electrolaqin/map.html Electrolux 1400xp] [http://www.esfull.info/Electrolaqin/ 1400xp Electrolux] [http://www.esfull.info/Electroltutd/map.html Electrolux 14 Floor Brush] [http://www.esfull.info/Electroltutd/ Electrolux Brush Floor 14] [http://www.esfull.info/Electrolpmkx/map.html Electrolux 1200xp] [http://www.esfull.info/Electrolpmkx/ 1200xp Electrolux] [http://www.esfull.info/Electrolkzzk/map.html Electrolux] [http://www.esfull.info/Electrolkzzk/ Electrolux] [http://www.esfull.info/El1000a2etlt/map.html El1000a2 Electrolux] [http://www.esfull.info/El1000a2etlt/ Electrolux El1000a2] [http://www.esfull.info/Dishwashfyyp/map.html Dishwashers] [http://www.esfull.info/Dishwashfyyp/ Dishwashers] [http://www.esfull.info/CarpetClnasj/map.html Cleaners Carpet] [http://www.esfull.info/CarpetClnasj/ Carpet Cleaners] [http://www.esfull.info/Canisterqerl/map.html Canister Vacuum] [http://www.esfull.info/Canisterqerl/ Vacuum Canister] [http://www.esfull.info/Appliancenet/map.html Appliances] [http://www.esfull.info/Appliancenet/ Appliances] [http://www.esfull.info/Appliancoffm/map.html Appliance Repair] [http://www.esfull.info/Appliancoffm/ Appliance Repair] [http://www.esfull.info/Appliancvdus/map.html Appliance Parts] [http://www.esfull.info/Appliancvdus/ Parts Appliance] [http://www.esfull.info/AirCleanewdt/map.html Cleaners Air] [http://www.esfull.info/AirCleanewdt/ Air Cleaners] [http://www.esfull.info/AerusElecqyi/map.html Electrolux Vacuum Aerus] [http://www.esfull.info/AerusElecqyi/ Electrolux Vacuum Aerus] [http://www.esfull.info/AerusElemcnc/map.html Electrolux Sweeper Aerus] [http://www.esfull.info/AerusElemcnc/ Sweeper Electrolux Aerus] [http://www.esfull.info/AerusElezxta/map.html 2000 Aerus Electrolux] [http://www.esfull.info/AerusElezxta/ Electrolux 2000 Aerus] [http://www.esfull.info/AerusEleuvyh/map.html Aerus Electrolux] [http://www.esfull.info/AerusEleuvyh/ Electrolux Aerus] [http://www.esfull.info/AegElectuezy/map.html Aeg Electrolux] [http://www.esfull.info/AegElectuezy/ Aeg Electrolux] [http://www.esfull.info/AbElectrukeu/map.html Electrolux Ab] [http://www.esfull.info/AbElectrukeu/ Ab Electrolux] [http://www.esfull.info/Electroloqnb/map.html Electrolux] [http://www.esfull.info/Electroloqnb/ Electrolux] [http://www.esfull.info/carpetexitnq/map.html carpet extractor] [http://www.esfull.info/carpetexitnq/ extractor carpet] [http://www.esfull.info/iwcwatchhqch/map.html watch iwc] [http://www.esfull.info/iwcwatchhqch/ iwc watch] [http://www.esfull.info/iwcreplivqbp/map.html iwc replica] [http://www.esfull.info/iwcreplivqbp/ iwc replica] [http://www.esfull.info/jacobcorjokc/map.html watch jacob replica co] [http://www.esfull.info/jacobcorjokc/ co replica watch jacob] [http://www.esfull.info/cartierrqero/map.html cartier replica watch] [http://www.esfull.info/cartierrqero/ replica cartier watch] [http://www.esfull.info/breitlinocth/map.html replica watch breitling] [http://www.esfull.info/breitlinocth/ replica breitling watch] [http://www.esfull.info/swissrepvbjc/map.html swiss rolex replica] [http://www.esfull.info/swissrepvbjc/ rolex swiss replica] [http://www.esfull.info/fakewatcyrzp/map.html fake watch] [http://www.esfull.info/fakewatcyrzp/ watch fake] [http://www.esfull.info/fakerolehjxh/map.html fake rolex] [http://www.esfull.info/fakerolehjxh/ rolex fake] [http://www.esfull.info/replicarxuwy/map.html rolex replica] [http://www.esfull.info/replicarxuwy/ rolex replica] [http://www.esfull.info/replicarxntj/map.html rolex watch replica] [http://www.esfull.info/replicarxntj/ rolex watch replica] [http://www.esfull.info/rolexwatmgnx/map.html rolex watch] [http://www.esfull.info/rolexwatmgnx/ watch rolex] [http://www.esfull.info/replicaworve/map.html watch replica] [http://www.esfull.info/replicaworve/ watch replica] [http://www.esfull.info/rolexrepdyud/map.html replica rolex] [http://www.esfull.info/rolexrepdyud/ replica rolex] [http://esfull.info/site/lamborghsjwz lamborghini replica] [http://esfull.info/site/bestrolekdfq best rolex replica] [http://esfull.info/site/naturalpkceo penis natural enlargement] [http://esfull.info/site/replicarjsle submariner rolex replica] [http://esfull.info/site/chanelreatzg chanel watch replica] [http://esfull.info/site/replicaddsgi designer replica watch] [http://esfull.info/site/swissrepelsq swiss replica rolex] [http://esfull.info/site/swissrepoigc replica watch rolex swiss] [http://esfull.info/site/cheaprepsnhs cheap watches replica] [http://esfull.info/site/cheaprolegvr cheap rolex watches] [http://esfull.info/site/cheapfaknqrv fake watch cheap] [http://esfull.info/site/cheaprolsyfd rolex replica cheap] [http://esfull.info/site/cheaprepfinx cheap replica watch] [http://esfull.info/site/cheaprolacvz rolex watch cheap] [http://esfull.info/site/buyreplivsvy watches buy replica] [http://esfull.info/site/buyrolexpyvx buy watches rolex] [http://esfull.info/site/buyfakewznlk fake watch buy] [http://esfull.info/site/buyrolexkafh replica buy rolex] [http://esfull.info/site/buyrepliwfrh buy replica watch] [http://esfull.info/site/buyrolexcjqg buy rolex watch] [http://esfull.info/site/replicarmhzb online rolex replica] [http://esfull.info/site/replicawrewl watches replica] [http://esfull.info/site/rolexwatcfjl rolex watches] [http://esfull.info/site/fakewatcfiyc fake watch] [http://esfull.info/site/rolexrepmprg rolex replica] [http://esfull.info/site/replicawosfq watch replica] [http://esfull.info/site/rolexwatqzfq watch rolex] </div>
+
 
 +
===Useful links===
 +
An overview about interfoam:
 +
https://www.cfdyna.com/Home/OpenFOAM/of_Tut_Web/of_Suites_Description.pdf
 +
 
 +
==Equations==
 +
The solver solves the Navier Stokes equations for two incompressible, isothermal immiscible fluids. That means that the material properties
 +
are constant in the region filled by one of the two fluid except at the interphase.
 +
 
 +
===Continuity Equation===
 +
The constant-density continuity equation is
 +
 
 +
<table width="70%"><tr><td>
 +
<center><math>
 +
 
 +
  \frac{\partial {u}_j}{\partial x_j} = 0
 +
 
 +
</math></center>
 +
</td><td width="5%">(1)</td></tr></table>
 +
 
 +
===Momentum Equation===
 +
 
 +
 
 +
<table width="70%"><tr><td>
 +
<center><math>
 +
 
 +
    \frac{ \partial (\rho {u}_i)}{\partial t} + \frac{\partial}{\partial x_j} \left( \rho {u}_j u_i \right) =
 +
 
 +
  - \frac{\partial p} {\partial{x_i}} + \frac{\partial}{\partial x_j} \left( \tau_{ij} + \tau_{t_{ij}} \right) + \rho g_i + f_{\sigma i},
 +
 
 +
</math></center>
 +
</td><td width="5%">(2)</td></tr></table>
 +
 
 +
<math> u </math> represent the velocity, <math> g_i </math> the gravitational acceleration, <math> p </math> the pressure and
 +
<math> \tau_{ij}  </math> and <math> \tau_{t_{ij}}  </math> are the viscose and turbulent stresses. <math> f_{\sigma i}, </math> is the
 +
surface tension.
 +
 
 +
 
 +
The density <math> \rho </math> is defined as follows:
 +
 
 +
<table width="70%"><tr><td>
 +
<center><math>
 +
 
 +
  \rho = \alpha  \rho_1 + (1 - \alpha)  \rho_2
 +
 
 +
</math></center>
 +
</td><td width="5%">(3)</td></tr></table>
 +
 
 +
<math> \alpha </math> is 1 inside fluid 1 with the density  <math> \rho_1 </math> and 0 inside fluid 2 with the density <math> \rho_2  </math>. At the interphase between
 +
the two fluids <math> \alpha </math> varies between 0 and 1.
 +
 
 +
The surface tension <math> f_{\sigma i}, </math> is modelled as continuum surface force (CSF)<ref>Brackbill, J. U., Douglas B. Kothe, and Charles Zemach. "A continuum method for modeling surface tension." Journal of computational physics 100.2 (1992): 335-354. </ref>. It is calculated as follows (see also <ref> Heyns, Johan A., and Oliver F. Oxtoby. "Modelling surface tension dominated multiphase flows using the VOF approach." 6th European Conference on Computational Fluid Dynamics. 2014. </ref>):
 +
 
 +
<center><math>
 +
 
 +
  f_{\sigma i} = \sigma \kappa \frac{\partial \alpha }{\partial x_i}
 +
 
 +
</math></center>
 +
 
 +
<math> \sigma </math> is the surface tension constant and <math> \kappa </math> the curvature. The curvature can be approximated as follows <ref>Brackbill, J. U., Douglas B. Kothe, and Charles Zemach. "A continuum method for modeling surface tension." Journal of computational physics 100.2 (1992): 335-354. </ref> and <ref> Heyns, Johan A., and Oliver F. Oxtoby. "Modelling surface tension dominated multiphase flows using the VOF approach." 6th European Conference on Computational Fluid Dynamics. 2014. </ref>:
 +
 
 +
<center><math>
 +
 
 +
\kappa = - \frac{\partial n_i}{\partial x_i} = - \frac{\partial}{\partial x_i} \left (  \frac{\partial \alpha / \partial x_i}{|\partial \alpha / \partial x_i|}\right )
 +
 
 +
</math></center>
 +
 
 +
===Equation for the interphase ===
 +
 
 +
In order to know where the interphase between the two fluids is, an additional equation for <math> \alpha </math> has to be solved.
 +
 
 +
<table width="70%"><tr><td>
 +
<center><math>
 +
 
 +
\frac{\partial \alpha}{\partial t}  +  \frac{\partial ( \alpha {u}_j )}{\partial x_j} = 0
 +
 
 +
</math></center>
 +
</td><td width="5%">(4)</td></tr></table>
 +
 
 +
The equation can be seen as the conservation of the mixture components along the path of a fluid parcel.
 +
 
 +
==Source Code==
 +
\\OpenFOAM 6
 +
 
 +
===interFoam.C===
 +
 
 +
 
 +
<br><cpp>
 +
 
 +
#include "fvCFD.H"
 +
#include "dynamicFvMesh.H"
 +
#include "CMULES.H"
 +
#include "EulerDdtScheme.H"
 +
#include "localEulerDdtScheme.H"
 +
#include "CrankNicolsonDdtScheme.H"
 +
#include "subCycle.H"
 +
#include "immiscibleIncompressibleTwoPhaseMixture.H"
 +
#include "turbulentTransportModel.H"
 +
#include "pimpleControl.H"
 +
#include "fvOptions.H"
 +
#include "CorrectPhi.H"
 +
#include "fvcSmooth.H"
 +
 
 +
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 +
 
 +
int main(int argc, char *argv[])
 +
{
 +
    #include "postProcess.H"
 +
 
 +
    #include "setRootCaseLists.H"
 +
    #include "createTime.H"
 +
    #include "createDynamicFvMesh.H"
 +
    #include "initContinuityErrs.H"
 +
    #include "createDyMControls.H"
 +
    #include "createFields.H"
 +
    #include "createAlphaFluxes.H"
 +
    #include "initCorrectPhi.H"
 +
    #include "createUfIfPresent.H"
 +
 
 +
    turbulence->validate();
 +
 
 +
    if (!LTS)
 +
    {
 +
        #include "CourantNo.H"
 +
        #include "setInitialDeltaT.H"
 +
    }
 +
 
 +
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 +
    Info<< "\nStarting time loop\n" << endl;
 +
 
 +
    while (runTime.run())
 +
    {
 +
        #include "readDyMControls.H"
 +
 
 +
        if (LTS)
 +
        {
 +
            #include "setRDeltaT.H"
 +
        }
 +
        else
 +
        {
 +
            #include "CourantNo.H"
 +
            #include "alphaCourantNo.H"
 +
            #include "setDeltaT.H"
 +
        }
 +
 
 +
        runTime++;
 +
 
 +
        Info<< "Time = " << runTime.timeName() << nl << endl;
 +
 
 +
        // --- Pressure-velocity PIMPLE corrector loop
 +
        while (pimple.loop())
 +
        {
 +
            if (pimple.firstIter() || moveMeshOuterCorrectors)
 +
            {
 +
                mesh.update();
 +
 
 +
                if (mesh.changing())
 +
                {
 +
                    // Do not apply previous time-step mesh compression flux
 +
                    // if the mesh topology changed
 +
                    if (mesh.topoChanging())
 +
                    {
 +
                        talphaPhi1Corr0.clear();
 +
                    }
 +
 
 +
                    gh = (g & mesh.C()) - ghRef;
 +
                    ghf = (g & mesh.Cf()) - ghRef;
 +
 
 +
                    MRF.update();
 +
 
 +
                    if (correctPhi)
 +
                    {
 +
                        // Calculate absolute flux
 +
                        // from the mapped surface velocity
 +
                        phi = mesh.Sf() & Uf();
 +
 
 +
                        #include "correctPhi.H"
 +
 
 +
                        // Make the flux relative to the mesh motion
 +
                        fvc::makeRelative(phi, U);
 +
 
 +
                        mixture.correct();
 +
                    }
 +
 
 +
                    if (checkMeshCourantNo)
 +
                    {
 +
                        #include "meshCourantNo.H"
 +
                    }
 +
                }
 +
            }
 +
 
 +
            #include "alphaControls.H"
 +
            #include "alphaEqnSubCycle.H"
 +
 
 +
            mixture.correct();
 +
 
 +
            #include "UEqn.H"
 +
 
 +
            // --- Pressure corrector loop
 +
            while (pimple.correct())
 +
            {
 +
                #include "pEqn.H"
 +
            }
 +
 
 +
            if (pimple.turbCorr())
 +
            {
 +
                turbulence->correct();
 +
            }
 +
        }
 +
 
 +
        runTime.write();
 +
 
 +
        Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
 +
            << "  ClockTime = " << runTime.elapsedClockTime() << " s"
 +
            << nl << endl;
 +
    }
 +
 
 +
    Info<< "End\n" << endl;
 +
 
 +
    return 0;
 +
}
 +
 
 +
 
 +
// ************************************************************************* //
 +
</cpp><br>
 +
 
 +
 
 +
===UEqn.H===
 +
 
 +
 
 +
<br><cpp>
 +
 
 +
    MRF.correctBoundaryVelocity(U);
 +
 
 +
    fvVectorMatrix UEqn
 +
    (
 +
        fvm::ddt(rho, U) + fvm::div(rhoPhi, U)
 +
      + MRF.DDt(rho, U)
 +
      + turbulence->divDevRhoReff(rho, U)
 +
    ==
 +
        fvOptions(rho, U)
 +
    );
 +
 
 +
    UEqn.relax();
 +
 
 +
    fvOptions.constrain(UEqn);
 +
 
 +
    if (pimple.momentumPredictor())
 +
    {
 +
        solve
 +
        (
 +
            UEqn
 +
        ==
 +
            fvc::reconstruct
 +
            (
 +
                (
 +
                    mixture.surfaceTensionForce()
 +
                  - ghf*fvc::snGrad(rho)
 +
                  - fvc::snGrad(p_rgh)
 +
                ) * mesh.magSf()
 +
            )
 +
        );
 +
 
 +
        fvOptions.correct(U);
 +
    }
 +
 
 +
</cpp><br>
 +
 
 +
 
 +
===pEqn.H===
 +
 
 +
<br><cpp>
 +
{
 +
    if (correctPhi)
 +
    {
 +
        rAU.ref() = 1.0/UEqn.A();
 +
    }
 +
    else
 +
    {
 +
        rAU = 1.0/UEqn.A();
 +
    }
 +
 
 +
    surfaceScalarField rAUf("rAUf", fvc::interpolate(rAU()));
 +
    volVectorField HbyA(constrainHbyA(rAU()*UEqn.H(), U, p_rgh));
 +
    surfaceScalarField phiHbyA
 +
    (
 +
        "phiHbyA",
 +
        fvc::flux(HbyA)
 +
      + MRF.zeroFilter(fvc::interpolate(rho*rAU())*fvc::ddtCorr(U, phi, Uf))
 +
    );
 +
    MRF.makeRelative(phiHbyA);
 +
 
 +
    if (p_rgh.needReference())
 +
    {
 +
        fvc::makeRelative(phiHbyA, U);
 +
        adjustPhi(phiHbyA, U, p_rgh);
 +
        fvc::makeAbsolute(phiHbyA, U);
 +
    }
 +
 
 +
    surfaceScalarField phig
 +
    (
 +
        (
 +
            mixture.surfaceTensionForce()
 +
          - ghf*fvc::snGrad(rho)
 +
        )*rAUf*mesh.magSf()
 +
    );
 +
 
 +
    phiHbyA += phig;
 +
 
 +
    // Update the pressure BCs to ensure flux consistency
 +
    constrainPressure(p_rgh, U, phiHbyA, rAUf, MRF);
 +
 
 +
    while (pimple.correctNonOrthogonal())
 +
    {
 +
        fvScalarMatrix p_rghEqn
 +
        (
 +
            fvm::laplacian(rAUf, p_rgh) == fvc::div(phiHbyA)
 +
        );
 +
 
 +
        p_rghEqn.setReference(pRefCell, getRefCellValue(p_rgh, pRefCell));
 +
 
 +
        p_rghEqn.solve(mesh.solver(p_rgh.select(pimple.finalInnerIter())));
 +
 
 +
        if (pimple.finalNonOrthogonalIter())
 +
        {
 +
            phi = phiHbyA - p_rghEqn.flux();
 +
 
 +
            p_rgh.relax();
 +
 
 +
            U = HbyA + rAU()*fvc::reconstruct((phig - p_rghEqn.flux())/rAUf);
 +
            U.correctBoundaryConditions();
 +
            fvOptions.correct(U);
 +
        }
 +
    }
 +
 
 +
    #include "continuityErrs.H"
 +
 
 +
    // Correct Uf if the mesh is moving
 +
    fvc::correctUf(Uf, U, phi);
 +
 
 +
    // Make the fluxes relative to the mesh motion
 +
    fvc::makeRelative(phi, U);
 +
 
 +
    p == p_rgh + rho*gh;
 +
 
 +
    if (p_rgh.needReference())
 +
    {
 +
        p += dimensionedScalar
 +
        (
 +
            "p",
 +
            p.dimensions(),
 +
            pRefValue - getRefCellValue(p, pRefCell)
 +
        );
 +
        p_rgh = p - rho*gh;
 +
    }
 +
 
 +
    if (!correctPhi)
 +
    {
 +
        rAU.clear();
 +
    }
 +
}
 +
 
 +
 
 +
</cpp><br>
 +
 
 +
 
 +
===alphaEqn.H===
 +
 
 +
<br><cpp>
 +
 
 +
{
 +
    word alphaScheme("div(phi,alpha)");
 +
    word alpharScheme("div(phirb,alpha)");
 +
 
 +
    // Set the off-centering coefficient according to ddt scheme
 +
    scalar ocCoeff = 0;
 +
    {
 +
        tmp<fv::ddtScheme<scalar>> tddtAlpha
 +
        (
 +
            fv::ddtScheme<scalar>::New
 +
            (
 +
                mesh,
 +
                mesh.ddtScheme("ddt(alpha)")
 +
            )
 +
        );
 +
        const fv::ddtScheme<scalar>& ddtAlpha = tddtAlpha();
 +
 
 +
        if
 +
        (
 +
            isType<fv::EulerDdtScheme<scalar>>(ddtAlpha)
 +
        || isType<fv::localEulerDdtScheme<scalar>>(ddtAlpha)
 +
        )
 +
        {
 +
            ocCoeff = 0;
 +
        }
 +
        else if (isType<fv::CrankNicolsonDdtScheme<scalar>>(ddtAlpha))
 +
        {
 +
            if (nAlphaSubCycles > 1)
 +
            {
 +
                FatalErrorInFunction
 +
                    << "Sub-cycling is not supported "
 +
                      "with the CrankNicolson ddt scheme"
 +
                    << exit(FatalError);
 +
            }
 +
 
 +
            if
 +
            (
 +
                alphaRestart
 +
            || mesh.time().timeIndex() > mesh.time().startTimeIndex() + 1
 +
            )
 +
            {
 +
                ocCoeff =
 +
                    refCast<const fv::CrankNicolsonDdtScheme<scalar>>(ddtAlpha)
 +
                  .ocCoeff();
 +
            }
 +
        }
 +
        else
 +
        {
 +
            FatalErrorInFunction
 +
                << "Only Euler and CrankNicolson ddt schemes are supported"
 +
                << exit(FatalError);
 +
        }
 +
    }
 +
 
 +
    // Set the time blending factor, 1 for Euler
 +
    scalar cnCoeff = 1.0/(1.0 + ocCoeff);
 +
 
 +
    // Standard face-flux compression coefficient
 +
    surfaceScalarField phic(mixture.cAlpha()*mag(phi/mesh.magSf()));
 +
 
 +
    // Add the optional isotropic compression contribution
 +
    if (icAlpha > 0)
 +
    {
 +
        phic *= (1.0 - icAlpha);
 +
        phic += (mixture.cAlpha()*icAlpha)*fvc::interpolate(mag(U));
 +
    }
 +
 
 +
    // Add the optional shear compression contribution
 +
    if (scAlpha > 0)
 +
    {
 +
        phic +=
 +
            scAlpha*mag(mesh.delta() & fvc::interpolate(symm(fvc::grad(U))));
 +
    }
 +
 
 +
 
 +
    surfaceScalarField::Boundary& phicBf =
 +
        phic.boundaryFieldRef();
 +
 
 +
    // Do not compress interface at non-coupled boundary faces
 +
    // (inlets, outlets etc.)
 +
    forAll(phic.boundaryField(), patchi)
 +
    {
 +
        fvsPatchScalarField& phicp = phicBf[patchi];
 +
 
 +
        if (!phicp.coupled())
 +
        {
 +
            phicp == 0;
 +
        }
 +
    }
 +
 
 +
    tmp<surfaceScalarField> phiCN(phi);
 +
 
 +
    // Calculate the Crank-Nicolson off-centred volumetric flux
 +
    if (ocCoeff > 0)
 +
    {
 +
        phiCN = cnCoeff*phi + (1.0 - cnCoeff)*phi.oldTime();
 +
    }
 +
 
 +
    if (MULESCorr)
 +
    {
 +
        #include "alphaSuSp.H"
 +
 
 +
        fvScalarMatrix alpha1Eqn
 +
        (
 +
            (
 +
                LTS
 +
              ? fv::localEulerDdtScheme<scalar>(mesh).fvmDdt(alpha1)
 +
              : fv::EulerDdtScheme<scalar>(mesh).fvmDdt(alpha1)
 +
            )
 +
          + fv::gaussConvectionScheme<scalar>
 +
            (
 +
                mesh,
 +
                phiCN,
 +
                upwind<scalar>(mesh, phiCN)
 +
            ).fvmDiv(phiCN, alpha1)
 +
      // - fvm::Sp(fvc::ddt(dimensionedScalar("1", dimless, 1), mesh)
 +
      //          + fvc::div(phiCN), alpha1)
 +
        ==
 +
            Su + fvm::Sp(Sp + divU, alpha1)
 +
        );
 +
 
 +
        alpha1Eqn.solve();
 +
 
 +
        Info<< "Phase-1 volume fraction = "
 +
            << alpha1.weightedAverage(mesh.Vsc()).value()
 +
            << "  Min(" << alpha1.name() << ") = " << min(alpha1).value()
 +
            << "  Max(" << alpha1.name() << ") = " << max(alpha1).value()
 +
            << endl;
 +
 
 +
        tmp<surfaceScalarField> talphaPhi1UD(alpha1Eqn.flux());
 +
        alphaPhi10 = talphaPhi1UD();
 +
 
 +
        if (alphaApplyPrevCorr && talphaPhi1Corr0.valid())
 +
        {
 +
            Info<< "Applying the previous iteration compression flux" << endl;
 +
            MULES::correct
 +
            (
 +
                geometricOneField(),
 +
                alpha1,
 +
                alphaPhi10,
 +
                talphaPhi1Corr0.ref(),
 +
                oneField(),
 +
                zeroField()
 +
            );
 +
 
 +
            alphaPhi10 += talphaPhi1Corr0();
 +
        }
 +
 
 +
        // Cache the upwind-flux
 +
        talphaPhi1Corr0 = talphaPhi1UD;
 +
 
 +
        alpha2 = 1.0 - alpha1;
 +
 
 +
        mixture.correct();
 +
    }
 +
 
 +
 
 +
    for (int aCorr=0; aCorr<nAlphaCorr; aCorr++)
 +
    {
 +
        #include "alphaSuSp.H"
 +
 
 +
        surfaceScalarField phir(phic*mixture.nHatf());
 +
 
 +
        tmp<surfaceScalarField> talphaPhi1Un
 +
        (
 +
            fvc::flux
 +
            (
 +
                phiCN(),
 +
                cnCoeff*alpha1 + (1.0 - cnCoeff)*alpha1.oldTime(),
 +
                alphaScheme
 +
            )
 +
          + fvc::flux
 +
            (
 +
              -fvc::flux(-phir, alpha2, alpharScheme),
 +
                alpha1,
 +
                alpharScheme
 +
            )
 +
        );
 +
 
 +
        if (MULESCorr)
 +
        {
 +
            tmp<surfaceScalarField> talphaPhi1Corr(talphaPhi1Un() - alphaPhi10);
 +
            volScalarField alpha10("alpha10", alpha1);
 +
 
 +
            MULES::correct
 +
            (
 +
                geometricOneField(),
 +
                alpha1,
 +
                talphaPhi1Un(),
 +
                talphaPhi1Corr.ref(),
 +
                Sp,
 +
                (-Sp*alpha1)(),
 +
                oneField(),
 +
                zeroField()
 +
            );
 +
 
 +
            // Under-relax the correction for all but the 1st corrector
 +
            if (aCorr == 0)
 +
            {
 +
                alphaPhi10 += talphaPhi1Corr();
 +
            }
 +
            else
 +
            {
 +
                alpha1 = 0.5*alpha1 + 0.5*alpha10;
 +
                alphaPhi10 += 0.5*talphaPhi1Corr();
 +
            }
 +
        }
 +
        else
 +
        {
 +
            alphaPhi10 = talphaPhi1Un;
 +
 
 +
            MULES::explicitSolve
 +
            (
 +
                geometricOneField(),
 +
                alpha1,
 +
                phiCN,
 +
                alphaPhi10,
 +
                Sp,
 +
                (Su + divU*min(alpha1(), scalar(1)))(),
 +
                oneField(),
 +
                zeroField()
 +
            );
 +
        }
 +
 
 +
        alpha2 = 1.0 - alpha1;
 +
 
 +
        mixture.correct();
 +
    }
 +
 
 +
    if (alphaApplyPrevCorr && MULESCorr)
 +
    {
 +
        talphaPhi1Corr0 = alphaPhi10 - talphaPhi1Corr0;
 +
        talphaPhi1Corr0.ref().rename("alphaPhi1Corr0");
 +
    }
 +
    else
 +
    {
 +
        talphaPhi1Corr0.clear();
 +
    }
 +
 
 +
    #include "rhofs.H"
 +
 
 +
    if
 +
    (
 +
        word(mesh.ddtScheme("ddt(rho,U)"))
 +
    == fv::EulerDdtScheme<vector>::typeName
 +
    || word(mesh.ddtScheme("ddt(rho,U)"))
 +
    == fv::localEulerDdtScheme<vector>::typeName
 +
    )
 +
    {
 +
        rhoPhi = alphaPhi10*(rho1f - rho2f) + phiCN*rho2f;
 +
    }
 +
    else
 +
    {
 +
        if (ocCoeff > 0)
 +
        {
 +
            // Calculate the end-of-time-step alpha flux
 +
            alphaPhi10 =
 +
                (alphaPhi10 - (1.0 - cnCoeff)*alphaPhi10.oldTime())/cnCoeff;
 +
        }
 +
 
 +
        // Calculate the end-of-time-step mass flux
 +
        rhoPhi = alphaPhi10*(rho1f - rho2f) + phi*rho2f;
 +
    }
 +
 
 +
    Info<< "Phase-1 volume fraction = "
 +
        << alpha1.weightedAverage(mesh.Vsc()).value()
 +
        << "  Min(" << alpha1.name() << ") = " << min(alpha1).value()
 +
        << "  Max(" << alpha1.name() << ") = " << max(alpha1).value()
 +
        << endl;
 +
}
 +
 
 +
</cpp><br>
 +
 
 +
 
 +
==Validation==
 +
 
 +
In this section the validation performed in the literature a summarized.
 +
 
 +
<ref> Deshpande, S. S., Anumolu, L., & Trujillo, M. F. (2012). Evaluating the performance of the two-phase flow solver interFoam. Computational science & discovery, 5(1), 014016.</ref>
 +
Performed an accurate validation of interfoam. They found that:
 +
 
 +
"(i) Tests of kinematics showed excellent mass conservation and acceptable advection errors. For the notched
 +
disc in rotational flow, the rate of convergence was found to be close to unity. However, for a deforming
 +
globule, it was slightly improved (∼1.5). This is comparable to the existing methodologies, which
 +
have a similar degree of maturity. However, it is noticeably worse when compared with the latest
 +
algorithms which include subgrid level geometric reconstruction. In addition, a notable disparity is found
 +
between the local truncation and the global error.
 +
 
 +
(ii) The solver was tested on inertia-dominated flows and was found to perform extremely well.
 +
Even with modest grid resolutions, accurate physics was captured for the two unsteady problems. Similar
 +
observations have been presented in the literature for flows in this high Weber number regime.
 +
 
 +
(iii) In relation to surface tension-dominated flows, we performed several verification tests and showed that
 +
the momentum formulation in interFoam is indeed designed to yield a discrete balance between pressure
 +
gradient and surface tension. The performance of the solver is comparable with the face centered balanced
 +
force approach of Francois et al . An interesting finding in this work is regarding the amplification of
 +
magnitude spurious currents with the factor 1/ρ (section 3.3.1). It is shown that this factor amplifies
 +
an imbalance that originates from residuals in the solution of the pressure equation and not from any
 +
algorithmic inconsistencies.
 +
 
 +
(iv) Accuracy of curvature computation was also evaluated through a verification test involving a stationary
 +
2D droplet. The finding is that the average curvature and the average pressure jump across the interface
 +
do not converge to the analytical prediction. Such a convergence to a slightly erroneous value has already
 +
been reported in the literature [32] for VoF methods. These curvature errors, however, did not create any
 +
noticeable issues, and good agreement with experiments was obtained.
 +
 
 +
(v) Regarding spurious currents, following [66], we showed that for interFoam, the growth of spurious
 +
currents can be controlled by choosing a time step.
 +
 
 +
(vi) Finally, regarding computations that involved atomization, interFoam was able to capture the physics
 +
even with modest levels of grid resolution. This was exemplified in the test cases corresponding to a 2D
 +
standing capillary wave, Rayleigh breakup of a laminar jet and capillary retraction of a liquid jet."
 +
 
 +
==References==
 +
 
 +
<references/>
 +
 
 +
[[Category:Multiphase flow solvers]]

Latest revision as of 22:19, 28 December 2023

InterFoam Solver for 2 incompressible, isothermal immiscible fluids using a VOF

   (volume of fluid) phase-fraction based interface capturing approach,
   with optional mesh motion and mesh topology changes including adaptive
   re-meshing.


1 Related information in the web

1.1 Online discussion

1.2 Useful links

An overview about interfoam: https://www.cfdyna.com/Home/OpenFOAM/of_Tut_Web/of_Suites_Description.pdf

2 Equations

The solver solves the Navier Stokes equations for two incompressible, isothermal immiscible fluids. That means that the material properties are constant in the region filled by one of the two fluid except at the interphase.

2.1 Continuity Equation

The constant-density continuity equation is



   \frac{\partial {u}_j}{\partial x_j} = 0
(1)

2.2 Momentum Equation



    \frac{ \partial (\rho {u}_i)}{\partial t} + \frac{\partial}{\partial x_j} \left( \rho {u}_j u_i \right) = 

   - \frac{\partial p} {\partial{x_i}}  + \frac{\partial}{\partial x_j} \left( \tau_{ij} + \tau_{t_{ij}} \right) + \rho g_i + f_{\sigma i},
(2)

 u represent the velocity,  g_i the gravitational acceleration,  p the pressure and  \tau_{ij}  and  \tau_{t_{ij}}  are the viscose and turbulent stresses.  f_{\sigma i}, is the surface tension.


The density  \rho is defined as follows:



   \rho = \alpha  \rho_1 + (1 - \alpha)  \rho_2
(3)

 \alpha is 1 inside fluid 1 with the density  \rho_1 and 0 inside fluid 2 with the density  \rho_2  . At the interphase between the two fluids  \alpha varies between 0 and 1.

The surface tension  f_{\sigma i}, is modelled as continuum surface force (CSF)[1]. It is calculated as follows (see also [2]):



   f_{\sigma i} = \sigma \kappa \frac{\partial \alpha }{\partial x_i}

 \sigma is the surface tension constant and  \kappa the curvature. The curvature can be approximated as follows [3] and [4]:



\kappa = - \frac{\partial n_i}{\partial x_i} = - \frac{\partial}{\partial x_i} \left (  \frac{\partial \alpha / \partial x_i}{|\partial \alpha / \partial x_i|}\right )

2.3 Equation for the interphase

In order to know where the interphase between the two fluids is, an additional equation for  \alpha has to be solved.



 \frac{\partial \alpha}{\partial t}  +  \frac{\partial ( \alpha {u}_j )}{\partial x_j} = 0
(4)

The equation can be seen as the conservation of the mixture components along the path of a fluid parcel.

3 Source Code

\\OpenFOAM 6

3.1 interFoam.C


 
 
#include "fvCFD.H"
#include "dynamicFvMesh.H"
#include "CMULES.H"
#include "EulerDdtScheme.H"
#include "localEulerDdtScheme.H"
#include "CrankNicolsonDdtScheme.H"
#include "subCycle.H"
#include "immiscibleIncompressibleTwoPhaseMixture.H"
#include "turbulentTransportModel.H"
#include "pimpleControl.H"
#include "fvOptions.H"
#include "CorrectPhi.H"
#include "fvcSmooth.H"
 
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
int main(int argc, char *argv[])
{
    #include "postProcess.H"
 
    #include "setRootCaseLists.H"
    #include "createTime.H"
    #include "createDynamicFvMesh.H"
    #include "initContinuityErrs.H"
    #include "createDyMControls.H"
    #include "createFields.H"
    #include "createAlphaFluxes.H"
    #include "initCorrectPhi.H"
    #include "createUfIfPresent.H"
 
    turbulence->validate();
 
    if (!LTS)
    {
        #include "CourantNo.H"
        #include "setInitialDeltaT.H"
    }
 
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
    Info<< "\nStarting time loop\n" << endl;
 
    while (runTime.run())
    {
        #include "readDyMControls.H"
 
        if (LTS)
        {
            #include "setRDeltaT.H"
        }
        else
        {
            #include "CourantNo.H"
            #include "alphaCourantNo.H"
            #include "setDeltaT.H"
        }
 
        runTime++;
 
        Info<< "Time = " << runTime.timeName() << nl << endl;
 
        // --- Pressure-velocity PIMPLE corrector loop
        while (pimple.loop())
        {
            if (pimple.firstIter() || moveMeshOuterCorrectors)
            {
                mesh.update();
 
                if (mesh.changing())
                {
                    // Do not apply previous time-step mesh compression flux
                    // if the mesh topology changed
                    if (mesh.topoChanging())
                    {
                        talphaPhi1Corr0.clear();
                    }
 
                    gh = (g & mesh.C()) - ghRef;
                    ghf = (g & mesh.Cf()) - ghRef;
 
                    MRF.update();
 
                    if (correctPhi)
                    {
                        // Calculate absolute flux
                        // from the mapped surface velocity
                        phi = mesh.Sf() & Uf();
 
                        #include "correctPhi.H"
 
                        // Make the flux relative to the mesh motion
                        fvc::makeRelative(phi, U);
 
                        mixture.correct();
                    }
 
                    if (checkMeshCourantNo)
                    {
                        #include "meshCourantNo.H"
                    }
                }
            }
 
            #include "alphaControls.H"
            #include "alphaEqnSubCycle.H"
 
            mixture.correct();
 
            #include "UEqn.H"
 
            // --- Pressure corrector loop
            while (pimple.correct())
            {
                #include "pEqn.H"
            }
 
            if (pimple.turbCorr())
            {
                turbulence->correct();
            }
        }
 
        runTime.write();
 
        Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
            << "  ClockTime = " << runTime.elapsedClockTime() << " s"
            << nl << endl;
    }
 
    Info<< "End\n" << endl;
 
    return 0;
}
 
 
// ************************************************************************* //


3.2 UEqn.H


 
 
    MRF.correctBoundaryVelocity(U);
 
    fvVectorMatrix UEqn
    (
        fvm::ddt(rho, U) + fvm::div(rhoPhi, U)
      + MRF.DDt(rho, U)
      + turbulence->divDevRhoReff(rho, U)
     ==
        fvOptions(rho, U)
    );
 
    UEqn.relax();
 
    fvOptions.constrain(UEqn);
 
    if (pimple.momentumPredictor())
    {
        solve
        (
            UEqn
         ==
            fvc::reconstruct
            (
                (
                    mixture.surfaceTensionForce()
                  - ghf*fvc::snGrad(rho)
                  - fvc::snGrad(p_rgh)
                ) * mesh.magSf()
            )
        );
 
        fvOptions.correct(U);
    }
 


3.3 pEqn.H


 
{
    if (correctPhi)
    {
        rAU.ref() = 1.0/UEqn.A();
    }
    else
    {
        rAU = 1.0/UEqn.A();
    }
 
    surfaceScalarField rAUf("rAUf", fvc::interpolate(rAU()));
    volVectorField HbyA(constrainHbyA(rAU()*UEqn.H(), U, p_rgh));
    surfaceScalarField phiHbyA
    (
        "phiHbyA",
        fvc::flux(HbyA)
      + MRF.zeroFilter(fvc::interpolate(rho*rAU())*fvc::ddtCorr(U, phi, Uf))
    );
    MRF.makeRelative(phiHbyA);
 
    if (p_rgh.needReference())
    {
        fvc::makeRelative(phiHbyA, U);
        adjustPhi(phiHbyA, U, p_rgh);
        fvc::makeAbsolute(phiHbyA, U);
    }
 
    surfaceScalarField phig
    (
        (
            mixture.surfaceTensionForce()
          - ghf*fvc::snGrad(rho)
        )*rAUf*mesh.magSf()
    );
 
    phiHbyA += phig;
 
    // Update the pressure BCs to ensure flux consistency
    constrainPressure(p_rgh, U, phiHbyA, rAUf, MRF);
 
    while (pimple.correctNonOrthogonal())
    {
        fvScalarMatrix p_rghEqn
        (
            fvm::laplacian(rAUf, p_rgh) == fvc::div(phiHbyA)
        );
 
        p_rghEqn.setReference(pRefCell, getRefCellValue(p_rgh, pRefCell));
 
        p_rghEqn.solve(mesh.solver(p_rgh.select(pimple.finalInnerIter())));
 
        if (pimple.finalNonOrthogonalIter())
        {
            phi = phiHbyA - p_rghEqn.flux();
 
            p_rgh.relax();
 
            U = HbyA + rAU()*fvc::reconstruct((phig - p_rghEqn.flux())/rAUf);
            U.correctBoundaryConditions();
            fvOptions.correct(U);
        }
    }
 
    #include "continuityErrs.H"
 
    // Correct Uf if the mesh is moving
    fvc::correctUf(Uf, U, phi);
 
    // Make the fluxes relative to the mesh motion
    fvc::makeRelative(phi, U);
 
    p == p_rgh + rho*gh;
 
    if (p_rgh.needReference())
    {
        p += dimensionedScalar
        (
            "p",
            p.dimensions(),
            pRefValue - getRefCellValue(p, pRefCell)
        );
        p_rgh = p - rho*gh;
    }
 
    if (!correctPhi)
    {
        rAU.clear();
    }
}
 
 


3.4 alphaEqn.H


 
 
{
    word alphaScheme("div(phi,alpha)");
    word alpharScheme("div(phirb,alpha)");
 
    // Set the off-centering coefficient according to ddt scheme
    scalar ocCoeff = 0;
    {
        tmp<fv::ddtScheme<scalar>> tddtAlpha
        (
            fv::ddtScheme<scalar>::New
            (
                mesh,
                mesh.ddtScheme("ddt(alpha)")
            )
        );
        const fv::ddtScheme<scalar>& ddtAlpha = tddtAlpha();
 
        if
        (
            isType<fv::EulerDdtScheme<scalar>>(ddtAlpha)
         || isType<fv::localEulerDdtScheme<scalar>>(ddtAlpha)
        )
        {
            ocCoeff = 0;
        }
        else if (isType<fv::CrankNicolsonDdtScheme<scalar>>(ddtAlpha))
        {
            if (nAlphaSubCycles > 1)
            {
                FatalErrorInFunction
                    << "Sub-cycling is not supported "
                       "with the CrankNicolson ddt scheme"
                    << exit(FatalError);
            }
 
            if
            (
                alphaRestart
             || mesh.time().timeIndex() > mesh.time().startTimeIndex() + 1
            )
            {
                ocCoeff =
                    refCast<const fv::CrankNicolsonDdtScheme<scalar>>(ddtAlpha)
                   .ocCoeff();
            }
        }
        else
        {
            FatalErrorInFunction
                << "Only Euler and CrankNicolson ddt schemes are supported"
                << exit(FatalError);
        }
    }
 
    // Set the time blending factor, 1 for Euler
    scalar cnCoeff = 1.0/(1.0 + ocCoeff);
 
    // Standard face-flux compression coefficient
    surfaceScalarField phic(mixture.cAlpha()*mag(phi/mesh.magSf()));
 
    // Add the optional isotropic compression contribution
    if (icAlpha > 0)
    {
        phic *= (1.0 - icAlpha);
        phic += (mixture.cAlpha()*icAlpha)*fvc::interpolate(mag(U));
    }
 
    // Add the optional shear compression contribution
    if (scAlpha > 0)
    {
        phic +=
            scAlpha*mag(mesh.delta() & fvc::interpolate(symm(fvc::grad(U))));
    }
 
 
    surfaceScalarField::Boundary& phicBf =
        phic.boundaryFieldRef();
 
    // Do not compress interface at non-coupled boundary faces
    // (inlets, outlets etc.)
    forAll(phic.boundaryField(), patchi)
    {
        fvsPatchScalarField& phicp = phicBf[patchi];
 
        if (!phicp.coupled())
        {
            phicp == 0;
        }
    }
 
    tmp<surfaceScalarField> phiCN(phi);
 
    // Calculate the Crank-Nicolson off-centred volumetric flux
    if (ocCoeff > 0)
    {
        phiCN = cnCoeff*phi + (1.0 - cnCoeff)*phi.oldTime();
    }
 
    if (MULESCorr)
    {
        #include "alphaSuSp.H"
 
        fvScalarMatrix alpha1Eqn
        (
            (
                LTS
              ? fv::localEulerDdtScheme<scalar>(mesh).fvmDdt(alpha1)
              : fv::EulerDdtScheme<scalar>(mesh).fvmDdt(alpha1)
            )
          + fv::gaussConvectionScheme<scalar>
            (
                mesh,
                phiCN,
                upwind<scalar>(mesh, phiCN)
            ).fvmDiv(phiCN, alpha1)
       // - fvm::Sp(fvc::ddt(dimensionedScalar("1", dimless, 1), mesh)
       //           + fvc::div(phiCN), alpha1)
         ==
            Su + fvm::Sp(Sp + divU, alpha1)
        );
 
        alpha1Eqn.solve();
 
        Info<< "Phase-1 volume fraction = "
            << alpha1.weightedAverage(mesh.Vsc()).value()
            << "  Min(" << alpha1.name() << ") = " << min(alpha1).value()
            << "  Max(" << alpha1.name() << ") = " << max(alpha1).value()
            << endl;
 
        tmp<surfaceScalarField> talphaPhi1UD(alpha1Eqn.flux());
        alphaPhi10 = talphaPhi1UD();
 
        if (alphaApplyPrevCorr && talphaPhi1Corr0.valid())
        {
            Info<< "Applying the previous iteration compression flux" << endl;
            MULES::correct
            (
                geometricOneField(),
                alpha1,
                alphaPhi10,
                talphaPhi1Corr0.ref(),
                oneField(),
                zeroField()
            );
 
            alphaPhi10 += talphaPhi1Corr0();
        }
 
        // Cache the upwind-flux
        talphaPhi1Corr0 = talphaPhi1UD;
 
        alpha2 = 1.0 - alpha1;
 
        mixture.correct();
    }
 
 
    for (int aCorr=0; aCorr<nAlphaCorr; aCorr++)
    {
        #include "alphaSuSp.H"
 
        surfaceScalarField phir(phic*mixture.nHatf());
 
        tmp<surfaceScalarField> talphaPhi1Un
        (
            fvc::flux
            (
                phiCN(),
                cnCoeff*alpha1 + (1.0 - cnCoeff)*alpha1.oldTime(),
                alphaScheme
            )
          + fvc::flux
            (
               -fvc::flux(-phir, alpha2, alpharScheme),
                alpha1,
                alpharScheme
            )
        );
 
        if (MULESCorr)
        {
            tmp<surfaceScalarField> talphaPhi1Corr(talphaPhi1Un() - alphaPhi10);
            volScalarField alpha10("alpha10", alpha1);
 
            MULES::correct
            (
                geometricOneField(),
                alpha1,
                talphaPhi1Un(),
                talphaPhi1Corr.ref(),
                Sp,
                (-Sp*alpha1)(),
                oneField(),
                zeroField()
            );
 
            // Under-relax the correction for all but the 1st corrector
            if (aCorr == 0)
            {
                alphaPhi10 += talphaPhi1Corr();
            }
            else
            {
                alpha1 = 0.5*alpha1 + 0.5*alpha10;
                alphaPhi10 += 0.5*talphaPhi1Corr();
            }
        }
        else
        {
            alphaPhi10 = talphaPhi1Un;
 
            MULES::explicitSolve
            (
                geometricOneField(),
                alpha1,
                phiCN,
                alphaPhi10,
                Sp,
                (Su + divU*min(alpha1(), scalar(1)))(),
                oneField(),
                zeroField()
            );
        }
 
        alpha2 = 1.0 - alpha1;
 
        mixture.correct();
    }
 
    if (alphaApplyPrevCorr && MULESCorr)
    {
        talphaPhi1Corr0 = alphaPhi10 - talphaPhi1Corr0;
        talphaPhi1Corr0.ref().rename("alphaPhi1Corr0");
    }
    else
    {
        talphaPhi1Corr0.clear();
    }
 
    #include "rhofs.H"
 
    if
    (
        word(mesh.ddtScheme("ddt(rho,U)"))
     == fv::EulerDdtScheme<vector>::typeName
     || word(mesh.ddtScheme("ddt(rho,U)"))
     == fv::localEulerDdtScheme<vector>::typeName
    )
    {
        rhoPhi = alphaPhi10*(rho1f - rho2f) + phiCN*rho2f;
    }
    else
    {
        if (ocCoeff > 0)
        {
            // Calculate the end-of-time-step alpha flux
            alphaPhi10 =
                (alphaPhi10 - (1.0 - cnCoeff)*alphaPhi10.oldTime())/cnCoeff;
        }
 
        // Calculate the end-of-time-step mass flux
        rhoPhi = alphaPhi10*(rho1f - rho2f) + phi*rho2f;
    }
 
    Info<< "Phase-1 volume fraction = "
        << alpha1.weightedAverage(mesh.Vsc()).value()
        << "  Min(" << alpha1.name() << ") = " << min(alpha1).value()
        << "  Max(" << alpha1.name() << ") = " << max(alpha1).value()
        << endl;
}
 


4 Validation

In this section the validation performed in the literature a summarized.

[5] Performed an accurate validation of interfoam. They found that:

"(i) Tests of kinematics showed excellent mass conservation and acceptable advection errors. For the notched disc in rotational flow, the rate of convergence was found to be close to unity. However, for a deforming globule, it was slightly improved (∼1.5). This is comparable to the existing methodologies, which have a similar degree of maturity. However, it is noticeably worse when compared with the latest algorithms which include subgrid level geometric reconstruction. In addition, a notable disparity is found between the local truncation and the global error.

(ii) The solver was tested on inertia-dominated flows and was found to perform extremely well. Even with modest grid resolutions, accurate physics was captured for the two unsteady problems. Similar observations have been presented in the literature for flows in this high Weber number regime.

(iii) In relation to surface tension-dominated flows, we performed several verification tests and showed that the momentum formulation in interFoam is indeed designed to yield a discrete balance between pressure gradient and surface tension. The performance of the solver is comparable with the face centered balanced force approach of Francois et al . An interesting finding in this work is regarding the amplification of magnitude spurious currents with the factor 1/ρ (section 3.3.1). It is shown that this factor amplifies an imbalance that originates from residuals in the solution of the pressure equation and not from any algorithmic inconsistencies.

(iv) Accuracy of curvature computation was also evaluated through a verification test involving a stationary 2D droplet. The finding is that the average curvature and the average pressure jump across the interface do not converge to the analytical prediction. Such a convergence to a slightly erroneous value has already been reported in the literature [32] for VoF methods. These curvature errors, however, did not create any noticeable issues, and good agreement with experiments was obtained.

(v) Regarding spurious currents, following [66], we showed that for interFoam, the growth of spurious currents can be controlled by choosing a time step.

(vi) Finally, regarding computations that involved atomization, interFoam was able to capture the physics even with modest levels of grid resolution. This was exemplified in the test cases corresponding to a 2D standing capillary wave, Rayleigh breakup of a laminar jet and capillary retraction of a liquid jet."

5 References

  1. Brackbill, J. U., Douglas B. Kothe, and Charles Zemach. "A continuum method for modeling surface tension." Journal of computational physics 100.2 (1992): 335-354.
  2. Heyns, Johan A., and Oliver F. Oxtoby. "Modelling surface tension dominated multiphase flows using the VOF approach." 6th European Conference on Computational Fluid Dynamics. 2014.
  3. Brackbill, J. U., Douglas B. Kothe, and Charles Zemach. "A continuum method for modeling surface tension." Journal of computational physics 100.2 (1992): 335-354.
  4. Heyns, Johan A., and Oliver F. Oxtoby. "Modelling surface tension dominated multiphase flows using the VOF approach." 6th European Conference on Computational Fluid Dynamics. 2014.
  5. Deshpande, S. S., Anumolu, L., & Trujillo, M. F. (2012). Evaluating the performance of the two-phase flow solver interFoam. Computational science & discovery, 5(1), 014016.