From 2b8db3f6b579e2c9e0d563b0ce632f5cd0f5a87f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Fuhrmann?= Date: Fri, 9 Jun 2023 12:05:46 +0200 Subject: [PATCH 1/2] Add some methods to support linear algebra --- src/math.jl | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/src/math.jl b/src/math.jl index 37e62229..1e735d1b 100644 --- a/src/math.jl +++ b/src/math.jl @@ -16,8 +16,28 @@ Base.:/(l::Number, r::Quantity) = l * inv(r) Base.:/(l::Dimensions, r::Number) = Quantity(inv(r), l, true) Base.:/(l::Number, r::Dimensions) = Quantity(l, inv(r), true) -Base.:+(l::Quantity, r::Quantity) = Quantity(l.value + r.value, l.dimensions, l.valid && r.valid && l.dimensions == r.dimensions) -Base.:-(l::Quantity, r::Quantity) = Quantity(l.value - r.value, l.dimensions, l.valid && r.valid && l.dimensions == r.dimensions) +function Base.:+(l::Quantity, r::Quantity) + if iszero(l) + return r + elseif iszero(r) + return l + else + l.dimensions == r.dimensions ? Quantity(l.value + r.value, l.dimensions, l.valid && r.valid ) : error("dimension mismatch") + end +end + + +function Base.:-(l::Quantity, r::Quantity) + if iszero(l) + return -r + elseif iszero(r) + return l + else + l.dimensions == r.dimensions ? Quantity(l.value - r.value, l.dimensions, l.valid && r.valid) : error("dimension mismatch: l=$l, r=$r") + end +end + +Base.:-(l::Quantity) = Quantity(- l.value, l.dimensions, l.valid) Base.:^(l::Quantity, r::Quantity) = let rr = tryrationalize(R, r.value) @@ -38,4 +58,16 @@ Base.sqrt(q::Quantity) = Quantity(sqrt(q.value), sqrt(q.dimensions), q.valid) Base.cbrt(d::Dimensions) = d^(1 // 3) Base.cbrt(q::Quantity) = Quantity(cbrt(q.value), cbrt(q.dimensions), q.valid) -Base.abs(q::Quantity) = Quantity(abs(q.value), q.dimensions, q.valid) + +# +# We need this for pivoting: we could introduce a pivoting type RowNonZero instead. +# +#Base.abs(q::Quantity) = Quantity(abs(q.value), q.dimensions, q.valid) +Base.abs(q::Quantity) = Quantity(abs(q.value)) + + +Base.iszero(d::Dimensions) = d==Dimensions() +Base.isless(q::Quantity,r::Quantity) = q.value Date: Fri, 9 Jun 2023 12:11:15 +0200 Subject: [PATCH 2/2] start test code for linear algebra --- test/linsolve.jl | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 test/linsolve.jl diff --git a/test/linsolve.jl b/test/linsolve.jl new file mode 100644 index 00000000..efdcb263 --- /dev/null +++ b/test/linsolve.jl @@ -0,0 +1,27 @@ +module linsolve + + +using SparseArrays,Sparspak,DynamicQuantities, LinearAlgebra +using GenericLinearAlgebra + +function makeproblem(n;dimA=DynamicQuantities.Dimensions(length=1),dimb=DynamicQuantities.Dimensions(tim=1)) + A=-sprand(n,n,0.5)+100I + SparseMatrixCSC(size(A)...,A.colptr,A.rowval,Quantity.(A.nzval,dimA)), Quantity.(rand(n),dimb) + +# [ Quantity(b0[i],length=1) for i=1:n] + #DynamicQuantities.Quantity.(rand(10),time=1) +end + + +function densetest(n) + As,b=makeproblem(n) + A=Matrix(As) + lu(A)\b +end + +function sparsetest(n) + A,b=makeproblem(n) + sparspaklu(A)\b +end + +end