-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcoursework.cpp
More file actions
133 lines (117 loc) · 4.43 KB
/
coursework.cpp
File metadata and controls
133 lines (117 loc) · 4.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <iostream>
#include <cmath>
#include <string>
#include <typeinfo>
#include "myfunctions.h"
#include "solvers.h"
using namespace std;
#include <mpi.h>
#include <boost/program_options.hpp>
namespace po = boost::program_options;
int main(int argc, char* argv[])
{
po::options_description desc("Solving for displacement along a beam");
desc.add_options()
("L", po::value<double>(), "Length of the beam")
("Nx", po::value<int>(), "Number of elements")
("A", po::value<double>(), "Area of cross-section")
("I", po::value<double>(), "Second moment of inertia")
("E", po::value<double>(), "Young's modulus")
("rho", po::value<double>(), "Density")
("time_dependence", po::value<int>(), "Time dependence: 0 for static, 1 for dynamic")
("scheme", po::value<int>(), "Integration scheme: 0 for explicit, 1 for implicit")
("T", po::value<double>(), "Number of seconds if dynamic problem")
("Nt", po::value<int>(), "Number of time steps if dynamic problem")
("parallel", po::value<int>(), "Parallelization: 0 for serial, 1 for parallel")
("help", "Produce help message");
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
if (vm.count("help"))
{
cout << "Solving for displacement along a beam." << endl;
cout << desc << endl;
return 0;
}
const double L = vm.count("L") ? vm["L"].as<double>() : 10.0;
const int Nx = vm.count("Nx") ? vm["Nx"].as<int>() : 24;
const double A = vm.count("A") ? vm["A"].as<double>() : 0.012;
const double I = vm.count("I") ? vm["I"].as<double>() : 1.44e-05;
const double E = vm.count("E") ? vm["E"].as<double>() : 2.1e+11;
const double rho = vm.count("rho") ? vm["rho"].as<double>() : 7850.0;
const int time_dependence = vm.count("time_dependence") ? vm["time_dependence"].as
<int>() : 0;
const int scheme = vm.count("scheme") ? vm["scheme"].as<int>() : 0;
const double T = vm.count("T") ? vm["T"].as<double>() : 1.0;
const int Nt = vm.count("Nt") ? vm["Nt"].as<int>() : 10000;
const int parallel = vm.count("parallel") ? vm["parallel"].as<int>() : 0;
// ########################################## Parameters ################################################
// ######################################################################################################
const double qx = 0.0;
const double qy = -1000.0;
const double l = L/(double)Nx;
const double Fy = -1000.0;
const int N = (Nx-1)*3;
const int ku = 4;
const int kl = 4;
// ################################### Find nodal displacements #########################################
// ######################################################################################################
if (time_dependence == 0)
{
Static_Solver(A, E, I, L, l, qx, qy, Fy, Nx, ku, kl, N);
}
else if (time_dependence == 1)
{
if (scheme == 0)
{
if (parallel == 0)
{
Dynamic_Solver_1(A, E, I, L, l, qx, qy, Fy, rho, T, Nt, Nx, ku, kl, N);
}
else if (parallel == 1)
{
int size;
int rank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
Dynamic_Solver_MPI_1(A, E, I, L, l, qx, qy, Fy, rho, T, Nt, Nx, ku, kl, N, size, rank);
MPI_Finalize();
}
else
{
cout << "The parallelization has not been correctly specified" << endl;
}
}
else if (scheme == 1)
{
if (parallel == 0)
{
Dynamic_Solver_2(A, E, I, L, l, qx, qy, Fy, rho, T, Nt, Nx, ku, kl, N);
}
else if (parallel == 1)
{
int size;
int rank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
Dynamic_Solver_MPI_2(A, E, I, L, l, qx, qy, Fy, rho, T, Nt, Nx, ku, kl, N, size, rank);
MPI_Finalize();
}
else
{
cout << "The parallelization has not been correctly specified" << endl;
}
}
else
{
cout << "The integration scheme has not been correctly specified" << endl;
}
}
else
{
cout << "The time dependence has not been correctly specified." << endl;
}
return 0;
}