-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
232 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
# This file is a part of JuliaFEM. | ||
# License is MIT: see https://github.com/JuliaFEM/FEMBase.jl/blob/master/LICENSE | ||
|
||
using FEMBase | ||
using FEMBase: get_local_coordinates, inside | ||
using Base.Test | ||
|
||
@testset "inverse isoparametric mapping" begin | ||
el = Element(Quad4, [1, 2, 3, 4]) | ||
X = Dict{Int64, Vector{Float64}}( | ||
1 => [0.0, 0.0], | ||
2 => [1.0, 0.0], | ||
3 => [1.0, 1.0], | ||
4 => [0.0, 1.0]) | ||
update!(el, "geometry", X) | ||
time = 0.0 | ||
X1 = el("geometry", [0.1, 0.2], time) | ||
xi = get_local_coordinates(el, X1, time) | ||
X2 = el("geometry", xi, time) | ||
info("X1 = $X1, X2 = $X2") | ||
@test isapprox(X1, X2) | ||
end | ||
|
||
@testset "inside of linear element" begin | ||
el = Element(Quad4, [1, 2, 3, 4]) | ||
X = Dict{Int64, Vector{Float64}}( | ||
1 => [0.0, 0.0], | ||
2 => [1.0, 0.0], | ||
3 => [1.0, 1.0], | ||
4 => [0.0, 1.0]) | ||
update!(el, "geometry", X) | ||
time = 0.0 | ||
@test inside(el, [0.5, 0.5], time) == true | ||
@test inside(el, [1.0, 0.5], time) == true | ||
@test inside(el, [1.0, 1.0], time) == true | ||
@test inside(el, [1.01, 1.0], time) == false | ||
@test inside(el, [1.0, 1.01], time) == false | ||
end | ||
|
||
@testset "inside of quadratic element" begin | ||
el = Element(Tri6, [1, 2, 3, 4, 5, 6]) | ||
X = Dict{Int64, Vector{Float64}}( | ||
1 => [0.0, 0.0], | ||
2 => [1.0, 0.0], | ||
3 => [0.0, 1.0], | ||
4 => [0.5, 0.2], | ||
5 => [0.8, 0.6], | ||
6 => [-0.2, 0.5]) | ||
update!(el, "geometry", X) | ||
p = [0.94, 0.3] # visually checked to be inside | ||
@test inside(el, p, 0.0) == true | ||
p = [-0.2, 0.8] # visually checked to be outside | ||
@test inside(el, p, 0.0) == false | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,176 @@ | ||
# This file is a part of JuliaFEM. | ||
# License is MIT: see https://github.com/JuliaFEM/FEMBase.jl/blob/master/LICENSE | ||
|
||
using FEMBase | ||
using FEMBase: Field | ||
using Base.Test | ||
|
||
@testset "discrete, constant, time invariant field" begin | ||
@test DCTI(0.0).data == 0.0 | ||
@test isa(Field(0.0), DCTI) | ||
f = DCTI(0.0) | ||
update!(f, 1.0) | ||
@test isapprox(f, DCTI(1.0)) | ||
@test isapprox(f, 1.0) | ||
@test 2*f == 2.0 # multiply by constant | ||
@test f(1.0) == 1.0 # time interpolation | ||
@test isapprox(reshape([2.0],1,1)*f, 2.0) # wanted behavior? | ||
end | ||
|
||
@testset "discrete, variable, time invariant field" begin | ||
@test DVTI([1.0, 2.0]).data == [1.0, 2.0] | ||
@test isa(Field([1.0, 2.0]), DVTI) | ||
|
||
f = DVTI(zeros(2)) | ||
update!(f, [2.0, 3.0]) | ||
@test isapprox(f.data, [2.0, 3.0]) | ||
@test length(f) == 2 | ||
|
||
# slicing | ||
@test isapprox(f[1], 2.0) | ||
@test isapprox(f[[1, 2]], [2.0, 3.0]) | ||
|
||
# boolean comparison and multiplying by a constant | ||
@test f == DVTI([2.0, 3.0]) | ||
@test isapprox(2*f, [4.0, 6.0]) | ||
|
||
f3 = 2*f | ||
@test isa(f3, DVTI) | ||
@test f3+f == 3*f | ||
@test f3-f == f | ||
|
||
# spatial interpolation | ||
N = [1.0, 2.0] | ||
@test isapprox(N*f, 8.0) | ||
|
||
# time interpolation | ||
@test isapprox(f(1.0), [2.0, 3.0]) | ||
|
||
# spatial interpolation of vector valued variable field | ||
f2 = DVTI(Vector[[1.0, 2.0], [3.0, 4.0]]) | ||
@test isapprox(f2[1], [1.0, 2.0]) | ||
@test isapprox(f2[2], [3.0, 4.0]) | ||
@test length(f2) == 2 | ||
@test isapprox(N*f2, [1.0, 2.0] + [6.0, 8.0]) | ||
|
||
# iteration of DVTI field | ||
s = zeros(2) | ||
for j in f2 | ||
s += j | ||
end | ||
@test isapprox(s, [4.0, 6.0]) | ||
|
||
@test vec(f2) == [1.0, 2.0, 3.0, 4.0] | ||
@test isapprox([1.0 2.0]*f, [8.0]'') | ||
|
||
new_data = [2.0, 3.0, 4.0, 5.0] | ||
f4 = similar(f2, new_data) | ||
@test isa(f4, DVTI) | ||
@test isapprox(f4.data[1], [2.0, 3.0]) | ||
@test isapprox(f4.data[2], [4.0, 5.0]) | ||
end | ||
|
||
@testset "discrete, constant, time-variant field" begin | ||
f = Field(0.0 => 1.0) | ||
@test isa(f, DCTV) | ||
@test last(f).time == 0.0 | ||
@test last(f).data == 1.0 | ||
update!(f, 0.0 => 2.0) | ||
@test last(f).time == 0.0 | ||
@test last(f).data == 2.0 | ||
@test length(f) == 1 | ||
update!(f, 1.0 => 3.0) | ||
@test last(f).time == 1.0 | ||
@test last(f).data == 3.0 | ||
@test length(f) == 2 | ||
|
||
@testset "interpolation in time direction" begin | ||
@test isa(f(0.0), DCTI) # converts to time-invariant after time interpolation | ||
@test isapprox(f(-1.0), 2.0) | ||
@test isapprox(f(0.0), 2.0) | ||
@test isapprox(f(0.5), 2.5) | ||
@test isapprox(f(1.0), 3.0) | ||
@test isapprox(f(2.0), 3.0) | ||
end | ||
|
||
# create several time steps at once | ||
f = DCTV(0.0 => 1.0, 1.0 => 2.0) | ||
@test isapprox(f(0.5), 1.5) | ||
|
||
end | ||
|
||
@testset "discrete, variable, time-variant field" begin | ||
f = Field(0.0 => [1.0, 2.0]) | ||
@test isa(f, DVTV) | ||
@test last(f).time == 0.0 | ||
@test last(f).data == [1.0, 2.0] | ||
update!(f, 0.0 => [2.0, 3.0]) | ||
@test last(f).time == 0.0 | ||
@test last(f).data == [2.0, 3.0] | ||
@test length(f) == 1 | ||
update!(f, 1.0 => [3.0, 4.0]) | ||
@test last(f).time == 1.0 | ||
@test last(f).data == [3.0, 4.0] | ||
@test length(f) == 2 | ||
|
||
@testset "interpolation in time direction" begin | ||
@test isa(f(0.0), DVTI) # converts to time-invariant after time interpolation | ||
@test isapprox(f(-1.0), [2.0, 3.0]) | ||
@test isapprox(f(0.0), [2.0, 3.0]) | ||
@test isapprox(f(0.5), [2.5, 3.5]) | ||
@test isapprox(f(1.0), [3.0, 4.0]) | ||
@test isapprox(f(2.0), [3.0, 4.0]) | ||
end | ||
|
||
# create several time steps at once | ||
f = DVTV(0.0 => [1.0, 2.0], 1.0 => [2.0, 3.0]) | ||
@test isapprox(f(0.5), [1.5, 2.5]) | ||
end | ||
|
||
@testset "continuous, constant, time-invariant field" begin | ||
f = Field(() -> 2.0) | ||
@test isapprox(f([1.0], 2.0), 2.0) | ||
|
||
end | ||
|
||
@testset "continuous, constant, time variant field" begin | ||
f = Field((time::Float64) -> 2.0*time) | ||
@test isapprox(f([1.0], 2.0), 4.0) | ||
|
||
end | ||
|
||
@testset "continuous, variable, time invariant field" begin | ||
f = Field((xi::Vector) -> sum(xi)) | ||
@test isapprox(f([1.0, 2.0], 2.0), 3.0) | ||
end | ||
|
||
@testset "continuous, variable, time variant field" begin | ||
f = Field((xi::Vector, t::Float64) -> xi[1]*t) | ||
@test isapprox(f([1.0], 2.0), 2.0) | ||
end | ||
|
||
@testset "unknown function argument for continuous field" begin | ||
@test_throws ErrorException Field((a, b, c) -> a*b*c) | ||
end | ||
|
||
@testset "dictionary fields" begin | ||
f1 = Dict{Int64, Vector{Float64}}(1 => [0.0, 0.0], 2 => [0.0, 0.0]) | ||
f2 = Dict{Int64, Vector{Float64}}(1 => [1.0, 1.0], 2 => [1.0, 1.0]) | ||
f = Field(0.0 => f1, 1.0 => f2) | ||
@test isa(f, DVTV) | ||
@test isapprox(f(0.0)[1], [0.0, 0.0]) | ||
@test isapprox(f(1.0)[2], [1.0, 1.0]) | ||
|
||
f = Field(0.0 => f1) | ||
update!(f, 1.0 => f2) | ||
@test isa(f, DVTV) | ||
@test isapprox(f(0.0)[1], [0.0, 0.0]) | ||
@test isapprox(f(1.0)[2], [1.0, 1.0]) | ||
|
||
f = Field(f1) | ||
@test isapprox(f(0.0)[1], [0.0, 0.0]) | ||
@test isapprox(f[1], [0.0, 0.0]) | ||
|
||
f = Field(f1) | ||
@test isa(f, DVTI) | ||
end |