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
use ndarray::*;
use ndarray_linalg::*;
pub trait ModelSize<D: Dimension> {
fn model_size(&self) -> D::Pattern;
}
pub trait Explicit<S, D>: ModelSize<D>
where S: DataMut,
D: Dimension
{
type Scalar: Scalar;
type Time: RealScalar;
fn rhs<'a>(&self, &'a mut ArrayBase<S, D>) -> &'a mut ArrayBase<S, D>;
}
pub trait SemiImplicitDiag<Sn, Sd, D>: ModelSize<D>
where Sn: DataMut,
Sd: Data,
D: Dimension
{
type Scalar: Scalar;
type Time: RealScalar;
fn nlin<'a>(&self, &'a mut ArrayBase<Sn, D>) -> &'a mut ArrayBase<Sn, D>;
fn diag(&self) -> ArrayBase<Sd, D>;
}
pub trait TimeEvolutionBase<S, D>: ModelSize<D>
where S: DataMut,
D: Dimension
{
type Scalar: Scalar;
type Time: RealScalar;
fn iterate<'a>(&self, &'a mut ArrayBase<S, D>) -> &'a mut ArrayBase<S, D>;
}
pub trait TimeStep {
type Time: RealScalar;
fn get_dt(&self) -> Self::Time;
fn set_dt(&mut self, dt: Self::Time);
}
pub trait TimeEvolution<A, D>
: TimeEvolutionBase<OwnedRepr<A>, D, Time = A::Real>
+ TimeEvolutionBase<OwnedRcRepr<A>, D, Time = A::Real>
+ for<'a> TimeEvolutionBase<ViewRepr<&'a mut A>, D, Time = A::Real>
+ TimeStep<Time = A::Real>
where A: Scalar,
D: Dimension
{
}
impl<A, D, EOM> TimeEvolution<A, D> for EOM
where A: Scalar,
D: Dimension,
EOM: TimeEvolutionBase<OwnedRepr<A>, D, Time = A::Real>
+ TimeEvolutionBase<OwnedRcRepr<A>, D, Time = A::Real>
+ for<'a> TimeEvolutionBase<ViewRepr<&'a mut A>, D, Time = A::Real>
+ TimeStep<Time = A::Real>
{
}