ChangingTOI.cpp File Reference
#include "Mercury3D.h"
#include "Walls/InfiniteWall.h"
#include "Species/LinearViscoelasticFrictionSpecies.h"
#include "Particles/ClumpParticle.h"
#include "../ClumpHeaders/ClumpInput.h"
#include "../ClumpHeaders/Mercury3DClump.h"
#include <stdlib.h>
#include <CMakeDefinitions.h>
#include <memory>

Classes

class  ChangingTOIParticle
 

Functions

std::string ExecCommand (const char *cmd)
 
Vec3D LoadInitOrient ()
 
Vec3D LoadFinalOrient ()
 
Double2DVector LoadIProfiles ()
 
int main (int argc, char *argv[])
 

Variables

Mdouble f_min = -10
 
Mdouble f_max = 10
 

Function Documentation

◆ ExecCommand()

std::string ExecCommand ( const char cmd)
21  {
22  std::array<char, 256> buffer;
23  std::string result;
24 
25  // Prepare a pipe to write a to execute a system command and read the result
26  std::unique_ptr<FILE, int(*)(FILE*)> pipe(popen(cmd, "r"), pclose);
27  if (!pipe) {
28  throw std::runtime_error("popen() failed!");
29  }
30  while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
31  result += buffer.data();
32  }
33  return result;
34 }
return int(ret)+1
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286

References int(), and oomph::Global_string_for_annotation::string().

Referenced by main().

◆ LoadFinalOrient()

