Skip to content

Commit

Permalink
Merge pull request #64 from sjkelly/sjk/conda2
Browse files Browse the repository at this point in the history
[RFC] Use Conda for CI and fix deprecations
  • Loading branch information
ChrisRackauckas authored Jun 10, 2019
2 parents 9c25583 + 7f11dc3 commit b440534
Show file tree
Hide file tree
Showing 13 changed files with 73 additions and 60 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
*.jl.cov
*.jl.*.cov
*.jl.mem
Manifest.toml
29 changes: 15 additions & 14 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,26 @@
language: julia
os:
- linux
- osx
dist: xenial
julia:
- 1.0

dist: trusty

sudo: required

services:
- docker

- 1.1
# - nightly
addons:
apt:
packages:
pkg-config
before_install:
- echo "**** pulling Docker image"
- docker pull ysimillides/fenics-julia-docker:v1.0
- chmod +x travis_docker_test_script.sh
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew install pkg-config; fi
notifications:
email: false
matrix:
allow_failures:
- julia: nightly
script:
- echo "**** running Docker"
- docker run --env-file travis_docker_env.list -t -a STDOUT -a STDIN -a STDERR -v $PWD:/mnt ysimillides/fenics-julia-docker:v1.0 /mnt/travis_docker_test_script.sh $TRAVIS_JULIA_VERSION
- if [[ -a .git/shallow ]]; then git fetch --unshallow; fi
- julia -e 'using Pkg; ENV["PYTHON"]="";Pkg.add("Conda");Pkg.build("FEniCS");'
- julia -e 'using Pkg, Conda; ENV["PATH"] = "$(Conda.BINDIR);$(ENV["PATH"])";ENV["PKG_CONFIG_PATH"] = "$(Conda.LIBDIR*"/pkgconfig")"; print(ENV["PKG_CONFIG_PATH"]); Pkg.test("FEniCS", coverage=true)'
after_success:
# push coverage results to Coveralls, .cov files were copied back by script above
- echo "**** submitting coverage information"
Expand Down
7 changes: 7 additions & 0 deletions Project.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
name = "FEniCS"
uuid = "186dfeec-b415-5c13-8e76-5fbf19f56f9b"

[deps]
ProgressMeter = "92933f4c-e287-5a05-a399-4b506db050ca"
PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0"
Requires = "ae029012-a4dd-5104-9daa-d747884805df"
4 changes: 0 additions & 4 deletions REQUIRE

This file was deleted.

10 changes: 8 additions & 2 deletions deps/build.jl
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
using PyCall

if Sys.iswindows()
@warn("""
FEniCS is not known to run on Windows!
Please try installing from Windows Subsystem for Linux.
""")
end
try
pyimport("fenics")
pyimport_conda("fenics", "fenics=2019.1.0", "conda-forge")
pyimport_conda("mshr", "mshr=2019.1.0", "conda-forge")
catch ee
typeof(ee) <: PyCall.PyError || rethrow(ee)
@warn("""
Expand All @@ -13,4 +20,3 @@ using PyCall
"""
)
end

10 changes: 6 additions & 4 deletions src/FEniCS.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ __precompile__(false)
module FEniCS
using PyCall
using Requires
@pyimport fenics

fenics = pyimport_conda("fenics", "fenics=2019.1.0", "conda-forge")
ufl = pyimport_conda("ufl", "ufl=2019.1.0", "conda-forge")

function __init__()
@require PyPlot="d330b81b-6aea-500a-939a-2ce795aea3ee" include("jplot.jl")
Expand All @@ -16,7 +18,7 @@ abstract type
fenicsobject
end #creates placeholder for the fenicsobject type

fenicspycall(object::fenicsobject, func::Union{Symbol,String}, args...) = object.pyobject[func](args...)
fenicspycall(object::fenicsobject, func::Union{Symbol,String}, args...) = getproperty(object.pyobject,func)(args...)
export fenicspycall

macro fenicsclass(name::Symbol, base1::Symbol=:fenicsobject)
Expand All @@ -36,7 +38,7 @@ export fenicsclass
str(obj::fenicsobject) = fenicspycall(obj, :__str__)
repr(obj::fenicsobject) = fenicspycall(obj, :__repr__)
show(io::IO, obj::fenicsobject) = show(io, str(obj))
Docs.getdoc(obj::fenicsobject) = obj.pyobject[:__doc__]
Docs.getdoc(obj::fenicsobject) = obj.pyobject.__doc__
export str, repr

include("jmesh.jl") #this file contains the mesh functions
Expand All @@ -46,7 +48,7 @@ include("jsolve.jl") #this file contains the solver functions/routines
include("jinterface.jl")

