Reference documentation for deal.II version 9.6.0
|
This is the list of changes made between the deal.II releases listed above. All entries are signed with the names of the author.
Following are a few modifications to the library that unfortunately are incompatible with previous versions of the library, but which we deem necessary for the future maintainability of the library. Unfortunately, some of these changes will require modifications to application programs. We apologize for the inconvenience this causes.
Changed: GridTools, DoFTools, MGTools, VectorTools, MatrixCreator and MatrixTools are now namespaces. They have long been classes that had only public, static member functions, making the end result semantically exactly equivalent to a namespace, which is also how it was used. This is now also reflected in the actual code.
(Wolfgang Bangerth, 2011/04/27, 2011/09/14)
Changed: The PETScWrappers::VectorBase and PETScWrappers::MatrixBase classes tried to keep track of whether the last operation done on a vector was to add to an element or to write into one. If the previous such operation was of a different kind than the current one, we would flush buffers (see the description in GlossCompress). However, trying to do this automatically turned out to be an endless source of hard-to-find bugs in parallel programs. The scheme has therefore now been changed to the following: the classes keep track of the previous operation and if it differs from the current one, reports an error stating that the user needs to call PETScWrapper::VectorBase::compress() or PETScWrapper::MatrixBase::compress() instead.
(Wolfgang Bangerth, 2011/08/03, 2011/08/30)
Changed: The classes Tensor, SymmetricTensor and Point now have an additional template argument for the number type. While a default template value of double
ensures that all old code is still valid, this change invalidates forward declarations of the form template <int dim> class Point
that might be present in user-defined header files. Now forward declarations need to specify the type as well, i.e., template <int dim, typename Number> class Point
. However, nothing changes if the full declarations in deal.II/base/tensor.h, deal.II/base/symmetric_tensor.h
and deal.II/base/point.h
are included.
(Martin Kronbichler, 2011/08/02)
Removed: deal.II no longer supports Trilinos versions prior to 10.0.
(Wolfgang Bangerth, 2011/06/29)
Changed: deal.II has a namespace std_cxx1x that was used to import classes from BOOST that are part of the upcoming C++ 1x standard. On the other hand, if your compiler supported a sufficiently large subset of C++ 1x, we had code that simply did
allowing you to refer to everything that was part of the compiler's namespace std
under the alternative name. This turned out to be untenable in connection to the changed outlined below for _1, _2, etc. Consequently, if the compiler used supports C++ 1x, we now selectively import elements of the compiler's namespace std into namespace std_cxx1x as well. This may lead to incompatibilities if you are already using elements of the C++ 1x standard by referring to them through the std_cxx1x namespace and these elements are not on the list of selectively imported ones.
(Wolfgang Bangerth, 2011/05/29)
New: Long in the making, the new tutorial program step-32 is a massively parallel simulator for the Boussinesq equations that describe thermal convection.
(Martin Kronbichler, Timo Heister, Wolfgang Bangerth, 2011/10/06)
New: There is now a namespace Utilities::MPI that holds some of the MPI-related functions that were previously part of Utilities::System. Specifically, the following functions were moved and in part renamed: Utilities::System::get_n_mpi_processes is now Utilities::MPI::n_mpi_processes; Utilities::System::get_this_mpi_process is now Utilities::MPI::this_mpi_process; Utilities::System::compute_point_to_point_communication_pattern is now Utilities::MPI::compute_point_to_point_communication_pattern; Utilities::System::duplicate_communicator is now Utilities::MPI::duplicate_communicator; Utilities::System::calculate_collective_mpi_min_max_avg is now Utilities::MPI::min_max_avg; Utilities::System::MPI_InitFinalize is now Utilities::MPI::MPI_InitFinalize. In addition, some of the arguments of these functions or classes have changed.
The previous functions should still be available, though their use is now deprecated.
(Wolfgang Bangerth, 2011/09/26)
Removed: Utilities::System::program_uses_mpi does exactly the same thing as Utilities::System::job_supports_mpi. The former has therefore been deprecated.
(Wolfgang Bangerth, 2011/09/26)
New: When using a new enough version of GCC, debug sections in object files are now compressed using the -Wa,–compress-debug-sections
flag, resulting in savings in disk space on the order of 230 MB.
(Wolfgang Bangerth, 2011/09/22)
New: deal.II can now be configured and built with the Clang C++ frontend of the LLVM compiler.
(Timo Heister, Wolfgang Bangerth, 2011/08/20)
Changed: Several of the tutorial programs used the same class names, often LaplaceProblem
in the earlier programs. There is nothing inherently wrong with this, since these are entirely separate programs, but this sometimes confused integrated development environments because searching for individual symbols would turn up several occurrences in different files. To make this a bit simpler, the main classes for step-3 through step-6 were renamed to StepX
(steps 1 and 2 do not have a main class). Starting with step-7, everything specific to a tutorial program has been moved into a namespace called StepX
to make the fully qualified names unique across different tutorial programs.
(Wolfgang Bangerth, Guido Kanschat 2011/08/16)
Extended: Many operations on objects of type Point<0>, Quadrature<0>, etc (including creation) were previously forbidden since such objects do not make much sense. However, this prevented a lot of code that could otherwise work in a dimension independent way, from working in 1d, e.g. integration on faces. Many of these places have now been cleaned up and work.
(Wolfgang Bangerth, 2011/08/12)
Extended: The classes Tensor, SymmetricTensor and Point now have an additional template argument for the number type. It is now possible to base these classes on any abstract data type that implements basic arithmetic operations, like Tensor<1,dim,std::complex<double> >
. deal.II uses a default template argument double
that ensures that all code using e.g. Tensor<1,dim>
remains valid.
(Martin Kronbichler, 2011/08/02)
Fixed: deal.II can link with Trilinos but previously it required a very specific set of Trilinos sub-libraries; if Trilinos had been compiled with a larger set of sub-libraries, linking would sometimes fail. This has now been made more generic and deal.II obtains the proper set of libraries from Trilinos.
(Wolfgang Bangerth, 2011/06/29)
Fixed: On Mac OS X, linking with some external libraries such as Trilinos sometimes failed due to a misconfiguration of linker flags. This should now be fixed.
(Praveen C, Martin Kronbichler, Wolfgang Bangerth, 2011/06/23)
Changed: Doing make clean
was supposed to only remove object files but not libraries; however, it also removed the TBB libraries and a few executables. This has now been changed: make clean
now only removes stuff that isn't needed to run executables, i.e. it leaves the TBB and other libraries alone. As before, the target make distclean
is responsible for removing everything.
(Max Jensen, Wolfgang Bangerth, 2011/06/14)
New: The Triangulation and DoFHandler classes, together with many smaller classes can now be serialized, i.e. their data can be written to an output stream and later retrieved to restore the state of the program.
(Wolfgang Bangerth, 2011/06/13)
New/deprecated: The Triangulation class offers ways to get informed whenever the triangulation changes. Previously, the mechanism doing this was through the Triangulation::RefinementListener class. This has been deprecated and has been superseded by a BOOST signals based mechanism that is generally more powerful and does not rely on overloading particular virtual functions inherited from a base class.
While the old mechanism should continue to work, you should consider upgrading. For more information on the signals mechanism, see the documentation of the Triangulation class.
In addition to the change above, the new implementation now offers two more signals one can subscribe to: Triangulation::Signals::clead for when the triangulation is cleared, and Triangulation::Signals::any_change that can be used for any operation that changes the mesh. Furthermore, in a change from previous behavior, the Triangulations::Signal::create signal is now also triggered when another triangulation is copied to the one that owns the signal.
(Wolfgang Bangerth, 2011/06/01)
Removed: The ./configure
script allowed configuring for the GNU Scientific Library (GSL) in version 7.0 but didn't actually use any of the GSL functions. The corresponding code has therefore been removed again.
(Wolfgang Bangerth, 2011/05/22)
Changed: Traditionally, include directories were set through the -I
flag in make files in such a way that one would do
In preparation for future changes that will make possible installing header files in a directory under /usr/include
it seemed useful to install everything under /usr/include/deal.II
and include them as
This change has been made throughout the library and tutorial programs. However, the old way of using include directories will continue to work for at least one release for backward compatibility.
(Wolfgang Bangerth, 2011/05/16)
Changed: The version of BOOST we ship with deal.II has been upgraded to 1.46.1. BOOST now also resides in the directory contrib/boost-1.46.1
instead of an unversioned directory.
(Wolfgang Bangerth, 2011/05/16)
New: The SparseDirectUMFPACK class can now also deal with matrices provided in SparseMatrixEZ format.
(Martin Genet, 2011/05/04)
New: The new tutorial program step-46 shows how to couple different models defined on subsets of the domain, in this case Stokes flow around an elastic solid. The trick here is that variables (here the flow velocity and pressure, and the solid displacement) do not live on the entire domain, but only on a part. The point of the program is how to represent this in source code.
(Wolfgang Bangerth, 2011/04/30)
Fixed: On Debian, the Trilinos packages use a different layout of include files and library names. The ./configure
script can now deal with this.
(Walter Landry, 2011/02/22)
Improved: Linking the deal.II libraries on file systems that are mounted remotely from a file server took painfully long. This is now fixed by linking everything on the local file system and only subsequently moving the file into its final location.
(Wolfgang Bangerth, 2011/01/28)
Changed: Most classes in deal.II have a member function memory_consumption
that used to return an unsigned int. However, on most 64-bit systems, unsigned int is still only 32-bit wide, and consequently the return type does not provide enough precision to return the size of very large objects. The return types of all of these functions has been changed to std::size_t, which is defined to be a type that can hold the sizes of all objects possible on any system.
(Wolfgang Bangerth, 2011/01/22)
Fixed: When using the –enable-mpi
to ./configure
, the script only tried mpiCC
as the MPI C++ compiler. However, on some systems, it is called mpicxx
. The script now tries that as well.
(Wolfgang Bangerth, 2011/01/22)
Fixed: When using Trilinos and using the Intel C++ compiler, we accidentally used invalid compiler flags that led to a warning every time we compiled a file.
(Wolfgang Bangerth, 2011/01/22)
Fixed: At the bottom of the page of tutorial programs we show a "plain" version of the tutorial program. However, the script that generates this plain version was broken and sometimes truncated the file. This should be fixed now.
(Wolfgang Bangerth, 2011/01/18)
New: There is a new predicate IteratorFilters::LocallyOwnedCell for filtered iterators.
(Wolfgang Bangerth, 2011/10/03)
Improved: The class BlockList used in RelaxationBlock has been replaced by SparsityPattern, since it only reproduced its functionality.
(Guido Kanschat, 2011/09/26)
New: SparsityPattern::row_position() finds a column index in a row and returns its "local" index or numbers::invalid_unsigned_int.
(Guido Kanschat, 2011/09/26)
New: The functions Utilities::MPI::sum and Utilities::MPI::max function can be used to compute the sum or maximum of values over a number of MPI processes without having to deal with the underlying MPI functions.
(Wolfgang Bangerth, 2011/09/25)
New: The CellAccessor::is_locally_owned function is a shortcut for the !cell->is_ghost() && !cell->is_artificial()
pattern found in many places when dealing with distributed meshes.
(Wolfgang Bangerth, 2011/09/10)
New: The GridGenerator::torus function and TorusBoundary class can create and describe the surface of a torus.
(Daniel Castanon Quiroz, 2011/09/08)
Fixed: FEFieldFunction class was not thread-safe because it keeps a cache on the side that was invalidated when different threads kept pouncing on it. This is now fixed.
(Patrick Sodré, 2011/09/07)
New: There is now a function GridTools::volume() computing the volume of a triangulation.
(Wolfgang Bangerth, 2011/09/02)
New: Code like cell->face(1)->set_boundary_indicator(42);
now also works in 1d.
(Wolfgang Bangerth, 2011/08/30)
Fixed: The TimerOutput::print_summary() function changed the precision of output on the stream it prints to, but didn't restore the previous value. This is now fixed.
(Wolfgang Bangerth, 2011/08/30)
New: There are now two new functions Utilities::string_to_double.
(Wolfgang Bangerth, 2011/08/25)
Changed: The function VectorTools::compute_no_normal_flux_constraints used to compute its constraints by evaluating the normal vector to the surface as described by the mapping, rather than using the normal to the surface described by the Boundary object associated with this face. (Note that the Mapping computes its approximation by polynomial interpolation of the surface described by the Boundary object.) This has now been changed: the normal vector is now obtained from the Boundary object directly, at points computed by the Mapping.
(Wolfgang Bangerth, 2011/08/25)
New: The Boundary base class now has a function Boundary::normal_vector that returns the normal vector to the surface at a given location. Derived classes need to implement it, of course, if they want it to be used.
(Wolfgang Bangerth, 2011/08/25)
Fixed: The function VectorTools::compute_no_normal_flux_constraints had a problem that led to extremely difficult to pin down bugs when running with sufficiently many processors. Basically, the constraints computed by different processors did not agree which should be the independent degrees of freedom and which should be the constrained ones. The result were constraints that did not lead to a consistent linear system.
(Martin Kronbichler, 2011/08/24)
New: Added GridRefinement::hierarchical() to reorder the degrees of freedom by going through the cells in hierarchical order. This ensures consistent DoF numbering in parallel computations.
(Timo Heister, 2011/08/24)
Changed: Triangulation<dim>::get_boundary_indicators() returned wrong data for dim=1.
(Sebastian Pauletti 2011/08/17)
Improved: The function LogStream::timestamp() outputs all results of the Posix function times, namely wall time, user time and system time.
(Guido Kanschat, 2011/08/18)
Extended: GridGenerator::half_hyper_shell() got the option colorize
, which assigns different boundary indicators to the different parts of the boundary. Added GridGenerator::quarter_hyper_shell() with the same options.
(Timo Heister, 2011/08/15)
Fixed: The functions VectorTools::create_boundary_right_hand_side() called with an empty set of boundary_indicators (the default), did not apply any boundary conditions. The empty set now applies it to all boundaries.
(Timo Heister, Sebastian Pauletti, 2011/08/15)
Fixed: The function VectorTools::compute_no_normal_flux_constraints had a bug that led to an exception whenever we were computing constraints for vector fields located on edges shared between two faces of a 3d cell if those faces were not perpendicular. This is now fixed.
(Wolfgang Bangerth, Thomas Geenen, Timo Heister, 2011/08/10)
New: The function FullMatrix::triple_product() adds triple products like Schur complements to existing matrices.
(Guido Kanschat, 2011/08/05)
Improved: The PETScWrapper::VectorBase class was rather generous in calling the PETSc VecAssembleBegin/End
functions that incur communication in the parallel case and are therefore causes of potential slowdowns. This has been improved.
(Wolfgang Bangerth, 2011/08/03)
Fixed: The function VectorTools::create_right_hand_side now also works for objects of type hp::DoFHandler with different finite elements.
(Daniel Gerecht, 2011/07/20)
Improved: Evaluation of Lagrangian basis functions has been made stable by exchanging polynomial evaluation from the standard form \(a_n x^n+\ldots+a_1 x + a_0\) to a product of linear factors, \(c (x - x_0) (x-x_1)\ldots (x-x_n)\). This ensures accurate evaluation up to very high order and avoids inaccuracies when using high order finite elements.
(Martin Kronbichler 2011/07/26)
Improved: The internal functions in the constructor of the FE_Q element have been improved for high order elements. Especially when the element is constructed for a 1D quadrature formula, the initialization is now much faster. E.g. the initialization up to order 12 in three dimension completes in less than a second, whereas it took hundreds of seconds before.
(Martin Kronbichler 2011/07/26)
New: There is now a class Threads::ThreadLocalStorage that allows threads to have their own copy of an object without having to fear interference from other threads in accessing this object.
(Wolfgang Bangerth 2011/07/07)
Fixed: The 2d grid reordering algorithm that is used by all grid readers had a component that was quadratic in its complexity, sometimes leading to cases where reading in a mesh in debug mode could take minutes for just a few tens of thousands of cells. This has now been fixed.
(Wolfgang Bangerth 2011/07/07)
New: The function DoFTools::count_dofs_per_component now also works for objects of type hp::DoFHandler.
(Christian Goll, Wolfgang Bangerth 2011/07/06)
Fixed: Under some circumstances, Threads::Thread::join() could only be called once and would generate a system exception when called a second time. Since it is often useful to not track whether this function had already been called, this is now worked around in such a way that one can always call the function multiple times.
(Wolfgang Bangerth 2011/07/03)
New: The Threads::Thread::join() function can now also be called even if no thread has been assigned to this thread object. The function then simply does nothing.
(Wolfgang Bangerth 2011/07/03)
New: There is now a new function Threads::Thread::valid that can be used to query whether the thread object has been assigned a thread.
(Wolfgang Bangerth 2011/07/01)
New: The new function GridGenerator::merge_triangulations can be used to compose coarse meshes from simpler ones by merging their cells into a single triangulation object.
(Wolfgang Bangerth 2011/06/17)
Fixed: If an FEValues object was kept around until after the triangulation on which it works has been refined or coarsened, and is then reinitialized with a cell from the refined triangulation, it could compute wrong results or crash outright. This has now been fixed.
(Wolfgang Bangerth 2011/06/02)
Changed: The TrilinosWrappers::SparsityPattern::trilinos_sparsity_pattern() function returned a reference to an object of kind Epetra_CrsMatrix. However, the actual object pointed to is of derived class Epetra_FECrsMatrix. The function has now been changed to return a reference to the latter type. Since derived references can be assigned to references to base, this change should not result in any incompatibilities.
(Wolfgang Bangerth 2011/05/27)
New: The class RelaxationBlockJacobi has been added to the relaxation classes.
(Guido Kanschat, 2011/05/19)
New: discontinuous Galerkin versions of vector-valued elements have been implemented: FE_DGBDM, FE_DGNedelec, and FE_DGRaviartThomas.
(Guido Kanschat, 2011/05/19)
New: Mapping<dim,spacedim>::transform_real_to_unit_cell now works also in the codimension one case, where it performs the normal projection of the point on the codimension one surface.
(Luca Heltai, 2011/05/17)
New: The PersistentTriangulation class now works also in the codimension one case.
(Luca Heltai, 2011/05/16)
Fixed: The TrilinosWrappers::SparseMatrix::print() function didn't get column indices right. This is now fixed.
(Habib Talavatifard, Wolfgang Bangerth 2011/05/10)
Fixed: The TrilinosWrappers::SparseMatrix::operator() and TrilinosWrappers::SparseMatrix::el() functions sometimes produced wrong results for rectangular matrices. The same is true for TrilinosWrappers::SparsityPattern::exists(). This is now fixed.
(Habib Talavatifard, Wolfgang Bangerth 2011/05/09, 2011/05/27)
New: The version of DoFTools::make_flux_sparsity_pattern that takes the coupling masks is now also available for hp::DoFHandler objects.
(Wolfgang Bangerth, 2011/04/27)
Fixed: If Triangulation::create_triangulation is called after an hp::DoFHandler object is attached to the triangulation object, setting active FE indices leads to a crash. The problem did not happen if the mesh was refined before setting the FE indices. This is now fixed. In the process, the Triangulation::RefinementListener::create_notification function was introduced.
(Wolfgang Bangerth, 2011/04/22)
Fixed: The function FEValuesViews::SymmetricTensor::divergence had a bug. This is now fixed.
(Wolfgang Bangerth, Feifei Cheng, Venkat Vallala 2011/04/21)
Fixed: Under some conditions, FEFaceValues applied to an FESystem element that contained elements of type FE_Nothing would receive an erroneous exception. This is now fixed.
(Wolfgang Bangerth, 2011/04/17)
New: There is now an operator* for the multiplication of a SymmetricTensor<2,dim>
and a Tensor<1,dim>
.
(Wolfgang Bangerth, 2011/04/12)
Fixed: Added some instantiations to make KellyErrorEstimator and SolutionTransfer work in codimension one. Fixed some dim in spacedim.
(Luca Heltai, 2011/04/11)
Fixed: Added some instantiations to make anisotropic refinement work in codimension one.
(Luca Heltai, 2011/03/31)
Fixed: Corrections in the creation of the face and subface interpolation matrices in the class FE_Nedelec.
(Markus Bürg, 2011/03/17)
Fixed: In step-21, the inner iteration would sometimes not converge for very coarse meshes because of numerical roundoff. This is now fixed by allowing more than rhs.size()
CG iterations if the number of degrees of freedom is very small.
(Jichao Yin, Wolfgang Bangerth, 2011/04/06)
New: There is now a new function ConditionalOStream::get_stream().
(Wolfgang Bangerth, 2011/03/09)
Fixed: FESystem::get_unit_face_support_points would refuse to return anything if one of the base elements did not have support points. This condition has been relaxed: it now only doesn't return anything if this base element has no support points and also has degrees of freedom on the face.
(Wolfgang Bangerth, 2011/03/07)
Fixed: Objects of type FE_Nothing could be generated with multiple vector components by passing an argument to the constructor. Yet, the FE_Nothing::get_name() function always just returned the string FE_Nothing<dim>()
independently of the number of components. This is now fixed.
(Wolfgang Bangerth, 2011/03/07)
Fixed: PETScWrappers:MPI:SparseMatrix and apply_boundary_values() produced an error in debug mode about non-existent SparsityPattern entries. Reason: clear_rows() also eliminated the whole row in the PETSc-internal SparsityPattern, which resulted in an error in the next assembly process.
(Timo Heister, 2011/02/23)
Fixed: It wasn't possible to use the FE_Nothing element inside an FESystem object and hand the result over to an FEValues object. This is now fixed.
(Wolfgang Bangerth, 2011/02/18)
New: There is now a function DataOutBase::write_visit_record that does the equivalent for VisIt that DataOutBase::write_pvtu_record does for ParaView: generate a file that contains a list of all other VTK or VTU files of which the current parallel simulation consists.
(Wolfgang Bangerth, 2011/02/16)
New: There is now a function TrilinosWrappers::VectorBase::minimal_value.
(Wolfgang Bangerth, 2011/02/16)
Fixed: TableBase::operator= could not be compiled if the type of the elements of the table was bool
. This is now fixed.
(Wolfgang Bangerth, 2011/02/16)
Improved: The GridGenerator::hyper_shell function generated meshes in 3d that are valid but of poor quality upon refinement. There is now an additional option to generate a coarse mesh of 96 cells that has a much better quality.
(Wolfgang Bangerth, 2011/02/12)
Fixed: There are systems where the libz
library is installed but the zlib.h
header file is not available. Since the latter condition was not tested, this would result in compiler errors. This is now fixed.
(Wolfgang Bangerth, 2011/02/09)
Fixed: Prolongation and restriction matrices were not computed at all for elements of type FE_DGQ if dim<spacedim
. Consequently, consumers of this information, such as the SolutionTransfer class or the DoFCellAccess::set_dof_values_by_interpolation function did not work either and simply returned zero results. This is now fixed.
(M. Sebastian Pauletti, Wolfgang Bangerth, 2011/02/09)
Fixed: When refining a mesh with codimension one, edges were refined using the same manifold description as adjacent cells, but this ignored that a boundary indicator might have been purposefully set for edges that are truly at the boundary of the mesh. For such edges, the boundary indicator is now honored.
(M. Sebastian Pauletti, Wolfgang Bangerth, 2011/02/09)
Fixed: The functions VectorTools::compute_mean_value and VectorTools::integrate_difference now also work for distributed triangulations of type parallel::distributed::Triangulation.
(Wolfgang Bangerth, 2011/02/07)
Changed: If the libz
library was detected during library configuration, the function DataOutBase::write_vtu now writes data in compressed format, saving a good fraction of disk space (80-90% for big output files).
(Wolfgang Bangerth, 2011/01/28)
New: Trilinos and PETSc vectors now have a function has_ghost_elements().
(Timo Heister, 2011/01/26)
Changed: The TrilinosWrappers::MPI::BlockVector::compress function now takes an argument (with a default value) in exactly the same way as the TrilinosWrappers::MPI::Vector::compress function already did.
(Wolfgang Bangerth, 2011/01/21)
Fixed: When calling DataOut::build_patches with a mapping, requesting more than one subdivision, and when dim<spacedim
, then some cells were not properly mapped. This is now fixed.
(Wolfgang Bangerth, 2011/01/18)
New: Restructured the internals of PETScWrappers::Precondition*
to allow a PETSc PC object to exist without a solver. New: Use Precondition*::vmult()
to apply the preconditioner once. Preconditioners now have a default constructor and an initialize()
function and are no longer initialized in the solver call, but in the constructor or initialize()
.
(Timo Heister, 2011/01/17)
Fixed: Boundary conditions in the step-23 tutorial program are now applied correctly. Matrix columns get eliminated with the used method and introduce some contribution to the right hand side coming from inhomogeneous boundary values. The old implementation did not reset the matrix columns before applying new boundary values.
(Martin Stoll, Martin Kronbichler, 2011/01/14)
Extended: base/tensor.h
has an additional collection of contractions between three tensors (ie. contract3
). This can be useful for writing matrix/vector assembly in a more compact form than before.
(Toby D. Young, 2011/01/12)