# created: 20.07.2007 (-1)

from 2010.4 to 2011.1
=====================

- implement discontinuous fields - merge 'discontinuous' branch
  - use mesh connectivity to construct reference maps
    - independently from approximations of variables (fields)
    - always P1 or Q1, based on element geometry
    - update Approximation.describe_geometry() and related functions 
  - new DiscontinuousField, DiscontinuousApproximation classes
  - use DiscontinuousField for P0, Q0 approximations
  - new eval_nodal_coors()
  - update Approximation.eval_extra_coor()
  - new Field.average_qp_to_vertices(), .interp_to_qp()
- update surface fields:
  - new SurfaceApproximation class, used by SurfaceField
  - new SurfaceInterpolant class, used by SurfaceField
- fields:
  - new Field.get_true_order(), .get_vertices()
  - new Field.evaluate_at()
    - allows different behaviour for Field subclasses
  - new Field.get_output_approx_order() - correct output order
  - remove Approximations class, move its functionality to Field
    - simplification to remove a layer of code that was not needed
    - Field.aps is an ordinary dict
    - methods using is_surface split between Field and SurfaceField
- state, variables, degrees of freedom:
  - new DofInfo.get_n_dof_total()
  - new Linear Combination BC operator: IntegralMeanValueOperator
  - new EquationMap.get_operator()
  - new State.from_variables(), .set_parts()
  - add force argument to State.set_full()
  - new Variables.check_vector_size(), use it to check DOF vectors
  - fix Variables.state_to_output() for saving by parts
  - fix Variable.advance() - prevent history modification
  - new FieldVariable.apply_ebc(), .apply_ic()
    - update Variables.apply_ebc(), .apply_ic()
  - new FieldVariable.get_full()
    - update Variables.make_full_vec(), remove var_name argument
  - new FieldVariable.get_reduced()
    - update Variables.strip_state_vector(), fix for non-first variables
  - remove Variable.get_indx(), update State accordingly
    - the indx attribute of a variable is local only, it does not index the
      state vector - dangerous to expose it
- materials: rewrite updating of material parameters
  - allow material nonlinearity, i.e. parameters dependent on state
  - ProblemDefinition instance needs to be passed into
    Materials.time_update() and related functions
  - material user function syntax changed
    - takes ts, coors, mode, equations, term, problem and group_indx
    - the coors argument are the QP coordinates for all element groups
      merged
- equations and evaluation:
  - split Equations.time_update() - new Equations.time_update_materials()
  - fix term evaluation with complex variables
  - update Equations.eval_tangent_matrices() - names argument
  - fix Equations.eval_tangent_matrices() for multi-variate terms
    - clear the matrix there, not in BasicEvaluator.eval_tangent_matrix()
  - update Equations.eval_residuals() - by_blocks, names arguments
  - new Equations.print_terms()
  - add regions argument to create_evaluable()
- terms:
  - new register_term()
  - ensure that each Term instance has caches attribute
  - ensure that all terms in equations share the same DataCaches instance
    - new Equations.setup_caches()
  - update Term.get_arg_name() - add docstring, join argument
  - fix Term.assign_caches(), .get_cache() for material arguments
  - update cachesBasic for complex values
- mesh, domain, regions:
  - generate meshes using: 2D - triangle, 3D - tetgen
  - speed-up mesh reading by using numpy.fromfile()
    - update read_array()
  - update VTKMeshIO, ComsolMeshIO, VTKMeshIO, MeditMeshIO
  - update skip_read_line(), read_token()
  - coordinate transformation matrix can be defined in options
  - allows translation in coordinate transformation
  - new Domain.refine() - uniform tetrahedral mesh refinement
    - new sfepy/fem/refine.py: refine_3_4()
  - new Region.from_vertices()
  - new Region.update_shape(), update Region.complete_description()
  - new Facets.get_complete_facets()
- problem definition:
  - new ProblemDefinition.setup_hooks()
  - fix ProblemDefinition.solve() for LCBCs
  - new ProblemDefinition.set_output_dir(), .set_solvers_instances()
  - update ProblemDefinition.init_solvers() to report presolve time
  - new ProblemDefinition.set_equations_instance()
- solvers:
  - fix time_step_function() to allow presolve if possible
  - fix Newton, SemismoothNewton exception handling (define ok)
  - update/fix TimeStepper construction arguments
  - new pre_process_hook - called in solve_direct
  - fix TimeStepper, get_print_info() for n_step set to 1
  - fix time stepping solver for quasistatic linear problems
    - new prepare_matrix()
- sfepy.linalg:
  - new get_coors_in_ball()
  - new assemble1d(), unique_rows(), infinity_norm()
  - new insert_strided_axis()
  - update cg_eigs(), sym_tri_eigen(), allow eigenvalue selection
  - fix and update dot_sequences() - general mode argument