try
pyimport("mshr")
pyimport_conda("mshr", "mshr=2019.1.0", "conda-forge")
include("fmshr.jl") #this file contains various geometrical objects using the mshr package
catch ee
print("mshr has not been included")
Expand Down
8 changes: 4 additions & 4 deletions src/fmshr.jl
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
@pyimport mshr
mshr = pyimport_conda("mshr", "mshr", "conda-forge")
@fenicsclass Geometry

#functions necessary for creating meshes from geometrical objects.
Expand All @@ -18,9 +18,9 @@ export Circle,Rectangle,Ellipse,Box,Cone,Sphere,generate_mesh


#operator overloading for Geometry types so we can create composite shapes
+(geom_object1::Geometry, geom_object2::Geometry) = Geometry(geom_object1.pyobject[:__add__](geom_object2.pyobject))
-(geom_object1::Geometry, geom_object2::Geometry) = Geometry(geom_object1.pyobject[:__sub__](geom_object2.pyobject))
*(geom_object1::Geometry, geom_object2::Geometry) = Geometry(geom_object1.pyobject[:__mul__](geom_object2.pyobject))
+(geom_object1::Geometry, geom_object2::Geometry) = Geometry(geom_object1.pyobject.__add__(geom_object2.pyobject))
-(geom_object1::Geometry, geom_object2::Geometry) = Geometry(geom_object1.pyobject.__sub__(geom_object2.pyobject))
*(geom_object1::Geometry, geom_object2::Geometry) = Geometry(geom_object1.pyobject.__mul__(geom_object2.pyobject))

