bubble-dynamics

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

bubbleDynamics.cpp (6364B)


      1 /* File:   bubbleDynamics.cpp */
      2 /* Date:   Tue Jan 12 22:04:58 2016 */
      3 /* Author: Fabian Wermelinger */
      4 /* Tag:    Solve 1D bubble dynamics */
      5 /* Copyright 2016 ETH Zurich. All Rights Reserved. */
      6 #include "kernels.h"
      7 
      8 #include <ODETB/GnuplotDump.h>
      9 #include <ODETB/TimeStepper/TimeStepper.h>
     10 #include <ODETB/common.h>
     11 
     12 #include <cassert>
     13 #include <cmath>
     14 #include <cstdio>
     15 #include <ctime>
     16 #include <fstream>
     17 #include <iomanip>
     18 #include <iostream>
     19 #include <memory>
     20 #include <stdexcept>
     21 
     22 using namespace std;
     23 
     24 
     25 void say_hello(const int argc, const char * argv[])
     26 {
     27     time_t rawtime;
     28     struct tm* timeinfo;
     29     time(&rawtime);
     30     timeinfo = localtime(&rawtime);
     31     char buf[256];
     32     strftime(buf, 256, "%A, %h %d %Y, %r", timeinfo);
     33     cout << "Hi! It is now " << buf << endl;
     34     cout << "Here is what you gave me: ";
     35     for (int i = 0; i < argc; ++i)
     36         cout << argv[i] << " ";
     37     cout << endl;
     38 }
     39 
     40 template <typename T>
     41 void run(ArgumentParser &parser,
     42          StepperSettings &stepperData,
     43          BubbleData &simConfig,
     44          StepperBase<T> *const stepper)
     45 {
     46     simConfig.print();
     47 
     48     using vec_t = T;
     49     T &U = stepper->U();
     50 
     51     size_t& step       = stepperData.step;
     52     Real& t            = stepperData.t;
     53     Real& dt           = stepperData.dt;
     54     const Real& tFinal = stepperData.tFinal;
     55     Real& tDump        = stepperData.tDump;
     56     if (stepperData.dtDump > 0.0) tDump = t + stepperData.dtDump;
     57 
     58 
     59     if (stepperData.bRestart)
     60     {
     61         deserialize<vec_t>(U, stepperData);
     62         std::cout << "-->RESTARING: Time = " << std::scientific << stepperData.t;
     63         std::cout << ";\tStep = " << std::fixed << stepperData.step << std::endl;
     64     }
     65     else
     66         stepper->write(step, t, dt, U, &simConfig);
     67 
     68 
     69     while (t < tFinal)
     70     {
     71         dt = (tFinal-t) < dt ? (tFinal-t) : dt;
     72         if (stepperData.dtDump > 0.0) dt = (tDump-t) < dt ? (tDump-t) : dt;
     73 
     74         stepper->step(&simConfig);
     75 
     76         if (stepperData.bFixedStep && stepperData.dtDump > 0.0)
     77         {
     78             if (t == tDump)
     79             {
     80                 stepper->write(step, t, dt, U, &simConfig);
     81                 tDump += stepperData.dtDump;
     82             }
     83         }
     84         else
     85             if (stepperData.bFixedStep && step % stepperData.writeGranularity == 0)
     86                 stepper->write(step, t, dt, U, &simConfig);
     87 
     88         if (stepperData.restartstep > 0 && step % stepperData.restartstep == 0)
     89             serialize<vec_t>(U, stepperData);
     90     }
     91 
     92     if (stepperData.dtDump > 0.0)
     93     {
     94         if (t != tDump)
     95             stepper->write(step, t, dt, U, &simConfig);
     96     }
     97     else
     98     {
     99         if (step % stepperData.writeGranularity != 0)
    100             stepper->write(step, t, dt, U, &simConfig);
    101     }
    102 
    103     printf("\nFinal Time = %e;\nFinal Step = %zu\n",
    104            stepperData.t,
    105            stepperData.step);
    106 }
    107 
    108 int main(int argc, const char **argv)
    109 {
    110     say_hello(argc, argv);
    111 
    112     // Parameter
    113     ArgumentParser parser(argc, argv);
    114     if (parser.exist("-conf"))
    115         parser.readFile(parser("-conf").asString());
    116     parser.print_args();
    117 
    118     // set user specific data
    119     StepperSettings stepperData(parser);
    120     BubbleData simConfig(parser);
    121 
    122     int binary_dump;
    123     if (parser("-binary").asBool(false))
    124         binary_dump = GnuplotDump::BIN;
    125     else
    126         binary_dump = GnuplotDump::ASCII;
    127 
    128     if (parser("-dynamics").asString("rp") == "rpcluster-positions" ||
    129         parser("-dynamics").asString("rp") == "kmcluster-positions") {
    130         // with additional 6 DoF for bubble translation (3 x and 3 \dot{x})
    131         using TVec = LightVector<State<Real, 8>>;
    132 
    133         // Select stepper and kernel
    134         TVec U(simConfig.Nbubbles);
    135         std::unique_ptr<KernelBase<TVec>> kern;
    136         if (parser("-dynamics").asString("rp") == "rpcluster-positions") {
    137             RPClusterPositions_D<TVec>::IC(U, simConfig);
    138             kern.reset(new RPClusterPositions_D<TVec>(U.size(), binary_dump));
    139         } else if (parser("-dynamics").asString("rp") ==
    140                    "kmcluster-positions") {
    141             KMClusterPositions_D<TVec>::IC(U, simConfig);
    142             kern.reset(new KMClusterPositions_D<TVec>(U.size(), binary_dump));
    143         } else {
    144             throw std::runtime_error("Unknown kernel: " +
    145                                      parser("-dynamics").asString("rp"));
    146         }
    147 
    148         std::unique_ptr<StepperBase<TVec>> stepper(
    149             stepperData.template stepperFactory<TVec>(parser, U, kern.get()));
    150         assert(stepper != nullptr);
    151 
    152         run<TVec>(parser, stepperData, simConfig, stepper.get());
    153     } else {
    154         // regular R and \dot{R} state
    155         using TVec = LightVector<State<Real, 2>>;
    156 
    157         // Select stepper and kernel
    158         TVec U(simConfig.Nbubbles);
    159         std::unique_ptr<KernelBase<TVec>> kern;
    160         if (parser("-dynamics").asString("rp") == "rp") {
    161             RayleighPlesset<TVec>::IC(U, simConfig);
    162             kern.reset(new RayleighPlesset<TVec>(U.size(), binary_dump));
    163         } else if (parser("-dynamics").asString("rp") == "hbgl") {
    164             RayleighPlesset_HBGL<TVec>::IC(U, simConfig);
    165             kern.reset(new RayleighPlesset_HBGL<TVec>(U.size(), binary_dump));
    166         } else if (parser("-dynamics").asString("rp") == "km") {
    167             KellerMiksis<TVec>::IC(U, simConfig);
    168             kern.reset(new KellerMiksis<TVec>(U.size(), binary_dump));
    169         } else if (parser("-dynamics").asString("rp") == "kmcluster") {
    170             KMCluster_TY<TVec>::IC(U, simConfig);
    171             kern.reset(new KMCluster_TY<TVec>(U.size(), binary_dump));
    172         } else if (parser("-dynamics").asString("rp") == "kmcluster-fc") {
    173             KMCluster_FC<TVec>::IC(U, simConfig);
    174             kern.reset(new KMCluster_FC<TVec>(U.size(), binary_dump));
    175         } else if (parser("-dynamics").asString("rp") == "rpcluster") {
    176             RPCluster<TVec>::IC(U, simConfig);
    177             kern.reset(new RPCluster<TVec>(U.size(), binary_dump));
    178         } else {
    179             throw std::runtime_error("Unknown kernel: " +
    180                                      parser("-dynamics").asString("rp"));
    181         }
    182 
    183         std::unique_ptr<StepperBase<TVec>> stepper(
    184             stepperData.template stepperFactory<TVec>(parser, U, kern.get()));
    185         assert(stepper != nullptr);
    186 
    187         run<TVec>(parser, stepperData, simConfig, stepper.get());
    188     }
    189     return 0;
    190 }