- large deformation:
  - fix HyperElasticBase for several element groups
  - fix HyperElasticBase for matrix-only assembling
  - compute stress in matrix mode if no previous residual mode call
  - fix BulkPressureTLTerm (dw_tl_bulk_pressure) for several element groups
  - update VolumeTLTerm to work in initial step
  - fix error handling in hyperelastic term caches
  - new sfepy/mechanics/membranes.py: functions for membranes
    - new describe_deformation(), get_tangent_stress_matrix(),
      create_transformation_matrix(), create_mapping(), get_invariants()
- schroedinger: update and clean up
  - update for recent changes (on the fly geometries, Materials under
    Equations, for material nonlinearity, ...)
  - add iter_hook_final application option
  - fix getting parametric hook for inputs with define()
- homogenization:
  - update plotPerfusionCoefs.py
  - new CorrEqPar - parametrized equation via 'eq_pars'
  - update TCorrectorsViaPressureEVP for Variable.get_full()
  - allow complex coefficients
  - fix CorrectorsPermeability
  - update PressureEigenvalueProblem
  - remove obsolete fading memory coefficients
    - remove ViscousFMCoef, BiotFMCoef, BiotFM2Coef, FMRBiotModulus
  - update fading memory coefficients CoefFMSymSym, CoefFMSym, CoefFMOne
  - fading corrector file names obtained by set_variables()
  - update time dependent pressure eigenvalue problem based correctors
  - update TCorrectorsViaPressureEVP
  - update TCorrectorsRSViaPressureEVP, TCorrectorsPressureViaPressureEVP
  - raise original exception in MiniAppBase.init_solvers()
  - update recover_bones()
  - fix variable names in CorrMiniApp.get_output() for no components
- genPerMesh.py:
  - new --repeat option
  - split and move functionality into sfepy.fem
  - move fix_double_nodes(), get_min_edge_size(), get_min_vertex_distance(),
    get_min_vertex_distance_naive() into sfepy/fem/mesh.py
  - new compose_periodic_mesh()
  - remove broken --test option
- new terms:
  - d_sum_vals (sum nodal values, for use in postprocessing)
  - d_diffusion_integrate (diffusion integral term)
  - d_surf_diffusion_integrate (diffusion surface integral term)
  - dw_diffusion_coupling (diffusion copupling term)
  - new d_div term (evaluate divergence term)
  - d_surface_integrate_w (integrate a variable over a surface)
  - d_surface_dot_w (surface dot product for both scalar and vector fields)
- clean up in acoustic terms
 - some of them replaced by more general diffusion terms
- simplify acoustic/diffusion sensitivity terms
  - d_llaplace_p_sa1, d_llaplace_p_sa2,  d_llaplace_t_sa2 -> d_diffusion_sa
  - dw_surface_llaplace -> dw_surface_laplace
- remove obsolete code, clean up:
  - BasicEvaluator.strip_state_vector(), LCBCEvaluator.strip_state_vector()
  - remove obsolete function and code (_fix_scalar_dc())
  - remove Field.get_extra_nodes_as_simplices(), .write_mesh()
  - simple.py: remove --save-region-field-meshes option
  - remove code depending on removed Field.get_extra_nodes_as_simplices()
    - Mesh.from_region_and_field()
    - ProblemDefinition.save_region_field_meshes()
  - remove Field.interp_c_vals_to_n_vals()
  - remove parameter 'shape' from term di_volume_integrate_mat
  - remove read_tuple()
- docs:
  - new projections.rst, fields.rst, variables.rst
- misc:
  - remove star imports
  - fix Output.__init__() arguments
  - new Container.extend()
  - allow construction of OneTypeList from sequence
  - fix acoustic band gaps code
  - new Interpolant.get_geom_poly_space()
  - new make_l2_projection() for scalar field variables
  - add tetrahedron quadratures of order 4 and 6
  - update get_physical_qps() - use slices for efficiency
  - update Viewer - plot scalar cell data as cell data if possible
  - isfepy: update startup message
- tests and examples:
  - tests/test_projections.py: new test_projection_tri_quad()
  - new examples/linear_elasticity/material_nonlinearity.py + test
  - fix, update examples/diffusion/poisson_parametric_study.py
  - update tests/test_tensors.py
    - new test_transform_data(), test_stress_transform()
  - new tests/test_linalg.py - test dot_sequences(), insert_strided_axis()
  - update tests/test_linalg.py - new test_unique_rows(), test_assemble1d()
  - new tests/test_domain.py - very basic tests of facets and refinement
- many bug fixes

from 2010.3 to 2010.4
=====================

- base:
  - better printing formatting for basic data types
- docs:
  - use viewcode Sphinx extension
  - add gitwash tutorial (adapted from Numpy)
- sfepy.linalg:
  - new insert_sparse_to_csr() - insert a sparse matrix into a CSR matrix
  - new compose_sparse()
  - improve structuring:
    - move some functions from sfepy.linalg.utils to sfepy.linalg.geometry
    - remove unneeded functions
  - simplify importing:
    - import all its contents into sfepy.linalg namespace
  - new sfepy/linalg/eigen.py - eigenvalues utility functions
  - new sfepy/linalg/geometry.py - barycentic coordinates and simplex utilities