set_subdomain(object::Geometry,degree,domain2) = fenicspycall(object, :set_subdomain,degree,domain2.pyobject)
"""
Expand Down
36 changes: 18 additions & 18 deletions src/jfem.jl
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ function split(fun::FeFunction)
end

function py_split(fun::FeFunction)
vec = fun.pyobject[:split]()
vec = fun.pyobject.split()
expr_vec = [FeFunction(spl) for spl in vec]
return expr_vec
end
Expand All @@ -71,16 +71,16 @@ export FeFunction,assign,split,py_split

@fenicsclass Expression

Expression(cppcode::String;element=nothing, cell=nothing, domain=nothing, degree=nothing, name=nothing, label=nothing, mpi_comm=nothing) = Expression(fenics.Expression(cppcode,
element=element,cell=cell, domain=domain, degree=degree, name=name, label=label, mpi_comm=mpi_comm))
Expression(cppcode::String;element=nothing, cell=nothing, domain=nothing, degree=nothing, name=nothing, label=nothing) = Expression(fenics.Expression(cppcode,
element=element,cell=cell, domain=domain, degree=degree, name=name, label=label))
Identity(dim::Int) = Expression(fenics.Identity(dim))
inner(u::Union{Expression,FeFunction}, v::Union{Expression,FeFunction}) = Expression(fenics.inner(u.pyobject, v.pyobject))
outer(u::Union{Expression,FeFunction}, v::Union{Expression,FeFunction}) = Expression(fenics.outer(u.pyobject, v.pyobject))
dot(u::Union{Expression,FeFunction}, v::Union{Expression,FeFunction}) = Expression(fenics.dot(u.pyobject, v.pyobject))
grad(u::Union{Expression,FeFunction}) = Expression(fenics.grad(u.pyobject))
(u::Union{Expression,FeFunction}) = Expression(fenics.grad(u.pyobject))
nabla_grad(u::Union{Expression,FeFunction}) = Expression(fenics.nabla_grad(u.pyobject))
nabla_div(u::Union{Expression,FeFunction}) = Expression(fenics.nabla_div(u.pyobject))
nabla_grad(u::Union{Expression,FeFunction}) = Expression(ufl.nabla_grad(u.pyobject))
nabla_div(u::Union{Expression,FeFunction}) = Expression(ufl.nabla_div(u.pyobject))
div(u::Union{Expression,FeFunction}) = Expression(fenics.div(u.pyobject))
cross(u::Union{Expression,FeFunction}, v::Union{Expression,FeFunction}) = Expression(fenics.cross(u.pyobject, v.pyobject))
tr(u::Union{Expression,FeFunction}) = Expression(fenics.tr(u.pyobject))
Expand Down Expand Up @@ -115,22 +115,22 @@ export dx,ds,dS,dP,directional_derivative
#https://github.com/FEniCS/Expression/blob/master/Expression/measure.py
@fenicsclass Form

*(expr::Union{Expression,FeFunction}, measure::Measure) = Expression(measure.pyobject[:__rmul__](expr.pyobject) )
*(expr::Union{Expression,FeFunction}, measure::Measure) = Expression(measure.pyobject.__rmul__(expr.pyobject) )

*(expr::Union{Expression,FeFunction}, expr2::Union{Expression,FeFunction}) = Expression(expr.pyobject[:__mul__](expr2.pyobject) )
*(expr::Real, expr2::Union{Expression,FeFunction}) = Expression(expr2.pyobject[:__mul__](expr) )
*(expr::Union{Expression,FeFunction}, expr2::Real) = Expression(expr.pyobject[:__mul__](expr2) )
*(expr::Union{Expression,FeFunction}, expr2::Union{Expression,FeFunction}) = Expression(expr.pyobject.__mul__(expr2.pyobject) )
*(expr::Real, expr2::Union{Expression,FeFunction}) = Expression(expr2.pyobject.__mul__(expr) )
*(expr::Union{Expression,FeFunction}, expr2::Real) = Expression(expr.pyobject.__mul__(expr2) )

+(expr::Union{Expression,FeFunction}, expr2::Real) = Expression(expr.pyobject[:__add__](expr2) )
+(expr::Real, expr2::Union{Expression,FeFunction}) = Expression(expr2.pyobject[:__add__](expr) )
+(expr::Union{Expression,FeFunction}, expr2::Union{Expression,FeFunction}) = Expression(expr.pyobject[:__add__](expr2.pyobject) )
+(expr::Union{Expression,FeFunction}, expr2::Real) = Expression(expr.pyobject.__add__(expr2) )
+(expr::Real, expr2::Union{Expression,FeFunction}) = Expression(expr2.pyobject.__add__(expr) )
+(expr::Union{Expression,FeFunction}, expr2::Union{Expression,FeFunction}) = Expression(expr.pyobject.__add__(expr2.pyobject) )

-(expr::Union{Expression,FeFunction}, expr2::Real) = Expression(expr.pyobject[:__sub__](expr2) )
-(expr::Real, expr2::Union{Expression,FeFunction}) = -1*(Expression(expr2.pyobject[:__sub__](expr) ))
-(expr::Union{Expression,FeFunction}, expr2::Union{Expression,FeFunction}) = Expression(expr.pyobject[:__sub__](expr2.pyobject) )
-(expr::Union{Expression,FeFunction}, expr2::Real) = Expression(expr.pyobject.__sub__(expr2) )
-(expr::Real, expr2::Union{Expression,FeFunction}) = -1*(Expression(expr2.pyobject.__sub__(expr) ))
-(expr::Union{Expression,FeFunction}, expr2::Union{Expression,FeFunction}) = Expression(expr.pyobject.__sub__(expr2.pyobject) )

/(expr::Union{Expression,FeFunction}, expr2::Real) = Expression(expr.pyobject[:__div__](expr2) )
/(expr::Union{Expression,FeFunction}, expr2::Union{Expression,FeFunction}) = Expression(expr.pyobject[:__div__](expr2.pyobject) )
/(expr::Union{Expression,FeFunction}, expr2::Real) = Expression(expr.pyobject.__div__(expr2) )
/(expr::Union{Expression,FeFunction}, expr2::Union{Expression,FeFunction}) = Expression(expr.pyobject.__div__(expr2.pyobject) )

function /(expr::Real,expr2::Union{Expression,FeFunction})
x = expr2*expr2
Expand All @@ -140,7 +140,7 @@ function /(expr::Real,expr2::Union{Expression,FeFunction})
end

function Transpose(object::Expression)
x = object.pyobject[:T]
x = object.pyobject.T
y = Expression(x)
return y
end
Expand Down
8 changes: 4 additions & 4 deletions src/jmesh.jl
Original file line number Diff line number Diff line change
Expand Up @@ -72,14 +72,14 @@ UnitTriangleMesh() \n
A mesh consisting of a single triangle with vertices at \n
(0, 0) (1, 0) (0, 1)
"""
UnitTriangleMesh() = Mesh(fenics.UnitTriangleMesh())
UnitTriangleMesh() = Mesh(fenics.cpp.generation.UnitTriangleMesh.create())

"""
UnitTetrahedronMesh() \n
A mesh consisting of a single tetrahedron with vertices at \n
(0, 0, 0) (1, 0, 0) (0, 1, 0) (0, 0, 1)
"""
UnitTetrahedronMesh() = Mesh(fenics.UnitTetrahedronMesh())
UnitTetrahedronMesh() = Mesh(fenics.cpp.generation.UnitTetrahedronMesh.create())


