bubble-dynamics

Spherical bubble dynamics simulator
git clone https://git.0xfab.ch/bubble-dynamics.git
Log | Files | Refs | README | LICENSE

commit d6cbc0743dea18ee64a56180a8150560ed138d38
parent f9f501b7c18e3b190677bc5b961b225bb074f588
Author: Fabian Wermelinger <fabianw@mavt.ethz.ch>
Date:   Sat, 19 Dec 2020 23:13:18 +0100

Remove _POS_STATE_ dependencies

Diffstat:
Msrc/bubbleDynamics.cpp | 196++++++++++++++++++++++++++++++++++++++-----------------------------------------
Msrc/kernels.h | 4----
Msrc/meson.build | 5-----
3 files changed, 95 insertions(+), 110 deletions(-)

diff --git a/src/bubbleDynamics.cpp b/src/bubbleDynamics.cpp @@ -9,12 +9,14 @@ #include <kernels.h> #include <cassert> -#include <cstdio> -#include <iostream> -#include <iomanip> -#include <fstream> #include <cmath> +#include <cstdio> #include <ctime> +#include <fstream> +#include <iomanip> +#include <iostream> +#include <memory> +#include <stdexcept> using namespace std; @@ -34,104 +36,17 @@ void say_hello(const int argc, const char * argv[]) cout << endl; } -template <typename Tinput, typename Trhs=Tinput> -KernelBase<Tinput,Trhs>* kernelFactory(ArgumentParser& parser, Tinput& U, BubbleData& simConfig) -{ - int yeaBinary; - if (parser("-binary").asBool(false)) - yeaBinary = GnuplotDump::BIN; - else - yeaBinary = GnuplotDump::ASCII; - -#ifndef _POS_STATE_ - if (parser("-dynamics").asString("rp") == "rp") - { - RayleighPlesset<Tinput,Trhs>::IC(U, simConfig); - return new RayleighPlesset<Tinput,Trhs>(U.size(), yeaBinary); - } - else if (parser("-dynamics").asString("rp") == "hbgl") - { - RayleighPlesset_HBGL<Tinput,Trhs>::IC(U, simConfig); - return new RayleighPlesset_HBGL<Tinput,Trhs>(U.size(), yeaBinary); - } - else if (parser("-dynamics").asString("rp") == "km") - { - KellerMiksis<Tinput,Trhs>::IC(U, simConfig); - return new KellerMiksis<Tinput,Trhs>(U.size(), yeaBinary); - } -#ifdef _USE_EIGEN_ - else if (parser("-dynamics").asString("rp") == "kmcluster") - { - KMCluster_TY<Tinput,Trhs>::IC(U, simConfig); - return new KMCluster_TY<Tinput,Trhs>(U.size(), yeaBinary); - } - else if (parser("-dynamics").asString("rp") == "kmcluster-fc") - { - KMCluster_FC<Tinput,Trhs>::IC(U, simConfig); - return new KMCluster_FC<Tinput,Trhs>(U.size(), yeaBinary); - } - else if (parser("-dynamics").asString("rp") == "rpcluster") - { - RPCluster<Tinput,Trhs>::IC(U, simConfig); - return new RPCluster<Tinput,Trhs>(U.size(), yeaBinary); - } -#endif - else - return nullptr; -#else - if (parser("-dynamics").asString("rp") == "rpcluster-positions") - { - RPClusterPositions_D<Tinput,Trhs>::IC(U, simConfig); - return new RPClusterPositions_D<Tinput,Trhs>(U.size(), yeaBinary); - } - else if (parser("-dynamics").asString("rp") == "kmcluster-positions") - { - KMClusterPositions_D<Tinput,Trhs>::IC(U, simConfig); - return new KMClusterPositions_D<Tinput,Trhs>(U.size(), yeaBinary); - } - else - return nullptr; -#endif -} - -template <typename Tinput, typename Trhs=Tinput> -StepperBase<Tinput,Trhs>* stepperFactory(ArgumentParser& p, Tinput& U, StepperSettings& S, BubbleData& D) -{ - KernelBase<Tinput,Trhs> * const kern = kernelFactory<Tinput,Trhs>(p, U, D); - assert(kern != nullptr); - return S.template stepperFactory<Tinput,Trhs>(p, U, kern); -} - - -int main(int argc, const char** argv) +template <typename T> +void run(ArgumentParser &parser, + StepperSettings &stepperData, + BubbleData &simConfig, + StepperBase<T> *const stepper) { - say_hello(argc, argv); - - // Parameter - ArgumentParser parser(argc, argv); - if (parser.exist("-conf")) parser.readFile(parser("-conf").asString()); - parser.print_args(); - - // set user specific data - StepperSettings stepperData(parser); - BubbleData simConfig(parser); - - // set up solution vector -#if (_POS_STATE_ && _USE_EIGEN_) - typedef State<Real,8> State8; - using vec_t = LightVector<State8>; -#else - typedef State<Real,2> State2; - using vec_t = LightVector<State2>; -#endif - vec_t U(simConfig.Nbubbles); - - // Select stepper and kernel - StepperBase<vec_t> * const stepper = stepperFactory<vec_t>(parser, U, stepperData, simConfig); - assert(stepper != nullptr); - simConfig.print(); + using vec_t = T; + T &U = stepper->U(); + size_t& step = stepperData.step; Real& t = stepperData.t; Real& dt = stepperData.dt; @@ -187,9 +102,88 @@ int main(int argc, const char** argv) printf("\nFinal Time = %e;\nFinal Step = %zu\n", stepperData.t, stepperData.step); +} + +int main(int argc, const char **argv) +{ + say_hello(argc, argv); - stepper->dispose(); - delete stepper; + // Parameter + ArgumentParser parser(argc, argv); + if (parser.exist("-conf")) + parser.readFile(parser("-conf").asString()); + parser.print_args(); + + // set user specific data + StepperSettings stepperData(parser); + BubbleData simConfig(parser); + int binary_dump; + if (parser("-binary").asBool(false)) + binary_dump = GnuplotDump::BIN; + else + binary_dump = GnuplotDump::ASCII; + + if (parser("-dynamics").asString("rp") == "rpcluster-positions" || + parser("-dynamics").asString("rp") == "kmcluster-positions") { + // with additional 6 DoF for bubble translation (3 x and 3 \dot{x}) + using TVec = LightVector<State<Real, 8>>; + + // Select stepper and kernel + TVec U(simConfig.Nbubbles); + std::unique_ptr<KernelBase<TVec>> kern; + if (parser("-dynamics").asString("rp") == "rpcluster-positions") { + RPClusterPositions_D<TVec>::IC(U, simConfig); + kern.reset(new RPClusterPositions_D<TVec>(U.size(), binary_dump)); + } else if (parser("-dynamics").asString("rp") == + "kmcluster-positions") { + KMClusterPositions_D<TVec>::IC(U, simConfig); + kern.reset(new KMClusterPositions_D<TVec>(U.size(), binary_dump)); + } else { + throw std::runtime_error("Unknown kernel: " + + parser("-dynamics").asString("rp")); + } + + std::unique_ptr<StepperBase<TVec>> stepper( + stepperData.template stepperFactory<TVec>(parser, U, kern.get())); + assert(stepper != nullptr); + + run<TVec>(parser, stepperData, simConfig, stepper.get()); + } else { + // regular R and \dot{R} state + using TVec = LightVector<State<Real, 2>>; + + // Select stepper and kernel + TVec U(simConfig.Nbubbles); + std::unique_ptr<KernelBase<TVec>> kern; + if (parser("-dynamics").asString("rp") == "rp") { + RayleighPlesset<TVec>::IC(U, simConfig); + kern.reset(new RayleighPlesset<TVec>(U.size(), binary_dump)); + } else if (parser("-dynamics").asString("rp") == "hbgl") { + RayleighPlesset_HBGL<TVec>::IC(U, simConfig); + kern.reset(new RayleighPlesset_HBGL<TVec>(U.size(), binary_dump)); + } else if (parser("-dynamics").asString("rp") == "km") { + KellerMiksis<TVec>::IC(U, simConfig); + kern.reset(new KellerMiksis<TVec>(U.size(), binary_dump)); + } else if (parser("-dynamics").asString("rp") == "kmcluster") { + KMCluster_TY<TVec>::IC(U, simConfig); + kern.reset(new KMCluster_TY<TVec>(U.size(), binary_dump)); + } else if (parser("-dynamics").asString("rp") == "kmcluster-fc") { + KMCluster_FC<TVec>::IC(U, simConfig); + kern.reset(new KMCluster_FC<TVec>(U.size(), binary_dump)); + } else if (parser("-dynamics").asString("rp") == "rpcluster") { + RPCluster<TVec>::IC(U, simConfig); + kern.reset(new RPCluster<TVec>(U.size(), binary_dump)); + } else { + throw std::runtime_error("Unknown kernel: " + + parser("-dynamics").asString("rp")); + } + + std::unique_ptr<StepperBase<TVec>> stepper( + stepperData.template stepperFactory<TVec>(parser, U, kern.get())); + assert(stepper != nullptr); + + run<TVec>(parser, stepperData, simConfig, stepper.get()); + } return 0; } diff --git a/src/kernels.h b/src/kernels.h @@ -9,14 +9,10 @@ #include <kernels/KellerMiksis.h> #include <kernels/RayleighPlesset.h> #include <kernels/RayleighPlesset_HBGL.h> -#ifdef _USE_EIGEN_ #include <kernels/KMCluster_FC.h> #include <kernels/KMCluster_TY.h> #include <kernels/RPCluster.h> -#ifdef _POS_STATE_ #include <kernels/KMClusterPositions_D.h> #include <kernels/RPClusterPositions_D.h> -#endif -#endif #endif /* KERNELS_H_KY4W86QV */ diff --git a/src/meson.build b/src/meson.build @@ -1,12 +1,7 @@ -cpp_args = ['-D_USE_EIGEN_'] eigen_dependency = dependency('eigen3', fallback: ['eigen', 'eigen_dep']) -if get_option('position') - cpp_args += ['-D_POS_STATE_'] -endif rpbd = executable('rpbd', 'bubbleDynamics.cpp', include_directories: 'kernels', - cpp_args: cpp_args, dependencies: [lib_ode_deps, eigen_dependency], cpp_pch: 'pch/bubbleDynamics.h', install: true,