- conditions:
  - make active LCBC-constrained DOF information always defined
  - update make_global_lcbc_operator() to preserve matrix blocks
    - also create and return global active LCBC-constrained DOF information
  - new NormalDirectionOperator class
- solvers:
  - solvers: provide default name and kind for any type of conf
  - allow (re)setting data of an existing TimeStepper instance
  - use a single time stepper instance in ProblemDefinition
    - pass the instance to .set_equations() as user data to satisfy
      time-dependent term arguments
  - update Newton, SemismoothNewton - raise original residual/matrix exceptions
  - update SemismoothNewton to use compose_sparse()
    - the Jacobian needs no longer to have the non-smooth part preallocated
- refactoring of geometries (reference mappings) - merge 'geo' branch
  - create geometries as needed on the fly, similarly to term caches
  - equations only assign container for geometries to terms
  - geometries no longer stored in Approximations instances
    - greatly simplify Approximations.describe_geometry()
- new sfepy/fem/mappings.py:
  - handle reference element mappings by new Mapping, VolumeMapping,
    SurfaceMapping classes
- update Equations to create, hold and update Materials:
  - only materials actually present in equations are updated during
    ProblemDefinition.time_update() call now
  - update materials in ProblemDefinition to be created on demand
  - similar to creating variables
- DOF vector synchronization with variables - merge 'state' branch
  - new sfepy/fem/state.py
  - new State class for handling state Variables
- Domain and Mesh:
  - new Facets class for handling edges and faces
  - remove C code superseded by Facets
  - remove unused code superseded by scipy.spatial
  - new Mesh.explode_groups()
- update Field:
  - simplify Field, Approximations - assume single base and region
  - new SurfaceField - subclass of Field
    - enrich the field region syntax - allow (region, 'surface') tuple
    - add is_surface attribute to Approximations, Approximation
    - update Mesh.from_region() for surface field regions
      - useful for saving SurfaceField variables with file_per_var option
  - simplify setting Field approximation order and Interpolant construction
  - move code for getting DOFs in a region to Field
  - move DOF manipulation functions to Field
- update Equations:
  - allow passing additional connectivities to Equations.create_matrix_graph()
  - allow passing single Term to Equation.__init__()
  - update Equations.eval_tangent_matrices() - block assembling mode
- update Variables:
  - set _variables attribute in Variables.__setitem__()
    so that any Variable has it once it is added to Variables
  - new MultiplierVariable - subclass of FieldVariable
- update Terms:
  - allow different Term integration per call mode
  - simplify setting of term geometry and connectivity types:
    - new Term.integration attribute
    - new Term.setup_integration() to determine geometry and connectivity
      types according to the integration attribute
    - remove Volume, Surface, Edge, Point, SurfaceExtra constants
    - geometry types lower-cased
- expression evaluation:
  - pass integral instances instead of integral names where applicable
    - pass Term instance to .init_data() of DataCache subclasses
    - update all affected terms and term caches
  - enable calling user functions on tangent matrix in evaluators
  - check argument names consistency in ProblemDefinition.create_evaluable()
- implement higher order elements - merge 'ori' branch:
  - new NodeDescription class
  - prepare all possible facet DOF permutations
  - update Facets to store raw orientation
  - reimplement Approximations.setup_global_base():
    - for any polynomial degrees (including extra face DOFs), no C
  - update computation of extra node coordinates, no C
  - remove obsolete/unused methods and C functions
  - prepare remap vectors and DOF indices for all DOF kinds
- new sfepy/fem/projections.py
  - start projections between FE spaces
- homogenization:
  - remove unused (obsolete) correctors and coefficients
  - remove 'auxiliary' coefficients
- new sfepy/mechanics/friction.py, DualMesh class
- problem description file:
  - allow optional arguments to define()
  - update field keywords to match Field constructor arguments
  - new ANSYS CDB file reader
- output:
  - new FieldVariable.create_output(), simplify Variables.state_to_output()
  - update Variables.state_to_output() - allow skipping variables
- new terms:
  - dw_non_penetration (non-penetration condition term)
  - dw_surface_lcouple (acoustic term - derivatives in surface directions)
  - dw_surface_llaplace (acoustic term - derivatives in surface directions)
  - dq_div (new divergence in QP term)
- scripts:
  - new friction_slip.py (work in progress)
  - compare_elastic_materials.py: new --no-plot option
  - postproc.py:
    - new --subdomains option
    - update Viewer - new vector cut plane plotting mode
- tests and examples:
  - new examples/biot/biot_npbc_lagrange.py + test
    - uses dw_non_penetration term
  - update tests/test_volume.py to report volumes
  - update examples/navier_stokes/navier_stokes.py
    - check divergence-free solution
  - new tests/test_sparse.py - test compose_sparse()
  - new 'linear_elastic_up.py' example + test
    - linear elasticity, mixed formulation
  - new test_eval_matrix()
  - tests/test_meshio.py: new _compare_meshes(), test_write_read_meshes()
  - new tests/test_projections.py