Vec3D LoadFinalOrient ( )
257 {
258  std::cout<<"Read final orientation"<<std::endl;
259  // Load final orientation
260  std::ifstream infile((getMercuryDPMBuildDir() + "/Drivers/Clump/ChangingTOI/opt/final_orientation.txt").c_str(), std::ios::in | std::ios::binary);
261  char lin[256];
262  infile.getline(lin, 256, '\n');
263  std::string line(lin);
264  Mdouble theta = std::stof(line);
265  infile.getline(lin, 256, '\n');
266  std::string line2(lin);
267  Mdouble phi = std::stof(line2);
268  infile.close();
269  std::cout<<"LOADED FINAL ORIENTATION: theta = "<<theta<<", phi = "<<phi<<std::endl;
270  return Vec3D(sin(theta) * cos(phi), sin(theta) * sin(phi), cos(theta));
271 }
AnnoyingScalar cos(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:136
AnnoyingScalar sin(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:137
const std::string getMercuryDPMBuildDir()
Definition: Configuration/CMakeDefinitions.cc:15
Definition: Kernel/Math/Vector.h:30
double theta
Definition: two_d_biharmonic.cc:236
line
Definition: calibrate.py:103

References cos(), getMercuryDPMBuildDir(), calibrate::line, sin(), oomph::Global_string_for_annotation::string(), and BiharmonicTestFunctions2::theta.

Referenced by main().

◆ LoadInitOrient()

Vec3D LoadInitOrient ( )
241 {
242  std::cout<<"Read init orientation"<<std::endl;
243  // Load init orientation
244  std::ifstream infile((getMercuryDPMBuildDir() + "/Drivers/Clump/ChangingTOI/opt/init_orientation.txt").c_str(), std::ios::in | std::ios::binary);
245  char lin[256];
246  infile.getline(lin, 256, '\n');
247  std::string line(lin);
248  Mdouble theta = std::stof(line);
249  infile.getline(lin, 256, '\n');
250  std::string line2(lin);
251  Mdouble phi = std::stof(line2);
252  infile.close();
253  return Vec3D(sin(theta) * cos(phi), sin(theta) * sin(phi), cos(theta));
254 }

References cos(), getMercuryDPMBuildDir(), calibrate::line, sin(), oomph::Global_string_for_annotation::string(), and BiharmonicTestFunctions2::theta.

Referenced by main().

◆ LoadIProfiles()

Double2DVector LoadIProfiles ( )
274 {
275  std::cout<<"read inertia profile"<<std::endl;
276  // Load goal orientation
277  std::ifstream infile((getMercuryDPMBuildDir() + "/Drivers/Clump/ChangingTOI/opt/inertia_profiles.txt").c_str(), std::ios::in | std::ios::binary);
278  char lin[256];
279  Double2DVector i_profiles;
280  while (infile.getline(lin, 256, '\n')){
282  std::string line(lin);
283  line+=" ";
284  std::string buffer = "";
285  for ( int j = 0; j < line.size(); j++){
286  if (line[j] != ' ') {buffer += line[j];}
287  else {val.push_back(buffer); buffer = "";}
288  }
290  for (int i = 0; i < 7; i++){ row.push_back(std::stof(val[i])); }
291  i_profiles.push_back(row);
292  }
293  infile.close();
294  return i_profiles;
295 }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
std::vector< double > DoubleVector
loads clump configuration
Definition: ClumpInput.h:26
std::vector< std::string > StringVector
Definition: ClumpInput.h:28
std::vector< DoubleVector > Double2DVector
Definition: ClumpInput.h:27
m row(1)
val
Definition: calibrate.py:119
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References getMercuryDPMBuildDir(), i, j, calibrate::line, row(), oomph::Global_string_for_annotation::string(), and calibrate::val.

Referenced by main().

◆ main()

int main ( int argc  ,
char argv[] 
)
298 {
300  problem.init_orientation = LoadInitOrient();
301  problem.final_orientation = LoadFinalOrient();
302  problem.inertia_profiles = LoadIProfiles();
303 
304  // Get parameters passed through the command line
305  std::string a;
306  problem.progDuration = stod(helpers::readFromCommandLine(argc, argv, "-p1", a));
307  problem.symDuration = stod(helpers::readFromCommandLine(argc, argv, "-p2", a));
308  problem.baseAngVel = stod(helpers::readFromCommandLine(argc, argv, "-p3", a));
309 
310  auto species = problem.speciesHandler.copyAndAddObject(LinearViscoelasticFrictionSpecies());
311  species->setDensity(1.0); // sets the species type-0 density
312  species->setDissipation(0.0);
313  species->setStiffness(1e6);
314  const Mdouble collisionTime = species->getCollisionTime(problem.getClumpMass());
315  problem.setClumpDamping(0);
316  problem.setTimeStep(collisionTime/50 );
317  std::cout<<"TIMESTEP: "<< collisionTime/50 << std::endl;
318 
319  // Quick demonstration
320  problem.setSaveCount(500);
321  problem.setTimeMax(problem.symDuration);
322  problem.removeOldFiles();
323  problem.solve();
324  // Paraview data
325  ExecCommand("rm -rf paraview_ChangingTOI/");
326  ExecCommand("mkdir paraview_ChangingTOI/");
327  ExecCommand("../../../Tools/data2pvd ChangingTOI.data paraview_ChangingTOI/ChangingTOI");
328  std::string command;
329  command = "python " + getMercuryDPMSourceDir() + "/Tools/MClump/PlotEnergies.py " + getMercuryDPMBuildDir() + "/Drivers/Clump/ChangingTOI/ " + "ChangingTOI";
330  ExecCommand(command.c_str());
331 
332  // Return the functional via the text file
333  std::ofstream funct; funct.open ("opt/functional.txt");
334  funct << problem.functional;
335  funct.close();
336 
337  // Return current angles
338  std::ofstream angl; angl.open ("opt/angles.txt");
339  angl << problem.c_theta << std::endl;
340  angl << problem.c_phi <<std::endl;
341  angl.close();
342 
343  // Return the log of the angular momentum
344  std::ofstream mom; mom.open ("opt/momentum.txt");
345  for (int i = 0; i<problem.angularMomentumLog.size(); i+=500){mom <<problem.angularMomentumLog[i]<<std::endl;}
346  mom.close();
347  return 0;
348 }
std::string ExecCommand(const char *cmd)
Definition: ChangingTOI.cpp:21
Vec3D LoadInitOrient()
Definition: ChangingTOI.cpp:240
Vec3D LoadFinalOrient()
Definition: ChangingTOI.cpp:256
Double2DVector LoadIProfiles()
Definition: ChangingTOI.cpp:273
const std::string getMercuryDPMSourceDir()
This file is used for generating definitions that give access to CMakeVariables from within a cpp fil...
Definition: Configuration/CMakeDefinitions.cc:10
Species< LinearViscoelasticNormalSpecies, FrictionSpecies > LinearViscoelasticFrictionSpecies
Definition: LinearViscoelasticFrictionSpecies.h:12
Definition: ChangingTOI.cpp:37
const Scalar * a
Definition: level2_cplx_impl.h:32
bool readFromCommandLine(int argc, char *argv[], const std::string &varName)
Returns true if command line arguments contain varName, false else.
Definition: CommandLineHelpers.cc:99
Constructor for SteadyAxisymAdvectionDiffusion problem
Definition: steady_axisym_advection_diffusion.cc:213

References a, ExecCommand(), getMercuryDPMBuildDir(), getMercuryDPMSourceDir(), i, LoadFinalOrient(), LoadInitOrient(), LoadIProfiles(), problem, helpers::readFromCommandLine(), and oomph::Global_string_for_annotation::string().

Variable Documentation

◆ f_max

◆ f_min