This list functions as a project plan for the development of DOLFIN.

It works as follows: Pick something from the list, notify one of the
maintainers that you're working on it. When a task is done, it will
be deleted from this list and moved to the ChangeLog.

Ideally, each task should be assigned to a developer, including an
estimate of when the task should be ready.

Send suggestions, comments, and corrections to dolfin@fenics.org.

Assembly
--------

* Use MatSetOption(A, MAT_ROWS_SORTED), MatSetOption(A, MAT_COLUMNS_SORTED)?
* Use MatSetOption(A, MAT_USE_HASH_TABLE)?
* Make two forms share the same map and only update the map
* Compute number of nonzeros before assembly
* Boundary conditions for other than linear elements
* Parallel assembly

Mesh
----

* Change "node" --> "vertex"
* Speed up uniform mesh refinement
* Optimize mesh refinement
o [jj] Schema for mesh XML format
* Connectivity, automate computation of all 16 connections
* Geometry representation, including boundaries
* Mesh generation using triangle or tetgen?
* Clean up iterators?
* Seems to be something wrong with trimesh-32.xml.gz
* Compute normals of edges

Linear Algebra
--------------

o [jj] Add wrapper for PETSc preconditioners
* Cleanup and PETSc linear algebra wrappers
* Change (i) to [i]?

Function
--------

* Subvectors/components of mixed Functions
* Save Function to file
* Load Function from file

Input/Output
------------

* Add script/program dolfin-convert for converting between file formats
* Save edges in MATLAB format

Solvers
-------

* Implement Navier-Stokes solver

Multi-adaptive solver
---------------------

o [jj, logg] Preconditioner for multi-adaptive solver
o [jj, logg] Is Newton working correctly for high-order methods?
o [jj, logg] Save solution for new solver
o [jj, logg] Implement preconditioner for multi-adaptive Newton
o [jj, logg] Save dual solution backwards
o [jj, logg] Error estimates
o [jj, logg] Automatic computation of stability factors as function of time T
o [jj, logg] Use two files for matlab format

Modules
-------

o [hoffman] Navier-Stokes module
o [harald] Euler module?
o [foufas] Finance module?

Parameters
----------

o Add base class for local parameters
o Use hash list to store parameters (use STL hash)
o Make sure parameters work with type std::string
o Does saving/loading parameters work?
o Collect default parameters in an appropriate place (not Settings)
o Change from Parameter::REAL to Parameter::real etc
o Add function to display all parameters
o Decide on proper namespace/class for parameters

General
-------

* Write a manual
* Write FAQ and put on web page:

  Q: When to use -DPETSC_USE_EXTERN_CXX?
  A: When calling PETSc from C (not recommended), recompile PETSc.

  Q: Parallel mesh?
  A: Waiting for Matt.

  Q: What does DOLFIN mean?
  A: Dynamic Object-oriented Library for FINite element computation.

  Q: Is it fast?
  A: Yes.

  Q: Can I help?
  A: Yes.

* New repository dolfin-contrib?
* Don't use cut in src/config script
* Replace ::show() with ::disp() for all classes
* Replace unsigned int and int with uint when possible
* Replace Array and List with NewArray and NewList everywhere
* Use libtool?
* Cleanup Parameter and ParameterList
* Replace stdio with iostream and fstream
* Fix setprecision() for cout
* Use symbolic links for meshes, see example src/demo/fem
* Automatically load parameters from dolfin.xml
* Collect diagnostic and error messages into one file? Translations?

Some suggestions for PETSc
--------------------------

Use namespaces, don't define macros like restrict which prevents
users of PETSc to declare functions with that name.