- many bug fixes

from 2010.2 to 2010.3
=====================

- refactor for interactive use, making things simpler:
  - redesign term evaluation: non-assembling modes, hierarchy of calls:
    - hierarchy: ProblemDefinition.evaluate() - evaluate() -
      Equation.evaluate() - Term.evaluate()
    - each level can be used by itself
    - 'eval', 'el_avg', 'qp' and 'weak' modes
    - split call_mode into (call_)mode and new term_mode
    - split evaluate() into create_evaluable() and eval_equations()
  - new Domain methods to access underlying mesh
  - refactor Field, remove Fields:
    - update Field construction (remove bases)
    - move DOF connectivity setup to fields
  - refactor construction of Variables
    - move field-specific methods into FieldVariable
  - refactor Materials, Material:
    - remove regions from Material definition:
      - a Material instance is now really just a collection of values
      - region is given by a term using the particular Material
    - split material update code into several functions
    - allow mixing special constants with parameters given by user-defined
      function by passing mode='special_constant' to the function
  - refactor construction of Equations, Equation:
    - Equation.__init__() accepts Terms instance directly
    - make parse_definition() a regular function
    - update Equations to create and hold Variables
    - variables collected from individual terms
    - Equations now hold geometries instead of ProblemDefinition
    - remove term prefixes (namespaces) from description of equations
    - move setup of equations from ProblemDefinition to Equations
    - move mirror region handling to Region
    - move creation of ConnInfo into Term
    - move assembling to Equations (and Term)
  - refactor Terms, Term:
    - allow override of term arguments in Term.get_args()
    - new Term.new() factory constructor
    - simplified equation parser (full argument parsing now in
      create_arg_parser())
    - support basic arithmetics
    - set term integral at time of term construction
  - new basic boundary condition classes:
    BoundaryConditions, BoundaryCondition, EssentialBC, PeriodicBC,
    LinearCombinationBC
    - allow Function instances in conditions
  - refactor linear combination BC
    - new LCBCOperator, RigidOperator, NoPenetrationOperator,
      LCBCOperators, make_global_lcbc_operator()
  - refactor DofInfo into proper class (and module)
  - refactor equation mapping into EquationMap class
  - implement simplified integral specification in equations
    - the integral can either be a string representation of a non-negative
      integer (the integral order) or 'a' (automatic order) or a string
      beginning with 'i' (existing custom integral name)
    - integrals are created on demand
  - ConnInfo now stores directly variables instead of their names
  - update ProblemDefinition for interactive use:
    - evaluators do not hold the tangent matrix
    - split and update ProblemDefinition.time_update()
  - remove unnecessary arguments from evaluators and generic solvers
  - remove historical cruft, obsolete code
  - update all examples
  - update applications for new term evaluation:
    - schroedinger.py
    - shaper.py
- simplify interactive construction of solvers:
  - when a non-abstract class is used, name and kind are inferred
    automatically
- improve tests of examples:
  - update TestInput to call hook functions and to use solve_direct()
  - simplify TestInputEvolutionary
  - check nonlinear solver stopping conditions also for evolutionary
    problems
- homogenization:
  - new CoefSum and CorrSum
  - new CoefEval - evaluate expression (e.g. 'c.A/2 + c.B*c.C')
  - update for new evaluation code
  - simplify saving/dumping of correctors by new CorrSolution class
  - correctors stored by variables, not as the whole state vector
  - user should provide set_variables() functions for all required
    correctors/coefficients
  - pass only the direct dependencies to coefficient and corrector mini_apps
- mesh readers:
  - add support for 2d abaqus quad and tri elements
  - add full read and write support for comsol mesh format for sfepy
    supported types
- examples:
  - update examples/quantum:
    - unify 2D and 3D versions
    - remove broken DFT examples
  - new example + test (linear_elastic_tractions.py):
    - employs simplified integral definition
  - new examples/standalone/interactive/linear_elasticity.py
- tests:
  - new tests/test_high_level.py
- documentation:
  - improve docstrings:
    - add argument description for all terms
    - prepend term call signature(s) into term docstrings
  - new tutorial "Interactive Example: Linear Elasticity"
- many bug fixes
- base:
  - update Container class to be more dict-like
- new AUTHORS file

from 2010.1 to 2010.2
=====================

- new mesh readers:
  - MED (Salome, PythonOCC) format
  - Gambit NEU mesh format
  - UserMeshIO class:
    - creating, writing meshes by user-supplied functions
- mechanics:
  - ElasticConstants class - conversion formulas for elastic constants
  - StressTransform class to convert various stress tensors
  - basic tensor transformations
- updated documentation:
  - new sections in developer guide
  - updated tutorial
  - many new docstrings
- solvers:
  - semi-smooth Newton method
  - allow registering custom solvers
