forked from solarcalf/Thermal-conduction
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathThermalConduction.h
67 lines (48 loc) · 1.39 KB
/
ThermalConduction.h
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
#pragma once
#include <functional>
#include <vector>
#include "TMA.h"
class thermal {
private:
using FP = double;
using VecFP = std::vector<FP>;
using FPair = std::pair<std::function<FP(FP)>, std::function<FP(FP)>>;
VecFP x_grid;
VecFP v_vals;
static const inline FP integrate(FP a, FP h, std::function<FP(FP)> f) {
return f(a + h) * h;
}
public:
thermal (FP a, FP b, size_t N, FPair k, FPair q, FPair f, FP mu1, FP mu2, FP xi) {
FP h = (b - a) / N;
VecFP x_grid{a};
VecFP v_vals;
VecFP A(N - 1);
VecFP B(N - 1);
VecFP C(N - 1);
VecFP phi(N);
FP a = integrate(x_grid.back(), h, [k](FP x) { return 1 / k.first(x); });
size_t i = 1;
A[0] = 1 / (a + h);
while (x_grid.back() + h < xi) {
FP a = integrate(x_grid.back(), h, [k](FP x) { return 1 / k.first(x); });
A[i] = 1 / (a * h);
B[i - 1] = A[i];
C[i] += A[i];
C[i - 1] += A[i++];
}
FP a = integrate(x_grid.back(), xi - x_grid.back(), [k](FP x) { return 1 / k.first(x); }) +
integrate(xi, x_grid.back() + h - xi, [k](FP x) { return 1 / k.second(x); });
A[i] = 1 / (a * h);
B[i - 1] = A[i];
C[i] += A[i];
C[i - 1] += A[i++];
while (x_grid.back() < b) {
FP a = integrate(x_grid.back(), h, [k](FP x) { return 1 / k.second(x); });
A[i] = 1 / (a * h);
B[i - 1] = A[i];
C[i] += A[i];
C[i - 1] += A[i++];
}
}
};