problems_mortar_3d.jl: rename function contains to approx_in (#86)

* problems_mortar_3d.jl: rename function contains to approx_in

See issue #85. `contains` is now renamed to `approx_in`. I also
switched argument order, so this function is now called in a same
way function `in()`. Usage example:

    julia> P = Vector[[1.0, 1.0], [2.0, 2.0]]
    2-element Array{Array{T,1},1}:
     [1.0,1.0]
     [2.0,2.0]

    julia> q = [1.0, 1.0] + eps(Float64)
    2-element Array{Float64,1}:
     1.0
     1.0

    julia> in(q, P)
    false

    julia> approx_in(q, P)
    true

Also added docstring and usage example.

* Removed `importall base` from code
This commit is contained in:
Jukka Aho
2017-02-01 10:42:31 +02:00
committed by Tero Frondelius
parent c307c1482c
commit bb06b151cb
7 changed files with 40 additions and 26 deletions
+3 -1
View File
@@ -8,7 +8,9 @@ This is JuliaFEM -- Finite Element Package
"""
module JuliaFEM
importall Base
import Base: getindex, setindex!, convert, length, size, isapprox, similar,
start, first, next, done, last, endof, vec, ==, +, -, *, /, haskey, copy,
push!, isempty, empty!, append!, sparse, full, read
using Logging
+1 -1
View File
@@ -1,7 +1,7 @@
# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md
importall Base
import Base: getindex, length
using JuliaFEM
using JuliaFEM.Preprocess
+7 -7
View File
@@ -89,12 +89,12 @@ function length(f::DCTI)
return 1
end
function Base.:*(c::Number, f::DCTI)
function *(c::Number, f::DCTI)
return c*f.data
end
""" Kind of spatial interpolation of DCTI. """
function Base.:*(N::Matrix, f::DCTI)
function *(N::Matrix, f::DCTI)
@assert length(N) == 1
return N[1]*f.data
end
@@ -179,11 +179,11 @@ function start(field::DVTI)
return 1
end
function Base.:+(f1::DVTI, f2::DVTI)
function +(f1::DVTI, f2::DVTI)
return DVTI(f1.data + f2.data)
end
function Base.:-(f1::DVTI, f2::DVTI)
function -(f1::DVTI, f2::DVTI)
return DVTI(f1.data - f2.data)
end
@@ -192,20 +192,20 @@ function update!(field::DVTI, data::Union{Vector, Dict})
end
""" Take scalar product of DVTI and constant T. """
function Base.:*(T::Number, field::DVTI)
function *(T::Number, field::DVTI)
return DVTI(T*field.data)
end
""" Take dot product of DVTI field and vector T. Vector length must match to the
field length and this can be used mainly for interpolation purposes, i.e., u = ∑ Nᵢuᵢ.
"""
function Base.:*(T::Vector, f::DVTI)
function *(T::Vector, f::DVTI)
@assert length(T) <= length(f)
return sum([T[i]*f[i] for i=1:length(T)])
end
""" Take outer product of DVTI field and matrix T. """
function Base.:*(T::Matrix, f::DVTI)
function *(T::Matrix, f::DVTI)
n, m = size(T)
return sum([kron(T[:,i], f[i]') for i=1:m])'
end
-2
View File
@@ -1,8 +1,6 @@
# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md
importall Base
using JuliaFEM
using DataFrames
using HDF5
+1 -1
View File
@@ -12,7 +12,7 @@
- etc only topology related stuff
=#
importall Base
import Base: copy
using JuliaFEM
-2
View File
@@ -1,8 +1,6 @@
# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md
importall Base
element_has_nodes(::Type{Val{:C3D4}}) = 4
element_has_type( ::Type{Val{:C3D4}}) = :Tet4
+28 -12
View File
@@ -72,16 +72,32 @@ function get_cells(P, C; allow_quads=false)
return cells
end
""" Test does P contain q. """
function contains{T}(P::Vector{T}, q::T; check_is_close=true, rtol=1.0e-4)
if q in P
return true
end
if check_is_close
for p in P
if isapprox(p, q; rtol=rtol)
return true
end
""" Test does vector P contain approximately q. This function uses isapprox()
internally to make boolean test.
Examples
--------
julia> P = Vector[[1.0, 1.0], [2.0, 2.0]]
2-element Array{Array{T,1},1}:
[1.0,1.0]
[2.0,2.0]
julia> q = [1.0, 1.0] + eps(Float64)
2-element Array{Float64,1}:
1.0
1.0
julia> in(q, P)
false
julia> approx_in(q, P)
true
"""
function approx_in{T}(q::T, P::Vector{T}; rtol=1.0e-4, atol=0.0)
for p in P
if isapprox(q, p; rtol=rtol, atol=atol)
return true
end
end
return false
@@ -104,7 +120,7 @@ function get_polygon_clip(xs, xm, n)
# 2. test is slave point inside master, if yes, add to clip
for i=1:ns
if vertex_inside_polygon(xs[i], xm)
contains(P, xs[i]) && continue
approx_in(xs[i], P) && continue
debug("2. $(xs[i]) inside M -> push")
push!(P, xs[i])
end
@@ -127,7 +143,7 @@ function get_polygon_clip(xs, xm, n)
q = xs1 + t*(xs2 - xs1)
#info("t=$t, q=$q, q ∈ xm ? $(vertex_inside_polygon(q, xm))")
if vertex_inside_polygon(q, xm)
contains(P, q) && continue
approx_in(q, P) && continue
debug("3. $q inside M -> push")
push!(P, q)
end