mirror of
https://github.com/JuliaFEM/JuliaFEM.jl.git
synced 2026-09-27 20:26:58 +00:00
data types defined
This commit is contained in:
+45
-3
@@ -2,7 +2,49 @@
|
||||
# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md
|
||||
|
||||
using FactCheck
|
||||
using JuliaFEM: test_element
|
||||
using JuliaFEM: Element, Basis, FieldSet
|
||||
|
||||
# prototype element
|
||||
type MockElement <: Element
|
||||
connectivity :: Array{Int, 1}
|
||||
basis :: Basis
|
||||
fields :: Dict{Symbol, FieldSet}
|
||||
end
|
||||
function MockElement(connectivity)
|
||||
h(xi) = [
|
||||
(1-xi[1])*(1-xi[2])/4
|
||||
(1+xi[1])*(1-xi[2])/4
|
||||
(1+xi[1])*(1+xi[2])/4
|
||||
(1-xi[1])*(1+xi[2])/4]
|
||||
dh(xi) = [
|
||||
-(1-xi[2])/4.0 -(1-xi[1])/4.0
|
||||
(1-xi[2])/4.0 -(1+xi[1])/4.0
|
||||
(1+xi[2])/4.0 (1+xi[1])/4.0
|
||||
-(1+xi[2])/4.0 (1-xi[1])/4.0]
|
||||
basis = Basis(h, dh)
|
||||
MockElement(connectivity, basis, Dict())
|
||||
end
|
||||
JuliaFEM.get_number_of_basis_functions(el::Type{MockElement}) = 4
|
||||
JuliaFEM.get_element_dimension(el::Type{MockElement}) = 2
|
||||
|
||||
|
||||
using JuliaFEM: test_element
|
||||
facts("test test_element against mock element") do
|
||||
test_element(MockElement)
|
||||
end
|
||||
|
||||
|
||||
using JuliaFEM: new_fieldset!, add_field!, Field, get_fieldset
|
||||
facts("test adding fieldsets and fields to element") do
|
||||
el = MockElement([1, 2, 3, 4])
|
||||
fieldset = new_fieldset!(el, "geometry")
|
||||
field1 = Field(0.0, [0.0, 0.0, 0.0, 0.0])
|
||||
add_field!(el, "geometry", field1)
|
||||
field2 = Field(1.0, [1.0, 1.0, 1.0, 1.0])
|
||||
add_field!(fieldset, field2)
|
||||
fields = get_fieldset(el, "geometry")
|
||||
@fact length(fields) --> 2
|
||||
@fact fields[1] --> field1
|
||||
@fact fields[2] --> field2
|
||||
end
|
||||
|
||||
using JuliaFEM: Quad4
|
||||
test_element(Quad4)
|
||||
|
||||
+56
-43
@@ -1,18 +1,11 @@
|
||||
# This file is a part of JuliaFEM.
|
||||
# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md
|
||||
|
||||
using JuliaFEM: Basis, Field, get_field, diff
|
||||
using JuliaFEM: Basis, Field, FieldSet, interpolate, dinterpolate
|
||||
using FactCheck
|
||||
|
||||
facts("test fields and interpolation") do
|
||||
|
||||
# simple interpolation in domain [-1, 1]
|
||||
N = Basis((ξ) -> [0.5*(1.0-ξ[1]), 0.5*(1.0+ξ[1])])
|
||||
u = Field(0.0, [0.0, 1.0])
|
||||
@fact N([0.0])*u --> 0.5
|
||||
@fact (N*u)([0.0]) --> 0.5
|
||||
|
||||
# multiply of field with constant
|
||||
facts("test fields") do
|
||||
# multiple field with some constant
|
||||
u1 = Field(0.0, [0.0, 1.0])
|
||||
u2 = 3.0*u1
|
||||
@fact u1.time --> 0.0
|
||||
@@ -24,48 +17,68 @@ facts("test fields and interpolation") do
|
||||
u2 = Field(0.0, [1.0, 2.0])
|
||||
u3 = u1 + u2
|
||||
@fact u3.values --> [1.0, 3.0]
|
||||
end
|
||||
|
||||
# interpolation between two fields in time domain
|
||||
facts("test interpolation of fields") do
|
||||
|
||||
# interpolation of field in spatial domain
|
||||
N = Basis((xi) -> [0.5*(1.0-xi[1]), 0.5*(1.0+xi[1])])
|
||||
u = Field(0.0, [0.0, 1.0])
|
||||
@fact interpolate(N, u, [0.0]) --> 0.5
|
||||
|
||||
# interpolation of fieldset in time domain
|
||||
u1 = Field(0.0, [0.0, 1.0])
|
||||
u2 = Field(0.0, [1.0, 2.0])
|
||||
t = Basis((t) -> [1-t, t])
|
||||
u = Field[u1, u2]
|
||||
u2 = (t*u)(0.5)
|
||||
@fact u2.values --> [0.5, 1.5]
|
||||
u2 = Field(1.0, [1.0, 2.0])
|
||||
u = FieldSet([u1, u2])
|
||||
@fact interpolate(u, 0.5).values --> [0.5, 1.5]
|
||||
@fact interpolate(u, 0.5).time --> 0.5
|
||||
|
||||
# interpolation in set of fields is defined for every time value
|
||||
# interpolation of fieldset is defined for every time value:
|
||||
u1 = Field(0.0, [0.0, 0.0])
|
||||
u2 = Field(1.0, [1.0, 2.0])
|
||||
u3 = Field(2.0, [0.5, 1.5])
|
||||
u = Field[u1, u2, u3]
|
||||
@fact u(-1.0).values --> [0.0, 0.0] # "out of range -" -> first known value
|
||||
@fact u(0.0).values --> [0.0, 0.0]
|
||||
@fact u(1.0).values --> [1.0, 2.0]
|
||||
@fact u(2.0).values --> [0.5, 1.5]
|
||||
@fact u(3.0).values --> [0.5, 1.5] # "out of range +" -> last known value
|
||||
@fact u(0.5).values --> [0.5, 1.0]
|
||||
@fact u(1.5).values --> [0.75, 1.75]
|
||||
u = FieldSet([u1, u2, u3])
|
||||
@fact interpolate(u, -1.0).values --> [0.0, 0.0] # "out of range -" -> first known value
|
||||
@fact interpolate(u, 0.0).values --> [0.0, 0.0]
|
||||
@fact interpolate(u, 1.0).values --> [1.0, 2.0]
|
||||
@fact interpolate(u, 2.0).values --> [0.5, 1.5]
|
||||
@fact interpolate(u, 3.0).values --> [0.5, 1.5] # "out of range +" -> last known value
|
||||
@fact interpolate(u, 0.5).values --> [0.5, 1.0]
|
||||
@fact interpolate(u, 1.5).values --> [0.75, 1.75]
|
||||
# use Inf to get very first or last value of field
|
||||
@fact u(-Inf).values --> [0.0, 0.0]
|
||||
@fact u(+Inf).values --> [0.75, 1.75]
|
||||
@fact interpolate(u, -Inf).values --> [0.0, 0.0]
|
||||
@fact interpolate(u, +Inf).values --> [0.5, 1.5]
|
||||
|
||||
# multidimensional interpolation with and without derivatives
|
||||
X = Field(0.0, Vector[[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0]])
|
||||
h = Basis((xi) ->
|
||||
[(1-xi[1])*(1-xi[2])/4
|
||||
(1+xi[1])*(1-xi[2])/4
|
||||
(1+xi[1])*(1+xi[2])/4
|
||||
(1-xi[1])*(1+xi[2])/4])
|
||||
# midpoint of field
|
||||
@fact (h*X)([0.0, 0.0]) --> [0.5, 0.5]
|
||||
@fact h([0.0, 0.0])*X --> [0.5, 0.5]
|
||||
# derivatives of field at midpoint
|
||||
@fact diff(h)([0.0, 0.0])*X --> [0.5 0.0; 0.0 0.5]
|
||||
@fact (diff(h)*X)([0.0, 0.0]) --> [0.5 0.0; 0.0 0.5]
|
||||
h(xi) = [
|
||||
(1-xi[1])*(1-xi[2])/4
|
||||
(1+xi[1])*(1-xi[2])/4
|
||||
(1+xi[1])*(1+xi[2])/4
|
||||
(1-xi[1])*(1+xi[2])/4]
|
||||
dh(xi) = [
|
||||
-(1-xi[2])/4.0 -(1-xi[1])/4.0
|
||||
(1-xi[2])/4.0 -(1+xi[1])/4.0
|
||||
(1+xi[2])/4.0 (1+xi[1])/4.0
|
||||
-(1+xi[2])/4.0 (1-xi[1])/4.0]
|
||||
N = Basis(h, dh)
|
||||
|
||||
# multiplying scalar field with a vector -> vector
|
||||
b = Basis((xi) -> [1/2*(1-xi[1]), 1/2*(1+xi[1])])
|
||||
f = Field(0.0, 100.0)
|
||||
@fact b(0.0) * f --> [50.0, 50.0]
|
||||
X = Field(0.0, Vector[[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0]])
|
||||
|
||||
# get midpoint of field in spatial domain
|
||||
@fact interpolate(N, X, [0.0, 0.0]) --> [0.5, 0.5]
|
||||
# derivatives of field at midpoint
|
||||
@fact dinterpolate(N, X, [0.0, 0.0]) --> [0.5 0.0; 0.0 0.5]
|
||||
|
||||
# interpolate of scalar field -> scalar
|
||||
H = Field(0.0, 6.0)
|
||||
@fact interpolate(N, H, [0.0, 0.0]) --> 6.0
|
||||
|
||||
# multiplying scalar field with a vector -> vector
|
||||
# this is actually not so good idea...
|
||||
#h(xi) = [1/2*(1-xi[1]), 1/2*(1+xi[1])]
|
||||
#dh(xi) = [-1/2 1/2]'
|
||||
#N = Basis(h, dh)
|
||||
#f = Field(0.0, 100.0)
|
||||
#@fact interpolate(N, f, [0.0]) --> [50.0, 50.0]
|
||||
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user