- examples:
  - usage of functions to define various parameter
  - usage of probes
- scripts:
  - simple.py: new --log, --quiet options
  - postproc.py: new --wireframe, --group-names options
  - extractor.py: new --same-dir, --to, --step options
  - split homogen.py:
    - HomogenizationApp moved to sfepy/homogenization/homogen_app.py
- new tests:
  - test region construction
  - test quadratures using symbolic integration
  - test semi-smooth Newton solver
- miscellaneous updates:
  - automatic order of variables
  - refactor integrals and quadratures
  - improve printing of Struct instances
  - IPython-enabled debug()
  - fixed probes in 2D
  - split Material.time_update() to allow easier setting of data
  - region selection of several nodes or elements by their ids
  - update dump_to_vtk() for stationary results (no time stepper)
  - update import_file(), load_classes() for package namespaces
  - update all terms for the new Term constructor
  - refactor dof connectivity setup, info, active dof info
  - refactor term argument checking
  - update equations and terms construction
  - update HomogenizationEngine to allow inter-coefficient dependencies
  - update term and cache table generation
  - run tests in alphabetical order
  - fix paths to meshes and other data in system-wide installation
  - new get_lattice_volume()
  - many small bug fixes
- new terms:
  - dw_stokes_w (Stokes term weighted by scalar function)
  - dq_biot_stress (Biot stress term in QP)
  - dq_cauchy_strain (Cauchy strain term in QP)
  - dq_cauchy_stress (Cauchy stress term in QP)
  - dq_def_grad (deformation gradient term)
  - dw_lin_prestress (linear prestress term)
  - dw_surface_mass_scalar_w (weighted surface scalar mass term)
  - de_biot_stress (averaged Biot stress term)
  - di_surface_moment (surface moment term)


from 2009.4 to 2010.1
=====================

- new sphinx-based documentation
- major branches merged:
  - 'interp' branch: interpolation between different meshes
  - 'shape' branch: shape optimization in optimal flow problems
- fast evaluation (in C) of Lagrange base functions:
  - new sfepy/fem/poly_spaces.py, tests/test_fem.py
