Package: scikit-fem
scikit-femscikit-femis a pure Python 3.8+ library for performingfinite element
assembly. Its main
purpose is the transformation of bilinear forms into sparse matrices and linear
forms into vectors.The libraryhas minimal dependenciescontains no compiled codesupports one-dimensional, triangular, quadrilateral, tetrahedral and hexahedral finite elementsincludes special elements such as Raviart-Thomas, Nédélec, MINI, Crouzeix-Raviart, Argyris, ...If you use the library in your research, you can cite the following article:@article{skfem2020,
  doi = {10.21105/joss.02369},
  year = {2020},
  volume = {5},
  number = {52},
  pages = {2369},
  author = {Tom Gustafsson and G. D. McBain},
  title = {scikit-fem: A {P}ython package for finite element assembly},
  journal = {Journal of Open Source Software}
}InstallationThe most recent release can be installed simply bypip install scikit-fem[all]Remove[all]to not install the optional dependenciesmeshiofor mesh
input/output, andmatplotlibfor creating simple visualizations.
The minimal dependencies arenumpyandscipy.
You can also try the library in browser throughGoogle Colab.ExamplesSolve the Poisson problem (see alsoex01.py):fromskfemimport*fromskfem.helpersimportdot,grad# create the meshmesh=MeshTri().refined(4)# or, with your own points and elements:# mesh = MeshTri(points, elements)basis=Basis(mesh,ElementTriP1())@BilinearFormdeflaplace(u,v,_):returndot(grad(u),grad(v))@LinearFormdefrhs(v,_):return1.*vA=laplace.assemble(basis)b=rhs.assemble(basis)# Dirichlet boundary conditionsA,b=enforce(A,b,D=mesh.boundary_nodes())# solve the linear systemx=solve(A,b)# plot using matplotlibmesh.plot(x,shading='gouraud',colorbar=True).show()# or, save to external file:# mesh.save('output.vtk', point_data={'solution': x})Meshes can be initialized manually, loaded from external files usingmeshio, or created with the help of special
constructors:importnumpyasnpfromskfemimportMeshLine,MeshTri,MeshTetmesh=MeshLine(np.array([0.,.5,1.]))mesh=MeshTri(np.array([[0.,0.],[1.,0.],[0.,1.]]).T,np.array([[0,1,2]]).T,)mesh=MeshTri.load("docs/examples/meshes/square.msh")# requires meshiomesh=MeshTet.init_tensor(*((np.linspace(0,1,60),)*3))We supportmany common finite
elements.
Below the stiffness matrix is assembled using second-order tetrahedra:fromskfemimportBasis,ElementTetP2basis=Basis(mesh,ElementTetP2())# quadratic tetrahedronA=laplace.assemble(basis)# type: scipy.sparse.csr_matrixMore examples can be found in thegallery.BenchmarkThe following benchmark (docs/examples/performance.py) demonstrates the time
spent on finite element assembly in comparison to the time spent on linear
solve.  The given numbers were calculated using a ThinkPad X1 Carbon laptop (7th
gen).  Note that the timings are only illustrative as they depend on, e.g., the
type of element used, the number of quadrature points used, the type of linear
solver, and the complexity of the forms.  This benchmark solves the Laplace
equation using linear tetrahedral elements and the default direct sparse solver
ofscipy.sparse.linalg.spsolve.Degrees-of-freedomAssembly (s)Linear solve (s)40960.048050.0424180000.098040.16269156250.203470.87741327680.463995.98163640001.0014336.478551250002.05274nan2621444.48825nan5120008.82814nan103030118.25461nanDocumentationThe project is documented using Sphinx underdocs/.
Built version can be found fromRead the Docs.
Here are direct links to additional resources:Examples from our test suiteExamples from the FEniCS tutorialGetting helpIf you encounter an issue you can use GitHub issue tracker.  If you cannot find help from the documentation,
you can use the GitHub Discussions toask questions.
Try to provide a snippet of code which fails
and include also the version of the library you are
using.  The version can be found as follows:importskfem;print(skfem.__version__)DependenciesThe minimal dependencies for installingscikit-femarenumpyandscipy.  In addition,
manyexamplesusematplotlibfor visualization andmeshiofor loading/saving different mesh
file formats.  Some examples demonstrate the use of other external packages;
seerequirements.txtfor a list of test dependencies.TestingThe tests are run by GitHub Actions.  TheMakefilein the repository root has
targets for running the testing container locally usingdocker.  For example,make test_py38runs the tests usingpy38branch fromkinnala/scikit-fem-docker-action.
The releases are tested inkinnala/scikit-fem-release-tests.LicensingThe contents ofskfem/and the PyPI packagescikit-femare licensed under
the 3-clause BSD license.  Some examples underdocs/examples/or snippets
in the documentation may have a different license.AcknowledgementsThis project was started while working under a grant from theFinnish Cultural
Foundation.  Versions 2.0.0+ were prepared while working in
a project funded by Academy of Finland (decisions nr. 324611 and 338341).
The approach used in the finite element assembly has been inspired by thework
of A. Hannukainen and
M. Juntunen.ContributingWe are happy to welcome any contributions to the library.  Reasonable projects
for first timers include:Reporting abugWriting anexampleImproving thetestsFinding typos in the documentation.By contributing code to scikit-fem, you are agreeing to release it under BSD-3-Clause, see LICENSE.md.ChangelogThe format is based onKeep a Changelog,
and this project adheres toSemantic Versioningwith respect to documented and/or tested features.[9.0.1] - 2024-01-12Fixed:ElementVectorworks also for split_bases/split_indices in casemesh.dim() != elem.dim[9.0.0] - 2023-12-24Removed: Python 3.7 supportRemoved:MappingMortarandMortarFacetBasisin favor ofskfem.supermeshingDeprecated:skfem.visuals.glvis; current version is broken and no
replacement is being plannedAdded: Python 3.12 supportAdded:Mesh.loadsupports new keyword argumentsignore_orientation=Trueandignore_interior_facets=Truewhich
will both speed up the loading of larger three-dimensional meshes by
ignoring facet orientation and all tags not on the boundary,
respectively.Added:skfem.supermeshing(requiresshapely>=2) for creating quadrature
rules for interpolating between two 1D or 2D meshes.Added:Mesh.remove_unused_nodesAdded:Mesh.remove_duplicate_nodesAdded:Mesh.remove_elementsnow supports passing any subdomain
reference throughMesh.normalize_elements; subdomains and
boundaries are also properly preservedFixed:MeshTetuniform refine was reindexing subdomains incorrectlyFixed:MeshDG.drawdid not work; now callsBasis.drawwhich
works for any mesh topologyFixed:FacetBasisnow works withMeshTri2,MeshQuad2,MeshTet2andMeshHex2Fixed:ElementGlobalnow uses outward normals to initialize DOFs
on boundary facets[8.1.0] - 2023-06-16Added:ElementTriHHJ0andElementTriHHJ1matrix finite elements
for implementing the Hellan-Hermann-Johnson mixed method (seeex48.py)Added:ElementHexSkeleton0, piecewise constant element on the skeleton
of a hexahedral meshAdded:ElementHexC1, C1-continuous hexahedral elementAdded:Mesh.restrictnow preserves subdomains and boundariesAdded:skfem.utils.mpcfor setting multipoint constraintsAdded:Basis.get_dofsnow supports fetching DOFs at specific nodes
through kwargnodesAdded:DofsView.sortfor sorting a set of DOFs returned byBasis.get_dofsAdded:CellBasis.with_elementsas a shortcut for initiating a new Basis with subset of elementsAdded:Mesh.refinednow preserves subdomains in adaptive mesh refinementFixed:Mesh.refinedused to modify the element connectivity of the original mesh[8.0.0] - 2022-12-16Removed: The deprecatedBasis.find_dofsmethod, seeBasis.get_dofsfor a
replacementAdded: RenamedElementTetN0toElementTriN1and added alias for backwards
compatibilityAdded:ElementQuadN1, first order H(curl) conforming quadrilateral elementAdded:ElementTriN1, first order H(curl) conforming triangle elementAdded:ElementTriN2, second order H(curl) conforming triangle elementAdded:ElementTetSkeletonP0, extension ofElementTriSkeletonP0to
tetrahedral meshesAdded:Mesh.restrictwhich returns a new mesh given a subset of elements or subdomainAdded:Mesh.tracewhich turns facets into a trace meshAdded:skfem.utils.bmat, a variant ofscipy.sparse.bmatwhich adds the
indices of the different blocks as an attributeout.blocksAdded: Plane strain to plane stress mapping underskfem.models.elasticityAdded: Various methods such asBasis.interpolateandBasis.projectnow support specifyingdtypeand using complex fieldsFixed:  Python 3.11Fixed:Basis.intepolatedid not work properly withElementCompositewhen the basis was defined only for a subset of elementsFixed:Basis.splitworked incorrectly forElementVectorand multiple DOFs
of same typeFixed: Caching ofElementQuadPbasis for reused quadrature points
did not work correctlyDeprecated:MappingMortarandMortarFacetBasisin favor of
plainFacetBasisand the upcomingskfem.experimental.supermeshing(seeex04.py)[7.0.1] - 2022-08-03Fixed: Updated changelog was missing.[7.0.0] - 2022-08-03Changed: Removed the optimization of usingDiscreteField.is_zeroin the
helpers to skip the evaluation of zero components inElementCompositeto
improve type stability with respect to the size of the underlying numpy
arrays; this is technically a backwards incompatible change and might affect
self-created helper functionsDeprecated:FacetBasis.tracein favor ofBasis.interpolatorandBasis.projectAdded: Output ofBasis.interpolatorsupports trailing axes; can be now
passed toBasis.projectfor (inexact) interpolation between meshesAdded: RenamedElementTriRT0toElementTriRT1and added alias for
backwards compatibilityAdded: RenamedElementTetRT0toElementTetRT1and added alias for
backwards compatibilityAdded: RenamedElementQuadRT0toElementQuadRT1and added alias for
backwards compatibilityAdded:ElementTriRT2, the second order Raviart-Thomas elementAdded:ElementHexRT1, the first order Raviart-Thomas element for hexahedral meshesAdded:Basis.projectnow better supportsElementCompositeAdded:solver_iter_cg, a simple pure Python conjugate gradient solver for
environments that do not have sparse solver libraries (e.g., Pyodide)Added:ElementTriP2BandElementTriP1B, new aliases forElementTriMiniandElementTriCCRAdded:ElementTriP1GandElementTriP2G, variants ofElementTriP1andElementTriP2usingElementGlobalso that second derivatives are available
(useful, e.g., for stabilized methods and the Stokes problem)Added:Basis.plot3, a wrapper toskfem.visuals.*.plot3Fixed: Calculation of size inBasis.__repr__was slow and incorrectFixed: Subclasses ofElementHdivdid not work together withFacetBasis[6.0.0] - 2022-03-15Changed:DiscreteFieldis now a subclass ofndarrayinstead ofNamedTupleand, consequently, the components ofDiscreteFieldcannot no
more be indexed inside forms likeu[1](useu.gradinstead)Changed: Writingw['u']andw.uinside the form definition is now
equivalent (previouslyw.u == w['u'].value)Changed:Mesh.drawnow usesmatplotlibby default, callingMesh.draw("vedo")usesvedoChanged:skfem.visuals.matplotlibnow usesjetas the default colormapChanged:BoundaryFacetBasisis now an alias ofFacetBasisinstead of
other way aroundDeprecated:DiscreteField.valueremains for backwards-compatibility but is
now deprecated and can be droppedAdded:Mesh.plot, a wrapper toskfem.visuals.*.plotAdded:Basis.plot, a wrapper toskfem.visuals.*.plotAdded:Basis.refinterpnow supports vectorial fieldsAdded:skfem.visuals.matplotlib.plotnow has a basic quiver plot for vector
fieldsAdded:Mesh.facets_aroundwhich constructs a set of facets around a
subdomainAdded:Mesh.saveandloadnow preserve the orientation of boundaries and
interfacesAdded:OrientedBoundarywhich is a subclass ofndarrayfor facet index
arrays with the orientation information (0 or 1 per facet) available asOrientedBoundary.oriAdded:FacetBasiswill use the facet orientations (if present) to calculate
traces and normal vectorsAdded:skfem.visuals.matplotlib.drawwill visualize the orientations ifboundaries=Trueis givenAdded:Mesh.facets_satisfyingallows specifying the keyword argumentnormalfor orienting the resulting interfaceAdded:FacetBasisconstructor now has the keyword argumentsidewhich
allows changing the side of the facet used to calculate the basis function
values and gradientsAdded:Basis.boundarymethod to quickly initialize the correspondingFacetBasisFixed: Improvements to backwards compatibility inasm/assemblekeyword
argumentsFixed: Save format issue with meshio 5.3.0+Fixed:CellBasisdid not properly supportelementsargumentFixed:Basis.interpolatedid not properly interpolate all components ofElementComposite[5.2.0] - 2021-12-27Added:Basis.project, a more general and easy to use alternative forprojectionAdded:BasisandFacetBasiskwargselementsandfacetscan now be a
string refering to subdomain and boundary tagsAdded:ElementQuadRT0, lowest-order quadrilateral Raviart-Thomas elementFixed:Functionalreturned only the first component for forms with
non-scalar output[5.1.0] - 2021-11-30Added:skfem.helpers.mulfor matrix multiplicationAdded:Basis.splitwill now also splitElementVectorinto its componentsFixed:ElementDGwas not included in the wildcard importFixed: Automatic visualization ofMeshTri2andMeshQuad2in Jupyter
notebooks raised exception[5.0.0] - 2021-11-21Changed:meshiois now an optional dependencyChanged:ElementCompositeusesDiscreteField()to represent zeroAdded: Support more argument types inBasis.get_dofsAdded: Version information inskfem.__version__Added: PreserveMesh.boundariesduring uniform refinement ofMeshLine1,MeshTri1andMeshQuad1Fixed: Refinement of quadratic meshes will now fall back to the refinement
algorithm of first-order meshes instead of crashingFixed: Edge cases in the adaptive refine ofMeshTet1that failed to produce
a valid meshDeprecated:Basis.find_dofsin favor ofBasis.get_dofsDeprecated: MergingDofsViewobjects via+and|because of surprising
behavior in some edge cases[4.0.1] - 2021-10-15Fixed:MappingIsoparametriccan now be pickled[4.0.0] - 2021-09-27Added:Mesh.save/Mesh.loadnow exports/importsMesh.subdomainsandMesh.boundariesAdded:Mesh.loadnow optionally writes any mesh data to a list passed via
the keyword argumentout, e.g.,out=datawheredata = ['point_data']Added:Mesh.load(andskfem.io.meshio.from_file) now supports the
additional keyword argumentforce_meshio_typefor loading mesh files that
have multiple element types written in the same file, one element type at
a timeAdded:asmwill now accept a list of bases, assemble the same form using
all of the bases and sum the result (useful for jump terms and mixed meshes,
seeex41.pyAdded:Mesh.with_boundariesnow allows the definition of internal boundaries/interfaces
via the flagboundaries_only=FalseAdded:MeshTri1DG,MeshQuad1DG,MeshHex1DG,MeshLine1DG; new mesh
types for describing meshes with a discontinuous topology, e.g., periodic
meshes (seeex42.py)Added:ElementHexDGfor transforming hexahedral H1 elements to DG/L2 elements.Added:ElementTriP1DG,ElementQuad1DG,ElementHex1DG,ElementLineP1DG; shorthands forElementTriDG(ElementTriP1())etc.Added:ElementTriSkeletonP0andElementTriSkeletonP1for defining
Lagrange multipliers on the skeleton mesh (seeex40.py)Added:TrilinearFormfor assembling a sparse 3-tensor, e.g., when dealing
with unknown material dataAdded:MeshTri.orientedfor CCW oriented triangular meshes which can be
useful for debugging or interfacing to external toolsAdded: partial support forMeshWedge1andElementWedge1, the lowest order
wedge mesh and elementAdded:ElementTriP3, cubic triangular Lagrange elementAdded:ElementTriP4, quartic triangular Lagrange elementAdded:ElementTri15ParamPlate, 15-parameter nonconforming triangular element for platesAdded:ElementTriBDM1, the lowest order Brezzi-Douglas-Marini elementAdded:Mesh.draw().show()will now visualize any mesh interactively (requiresvedo)Added: Adaptive refinement forMeshTet1Fixed:MappingIsoparametricis now about 2x faster for large meshes thanks
to additional cachingFixed:MeshHex2.savedid not work properlyFixed:Mesh.loadignores unparseablecell_setsinserted bymeshioin MSH 4.1Changed:Meshstring representation is now more informativeChanged:Form.assembleno more allows keyword arguments withlistordicttype: from now on onlyDiscreteFieldor 1d/2dndarrayobjects are
allowed and 1dndarrayis passed automatically toBasis.interpolatefor
convenienceChanged:MeshLineis now a function which initializesMeshLine1and not an alias toMeshLine1Changed:FacetBasisis now a shorthand forBoundaryFacetBasisand no
longer initializesInteriorFacetBasisorMortarFacetBasisif the keyword
argumentsideis passed to the constructorRemoved: the deprecatedMesh.define_boundarymethod[3.2.0] - 2021-08-02Added:ElementTriCCRandElementTetCCR, conforming Crouzeix-Raviart finite elementsFixed:Mesh.mirroredreturned a wrong mesh when a point other than the origin was usedFixed:MeshLineconstructor accepted only numpy arrays and not plain Python listsFixed:Mesh.element_finder(andCellBasis.probes,CellBasis.interpolator) was not working properly for a small number of elements (<5) or a large number of input points (>1000)Fixed:MeshTetandMeshTri.element_finderare now more robust against degenerate elementsFixed:Mesh.element_finder(andCellBasis.probes,CellBasis.interpolator) raises exception if the query point is outside of the domain[3.1.0] - 2021-06-18Added:Basis, a shorthand forCellBasisAdded:CellBasis, a new preferred name forInteriorBasisAdded:BoundaryFacetBasis, a new preferred name forExteriorFacetBasisAdded:skfem.utils.penalize, an alternative tocondenseandenforcefor
essential boundary conditionsAdded:InteriorBasis.point_source, withex38Added:ElementTetDG, similar toElementTriDGfor tetrahedral meshesFixed:MeshLine1.element_finder[3.0.0] - 2021-04-19Added: Completely rewrittenMeshbase class which is "immutable" and usesElementclasses to define the ordering of nodes; better support for
high-order and other more general mesh types in the futureAdded: New quadratic mesh types:MeshTri2,MeshQuad2,MeshTet2andMeshHex2Added:InteriorBasis.probes; likeInteriorBasis.interpolatorbut returns a matrix
that operates on solution vectors to interpolate them at the given pointsAdded: More overloads forDiscreteField, e.g., multiplication, summation
and subtraction are now explicitly supported inside the form definitionsAdded:MeshHex.to_meshtetfor splitting hexahedra into tetrahedraAdded:MeshHex.element_finderfor interpolating finite element solutions
on hexahedral meshes viaInteriorBasis.interpolatorAdded:Mesh.with_boundaries, a functional replacement toMesh.define_boundary, i.e. defining boundaries via Boolean lambda functionAdded:Mesh.with_subdomainsfor defining subdomains via Boolean lambda functionAdded:skfem.utils.projection, a replacement ofskfem.utils.projectwith a different, more intuitive order of argumentsAdded:skfem.utils.enforcefor setting essential boundary conditions by
changing matrix rows to zero and diagonals to one.Deprecated:skfem.utils.projectin favor ofskfem.utils.projectionDeprecated:Mesh.define_boundaryin favor ofMesh.with_boundariesRemoved:Mesh.{refine,scale,translate}; the replacements areMesh.{refined,scaled,translated}Removed:skfem.models.helpers; available asskfem.helpersRemoved:DiscreteField.{f,df,ddf,hod}; available asDiscreteField.{value,grad,hess,grad3,...}Removed: Python 3.6 supportRemoved:skfem.utils.L2_projectionRemoved:skfem.utils.derivativeChanged:Mesh.refinedno more attempts to fix the indexing ofMesh.boundariesafter refineChanged:skfem.utils.solvenow usesscipy.sparse.eigsinstead ofscipy.sparse.eigshby default;
the old behavior can be retained by explicitly passingsolver=solver_scipy_eigs_sym()Fixed: High memory usage inskfem.visuals.matplotlibrelated to 1D plotting[2.5.0] - 2021-02-13Deprecated:sidekeyword argument toFacetBasisin favor of the more
explicitInteriorFacetBasisandMortarFacetBasis.Added:InteriorFacetBasisfor integrating over the interior facets, e.g.,
evaluating error estimators with jumps and implementing DG methods.Added:MortarFacetBasisfor integrating over the mortar mesh.Added:InteriorBasis.with_elementfor reinitializing an equivalent basis
that uses a different element.Added:Form.partialfor applyingfunctools.partialto the form function
wrapped byForm.Fixed: Include explicit Python 3.9 support.[2.4.0] - 2021-01-20Deprecated: List and tuple keyword argument types toasm.Deprecated:Mesh2D.mirrorin favor of the more generalMesh.mirrored.Deprecated:Mesh.refine,Mesh.scaleandMesh.translatein favor ofMesh.refined,Mesh.scaledandMesh.translated.Added:Mesh.refined,Mesh.scaled, andMesh.translated. The new methods
return a copy instead of modifyingself.Added:Mesh.mirroredfor mirroring a mesh using a normal and a point.Added:Functionalnow supports forms that evaluate to vectors or other
tensors.Added:ElementHex0, piecewise constant element for hexahedral meshes.Added:FacetBasis.tracefor restricting existing solutions to lower
dimensional meshes on boundaries or interfaces.Fixed:MeshLine.refinednow correctly performs adaptive refinement of
one-dimensional meshes.[2.3.0] - 2020-11-24Added:ElementLineP0, one-dimensional piecewise constant element.Added:skfem.helpers.curlnow calculates the rotated gradient for
two-dimensional elements.Added:MeshTet.init_ballfor meshing a ball.Fixed:ElementQuad0was not compatible withFacetBasis.[2.2.3] - 2020-10-16Fixed: Remove an unnecessary dependency.[2.2.2] - 2020-10-15Fixed: Make the preconditioner inTestEx32more robust.[2.2.1] - 2020-10-15Fixed: Removetestsfrom the PyPI distribution.[2.2.0] - 2020-10-14Deprecated:L2_projectionwill be replaced byproject.Deprecated:derivativewill be replaced byproject.Added:MeshTet.element_finderandMeshLine.element_finderfor usingInteriorBasis.interpolator.Added:ElementTriCR, the nonconforming Crouzeix-Raviart element for Stokes flow.Added:ElementTetCR, tetrahedral nonconforming Crouzeix-Raviart element.Added:ElementTriHermite, an extension ofElementLineHermiteto triangular
meshes.Fixed: FixMesh.validatefor unsignedMesh.t.[2.1.1] - 2020-10-01Fixed: Further optimizations toMesh3D.boundary_edges: tested to run on a laptop
with over 10 million elements.[2.1.0] - 2020-09-30Added:ElementHex2, a triquadratic hexahedral element.Added:MeshTri.init_circle, constructor for a circle mesh.Fixed:Mesh3D.boundary_edges(and, consequently,Basis.find_dofs) was slow
and used lots of memory due to an exhaustive search of all edges.[2.0.0] - 2020-08-21Deprecated:projectwill only support functions likelambda x: x[0]instead oflambda x, y, z: xin the future.Added: Support for complex-valued forms:BilinearFormandLinearFormnow take
an optional argumentdtypewhich defaults tonp.float64but can be alsonp.complex64.Added:Dofs.__or__andDofs.__add__, for merging degree-of-freedom sets
(i.e.Dofsobjects) using|and+operators.Added:Dofs.dropandDofs.keep, for further filtering the degree-of-freedom setsRemoved: Support for old-style decoratorsbilinear_form,linear_form, andfunctional(deprecated since 1.0.0).Fixed:FacetBasisdid not initialize withElementQuadP.[1.2.0] - 2020-07-07Added:MeshQuad._splitquadsaliased asMeshQuad.to_meshtri.Added:Mesh.__add__, for merging meshes using+operator: duplicated nodes are
joined.Added:ElementHexS2, a 20-node quadratic hexahedral serendipity element.Added:ElementLineMini, MINI-element for one-dimensional mesh.Fixed:Mesh3D.boundary_edgeswas broken in case of hexahedral meshes.Fixed:skfem.utils.projectdid not work forElementGlobal.[1.1.0] - 2020-05-18Added:ElementTetMini, MINI-element for tetrahedral mesh.Fixed:Mesh3D.boundary_edgesincorrectly returned all edges where both nodes are on
the boundary.[1.0.0] - 2020-04-22Deprecated: Old-style form constructorsbilinear_form,linear_form, andfunctional.Changed:Basis.interpolatereturnsDiscreteFieldobjects instead of ndarray tuples.Changed:Basis.interpolateworks now properly for vectorial and high-order elements
by interpolating all components and higher order derivatives.Changed:Form.assembleaccepts now any keyword arguments (with typeDiscreteField)
that are passed over to the forms.Changed: Renamedskfem.importerstoskfem.io.Changed: Renamedskfem.models.helperstoskfem.helpers.Changed:skfem.utils.solvewill now expand also the solutions of eigenvalue problems.Added: New-style form constructorsBilinearForm,LinearForm, andFunctional.Added:skfem.io.jsonfor serialization of meshes to/from json-files.Added:ElementLinePp, p-th order one-dimensional elements.Added:ElementQuadP, p-th order quadrilateral elements.Added:ElementQuadDGfor transforming quadrilateral H1 elements to DG elements.Added:ElementQuadBFS, Bogner-Fox-Schmit element for biharmonic problems.Added:ElementTriMini, MINI-element for Stokes problems.Added:ElementCompositefor using multiple elements in one bilinear form.Added:ElementQuadS2, quadratic Serendipity element.Added:ElementLineHermite, cubic Hermite element for Euler-Bernoulli beams.Added:Mesh.define_boundaryfor defining named boundaries.Added:Basis.find_dofsfor finding degree-of-freedom indices.Added:Mesh.from_basisfor defining high-order meshes.Added:Basis.splitfor splitting multicomponent solutions.Added:MortarMappingwith basic support for mortar methods in 2D.Added:Basisconstructors now acceptquadraturekeyword argument for specifying
a custom quadrature rule.