mirror of
https://github.com/JuliaFEM/JuliaFEM.jl.git
synced 2026-09-24 11:16:47 +00:00
- problem can be now represented using potential energy or residual
force vector, autodiff takes care of linearization - elasticity equations are now solved using e.g. principle of minimum potential energy. syntax is quite good, see notebook. - updated how to interpolate fields, by introducing function spaces. syntax is now good. still have to figure out how to do time derivatives - etc. etc. tutorial is broken at the moment, i took of get_lhs and get_rhs because they didn't really work.
This commit is contained in:
+33
-1
@@ -2,7 +2,7 @@
|
||||
# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md
|
||||
|
||||
using FactCheck
|
||||
using JuliaFEM: Element, Basis, FieldSet
|
||||
using JuliaFEM: Element, Basis, Field, FieldSet, FunctionSpace
|
||||
|
||||
""" Prototype element
|
||||
|
||||
@@ -51,3 +51,35 @@ facts("test adding fieldsets and fields to element") do
|
||||
@fact fields[2] --> field2
|
||||
end
|
||||
|
||||
facts("interpolation of fields in some function space") do
|
||||
|
||||
element = MockElement([1, 2, 3, 4])
|
||||
fieldset1 = FieldSet("geometry", [Field(0.0, Vector[[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0]])])
|
||||
fieldset2 = FieldSet("constant scalar field", [Field(0.0, 1.0)])
|
||||
fieldset3 = FieldSet("scalar field", [Field(0.0, [1.0, 2.0, 3.0, 4.0])])
|
||||
fieldset4 = FieldSet("vector field 1", [Field(0.0, Vector[[1.0], [2.0], [3.0], [4.0]])])
|
||||
fieldset5 = FieldSet("vector field 2", [Field(0.0, Vector[[1.0, 5.0], [2.0, 6.0], [3.0, 7.0], [4.0, 8.0]])])
|
||||
fieldset6 = FieldSet("vector field 3", [Field(0.0, Vector[[1.0, 5.0, 9.0], [2.0, 6.0, 10.0], [3.0, 7.0, 11.0], [4.0, 8.0, 12.0]])])
|
||||
fieldset7 = FieldSet("tensor field 1", [Field(0.0, Matrix[[1.0 5.0; 9.0 13.0], [2.0 6.0; 10.0 14.0], [3.0 7.0; 11.0 15.0], [4.0 8.0; 12.0 16.0]])])
|
||||
|
||||
push!(element, fieldset1)
|
||||
push!(element, fieldset2)
|
||||
push!(element, fieldset3)
|
||||
push!(element, fieldset4)
|
||||
push!(element, fieldset5)
|
||||
push!(element, fieldset6)
|
||||
push!(element, fieldset7)
|
||||
|
||||
xi = [0.0, 0.0]
|
||||
t = 0.0
|
||||
u = FunctionSpace(element)
|
||||
v = FunctionSpace(element)
|
||||
|
||||
@fact v("constant scalar field", xi, t) --> 1.0
|
||||
@fact v("scalar field", xi, t) --> 1/4*(1+2+3+4)
|
||||
@fact v("vector field 1", xi, t) --> [1/4*(1+2+3+4)]
|
||||
@fact v("vector field 2", xi, t) --> 1/4*[1+2+3+4, 5+6+7+8]
|
||||
@fact v("vector field 3", xi, t) --> 1/4*[1+2+3+4, 5+6+7+8, 9+10+11+12]
|
||||
@fact v("tensor field 1", xi, t) --> 1/4*[1+2+3+4 5+6+7+8; 9+10+11+12 13+14+15+16]
|
||||
end
|
||||
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
# This file is a part of JuliaFEM.
|
||||
# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md
|
||||
|
||||
using JuliaFEM: get_basis, grad, FieldSet, Field, Quad4
|
||||
using FactCheck
|
||||
|
||||
element = Quad4([1, 2, 3, 4])
|
||||
|
||||
geometry_field = Field(0.0, Vector[]) # Create empty field at time t=0.0
|
||||
push!(geometry_field, [ 0.0, 0.0]) # push some values for field
|
||||
push!(geometry_field, [ 1.0, 0.0])
|
||||
push!(geometry_field, [ 1.0, 1.0])
|
||||
push!(geometry_field, [ 0.0, 1.0])
|
||||
geometry_fieldset = FieldSet("geometry") # create fieldset "geometry"
|
||||
push!(geometry_fieldset, geometry_field) # add field to fieldset
|
||||
push!(element, geometry_fieldset) # add fieldset to element
|
||||
|
||||
temperature_fieldset = FieldSet("temperature")
|
||||
push!(temperature_fieldset, Field(0.0, [0.0, 0.0, 0.0, 0.0]))
|
||||
push!(temperature_fieldset, Field(1.0, [1.0, 2.0, 3.0, 4.0]))
|
||||
push!(element, temperature_fieldset)
|
||||
|
||||
displacement_fieldset = FieldSet("displacement")
|
||||
push!(displacement_fieldset, Field(0.0, Vector[[0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0]]))
|
||||
push!(displacement_fieldset, Field(1.0, Vector[[0.0, 0.0], [0.0, 0.0], [0.25, 0.0], [0.0, 0.0]]))
|
||||
push!(element, displacement_fieldset)
|
||||
|
||||
facts("basic continuum interpolations") do
|
||||
# from my old home works
|
||||
basis = get_basis(element)
|
||||
dbasis = grad(basis)
|
||||
@fact basis("geometry", [0.0, 0.0], 1.0) + basis("displacement", [0.0, 0.0], 1.0) --> [9/16, 1/2]
|
||||
gradu = dbasis("displacement", [0.0, 0.0], 1.0)
|
||||
epsilon = 1/2*(gradu + gradu')
|
||||
rotation = 1/2*(gradu - gradu')
|
||||
X = basis("geometry", [0.0, 0.0], 1.0)
|
||||
k = 0.25
|
||||
epsilon_wanted = [X[2]*k 1/2*X[1]*k; 1/2*X[1]*k 0]
|
||||
rotation_wanted = [0 k/2*X[1]; -k/2*X[1] 0]
|
||||
@fact epsilon --> roughly(epsilon_wanted)
|
||||
@fact rotation --> roughly(rotation_wanted)
|
||||
F = I + gradu
|
||||
@fact F --> [X[2]*k+1 X[1]*k; 0 1]
|
||||
C = F'*F
|
||||
@fact C --> [(X[2]*k+1)^2 (X[2]*k+1)*X[1]*k; (X[2]*k+1)*X[1]*k X[1]^2*k^2+1]
|
||||
E = 1/2*(F'*F - I)
|
||||
@fact E --> [1/2*(X[2]*k + 1)^2-1/2 1/2*(X[2]*k+1)*X[1]*k; 1/2*(X[2]*k + 1)*X[1]*k 1/2*X[1]^2*k^2]
|
||||
U = 1/sqrt(trace(C) + 2*sqrt(det(C)))*(C + sqrt(det(C))*I)
|
||||
#@fact U --> roughly([1.24235 0.13804; 0.13804 1.02149])
|
||||
end
|
||||
Reference in New Issue
Block a user