@@ -36,6 +36,8 @@ default_non_user_cache(integrator::SDEIntegrator) = chain(u_cache(integrator),du
36
36
@inline add_tstop! (integrator:: SDEIntegrator ,t) = push! (integrator. opts. tstops,t)
37
37
38
38
resize_non_user_cache! (integrator:: SDEIntegrator ,i:: Int ) = resize_non_user_cache! (integrator,integrator. cache,i)
39
+ deleteat_non_user_cache! (integrator:: SDEIntegrator ,i) = deleteat_non_user_cache! (integrator,integrator. cache,i)
40
+ addat_non_user_cache! (integrator:: SDEIntegrator ,i) = addat_non_user_cache! (integrator,integrator. cache,i)
39
41
resize! (integrator:: SDEIntegrator ,i:: Int ) = resize! (integrator,integrator. cache,i)
40
42
41
43
function resize! (integrator:: SDEIntegrator ,cache,i)
@@ -45,19 +47,19 @@ function resize!(integrator::SDEIntegrator,cache,i)
45
47
end
46
48
end
47
49
48
- function resize_noise! (integrator,cache,prev_len ,i)
50
+ function resize_noise! (integrator,cache,bot_idx ,i)
49
51
for c in integrator. S₁
50
52
resize! (c[2 ],i)
51
53
resize! (c[3 ],i)
52
- if i > prev_len # fill in rands
53
- resize_noise_caches ! (integrator,c,c[1 ],prev_len : i)
54
+ if i > bot_idx # fill in rands
55
+ fill_new_noise_caches ! (integrator,c,sqrt ( c[1 ]),bot_idx : i)
54
56
end
55
57
end
56
58
for c in integrator. S₂
57
59
resize! (c[2 ],i)
58
60
resize! (c[3 ],i)
59
- if i > prev_len # fill in rands
60
- resize_noise_caches ! (integrator,c,c[1 ],prev_len : i)
61
+ if i > bot_idx # fill in rands
62
+ fill_new_noise_caches ! (integrator,c,sqrt ( c[1 ]),bot_idx : i)
61
63
end
62
64
end
63
65
resize! (integrator. ΔW,i)
@@ -68,26 +70,122 @@ function resize_noise!(integrator,cache,prev_len,i)
68
70
resize! (integrator. ΔZtmp,i)
69
71
resize! (integrator. W,i)
70
72
resize! (integrator. Z,i)
71
- if i > prev_len # fill in rands
72
- fill! (@view (integrator. W[prev_len: i]),zero (eltype (integrator. u)))
73
- fill! (@view (integrator. Z[prev_len: i]),zero (eltype (integrator. u)))
73
+ if i > bot_idx # fill in rands
74
+ fill! (@view (integrator. W[bot_idx: i]),zero (eltype (integrator. u)))
75
+ fill! (@view (integrator. Z[bot_idx: i]),zero (eltype (integrator. u)))
76
+ end
77
+ end
78
+
79
+ @inline function fill_new_noise_caches! (integrator,c,scaling_factor,idxs)
80
+ if isinplace (integrator. noise)
81
+ integrator. noise (@view c[2 ][idxs])
82
+ for i in idxs
83
+ c[2 ][i] *= scaling_factor
84
+ end
85
+ if ! (typeof (integrator. alg) <: EM ) || ! (typeof (integrator. alg) <: RKMil )
86
+ integrator. noise (@view c[3 ][idxs])
87
+ for i in idxs
88
+ c[3 ][i] .*= scaling_factor
89
+ end
90
+ end
91
+ else
92
+ c[2 ][idxs] .= scaling_factor.* integrator. noise (length (idxs))
93
+ if ! (typeof (integrator. alg) <: EM ) || ! (typeof (integrator. alg) <: RKMil )
94
+ c[3 ][idxs] .= scaling_factor.* integrator. noise (length (idxs))
95
+ end
74
96
end
75
97
end
76
98
77
99
function resize_non_user_cache! (integrator:: SDEIntegrator ,cache,i)
78
- prev_len = length (integrator. u)
79
- resize_noise! (integrator,cache,prev_len ,i)
100
+ bot_idx = length (integrator. u)
101
+ resize_noise! (integrator,cache,bot_idx ,i)
80
102
for c in default_non_user_cache (integrator)
81
103
resize! (c,i)
82
104
end
83
105
end
84
106
85
- function deleteat! (integrator:: SDEIntegrator ,i:: Int )
86
- for c in full_cache (integrator)
87
- deleteat! (c,i)
107
+ function deleteat! (integrator:: SDEIntegrator ,idxs)
108
+ deleteat_non_user_cache! (integrator,cache,idxs)
109
+ for c in user_cache (integrator)
110
+ deleteat! (c,idxs)
111
+ end
112
+ end
113
+
114
+ function addat! (integrator:: SDEIntegrator ,idxs)
115
+ addat_non_user_cache! (integrator,cache,idxs)
116
+ for c in user_cache (integrator)
117
+ addat! (c,idxs)
118
+ end
119
+ end
120
+
121
+ function deleteat_non_user_cache! (integrator:: SDEIntegrator ,cache,idxs)
122
+ deleteat_noise! (integrator,cache,idxs)
123
+ i = length (integrator. u)
124
+ # Ordering doesn't matter in these caches
125
+ # So just resize
126
+ for c in default_non_user_cache (integrator)
127
+ resize! (c,i)
128
+ end
129
+ end
130
+
131
+ function addat_non_user_cache! (integrator:: SDEIntegrator ,cache,idxs)
132
+ addat_noise! (integrator,cache,idxs)
133
+ i = length (integrator. u)
134
+ # Ordering doesn't matter in these caches
135
+ # So just resize
136
+ for c in default_non_user_cache (integrator)
137
+ resize! (c,i)
88
138
end
89
139
end
90
140
141
+ function deleteat_noise! (integrator,cache,idxs)
142
+ for c in integrator. S₁
143
+ deleteat! (c[2 ],idxs)
144
+ deleteat! (c[3 ],idxs)
145
+ end
146
+ for c in integrator. S₂
147
+ deleteat! (c[2 ],idxs)
148
+ deleteat! (c[3 ],idxs)
149
+ end
150
+ deleteat! (integrator. ΔW,idxs)
151
+ deleteat! (integrator. ΔZ,idxs)
152
+ deleteat! (integrator. ΔWtilde,idxs)
153
+ deleteat! (integrator. ΔZtilde,idxs)
154
+ deleteat! (integrator. ΔWtmp,idxs)
155
+ deleteat! (integrator. ΔZtmp,idxs)
156
+ deleteat! (integrator. W,idxs)
157
+ deleteat! (integrator. Z,idxs)
158
+ end
159
+
160
+ function addat_noise! (integrator,cache,idxs)
161
+ for c in integrator. S₁
162
+ addat! (c[2 ],idxs)
163
+ addat! (c[3 ],idxs)
164
+ fill_new_noise_caches! (integrator,c,sqrt (c[1 ]),idxs)
165
+ end
166
+ for c in integrator. S₂
167
+ addat! (c[2 ],idxs)
168
+ addat! (c[3 ],idxs)
169
+ fill_new_noise_caches! (integrator,c,sqrt (c[1 ]),idxs)
170
+ end
171
+
172
+ addat! (integrator. ΔW,idxs)
173
+ addat! (integrator. ΔZ,idxs)
174
+ addat! (integrator. W,idxs)
175
+ addat! (integrator. Z,idxs)
176
+
177
+ i = length (integrator. u)
178
+ resize! (integrator. ΔWtilde,i)
179
+ resize! (integrator. ΔZtilde,i)
180
+ resize! (integrator. ΔWtmp,i)
181
+ resize! (integrator. ΔZtmp,i)
182
+
183
+ # fill in rands
184
+ fill! (@view (integrator. W[idxs]),zero (eltype (integrator. u)))
185
+ fill! (@view (integrator. Z[idxs]),zero (eltype (integrator. u)))
186
+ end
187
+
188
+
91
189
function terminate! (integrator:: SDEIntegrator )
92
190
integrator. opts. tstops. valtree = typeof (integrator. opts. tstops. valtree)()
93
191
end
0 commit comments