"""
Expand Down Expand Up @@ -153,11 +153,11 @@ export UnitTriangleMesh, UnitTetrahedronMesh, UnitSquareMesh, UnitQuadMesh,
UnitIntervalMesh, UnitCubeMesh, BoxMesh, RectangleMesh, Mesh, BoundaryMesh

function pyUnitTriangleMesh()
pycall(fenics.UnitTriangleMesh::PyObject,PyObject::Type)
fenics.cpp.generation.UnitTriangleMesh.create()
end

function pyUnitTetrahedronMesh()
pycall(fenics.UnitTetrahedronMesh::PyObject,PyObject::Type)
fenics.cpp.generation.UnitTetrahedronMesh.create()
end

function pyUnitCubeMesh(nx::Int, ny::Int, nz::Int)
Expand Down
4 changes: 2 additions & 2 deletions src/jmisc.jl
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@ list_linear_solver_methods()=fenics.list_linear_solver_methods()
"""
Lists information for NonlinearVariationalSolver
"""
info_NonLinearVariationalSolver() = fenics.info(fenics.NonlinearVariationalSolver[:default_parameters](), true)
info_NonLinearVariationalSolver() = fenics.info(fenics.NonlinearVariationalSolver.default_parameters(), true)
"""
Lists information for LinearVariationalSolver
"""
info_LinearVariatonalSolver() = fenics.info(fenics.LinearVariationalSolver[:default_parameters](), true)
info_LinearVariatonalSolver() = fenics.info(fenics.LinearVariationalSolver.default_parameters(), true)

export list_lu_solver_methods, list_krylov_solver_methods, list_krylov_solver_preconditioners, list_linear_solver_methods, info_NonLinearVariationalSolver, info_LinearVariatonalSolver

Expand Down
12 changes: 6 additions & 6 deletions src/jsolve.jl
Original file line number Diff line number Diff line change
Expand Up @@ -79,15 +79,15 @@ XDMFFile(path::StringOrSymbol) = fenics.XDMFFile(path)
export XDMFFile

TimeSeries(path::StringOrSymbol) = fenics.TimeSeries(path)
retrieve(timeseries,placeholder,time) = timeseries[:retrieve](placeholder,time)
retrieve(timeseries,placeholder,time) = timeseries.retrieve(placeholder,time)
export TimeSeries, retrieve


write(path,solution,time::Number) = path[:write](solution.pyobject, time)
write(path,solution::PyObject,time::Number) = path[:write](solution, time)
write(path,solution,time::Number) = path.write(solution.pyobject, time)
write(path,solution::PyObject,time::Number) = path.write(solution, time)

store(path,solution,time::Number) = path[:store](solution.pyobject, time)
store(path,solution::PyObject,time::Number) = path[:store](solution, time)
store(path,solution,time::Number) = path.store(solution.pyobject, time)
store(path,solution::PyObject,time::Number) = path.store(solution, time)

export write,store

Expand All @@ -107,7 +107,7 @@ end
function get_array(solution::FeFunction)
generic_vector = vector(solution)
instantiated_vector = fenics.Vector(generic_vector)
return instantiated_vector[:gather_on_zero]()
return instantiated_vector.gather_on_zero()
end
"""
we return the array from an assembled form
Expand Down
2 changes: 1 addition & 1 deletion test/test_create.jl
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ using PyCall


test_triangle = UnitTriangleMesh()
test_tetrahedron = UnitTetrahedronMesh()
#test_tetrahedron = UnitTetrahedronMesh() # deprecated? https://fenicsproject.org/docs/dolfin/2019.1.0/python/_autogenerated/dolfin.cpp.generation.html
test_interval = UnitIntervalMesh(10)
test_square = UnitSquareMesh(10,10,"crossed")
test_cube = UnitCubeMesh(10,10,10)
Expand Down
2 changes: 1 addition & 1 deletion test/test_pycreate.jl
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ using FEniCS


test_pytriangle = pyUnitTriangleMesh()
test_pytetrahedron = pyUnitTetrahedronMesh()
#test_pytetrahedron = pyUnitTetrahedronMesh() # deprecated? https://fenicsproject.org/docs/dolfin/2019.1.0/python/_autogenerated/dolfin.cpp.generation.html
test_pyquadmesh =pyUnitQuadMesh(10,10) # is one of the experimental meshes, but
#works directly as a PyObject. Investigate this at a later stage?
test_pyinterval = pyUnitIntervalMesh(10)
Expand Down

0 comments on commit b440534

Please sign in to comment.