- new GeometryElement class:
  - tensor product geometry now in [0, 1] instead of [-1, 1]
  - remove sfepy/eldesc/*
- clean-up of examples and meshes
- examples:
  - perfusion in the total Lagrangian (TL) formulation
  - active fibres in the TL formulation
- homogenization:
  - new examples:
    - linear elasticity, micro-macro coupling + test, micro-recovery
  - updated homogenization engine:
    - support for coefficients summing
    - improved saving of correctors
  - new acoustic and perfusion homogenized coefficients
- data probing:
  - automatic refinement of probe points
  - speed-up:
    - point caching, use cKDTree for speed
    - generate_probes() can reuse problem, probes, etc.
  - new PointsProbe data probe
  - update generate_probes() for multiple probe hooks
- postprocessing and visualization:
  - VTK source construction for any format supported by MeshIO classes
  - HDF5FileSource -> GenericFileSource
  - new GenericSequenceFileSource
- graphical logging:
  - support logging to a text file, vertical line plot (see live_plot.py)
  - update Log and ProcessPlotter for several Log instances
  - Log class: wait until figure save is acknowledged
  - convergence log support in Newton and Oseen solvers
- schroedinger: components of V evaluated point-wise in QPs
- miscellaneous updates:
  - new --save-regions-as-groups option in simple.py
  - move and update functions from extractor.py into time_history.py
  - Oseen solver: leave setup of stabilization parameters to user
  - allow also 'dq', 'de' call modes in InstantaneousBase._call()
  - split termsHyperElasticity.py to base, TL and UL parts
  - utilities for work with units of physical quantities:
    - new sfepy/mechanics/units.py
  - functions to compute tensor-related quantities usual in continuum mechanics:
    - new sfepy/mechanics/tensors.py
  - many bug fixes
- new terms:
  - d_surface (surface of a subdomain)
  - dw_volume_integrate_variable (volume integration a variable coefficient)
  - dw_diffusion_r (diffusion-like term)
  - TL formulation terms:
    - dw_tl_fib_a (hyperelastic active fibres)
    - dw_tl_bulk_pressure (hyperelastic bulk pressure)
    - dw_tl_volume (volume)
    - dw_tl_diffusion (diffusion with deformation-dependent permeability)
    - dw_tl_surface_traction (surface traction)
  - acoustic terms:
    - dw_acoustic (acoustic term)
    - d_acoustic_surface (acoustic surface term (in-plane directions))
    - d_acoustic_alpha (evaluation of acoustic term (in-plane directions))
    - dw_acoustic_integrate (integration of acoustic term (in-plane directions))
    - terms for sensitivity analysis:
      - d_sa_acoustic_alpha, d_sa_acoustic_alpha2, d_sa_acoustic_z,
        d_sa_acoustic_z2

from 2009.3 to 2009.4
=====================

- major branches merged:
  - 'ulf' branch: updated Lagrangian (UL) formulation
  - 'functions' branch:
    - unified passing extra arguments to boundary condition, material, and region
      functions
    - physical quadrature point generation
    - unified/improved handling of material parameters in terms:
      - all material parameters defined in physical quadrature points
      - all terms updated, some terms were coalesced into one
  - 'porous' branch: homogenized porous media
- input file keywords:
  - new 'functions' keyword
- simplifications & unifications:
  - results of all time steps of an evolutionary problem can be saved to a
    single HDF5 file
  - enable passing variables data to ProblemDefinition.solve()
  - runTests.py: allow multiple test files as command line arguments
  - Viewer.call_mlab() split and refactored
  - short syntax for periodic boundary conditions
  - simplified input file syntax of materials
- postprocessing and visualization:
  - using FileSource class abstracts the particular format for storing results:
    - VTK, HDF5 supported now
  - support for file sequences (evolutionary simulations)
    - time step selection for HDF5 (single) and VTK (sequence) files
  - animations (using ffmpeg)
  - minimalistic ViewerGUI
  - show scalar bars
  - various vector plotting modes
  - watch results file (HDF5) and add time steps as they are saved
  - listing data ranges works offscreen, summary for file sequence
  - sfepy_gui.py:  Mayavi2-based GUI to launch simulations
- changes aimed at interactive work:
  - Domain, Region, Field creation refactoring
- data probing - postprocessing mode:
  - read a previously probed data from the probe text file, re-plot them, and
    integrate them along the probe
- graphical logging:
  - dynamic adding of data groups (new axes) to Log and ProcessPlotter  
- many bug fixes, namely:
  - fix import_file() for multiple imports
  - fix saving results with piece-wise constant (Q0) approximation
- miscellaneous updates:
  - quasistatic time stepping
  - new zero-order elements: 3_4_P0, 3_8_Q0
  - more elastic tensor construction functions:
    - elastic tensor from Young's modulus and Poisson's ratio
    - elastic tensors for use in mixed formulation
  - setting of parameter variables by a user-defined function
  - gen_block_mesh() can generate also 2D meshes
  - reversed Cuthill-McKee permutation algorithm, graph in-place permutation
- new terms:
  - dw_volume_wdot_scalar_eth (exponential decay dot product convolution term)
  - dw_biot_eth (exponential decay Biot convolution term)
  - dw_lin_elastic_eth (exponential decay elastic convolution term)
  - updated Lagrangian (UL) formulation terms:
    - dw_ul_bulk_penalty, dw_ul_he_neohook, dw_ul_he_mooney_rivlin

from 2009.2 to 2009.3
=====================
- basic support for Windows installation via numpy distutils (finally!):
  - installation using standard "python setup.py install"...
- postproc.py:
  - quite usable now for fast first glance at the results
  - plots point, cell data of all kinds (scalar, vector, tensor)
  - draw iso-surface in 3D mode
  - fixed filename in Viewer for femhub notebook
  - new options: --scalar-mode, --list-names, --only-names,
    --rel-text-width, --no-show, --roll, --view, --all, --layout, -o
- cylindergen.py:
  - cylindrical mesh generator
- probe.py:
  - can probe selected quantities only
  - new options: --only-names, --auto-dir, --same-dir
- isfepy:
  - new options: --no-wx, --no-viewer
- phono: basic support for liquid inclusions
  - support for inner band gaps detection (brute force) and plotting
- homogenization: added new-style piezo-elastic corrector and coefficient classes
- schroedinger: fixed charge density computation
- solvers:
  - added SciPy direct sparse solvers (ls.scipy_direct) - unified
  umfpack, superlu
- new terms:
  - de_grad (element average of gradient)
  - d_volume_surface (compute volume using surface integral)
  - dw_bc_newton (Newton boundary condition)
  - dq_state_in_volume_qp, dq_state_in_surface_qp (interpolating state
    into quadrature points)
  - dw_surface_integrate_variable (weak surface term with variable coefficient)

from 2009.1 to 2009.2:
======================
- scripts:
  - added probe.py - a script to probe and plot results saved in result files
    - data probes along geometrical objects (e.g. lines, rays) intersecting the
      mesh
  - added postproc.py - a script to visualize results saved in result files
    - added Viewer class - 3D plots using mayavi2
    - rudimentary automatic mode only
  - added isfepy (interactive sfepy) IPython shell
    - uses new pde_solve(), pre-imports mayavi2 based Viewer
- short input syntax for LCBC conditions, fields, integrals, materials and
  solvers
- automatic html documentation generation via doxygen
- new mesh readers:
  - Nastran (.bdf) format
  - Abaqus ascii (.inp)
- new example problems:
  - subdomains.py + test - test dw_jump interface term
  - stabilized_navier_stokes.py input + test - test Oseen solver
  - acoustics.py + test - compute complex acoustic pressure
- solvers:
  - changed API of nonlinear solvers so that scipy solvers can be used
  - added Broyden and Anderson nonlinear solvers (SciPy implementation)
  - updated Oseen solver 
- major rewrite of handling of dof connectivities, matrix graph and term
  geometries:
  - lots of dof connectivity related code was simplified/removed
  - extra connectivity data (surface, point) computed on demand in
    Variables.setup_dof_conns()
  - support for terms with traces of variables on interface regions
  - surface data computation for terms of volume dof_conn and Surface geometry
- extended syntax of equations to allow boundary traces of variables:
  - to use when a field value at an interface boundary is needed from the
    neighbouring subdomain side and the field is not defined there
  - example: dw_jump.isurf.Gamma12_1( jump1.val, q1, p1, tr(p2) )
- refactored linear combination boundary conditions (LCBC) code:
  - fixed rigid LCBC for multi-field problems
  - added no penetration LCBC
  - major speed-up (several orders) of LCBC operator construction
    - assembled via the coo_matrix instead of the lil_matrix
  - fixed check_tangent_matrix() for LCBC
- applications:
  - homogenization:
    - prefactorize the matrix for linear corrector problems - major speed-up
  - phononic materials:
    - plot also middle eigenvalues in 3D, fixed plot labels, polarization angles
    - caching of eigenvalue problem solution and Christoffel acoustic tensor
  - schroedinger.py:
    - choose and call DFT solver via solver interface
- general:
  - fixed boundary quadrature points for multi-field problems
  - fixed complex assembling
  - fixed live plotting (ProcessPlotter) for multi-core machines
  - improved Output class, simplified its usage
  - Struct.__str__() prints in alphabetical order
  - unified version information by introducing sfepy.__version__
  - polished MeshIO class
  - implemented region selection by node groups
  - refactored Mesh nodes, lots of simplifications
  - many small fixes and updates
- new terms:
    - dw_jump (scalar interface jump term)
    - dw_surface_mass_scalar (scalar mass on a surface boundary)

from 2008.4 to 2009.1:
======================
- new solvers:
  - simple backtracking steepest descent optimization solver
  - PETSc Krylov solvers via petsc4py, sequential mode
  - LOBPCG eigenvalue solver (SciPy implementation)
- new mesh readers:
   - mesh3d (hermes3d)
   - AVS UCD ascii mesh
   - Hypermesh ascii mesh
- homogenization: 
  - MiniAppBase base class for "mini-applications": micro-problem correctors,
    homogenized coefficients
  - unified approach to resolve data dependencies: HomogenizationEngine class
- applications:
    - phononic materials:
      - dispersion analysis, phase velocity computation for phononic materials
      - homogenized coefficients computed via the HomogenizationEngine
      - caching of coefficients to speed up parametric runs
    - schroedinger.py:
      - all functionality moved into SchroedingerApp class
      - inherits from SimpleApp -> can be parametrized
      - fixed DFT iterations, iteration plot saving
      - basic smearing around Fermi limit
- scripts:
  - convert_mesh.py:
    - --scale option, support different scaling for each axis
- general:
  - terms, caches now imported dynamically by load_classes()
    - to add a new term/cache module just put it into sfepy/terms/
  - better setup of Application options
    - automatic option update in parametric studies
  - default configuration options for the linear, nonlinear and eigen- solvers
  - various 64bit fixes
  - allow empty output prefix, combined output to file and terminal
- new terms:
    - dw_electric_source (electric source term)

from 00.50.00 to 2008.4:
========================
- framework for running parametric studies
- allow time derivatives of variables as term arguments
  - example (transient diffusion):
    """dw_mass_scalar.i1.Omega( s, dT/dt )
     + dw_laplace.i1.Omega( coef.val, s, T ) = 0"""
- initial conditions via ics, ic_<number> keywords
- enhanced acoustic band gaps code
  - dispersion analysis (polarization angle calculation)
  - applied load tensor computation
  - phase velocity computation for periodic perforated media with empty holes
- term base classes
  - actual term code reduced significantly
  - adding new terms is even easier now
- type of term arguments determined fully at run-time
  - many terms were unified
  - the same term can be used both for the finite element assembling and the
  evaluation of the weak form for known fields (dw_ = d_)
- live plotting using multiprocessing module
  - assumes GTKAgg matplotlib backend
  - support for setting x axis values and labels and y labels
  - figure saving
- printing messages: Output class
- homogenized coefficients classes prototypes
- improved schroedinger.py
  - plotting DFT iterations
- created sfepy/mechanics
  - conversions of elastic constants and transformations to plane
- float format used for saving results can be set by the 'float_format' option
- new terms:
  - dw_piezo_coupling (piezo-electric coupling term)
  - dw_biot (Biot coupling term, former dw_biot_div, dw_biot_grad, ...)
  - dw_stokes (Stokes coupling term, former dw_div, dw_grad, ...)
  - dw_lin_elastic_th (linear elasticity fading memory, former dw_lin_viscous_th)
  - dw_biot_th (Biot fading memory terms unified)

from 00.46.02 to 00.50.00:
==========================
- finite strain elasticity: neo-Hookean, Mooney-Rivlin materials
  - total Lagrangian (TL) formulation
  - geometric data via finite_strain_tl DataCache
- solving problems in complex numbers
- generalized equations to allow linear combination of terms
  - example: """2 * aterm.i1.Omega( v, u ) = - 3.0 * bterm.i1.Omega2( v, u )""" 
- run-time type of state term arguments
  - removed all *_r terms, now useless
- 'elements by function( domain )' region selector
- refactoring to follow Python coding style guidelines
- history support in variables
- MeshIO.read_dimension() to quickly get dimension in an input file
- improved site_cfg_template.py
- improved schroedinger.py
- new terms:
  - de_average_variable (average a variable in elements)
  - dw_surface_integrate (integrate over surface operator)
  - dw_tl_bulk_penalty (bulk penalty in TL formulation)
  - dw_tl_he_neohook (neo-Hooekan term in TL formulation)
  - dw_tl_he_mooney_rivlin (Mooney-Rivlin term in TL formulation)

from 00.41.03 to 00.46.02:
==========================
- alternative short syntax for specifying essential boundary conditions,
  variables and  regions
- saving results per variable (useful when variables defined in different
  subdomains)
- manufactured solutions tests:
    - SymPy support
- new eigenvalue solvers:
    - removed symeig dependence
- linear solvers based on PyAMG
- simple block mesh generator
- unified HDF5 mesh/solution reading/writing
- site configuration now via script/config.py + site_cfg.py
- example: computing homogenized elastic coefficients
- new terms and lots of reorganization:
    - Biot terms
    - some fading memory terms

from 00.35.01 to 00.41.03:
==========================
- works on 64 bits
- support for various mesh formats:
    - medit: .mesh
    - text VTK: .vtk
    - tetgen: .node + .ele
    - comsol: .txt
- Schroedinger equation solver
    - run via 'schroedinger.py'
- input files:
    - new syntax for variables and boundary conditions
    - improved handling of degrees of freedom
- more descriptive (and less) test and simulation messages
- new handling of approximations (-> lots of thing simplified)
- material parameters can be defined in mesh vertices
- simple.py: allow user-specified postProcessHook function
- documentation generation via prettydoc
- new solvers:
    - generic time-dependent problem solver
    - pysparse, symeig, scipy-based eigenproblem solvers
    - scipy-based iterative solvers
- new terms:
    - dw_volume_integrate (volume integral operator)
    - dw_mass_scalar_r (rhs for time-dependent Poisson problem)
    - di_volume_integrate_mat (integrate material parameters)
    - dw_volume_wdot and related terms (weighted dot product)
    - dw_mass_scalar_variable (scalar mass term with variable coefficients)
    - dw_lin_elastic and related terms (anisotropic linear elasticity)
    - dw_lin_viscous (linear viscosity)
    - de_cauchy_stress (element-averaged Cauchy stress)

from 00.31.06 to 00.35.01:
==========================
- per term integration, major rewrite of sfe.fem and related:
    - term.integral.domain( arguments ) syntax
    - 'integral_*' keyword for input files
    - each term can use its own quadrature points
    - 'field' keyword syntax changed

- minor:
    - genDocs.py: PDF term documentation generator

from 00.26.01 to 00.31.06:
==========================

- acoustic band gaps determination:
    - zones of frequencies where elastic waves do not propagate
    - based on homogenization of material made of small inclusions periodically
    embedded in an elastic matrix
    - run via 'eigen.py'
- general linear combination boundary conditions - 'lcbc' keyword:
    - rigid body motion constraint imposed on regions
- new Solver classes, solver reorganization:
    - all solvers now configured in a uniform way ('solver_[0-9]+' keywords)
    - specify solvers using 'options' keyword
- new terms:
    - dot product in a volume or on a surface region
    - vector field mass term
    - scalar field "mass", fine-coarse scalar "mass" terms:
        - used for coarse mesh -> fine mesh interpolation of scalar fields

- minor:
    - added updated findSurf.py into distribution - extract surface from a mesh
    - script/kill_*
    - script/writeMesh2D.m
    - script/writeSparseMatrixHDF5.m

from 00.22.02 to 00.26.01:
==========================

- testing framework (in the spirit of unit tests):
    - particularly tests that standard input files work
    - runTests.py: output filtering
- linear spring term (kind of a relaxed Dirichlet BC on node displacements)
- volume term
- Laplace term in 2D
- chained periodic boundary conditions resolving
- new options for simple.py: --save-field-meshes, --solve-not
- periodic mesh merger (genPerMesh.py)

- minor:
    - improved region saving
    - growing term data cache
    - sparse matrix saving into HDF5
    - point dof connectivity and geometry
    - region handling improvements (canCells flag)
    - nonlinear solver status reporting
    - distribution: test and example meshes included in the release tarball
