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 }