-
Notifications
You must be signed in to change notification settings - Fork 11
Implementing CSRK code in BSeries.jl #144
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 6 commits
7853dcb
aaf5940
afe7373
e4d79cc
823684d
0df736b
09d4629
335265f
8c4e0b1
7ad5325
5d82c87
c0a724d
c45de1c
6616b9c
1227e1a
3691f69
68cecb0
5d30865
7387ffc
53fd493
d6a23d6
c0ba86f
b5813d2
691507f
02acff4
fd1a23e
0c29499
c8113e6
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -17,7 +17,7 @@ end | |
|
|
||
| using Latexify: Latexify, LaTeXString | ||
| using Combinatorics: Combinatorics, permutations | ||
| using LinearAlgebra: LinearAlgebra, rank | ||
| using LinearAlgebra: LinearAlgebra, rank, dot | ||
| using SparseArrays: SparseArrays, sparse | ||
|
|
||
| @reexport using Polynomials: Polynomials, Polynomial | ||
|
|
@@ -40,6 +40,8 @@ export renormalize! | |
|
|
||
| export is_energy_preserving, energy_preserving_order | ||
|
|
||
| export elementary_differentials_csrk, CSRK | ||
|
|
||
| # Types used for traits | ||
| # These traits may decide between different algorithms based on the | ||
| # corresponding complexity etc. | ||
|
|
@@ -74,6 +76,20 @@ end | |
|
|
||
| TruncatedBSeries{T, V}() where {T, V} = TruncatedBSeries{T, V}(OrderedDict{T, V}()) | ||
|
|
||
| """ | ||
| CSRK struct | ||
| """ | ||
| struct ContinuousStageRungeKuttaMethod{MatT <: AbstractMatrix} | ||
| matrix::MatT | ||
| end | ||
|
Sondar74 marked this conversation as resolved.
Outdated
Sondar74 marked this conversation as resolved.
Outdated
|
||
|
|
||
| function CSRK(matrix::AbstractMatrix) | ||
| T = promote_type(eltype(matrix)) | ||
| _M = T.(matrix) | ||
| return ContinuousStageRungeKuttaMethod(_M) | ||
| end | ||
|
|
||
|
|
||
|
Sondar74 marked this conversation as resolved.
Outdated
|
||
| # general interface methods of `AbstractDict` for `TruncatedBSeries` | ||
| @inline Base.iterate(series::TruncatedBSeries) = iterate(series.coef) | ||
| @inline Base.iterate(series::TruncatedBSeries, state) = iterate(series.coef, state) | ||
|
|
@@ -612,6 +628,23 @@ function bseries(ros::RosenbrockMethod, order) | |
| return series | ||
| end | ||
|
|
||
| """ | ||
| bseries CSRK | ||
| """ | ||
| function bseries(csrk::ContinuousStageRungeKuttaMethod, order) | ||
|
Sondar74 marked this conversation as resolved.
|
||
| csrk = csrk.matrix | ||
| V = Rational{Int64} | ||
| series = TruncatedBSeries{RootedTree{Int, Vector{Int}}, V}() | ||
|
ranocha marked this conversation as resolved.
Outdated
|
||
| series[rootedtree(Int[])] = one(Int64) | ||
| for o in 1:order | ||
| for t in RootedTreeIterator(o) | ||
| series[copy(t)] = elementary_differentials_csrk(csrk, t) | ||
| end | ||
| end | ||
|
|
||
| return series | ||
| end | ||
|
Comment on lines
+675
to
+707
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please add tests. This does not work correctly right now.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Okey, I'm working on this.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. When working with the function
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What is the
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It is the
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Use struct ContinuousStageRungeKuttaMethod{T, MatT <: AbstractMatrix{T}} <: RootedTrees.AbstractTimeIntegrationMethod
A::MatT
end
Base.eltype(::ContinuousStageRungeKuttaMethod{T}) where {T} = T |
||
|
|
||
| # TODO: bseries(ros::RosenbrockMethod) | ||
| # should create a lazy version, optionally a memoized one | ||
|
|
||
|
|
@@ -2016,4 +2049,73 @@ function equivalent_trees(tree) | |
| return equivalent_trees_set | ||
| end | ||
|
|
||
|
|
||
|
|
||
|
|
||
| # This function generates a polynomial | ||
| # A_{t,z} = [t,t^2/2,..., t^s/s]*M*[1, z, ..., z^(s-1)]^T | ||
| # for a given square matrix M of dimension s and chars 't' and 'z'. | ||
| function PolynomialA(M,t,z) | ||
| s = size(M,1) | ||
| # we need variables to work with | ||
| variable1 = Sym(t) | ||
| variable2 = Sym(z) | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I do not really like that this introduces a hard dependency on SymPy.jl here (which is not covered in the import statements at the top of this file or
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since we work only with polynomials and just need to integrate, in principle everything can be done by working directly with the coefficients. This will make the code a bit harder to read but may also be faster. |
||
| # conjugate the variable 1, provided that this will be the variable | ||
| # of the left polynomial | ||
| variable1 = conjugate(variable1) | ||
| # generate the components of the polynomial with powers of t | ||
| poli_z = Array{SymPy.Sym}(undef, s) | ||
| for i in 1:s | ||
| poli_z[i] = variable2^(i-1) | ||
| end | ||
| # generate the components of the polynomial with powers of z | ||
| poli_t = Array{SymPy.Sym}(undef, s) | ||
| for i in 1:s | ||
| poli_t[i] = (1 // i)*(variable1^i) | ||
| end | ||
| # multiply matrix times vector | ||
| result = M * poli_z | ||
| # use dot product for the two vectors | ||
| result = dot(poli_t,result) | ||
| return result | ||
| end | ||
|
|
||
|
|
||
| """ | ||
| elementary_differentials_csrk(M,tree) | ||
|
|
||
| This function calculates the CSRK elementary differential for a given | ||
| square matrix 'M' and a given RootedTree. | ||
|
|
||
| """ | ||
| function elementary_differentials_csrk(M,rootedtree) | ||
| # we'll work with the level sequence | ||
| tree = rootedtree.level_sequence | ||
| m = maximum(tree) | ||
| l = length(tree) | ||
| # create the variables called 'xi' for 1 <= i <= m | ||
| variables = [] | ||
| for i in 1:m | ||
| var_name = "x$i" | ||
| var = Sym(var_name) | ||
| push!(variables, var) | ||
| end | ||
| inverse_counter = l-1 | ||
| # stablish initial integrand, which is the rightmost leaf (last node of the level sequence) | ||
| if l > 1 | ||
| integrand = integrate(PolynomialA(M,variables[tree[end]-1],variables[tree[end]]),(variables[tree[end]],0,1)) | ||
| else | ||
| # if the RootedTree is [1] or [], the elementary differential will be 1. | ||
| return 1 | ||
| end | ||
| while inverse_counter > 1 | ||
| pseudo_integrand = PolynomialA(M,variables[tree[inverse_counter]-1],variables[tree[inverse_counter]])*integrand | ||
| integrand = integrate(pseudo_integrand,(variables[tree[inverse_counter]],0,1)) | ||
| inverse_counter -= 1 | ||
| end | ||
| # multiply for the Basis_Polynomial, i.e. the Polynomial B | ||
| # return the integral with respect to x1. | ||
| return integrate(PolynomialA(M,1,variables[1])*integrand,(variables[1],0,1)) | ||
| end | ||
|
|
||
| end # module | ||
Uh oh!
There was an error while loading. Please reload this page.