[cig-commits] commit: move to .hpp and .cpp

Mercurial hg at geodynamics.org
Fri Mar 9 13:24:55 PST 2012


changeset:   4:1042a48dad5a
user:        Walter Landry <boo at dante>
date:        Mon Dec 14 00:52:50 2009 -0800
files:       FTensor.h FTensor.hpp FTensor_new.h FTensor_new.hpp Index.h Index.hpp Layout.h Layout.hpp Number.h Number.hpp README Tensor0.h Tensor0.hpp Tensor0/dTensor0.h Tensor0/dTensor0.hpp Tensor0/d_boundary_Tensor0.h Tensor0/d_boundary_Tensor0.hpp Tensor0/d_one_sided_Tensor0.h Tensor0/d_one_sided_Tensor0.hpp Tensor0/ddTensor0.h Tensor0/ddTensor0.hpp Tensor0/dd_boundary_Tensor0.h Tensor0/dd_boundary_Tensor0.hpp Tensor0/diffusion_Tensor0.h Tensor0/diffusion_Tensor0.hpp Tensor0/interpolate_Tensor0.h Tensor0/interpolate_Tensor0.hpp Tensor1.h Tensor1.hpp Tensor1/Tensor1_Expr.h Tensor1/Tensor1_Expr.hpp Tensor1/Tensor1_Expr_equals.h Tensor1/Tensor1_Expr_equals.hpp Tensor1/Tensor1_and_Tensor1.h Tensor1/Tensor1_and_Tensor1.hpp Tensor1/Tensor1_carat_Tensor1.h Tensor1/Tensor1_carat_Tensor1.hpp Tensor1/Tensor1_constructor.h Tensor1/Tensor1_constructor.hpp Tensor1/Tensor1_divide_generic.h Tensor1/Tensor1_divide_generic.hpp Tensor1/Tensor1_minus_Tensor1.h Tensor1/Tensor1_minus_Tensor1.hpp Tensor1/Tensor1_minus_generic.h Tensor1/Tensor1_minus_generic.hpp Tensor1/Tensor1_or_Tensor1.h Tensor1/Tensor1_or_Tensor1.hpp Tensor1/Tensor1_plus_Tensor1.h Tensor1/Tensor1_plus_Tensor1.hpp Tensor1/Tensor1_plus_generic.h Tensor1/Tensor1_plus_generic.hpp Tensor1/Tensor1_pointer.h Tensor1/Tensor1_pointer.hpp Tensor1/Tensor1_times_Tensor1.h Tensor1/Tensor1_times_Tensor1.hpp Tensor1/Tensor1_times_generic.h Tensor1/Tensor1_times_generic.hpp Tensor1/Tensor1_value.h Tensor1/Tensor1_value.hpp Tensor1/dTensor1.h Tensor1/dTensor1.hpp Tensor1/d_one_sided_Tensor1.h Tensor1/d_one_sided_Tensor1.hpp Tensor1/ddTensor1.h Tensor1/ddTensor1.hpp Tensor1/diffusion_Tensor1.h Tensor1/diffusion_Tensor1.hpp Tensor1/generic_minus_Tensor1.h Tensor1/generic_minus_Tensor1.hpp Tensor1/interpolate_Tensor1.h Tensor1/interpolate_Tensor1.hpp Tensor1/minus_Tensor1.h Tensor1/minus_Tensor1.hpp Tensor2.h Tensor2.hpp Tensor2/Tensor2_Expr.h Tensor2/Tensor2_Expr.hpp Tensor2/Tensor2_Expr_equals.h Tensor2/Tensor2_Expr_equals.hpp Tensor2/Tensor2_and_Tensor1.h Tensor2/Tensor2_and_Tensor1.hpp Tensor2/Tensor2_carat_Tensor2.h Tensor2/Tensor2_carat_Tensor2.hpp Tensor2/Tensor2_constructor.h Tensor2/Tensor2_constructor.hpp Tensor2/Tensor2_divide_generic.h Tensor2/Tensor2_divide_generic.hpp Tensor2/Tensor2_minus_Tensor2.h Tensor2/Tensor2_minus_Tensor2.hpp Tensor2/Tensor2_number.h Tensor2/Tensor2_number.hpp Tensor2/Tensor2_numeral.h Tensor2/Tensor2_numeral.hpp Tensor2/Tensor2_or_Tensor2.h Tensor2/Tensor2_or_Tensor2.hpp Tensor2/Tensor2_plus_Tensor2.h Tensor2/Tensor2_plus_Tensor2.hpp Tensor2/Tensor2_pointer.h Tensor2/Tensor2_pointer.hpp Tensor2/Tensor2_times_Tensor1.h Tensor2/Tensor2_times_Tensor1.hpp Tensor2/Tensor2_times_Tensor2.h Tensor2/Tensor2_times_Tensor2.hpp Tensor2/Tensor2_times_generic.h Tensor2/Tensor2_times_generic.hpp Tensor2/Tensor2_transform.h Tensor2/Tensor2_transform.hpp Tensor2/Tensor2_value.h Tensor2/Tensor2_value.hpp Tensor2/conj_Tensor2.h Tensor2/conj_Tensor2.hpp Tensor2/minus_Tensor2.h Tensor2/minus_Tensor2.hpp Tensor2_symmetric.h Tensor2_symmetric.hpp Tensor2_symmetric/Tensor2_symmetric_Expr.h Tensor2_symmetric/Tensor2_symmetric_Expr.hpp Tensor2_symmetric/Tensor2_symmetric_Expr_equals.h Tensor2_symmetric/Tensor2_symmetric_Expr_equals.hpp Tensor2_symmetric/Tensor2_symmetric_and_Tensor2_symmetric.h Tensor2_symmetric/Tensor2_symmetric_and_Tensor2_symmetric.hpp Tensor2_symmetric/Tensor2_symmetric_carat_Tensor2.h Tensor2_symmetric/Tensor2_symmetric_carat_Tensor2.hpp Tensor2_symmetric/Tensor2_symmetric_constructor.h Tensor2_symmetric/Tensor2_symmetric_constructor.hpp Tensor2_symmetric/Tensor2_symmetric_divide_generic.h Tensor2_symmetric/Tensor2_symmetric_divide_generic.hpp Tensor2_symmetric/Tensor2_symmetric_minus_Tensor2.h Tensor2_symmetric/Tensor2_symmetric_minus_Tensor2.hpp Tensor2_symmetric/Tensor2_symmetric_minus_Tensor2_symmetric.h Tensor2_symmetric/Tensor2_symmetric_minus_Tensor2_symmetric.hpp Tensor2_symmetric/Tensor2_symmetric_minus_generic.h Tensor2_symmetric/Tensor2_symmetric_minus_generic.hpp Tensor2_symmetric/Tensor2_symmetric_mod_Tensor2_symmetric.h Tensor2_symmetric/Tensor2_symmetric_mod_Tensor2_symmetric.hpp Tensor2_symmetric/Tensor2_symmetric_plus_Tensor2.h Tensor2_symmetric/Tensor2_symmetric_plus_Tensor2.hpp Tensor2_symmetric/Tensor2_symmetric_plus_Tensor2_symmetric.h Tensor2_symmetric/Tensor2_symmetric_plus_Tensor2_symmetric.hpp Tensor2_symmetric/Tensor2_symmetric_plus_generic.h Tensor2_symmetric/Tensor2_symmetric_plus_generic.hpp Tensor2_symmetric/Tensor2_symmetric_pointer.h Tensor2_symmetric/Tensor2_symmetric_pointer.hpp Tensor2_symmetric/Tensor2_symmetric_times_Tensor1.h Tensor2_symmetric/Tensor2_symmetric_times_Tensor1.hpp Tensor2_symmetric/Tensor2_symmetric_times_Tensor2.h Tensor2_symmetric/Tensor2_symmetric_times_Tensor2.hpp Tensor2_symmetric/Tensor2_symmetric_times_Tensor2_symmetric.h Tensor2_symmetric/Tensor2_symmetric_times_Tensor2_symmetric.hpp Tensor2_symmetric/Tensor2_symmetric_times_generic.h Tensor2_symmetric/Tensor2_symmetric_times_generic.hpp Tensor2_symmetric/Tensor2_symmetric_value.h Tensor2_symmetric/Tensor2_symmetric_value.hpp Tensor2_symmetric/dTensor2_symmetric.h Tensor2_symmetric/dTensor2_symmetric.hpp Tensor2_symmetric/d_boundary_Tensor2_symmetric.h Tensor2_symmetric/d_boundary_Tensor2_symmetric.hpp Tensor2_symmetric/d_one_sided_Tensor2_symmetric.h Tensor2_symmetric/d_one_sided_Tensor2_symmetric.hpp Tensor2_symmetric/ddTensor2_symmetric.h Tensor2_symmetric/ddTensor2_symmetric.hpp Tensor2_symmetric/dd_boundary_Tensor2_symmetric.h Tensor2_symmetric/dd_boundary_Tensor2_symmetric.hpp Tensor2_symmetric/diffusion_Tensor2_symmetric.h Tensor2_symmetric/diffusion_Tensor2_symmetric.hpp Tensor2_symmetric/generic_minus_Tensor2_symmetric.h Tensor2_symmetric/generic_minus_Tensor2_symmetric.hpp Tensor2_symmetric/interpolate_Tensor2_symmetric.h Tensor2_symmetric/interpolate_Tensor2_symmetric.hpp Tensor2_symmetric/minus_Tensor2_symmetric.h Tensor2_symmetric/minus_Tensor2_symmetric.hpp Tensor3/Tensor3_Expr.h Tensor3/Tensor3_Expr.hpp Tensor3/Tensor3_contracted.h Tensor3/Tensor3_contracted.hpp Tensor3/Tensor3_minus_Tensor3_dg.h Tensor3/Tensor3_minus_Tensor3_dg.hpp Tensor3/Tensor3_or_Tensor3.h Tensor3/Tensor3_or_Tensor3.hpp Tensor3/Tensor3_plus_Tensor3.h Tensor3/Tensor3_plus_Tensor3.hpp Tensor3/Tensor3_times_Tensor1.h Tensor3/Tensor3_times_Tensor1.hpp Tensor3/Tensor3_times_Tensor2.h Tensor3/Tensor3_times_Tensor2.hpp Tensor3/Tensor3_times_Tensor2_symmetric.h Tensor3/Tensor3_times_Tensor2_symmetric.hpp Tensor3/Tensor3_times_Tensor3.h Tensor3/Tensor3_times_Tensor3.hpp Tensor3/Tensor3_times_Tensor3_dg.h Tensor3/Tensor3_times_Tensor3_dg.hpp Tensor3/Tensor3_times_generic.h Tensor3/Tensor3_times_generic.hpp Tensor3_antisymmetric.h Tensor3_antisymmetric.hpp Tensor3_antisymmetric/Tensor3_antisymmetric_Expr.h Tensor3_antisymmetric/Tensor3_antisymmetric_Expr.hpp Tensor3_antisymmetric/Tensor3_antisymmetric_Expr_equals.h Tensor3_antisymmetric/Tensor3_antisymmetric_Expr_equals.hpp Tensor3_antisymmetric/Tensor3_antisymmetric_constructor.h Tensor3_antisymmetric/Tensor3_antisymmetric_constructor.hpp Tensor3_antisymmetric/Tensor3_antisymmetric_mod_Tensor1.h Tensor3_antisymmetric/Tensor3_antisymmetric_mod_Tensor1.hpp Tensor3_antisymmetric/Tensor3_antisymmetric_or_Tensor3_antisymmetric.h Tensor3_antisymmetric/Tensor3_antisymmetric_or_Tensor3_antisymmetric.hpp Tensor3_antisymmetric/Tensor3_antisymmetric_plus_Tensor3_antisymmetric.h Tensor3_antisymmetric/Tensor3_antisymmetric_plus_Tensor3_antisymmetric.hpp Tensor3_antisymmetric/Tensor3_antisymmetric_pointer.h Tensor3_antisymmetric/Tensor3_antisymmetric_pointer.hpp Tensor3_antisymmetric/Tensor3_antisymmetric_times_Tensor3.h Tensor3_antisymmetric/Tensor3_antisymmetric_times_Tensor3.hpp Tensor3_antisymmetric/Tensor3_antisymmetric_times_generic.h Tensor3_antisymmetric/Tensor3_antisymmetric_times_generic.hpp Tensor3_antisymmetric/Tensor3_antisymmetric_value.h Tensor3_antisymmetric/Tensor3_antisymmetric_value.hpp Tensor3_christof.h Tensor3_christof.hpp Tensor3_christof/Tensor3_christof_constructor.h Tensor3_christof/Tensor3_christof_constructor.hpp Tensor3_christof/Tensor3_christof_number.h Tensor3_christof/Tensor3_christof_number.hpp Tensor3_christof/Tensor3_christof_numeral.h Tensor3_christof/Tensor3_christof_numeral.hpp Tensor3_christof/Tensor3_christof_pointer.h Tensor3_christof/Tensor3_christof_pointer.hpp Tensor3_christof/Tensor3_christof_value.h Tensor3_christof/Tensor3_christof_value.hpp Tensor3_dg.h Tensor3_dg.hpp Tensor3_dg/Tensor3_dg_Expr.h Tensor3_dg/Tensor3_dg_Expr.hpp Tensor3_dg/Tensor3_dg_Expr_equals.h Tensor3_dg/Tensor3_dg_Expr_equals.hpp Tensor3_dg/Tensor3_dg_and_Tensor1.h Tensor3_dg/Tensor3_dg_and_Tensor1.hpp Tensor3_dg/Tensor3_dg_and_Tensor2_symmetric.h Tensor3_dg/Tensor3_dg_and_Tensor2_symmetric.hpp Tensor3_dg/Tensor3_dg_and_Tensor3_dg.h Tensor3_dg/Tensor3_dg_and_Tensor3_dg.hpp Tensor3_dg/Tensor3_dg_constructor.h Tensor3_dg/Tensor3_dg_constructor.hpp Tensor3_dg/Tensor3_dg_divide_generic.h Tensor3_dg/Tensor3_dg_divide_generic.hpp Tensor3_dg/Tensor3_dg_function_operator.h Tensor3_dg/Tensor3_dg_function_operator.hpp Tensor3_dg/Tensor3_dg_minus_Tensor3_dg.h Tensor3_dg/Tensor3_dg_minus_Tensor3_dg.hpp Tensor3_dg/Tensor3_dg_number.h Tensor3_dg/Tensor3_dg_number.hpp Tensor3_dg/Tensor3_dg_numeral.h Tensor3_dg/Tensor3_dg_numeral.hpp Tensor3_dg/Tensor3_dg_or_Tensor3_dg.h Tensor3_dg/Tensor3_dg_or_Tensor3_dg.hpp Tensor3_dg/Tensor3_dg_plus_Tensor3_dg.h Tensor3_dg/Tensor3_dg_plus_Tensor3_dg.hpp Tensor3_dg/Tensor3_dg_pointer.h Tensor3_dg/Tensor3_dg_pointer.hpp Tensor3_dg/Tensor3_dg_times_Tensor1.h Tensor3_dg/Tensor3_dg_times_Tensor1.hpp Tensor3_dg/Tensor3_dg_times_Tensor2.h Tensor3_dg/Tensor3_dg_times_Tensor2.hpp Tensor3_dg/Tensor3_dg_times_Tensor2_symmetric.h Tensor3_dg/Tensor3_dg_times_Tensor2_symmetric.hpp Tensor3_dg/Tensor3_dg_times_Tensor3_dg.h Tensor3_dg/Tensor3_dg_times_Tensor3_dg.hpp Tensor3_dg/Tensor3_dg_times_generic.h Tensor3_dg/Tensor3_dg_times_generic.hpp Tensor3_dg/Tensor3_dg_value.h Tensor3_dg/Tensor3_dg_value.hpp Tensor3_dg/minus_Tensor3_dg.h Tensor3_dg/minus_Tensor3_dg.hpp Tensor4/Tensor4_Expr.h Tensor4/Tensor4_Expr.hpp Tensor4/Tensor4_minus_Tensor4.h Tensor4/Tensor4_minus_Tensor4.hpp Tensor4/Tensor4_plus_Tensor4.h Tensor4/Tensor4_plus_Tensor4.hpp Tensor4/Tensor4_times_Tensor2.h Tensor4/Tensor4_times_Tensor2.hpp Tensor4/Tensor4_times_Tensor2_symmetric.h Tensor4/Tensor4_times_Tensor2_symmetric.hpp Tensor4_Riemann.h Tensor4_Riemann.hpp Tensor4_Riemann/Tensor4_Riemann_Expr.h Tensor4_Riemann/Tensor4_Riemann_Expr.hpp Tensor4_Riemann/Tensor4_Riemann_minus_Tensor4_Riemann.h Tensor4_Riemann/Tensor4_Riemann_minus_Tensor4_Riemann.hpp Tensor4_Riemann/Tensor4_Riemann_plus_Tensor4_Riemann.h Tensor4_Riemann/Tensor4_Riemann_plus_Tensor4_Riemann.hpp Tensor4_Riemann/Tensor4_Riemann_times_Tensor1.h Tensor4_Riemann/Tensor4_Riemann_times_Tensor1.hpp Tensor4_Riemann/Tensor4_Riemann_times_Tensor2_symmetric.h Tensor4_Riemann/Tensor4_Riemann_times_Tensor2_symmetric.hpp Tensor4_Riemann/Tensor4_Riemann_times_Tensor4.h Tensor4_Riemann/Tensor4_Riemann_times_Tensor4.hpp Tensor4_Riemann/Tensor4_Riemann_times_Tensor4_ddg.h Tensor4_Riemann/Tensor4_Riemann_times_Tensor4_ddg.hpp Tensor4_ddg.h Tensor4_ddg.hpp Tensor4_ddg/Tensor4_ddg_Expr.h Tensor4_ddg/Tensor4_ddg_Expr.hpp Tensor4_ddg/Tensor4_ddg_Expr_equals.h Tensor4_ddg/Tensor4_ddg_Expr_equals.hpp Tensor4_ddg/Tensor4_ddg_and_Tensor2_symmetric.h Tensor4_ddg/Tensor4_ddg_and_Tensor2_symmetric.hpp Tensor4_ddg/Tensor4_ddg_and_Tensor4_ddg.h Tensor4_ddg/Tensor4_ddg_and_Tensor4_ddg.hpp Tensor4_ddg/Tensor4_ddg_carat_Tensor2_symmetric.h Tensor4_ddg/Tensor4_ddg_carat_Tensor2_symmetric.hpp Tensor4_ddg/Tensor4_ddg_carat_Tensor4_ddg.h Tensor4_ddg/Tensor4_ddg_carat_Tensor4_ddg.hpp Tensor4_ddg/Tensor4_ddg_minus_Tensor4_ddg.h Tensor4_ddg/Tensor4_ddg_minus_Tensor4_ddg.hpp Tensor4_ddg/Tensor4_ddg_mod_Tensor2_symmetric.h Tensor4_ddg/Tensor4_ddg_mod_Tensor2_symmetric.hpp Tensor4_ddg/Tensor4_ddg_mod_Tensor4_ddg.h Tensor4_ddg/Tensor4_ddg_mod_Tensor4_ddg.hpp Tensor4_ddg/Tensor4_ddg_number.h Tensor4_ddg/Tensor4_ddg_number.hpp Tensor4_ddg/Tensor4_ddg_numeral.h Tensor4_ddg/Tensor4_ddg_numeral.hpp Tensor4_ddg/Tensor4_ddg_or_Tensor2_symmetric.h Tensor4_ddg/Tensor4_ddg_or_Tensor2_symmetric.hpp Tensor4_ddg/Tensor4_ddg_or_Tensor4_ddg.h Tensor4_ddg/Tensor4_ddg_or_Tensor4_ddg.hpp Tensor4_ddg/Tensor4_ddg_plus_Tensor4_ddg.h Tensor4_ddg/Tensor4_ddg_plus_Tensor4_ddg.hpp Tensor4_ddg/Tensor4_ddg_pointer.h Tensor4_ddg/Tensor4_ddg_pointer.hpp Tensor4_ddg/Tensor4_ddg_times_Tensor1.h Tensor4_ddg/Tensor4_ddg_times_Tensor1.hpp Tensor4_ddg/Tensor4_ddg_times_Tensor2.h Tensor4_ddg/Tensor4_ddg_times_Tensor2.hpp Tensor4_ddg/Tensor4_ddg_times_Tensor2_symmetric.h Tensor4_ddg/Tensor4_ddg_times_Tensor2_symmetric.hpp Tensor4_ddg/Tensor4_ddg_times_Tensor4_ddg.h Tensor4_ddg/Tensor4_ddg_times_Tensor4_ddg.hpp Tensor4_ddg/Tensor4_ddg_times_generic.h Tensor4_ddg/Tensor4_ddg_times_generic.hpp Tensor4_ddg/Tensor4_ddg_value.h Tensor4_ddg/Tensor4_ddg_value.hpp Tensor4_ddg/minus_Tensor4_ddg.h Tensor4_ddg/minus_Tensor4_ddg.hpp derivative_delta.h derivative_delta.hpp promote.h promote.hpp tests/conformance/T2/test_T2.C tests/conformance/T2/test_T2.cpp tests/conformance/T2/test_T2I.C tests/conformance/T2/test_T2I.cpp tests/conformance/T2/test_T2II.C tests/conformance/T2/test_T2II.cpp tests/conformance/T2/test_T2III.C tests/conformance/T2/test_T2III.cpp tests/conformance/T2/test_T2IV.C tests/conformance/T2/test_T2IV.cpp tests/conformance/T2/test_T2IX.C tests/conformance/T2/test_T2IX.cpp tests/conformance/T2/test_T2V.C tests/conformance/T2/test_T2V.cpp tests/conformance/T2/test_T2VI.C tests/conformance/T2/test_T2VI.cpp tests/conformance/T2/test_T2VII.C tests/conformance/T2/test_T2VII.cpp tests/conformance/T2/test_T2VIII.C tests/conformance/T2/test_T2VIII.cpp tests/conformance/T2/test_T2X.C tests/conformance/T2/test_T2X.cpp tests/conformance/T2/test_T2XI.C tests/conformance/T2/test_T2XI.cpp tests/conformance/T2/test_T2XII.C tests/conformance/T2/test_T2XII.cpp tests/conformance/T2/test_T2XIII.C tests/conformance/T2/test_T2XIII.cpp tests/conformance/T2/test_T2XIV.C tests/conformance/T2/test_T2XIV.cpp tests/conformance/T2/test_T2XIX.C tests/conformance/T2/test_T2XIX.cpp tests/conformance/T2/test_T2XV.C tests/conformance/T2/test_T2XV.cpp tests/conformance/T2/test_T2XVI.C tests/conformance/T2/test_T2XVI.cpp tests/conformance/T2/test_T2XVII.C tests/conformance/T2/test_T2XVII.cpp tests/conformance/T2/test_T2XVIII.C tests/conformance/T2/test_T2XVIII.cpp tests/conformance/T2/test_T2XX.C tests/conformance/T2/test_T2XX.cpp tests/conformance/T2/test_T2XXI.C tests/conformance/T2/test_T2XXI.cpp tests/conformance/T2/test_T2XXII.C tests/conformance/T2/test_T2XXII.cpp tests/conformance/T2/test_T2XXIII.C tests/conformance/T2/test_T2XXIII.cpp tests/conformance/T2/test_T2XXIV.C tests/conformance/T2/test_T2XXIV.cpp tests/conformance/T2/test_T2XXIX.C tests/conformance/T2/test_T2XXIX.cpp tests/conformance/T2/test_T2XXV.C tests/conformance/T2/test_T2XXV.cpp tests/conformance/T2/test_T2XXVI.C tests/conformance/T2/test_T2XXVI.cpp tests/conformance/T2/test_T2XXVII.C tests/conformance/T2/test_T2XXVII.cpp tests/conformance/T2/test_T2XXVIII.C tests/conformance/T2/test_T2XXVIII.cpp tests/conformance/T2/test_T2XXX.C tests/conformance/T2/test_T2XXX.cpp tests/conformance/T2/test_T2XXXI.C tests/conformance/T2/test_T2XXXI.cpp tests/conformance/T2/test_T2XXXII.C tests/conformance/T2/test_T2XXXII.cpp tests/conformance/T2/test_T2XXXIII.C tests/conformance/T2/test_T2XXXIII.cpp tests/conformance/T2/test_T2XXXIV.C tests/conformance/T2/test_T2XXXIV.cpp tests/conformance/T2/test_T2XXXV.C tests/conformance/T2/test_T2XXXV.cpp tests/conformance/T2/test_T2XXXVI.C tests/conformance/T2/test_T2XXXVI.cpp tests/conformance/T2/test_T2XXXVII.C tests/conformance/T2/test_T2XXXVII.cpp tests/conformance/T2/test_T2XXXVIII.C tests/conformance/T2/test_T2XXXVIII.cpp tests/conformance/T2s/test_T2s.C tests/conformance/T2s/test_T2s.cpp tests/conformance/T2s/test_T2sI.C tests/conformance/T2s/test_T2sI.cpp tests/conformance/T2s/test_T2sII.C tests/conformance/T2s/test_T2sII.cpp tests/conformance/T2s/test_T2sIII.C tests/conformance/T2s/test_T2sIII.cpp tests/conformance/T2s/test_T2sIV.C tests/conformance/T2s/test_T2sIV.cpp tests/conformance/T2s/test_T2sIX.C tests/conformance/T2s/test_T2sIX.cpp tests/conformance/T2s/test_T2sV.C tests/conformance/T2s/test_T2sV.cpp tests/conformance/T2s/test_T2sVI.C tests/conformance/T2s/test_T2sVI.cpp tests/conformance/T2s/test_T2sVII.C tests/conformance/T2s/test_T2sVII.cpp tests/conformance/T2s/test_T2sVIII.C tests/conformance/T2s/test_T2sVIII.cpp tests/conformance/T2s/test_T2sX.C tests/conformance/T2s/test_T2sX.cpp tests/conformance/T2s/test_T2sXI.C tests/conformance/T2s/test_T2sXI.cpp tests/conformance/T2s/test_T2sXII.C tests/conformance/T2s/test_T2sXII.cpp tests/conformance/T2s/test_T2sXIII.C tests/conformance/T2s/test_T2sXIII.cpp tests/conformance/T2s/test_T2sXIV.C tests/conformance/T2s/test_T2sXIV.cpp tests/conformance/T2s/test_T2sXIX.C tests/conformance/T2s/test_T2sXIX.cpp tests/conformance/T2s/test_T2sXL.C tests/conformance/T2s/test_T2sXL.cpp tests/conformance/T2s/test_T2sXLI.C tests/conformance/T2s/test_T2sXLI.cpp tests/conformance/T2s/test_T2sXLII.C tests/conformance/T2s/test_T2sXLII.cpp tests/conformance/T2s/test_T2sXLIII.C tests/conformance/T2s/test_T2sXLIII.cpp tests/conformance/T2s/test_T2sXLIV.C tests/conformance/T2s/test_T2sXLIV.cpp tests/conformance/T2s/test_T2sXV.C tests/conformance/T2s/test_T2sXV.cpp tests/conformance/T2s/test_T2sXVI.C tests/conformance/T2s/test_T2sXVI.cpp tests/conformance/T2s/test_T2sXVII.C tests/conformance/T2s/test_T2sXVII.cpp tests/conformance/T2s/test_T2sXVIII.C tests/conformance/T2s/test_T2sXVIII.cpp tests/conformance/T2s/test_T2sXX.C tests/conformance/T2s/test_T2sXX.cpp tests/conformance/T2s/test_T2sXXI.C tests/conformance/T2s/test_T2sXXI.cpp tests/conformance/T2s/test_T2sXXII.C tests/conformance/T2s/test_T2sXXII.cpp tests/conformance/T2s/test_T2sXXIII.C tests/conformance/T2s/test_T2sXXIII.cpp tests/conformance/T2s/test_T2sXXIV.C tests/conformance/T2s/test_T2sXXIV.cpp tests/conformance/T2s/test_T2sXXIX.C tests/conformance/T2s/test_T2sXXIX.cpp tests/conformance/T2s/test_T2sXXV.C tests/conformance/T2s/test_T2sXXV.cpp tests/conformance/T2s/test_T2sXXVI.C tests/conformance/T2s/test_T2sXXVI.cpp tests/conformance/T2s/test_T2sXXVII.C tests/conformance/T2s/test_T2sXXVII.cpp tests/conformance/T2s/test_T2sXXVIII.C tests/conformance/T2s/test_T2sXXVIII.cpp tests/conformance/T2s/test_T2sXXX.C tests/conformance/T2s/test_T2sXXX.cpp tests/conformance/T2s/test_T2sXXXI.C tests/conformance/T2s/test_T2sXXXI.cpp tests/conformance/T2s/test_T2sXXXII.C tests/conformance/T2s/test_T2sXXXII.cpp tests/conformance/T2s/test_T2sXXXIII.C tests/conformance/T2s/test_T2sXXXIII.cpp tests/conformance/T2s/test_T2sXXXIV.C tests/conformance/T2s/test_T2sXXXIV.cpp tests/conformance/T2s/test_T2sXXXIX.C tests/conformance/T2s/test_T2sXXXIX.cpp tests/conformance/T2s/test_T2sXXXV.C tests/conformance/T2s/test_T2sXXXV.cpp tests/conformance/T2s/test_T2sXXXVI.C tests/conformance/T2s/test_T2sXXXVI.cpp tests/conformance/T2s/test_T2sXXXVII.C tests/conformance/T2s/test_T2sXXXVII.cpp tests/conformance/T2s/test_T2sXXXVIII.C tests/conformance/T2s/test_T2sXXXVIII.cpp tests/conformance/T3/test_T3.C tests/conformance/T3/test_T3.cpp tests/conformance/T3/test_T3II.C tests/conformance/T3/test_T3II.cpp tests/conformance/T3as/test_T3as.C tests/conformance/T3as/test_T3as.cpp tests/conformance/T3as/test_T3asI.C tests/conformance/T3as/test_T3asI.cpp tests/conformance/T3as/test_T3asII.C tests/conformance/T3as/test_T3asII.cpp tests/conformance/T3as/test_T3asIII.C tests/conformance/T3as/test_T3asIII.cpp tests/conformance/T3as/test_T3asIV.C tests/conformance/T3as/test_T3asIV.cpp tests/conformance/T3as/test_T3asIX.C tests/conformance/T3as/test_T3asIX.cpp tests/conformance/T3as/test_T3asV.C tests/conformance/T3as/test_T3asV.cpp tests/conformance/T3as/test_T3asVI.C tests/conformance/T3as/test_T3asVI.cpp tests/conformance/T3as/test_T3asVII.C tests/conformance/T3as/test_T3asVII.cpp tests/conformance/T3as/test_T3asVIII.C tests/conformance/T3as/test_T3asVIII.cpp tests/conformance/T3as/test_T3asX.C tests/conformance/T3as/test_T3asX.cpp tests/conformance/T3as/test_T3asXI.C tests/conformance/T3as/test_T3asXI.cpp tests/conformance/T3as/test_T3asXII.C tests/conformance/T3as/test_T3asXII.cpp tests/conformance/T3as/test_T3asXIII.C tests/conformance/T3as/test_T3asXIII.cpp tests/conformance/T3as/test_T3asXIV.C tests/conformance/T3as/test_T3asXIV.cpp tests/conformance/T3dg/test_T3dg.C tests/conformance/T3dg/test_T3dg.cpp tests/conformance/T3dg/test_T3dgCII.C tests/conformance/T3dg/test_T3dgCII.cpp tests/conformance/T3dg/test_T3dgCIII.C tests/conformance/T3dg/test_T3dgCIII.cpp tests/conformance/T3dg/test_T3dgI.C tests/conformance/T3dg/test_T3dgI.cpp tests/conformance/T3dg/test_T3dgII.C tests/conformance/T3dg/test_T3dgII.cpp tests/conformance/T3dg/test_T3dgIII.C tests/conformance/T3dg/test_T3dgIII.cpp tests/conformance/T3dg/test_T3dgIV.C tests/conformance/T3dg/test_T3dgIV.cpp tests/conformance/T3dg/test_T3dgIX.C tests/conformance/T3dg/test_T3dgIX.cpp tests/conformance/T3dg/test_T3dgV.C tests/conformance/T3dg/test_T3dgV.cpp tests/conformance/T3dg/test_T3dgVI.C tests/conformance/T3dg/test_T3dgVI.cpp tests/conformance/T3dg/test_T3dgVII.C tests/conformance/T3dg/test_T3dgVII.cpp tests/conformance/T3dg/test_T3dgVIII.C tests/conformance/T3dg/test_T3dgVIII.cpp tests/conformance/T3dg/test_T3dgX.C tests/conformance/T3dg/test_T3dgX.cpp tests/conformance/T3dg/test_T3dgXI.C tests/conformance/T3dg/test_T3dgXI.cpp tests/conformance/T3dg/test_T3dgXII.C tests/conformance/T3dg/test_T3dgXII.cpp tests/conformance/T3dg/test_T3dgXIII.C tests/conformance/T3dg/test_T3dgXIII.cpp tests/conformance/T3dg/test_T3dgXIV.C tests/conformance/T3dg/test_T3dgXIV.cpp tests/conformance/T3dg/test_T3dgXIX.C tests/conformance/T3dg/test_T3dgXIX.cpp tests/conformance/T3dg/test_T3dgXV.C tests/conformance/T3dg/test_T3dgXV.cpp tests/conformance/T3dg/test_T3dgXVI.C tests/conformance/T3dg/test_T3dgXVI.cpp tests/conformance/T3dg/test_T3dgXVII.C tests/conformance/T3dg/test_T3dgXVII.cpp tests/conformance/T3dg/test_T3dgXVIII.C tests/conformance/T3dg/test_T3dgXVIII.cpp tests/conformance/T3dg/test_T3dgXX.C tests/conformance/T3dg/test_T3dgXX.cpp tests/conformance/T3dg/test_T3dgXXI.C tests/conformance/T3dg/test_T3dgXXI.cpp tests/conformance/T3dg/test_T3dgXXII.C tests/conformance/T3dg/test_T3dgXXII.cpp tests/conformance/T3dg/test_T3dgXXIII.C tests/conformance/T3dg/test_T3dgXXIII.cpp tests/conformance/T3dg/test_T3dgXXIV.C tests/conformance/T3dg/test_T3dgXXIV.cpp tests/conformance/T3dg/test_T3dgXXIX.C tests/conformance/T3dg/test_T3dgXXIX.cpp tests/conformance/T3dg/test_T3dgXXV.C tests/conformance/T3dg/test_T3dgXXV.cpp tests/conformance/T3dg/test_T3dgXXVI.C tests/conformance/T3dg/test_T3dgXXVI.cpp tests/conformance/T3dg/test_T3dgXXVII.C tests/conformance/T3dg/test_T3dgXXVII.cpp tests/conformance/T3dg/test_T3dgXXVIII.C tests/conformance/T3dg/test_T3dgXXVIII.cpp tests/conformance/T3dg/test_T3dgXXX.C tests/conformance/T3dg/test_T3dgXXX.cpp tests/conformance/T3dg/test_T3dgXXXI.C tests/conformance/T3dg/test_T3dgXXXI.cpp tests/conformance/T3dg/test_T3dgXXXII.C tests/conformance/T3dg/test_T3dgXXXII.cpp tests/conformance/T3dg/test_T3dgXXXIII.C tests/conformance/T3dg/test_T3dgXXXIII.cpp tests/conformance/T3dg/test_T3dgXXXIV.C tests/conformance/T3dg/test_T3dgXXXIV.cpp tests/conformance/T3dg/test_T3dgXXXV.C tests/conformance/T3dg/test_T3dgXXXV.cpp tests/conformance/T4ddg/test_T4ddg.C tests/conformance/T4ddg/test_T4ddg.cpp tests/conformance/T4ddg/test_T4ddgII.C tests/conformance/T4ddg/test_T4ddgII.cpp tests/conformance/T4ddg/test_T4ddgIII.C tests/conformance/T4ddg/test_T4ddgIII.cpp tests/conformance/T4ddg/test_T4ddgIV.C tests/conformance/T4ddg/test_T4ddgIV.cpp tests/conformance/T4ddg/test_T4ddgV.C tests/conformance/T4ddg/test_T4ddgV.cpp tests/conformance/test_T0.C tests/conformance/test_T0.cpp tests/conformance/test_T0.h tests/conformance/test_T0.hpp tests/conformance/test_T1.C tests/conformance/test_T1.cpp tests/conformance/test_T1.h tests/conformance/test_T1.hpp tests/conformance/test_T2.h tests/conformance/test_T2.hpp tests/conformance/test_T2s.h tests/conformance/test_T2s.hpp tests/conformance/test_T3.h tests/conformance/test_T3.hpp tests/conformance/test_T3II.h tests/conformance/test_T3II.hpp tests/conformance/test_T3as.h tests/conformance/test_T3as.hpp tests/conformance/test_T3ch.C tests/conformance/test_T3ch.cpp tests/conformance/test_T3ch.h tests/conformance/test_T3ch.hpp tests/conformance/test_T3dg.h tests/conformance/test_T3dg.hpp tests/conformance/test_T4R.C tests/conformance/test_T4R.cpp tests/conformance/test_T4R.h tests/conformance/test_T4R.hpp tests/conformance/test_T4ddg.h tests/conformance/test_T4ddg.hpp tests/conformance/test_T4ddgII.h tests/conformance/test_T4ddgII.hpp tests/conformance/test_T4ddgIII.h tests/conformance/test_T4ddgIII.hpp tests/conformance/test_T4ddgIV.h tests/conformance/test_T4ddgIV.hpp tests/conformance/test_T4ddgV.h tests/conformance/test_T4ddgV.hpp tests/conformance/test_for_zero.h tests/conformance/test_for_zero.hpp tests/conformance/testcases.C tests/conformance/testcases.cpp tests/conformance/testcases_compiler.C tests/conformance/testcases_compiler.cpp tests/speed/Number_test.C tests/speed/Number_test.cpp tests/speed/acoustic.C tests/speed/acoustic.cpp tests/speed/example.C tests/speed/example.cpp tests/speed/examplefast.C tests/speed/examplefast.cpp tests/speed/little.C tests/speed/little.cpp tests/speed/littlefast.C tests/speed/littlefast.cpp tests/speed/one_over_1_minus_x.C tests/speed/one_over_1_minus_x.cpp tests/speed/one_over_1_minus_x.h tests/speed/one_over_1_minus_x.hpp tests/speed/one_over_1_minus_x1.C tests/speed/one_over_1_minus_x1.cpp tests/speed/one_over_1_minus_x2.C tests/speed/one_over_1_minus_x2.cpp tests/speed/one_over_1_minus_x3.C tests/speed/one_over_1_minus_x3.cpp tests/speed/one_over_1_minus_x4.C tests/speed/one_over_1_minus_x4.cpp tests/speed/one_over_1_minus_x5.C tests/speed/one_over_1_minus_x5.cpp tests/speed/one_over_1_minus_x6.C tests/speed/one_over_1_minus_x6.cpp tests/speed/one_over_1_minus_x7.C tests/speed/one_over_1_minus_x7.cpp tests/speed/one_over_1_minus_x8.C tests/speed/one_over_1_minus_x8.cpp tests/speed/one_over_1_minus_x9.C tests/speed/one_over_1_minus_x9.cpp tests/speed/one_over_1_minus_x_fast.C tests/speed/one_over_1_minus_x_fast.cpp tests/speed/one_over_1_minus_x_fast.h tests/speed/one_over_1_minus_x_fast.hpp tests/speed/one_over_1_minus_x_fast1.C tests/speed/one_over_1_minus_x_fast1.cpp tests/speed/one_over_1_minus_x_fast2.C tests/speed/one_over_1_minus_x_fast2.cpp tests/speed/one_over_1_minus_x_fast3.C tests/speed/one_over_1_minus_x_fast3.cpp tests/speed/one_over_1_minus_x_fast4.C tests/speed/one_over_1_minus_x_fast4.cpp tests/speed/one_over_1_minus_x_fast5.C tests/speed/one_over_1_minus_x_fast5.cpp tests/speed/one_over_1_minus_x_fast6.C tests/speed/one_over_1_minus_x_fast6.cpp tests/speed/one_over_1_minus_x_fast7.C tests/speed/one_over_1_minus_x_fast7.cpp tests/speed/one_over_1_minus_x_fast8.C tests/speed/one_over_1_minus_x_fast8.cpp tests/speed/one_over_1_minus_x_fast9.C tests/speed/one_over_1_minus_x_fast9.cpp tests/speed/simple.C tests/speed/simple.cpp tests/speed/single.C tests/speed/single.cpp tests/speed/speed_test.C tests/speed/speed_test.cpp
description:
move to .hpp and .cpp


diff -r dd991b426d75 -r 1042a48dad5a FTensor.h
--- a/FTensor.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-/* Include file for the Fast Tensor classes (FTensor).  Everything is
-   in namespace FTensor. */
-
-#include <cmath>
-#include <complex>
-#ifdef FTENSOR_DEBUG
-#include <iostream>
-#include <stdexcept>
-#include <sstream>
-#endif
-#include "Layout.h"
-namespace FTensor {
-  template <class T> class Tensor0;
-
-  template <class T, int Dim> class Tensor1;
-  template<class A, class T, int Dim, char i> class Tensor1_Expr;
-
-  template <class T, int Dim1, int Dim2, Layout layout=column_major>
-  class Tensor2;
-  template<class A, class T, int Dim1, int Dim2, char i, char j>
-  class Tensor2_Expr;
-  template<class A, class T, int N>
-  class Tensor2_number_rhs_0;
-  template<class A, class T, int N>
-  class Tensor2_number_rhs_1;
-
-  template <class T, int Dim> class Tensor2_symmetric;
-  template<class A, class T, int Dim, char i, char j>
-  class Tensor2_symmetric_Expr;
-
-  template <class A, class T, int Dim0, int Dim1, int Dim2,
-    char i, char j, char k> class Tensor3_Expr;
-
-  template <class T, int Dim01, int Dim2> class Tensor3_dg;
-  template <class A, class T, int Dim01, int Dim2, char i, char j, char k>
-  class Tensor3_dg_Expr;
-  template<class A, class T, int N> class Tensor3_dg_number_rhs_0;
-  template<class A, class T, int N> class Tensor3_dg_number_rhs_2;
-  template<class A, class T, int N1, int N2> class Tensor3_dg_number_rhs_01;
-  template<class A, class T, int N1, int N2> class Tensor3_dg_number_rhs_12;
-
-  template <class T, int Dim0, int Dim12> class Tensor3_christof;
-  template <class A, class T, int Dim0, int Dim12, char i, char j, char k>
-  class Tensor3_christof_Expr;
-
-  template <class T, int Dim0, int Dim12> class Tensor3_antisymmetric;
-  template <class A, class T, int Dim0, int Dim12, char i, char j, char k>
-  class Tensor3_antisymmetric_Expr;
-
-  template <class A, class T, int Dim0, int Dim1, int Dim2, int Dim3,
-    char i, char j, char k, char l> class Tensor4_Expr;
-
-  template <class T, int Dim> class Tensor4_Riemann;
-  template <class A, class T, int Dim, char i, char j, char k, char l>
-  class Tensor4_Riemann_Expr;
-
-  template <class T, int Dim01, int Dim23> class Tensor4_ddg;
-  template <class A, class T, int Dim01, int Dim23,
-    char i, char j, char k, char l> class Tensor4_ddg_Expr;
-  template<class A, class T, int N0, int N1>
-  class Tensor4_ddg_number_rhs_01;
-  template<class A, class T, int N0>
-  class Tensor4_ddg_number_rhs_0;
-
-#include "Index.h"
-#include "Number.h"
-#include "promote.h"
-#include "Tensor0.h"
-#include "Tensor1.h"
-#include "Tensor2.h"
-#include "Tensor2_symmetric.h"
-#include "Tensor3/Tensor3_Expr.h"
-#include "Tensor3/Tensor3_contracted.h"
-#include "Tensor3_dg.h"
-#include "Tensor3_christof.h"
-#include "Tensor3_antisymmetric.h"
-#include "Tensor4/Tensor4_Expr.h"
-#include "Tensor4_ddg.h"
-#include "Tensor4_Riemann.h"
-}
diff -r dd991b426d75 -r 1042a48dad5a FTensor.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FTensor.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,80 @@
+/* Include file for the Fast Tensor classes (FTensor).  Everything is
+   in namespace FTensor. */
+
+#include <cmath>
+#include <complex>
+#ifdef FTENSOR_DEBUG
+#include <iostream>
+#include <stdexcept>
+#include <sstream>
+#endif
+#include "Layout.hpp"
+namespace FTensor {
+  template <class T> class Tensor0;
+
+  template <class T, int Dim> class Tensor1;
+  template<class A, class T, int Dim, char i> class Tensor1_Expr;
+
+  template <class T, int Dim1, int Dim2, Layout layout=column_major>
+  class Tensor2;
+  template<class A, class T, int Dim1, int Dim2, char i, char j>
+  class Tensor2_Expr;
+  template<class A, class T, int N>
+  class Tensor2_number_rhs_0;
+  template<class A, class T, int N>
+  class Tensor2_number_rhs_1;
+
+  template <class T, int Dim> class Tensor2_symmetric;
+  template<class A, class T, int Dim, char i, char j>
+  class Tensor2_symmetric_Expr;
+
+  template <class A, class T, int Dim0, int Dim1, int Dim2,
+    char i, char j, char k> class Tensor3_Expr;
+
+  template <class T, int Dim01, int Dim2> class Tensor3_dg;
+  template <class A, class T, int Dim01, int Dim2, char i, char j, char k>
+  class Tensor3_dg_Expr;
+  template<class A, class T, int N> class Tensor3_dg_number_rhs_0;
+  template<class A, class T, int N> class Tensor3_dg_number_rhs_2;
+  template<class A, class T, int N1, int N2> class Tensor3_dg_number_rhs_01;
+  template<class A, class T, int N1, int N2> class Tensor3_dg_number_rhs_12;
+
+  template <class T, int Dim0, int Dim12> class Tensor3_christof;
+  template <class A, class T, int Dim0, int Dim12, char i, char j, char k>
+  class Tensor3_christof_Expr;
+
+  template <class T, int Dim0, int Dim12> class Tensor3_antisymmetric;
+  template <class A, class T, int Dim0, int Dim12, char i, char j, char k>
+  class Tensor3_antisymmetric_Expr;
+
+  template <class A, class T, int Dim0, int Dim1, int Dim2, int Dim3,
+    char i, char j, char k, char l> class Tensor4_Expr;
+
+  template <class T, int Dim> class Tensor4_Riemann;
+  template <class A, class T, int Dim, char i, char j, char k, char l>
+  class Tensor4_Riemann_Expr;
+
+  template <class T, int Dim01, int Dim23> class Tensor4_ddg;
+  template <class A, class T, int Dim01, int Dim23,
+    char i, char j, char k, char l> class Tensor4_ddg_Expr;
+  template<class A, class T, int N0, int N1>
+  class Tensor4_ddg_number_rhs_01;
+  template<class A, class T, int N0>
+  class Tensor4_ddg_number_rhs_0;
+
+#include "Index.hpp"
+#include "Number.hpp"
+#include "promote.hpp"
+#include "Tensor0.hpp"
+#include "Tensor1.hpp"
+#include "Tensor2.hpp"
+#include "Tensor2_symmetric.hpp"
+#include "Tensor3/Tensor3_Expr.hpp"
+#include "Tensor3/Tensor3_contracted.hpp"
+#include "Tensor3_dg.hpp"
+#include "Tensor3_christof.hpp"
+#include "Tensor3_antisymmetric.hpp"
+#include "Tensor4/Tensor4_Expr.hpp"
+#include "Tensor4_ddg.hpp"
+#include "Tensor4_Riemann.hpp"
+}
diff -r dd991b426d75 -r 1042a48dad5a FTensor_new.h
--- a/FTensor_new.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-/* Include file for the Fast Tensor classes (FTensor).  Everything is
-   in namespace FTensor. */
-
-#include <cmath>
-#include <complex>
-#ifdef FTENSOR_DEBUG
-#include <iostream>
-#endif
-namespace FTensor_new {
-  template <class T> class Tensor0;
-
-  template <class T, int Dim> class Tensor1;
-  template<class A, class T, int Dim, char i> class Tensor1_Expr;
-
-  template <class T, int Dim1, int Dim2> class Tensor2;
-  template<class A, class T, int Dim1, int Dim2, char i, char j>
-  class Tensor2_Expr;
-  template<class A, class T, int N>
-  class Tensor2_number_rhs_0;
-  template<class A, class T, int N>
-  class Tensor2_number_rhs_1;
-
-  template <class T, int Dim> class Tensor2_symmetric;
-  template<class A, class T, int Dim, char i, char j>
-  class Tensor2_symmetric_Expr;
-
-  template <class A, class T, int Dim0, int Dim1, int Dim2,
-    char i, char j, char k> class Tensor3_Expr;
-
-  template <class T, int Dim01, int Dim2> class Tensor3_dg;
-  template <class A, class T, int Dim01, int Dim2, char i, char j, char k>
-  class Tensor3_dg_Expr;
-  template<class A, class T, int N> class Tensor3_dg_number_rhs_0;
-  template<class A, class T, int N> class Tensor3_dg_number_rhs_2;
-  template<class A, class T, int N1, int N2> class Tensor3_dg_number_rhs_01;
-  template<class A, class T, int N1, int N2> class Tensor3_dg_number_rhs_12;
-
-  template <class T, int Dim0, int Dim12> class Tensor3_christof;
-  template <class A, class T, int Dim0, int Dim12, char i, char j, char k>
-  class Tensor3_christof_Expr;
-
-  template <class T, int Dim0, int Dim12> class Tensor3_antisymmetric;
-  template <class A, class T, int Dim0, int Dim12, char i, char j, char k>
-  class Tensor3_antisymmetric_Expr;
-
-  template <class A, class T, int Dim0, int Dim1, int Dim2, int Dim3,
-    char i, char j, char k, char l> class Tensor4_Expr;
-
-  template <class T, int Dim> class Tensor4_Riemann;
-  template <class A, class T, int Dim, char i, char j, char k, char l>
-  class Tensor4_Riemann_Expr;
-
-  template <class T, int Dim01, int Dim23> class Tensor4_ddg;
-  template <class A, class T, int Dim01, int Dim23,
-    char i, char j, char k, char l> class Tensor4_ddg_Expr;
-  template<class A, class T, int N0, int N1>
-  class Tensor4_ddg_number_rhs_01;
-  template<class A, class T, int N0>
-  class Tensor4_ddg_number_rhs_0;
-
-#include "Index.h"
-#include "Number.h"
-#include "promote.h"
-#include "Tensor0.h"
-#include "Tensor1.h"
-#include "Tensor2.h"
-#include "Tensor2_symmetric.h"
-#include "Tensor3/Tensor3_Expr.h"
-#include "Tensor3/Tensor3_contracted.h"
-#include "Tensor3_dg.h"
-#include "Tensor3_christof.h"
-#include "Tensor3_antisymmetric.h"
-#include "Tensor4/Tensor4_Expr.h"
-#include "Tensor4_ddg.h"
-#include "Tensor4_Riemann.h"
-}
diff -r dd991b426d75 -r 1042a48dad5a FTensor_new.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FTensor_new.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,76 @@
+/* Include file for the Fast Tensor classes (FTensor).  Everything is
+   in namespace FTensor. */
+
+#include <cmath>
+#include <complex>
+#ifdef FTENSOR_DEBUG
+#include <iostream>
+#endif
+namespace FTensor_new {
+  template <class T> class Tensor0;
+
+  template <class T, int Dim> class Tensor1;
+  template<class A, class T, int Dim, char i> class Tensor1_Expr;
+
+  template <class T, int Dim1, int Dim2> class Tensor2;
+  template<class A, class T, int Dim1, int Dim2, char i, char j>
+  class Tensor2_Expr;
+  template<class A, class T, int N>
+  class Tensor2_number_rhs_0;
+  template<class A, class T, int N>
+  class Tensor2_number_rhs_1;
+
+  template <class T, int Dim> class Tensor2_symmetric;
+  template<class A, class T, int Dim, char i, char j>
+  class Tensor2_symmetric_Expr;
+
+  template <class A, class T, int Dim0, int Dim1, int Dim2,
+    char i, char j, char k> class Tensor3_Expr;
+
+  template <class T, int Dim01, int Dim2> class Tensor3_dg;
+  template <class A, class T, int Dim01, int Dim2, char i, char j, char k>
+  class Tensor3_dg_Expr;
+  template<class A, class T, int N> class Tensor3_dg_number_rhs_0;
+  template<class A, class T, int N> class Tensor3_dg_number_rhs_2;
+  template<class A, class T, int N1, int N2> class Tensor3_dg_number_rhs_01;
+  template<class A, class T, int N1, int N2> class Tensor3_dg_number_rhs_12;
+
+  template <class T, int Dim0, int Dim12> class Tensor3_christof;
+  template <class A, class T, int Dim0, int Dim12, char i, char j, char k>
+  class Tensor3_christof_Expr;
+
+  template <class T, int Dim0, int Dim12> class Tensor3_antisymmetric;
+  template <class A, class T, int Dim0, int Dim12, char i, char j, char k>
+  class Tensor3_antisymmetric_Expr;
+
+  template <class A, class T, int Dim0, int Dim1, int Dim2, int Dim3,
+    char i, char j, char k, char l> class Tensor4_Expr;
+
+  template <class T, int Dim> class Tensor4_Riemann;
+  template <class A, class T, int Dim, char i, char j, char k, char l>
+  class Tensor4_Riemann_Expr;
+
+  template <class T, int Dim01, int Dim23> class Tensor4_ddg;
+  template <class A, class T, int Dim01, int Dim23,
+    char i, char j, char k, char l> class Tensor4_ddg_Expr;
+  template<class A, class T, int N0, int N1>
+  class Tensor4_ddg_number_rhs_01;
+  template<class A, class T, int N0>
+  class Tensor4_ddg_number_rhs_0;
+
+#include "Index.hpp"
+#include "Number.hpp"
+#include "promote.hpp"
+#include "Tensor0.hpp"
+#include "Tensor1.hpp"
+#include "Tensor2.hpp"
+#include "Tensor2_symmetric.hpp"
+#include "Tensor3/Tensor3_Expr.hpp"
+#include "Tensor3/Tensor3_contracted.hpp"
+#include "Tensor3_dg.hpp"
+#include "Tensor3_christof.hpp"
+#include "Tensor3_antisymmetric.hpp"
+#include "Tensor4/Tensor4_Expr.hpp"
+#include "Tensor4_ddg.hpp"
+#include "Tensor4_Riemann.hpp"
+}
diff -r dd991b426d75 -r 1042a48dad5a Index.h
--- a/Index.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-/* A simple index class that tells the operators which template to
-   instantiate.  The usual way to do this is to declare an index like
-
-   Index<'i',3> i;
-
-   It is important that each differently named index has a different
-   template parameter. So
-
-   Index<'i',3> i;
-   Index<'j',3> j;          // Good
-
-   is the right way, and
-
-   Index<'i',3> i,j;        // Bad
-
-   is likely to lead to errors, since the program thinks that i and j
-   are identical. */
-
-template<char i, int Dim>
-class Index
-{
-public:
-  Index() {};
-};
diff -r dd991b426d75 -r 1042a48dad5a Index.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Index.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,24 @@
+/* A simple index class that tells the operators which template to
+   instantiate.  The usual way to do this is to declare an index like
+
+   Index<'i',3> i;
+
+   It is important that each differently named index has a different
+   template parameter. So
+
+   Index<'i',3> i;
+   Index<'j',3> j;          // Good
+
+   is the right way, and
+
+   Index<'i',3> i,j;        // Bad
+
+   is likely to lead to errors, since the program thinks that i and j
+   are identical. */
+
+template<char i, int Dim>
+class Index
+{
+public:
+  Index() {};
+};
diff -r dd991b426d75 -r 1042a48dad5a Layout.h
--- a/Layout.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-/* A simple enum to select what kind of storage order you want.
-   Useful if you're mixing these classes with libraries with something
-   that has row-major (not C/C++ standard) ordering like Fortran or
-   some graphics libraries (Direct-X?). */
-
-enum Layout {
-  column_major,
-  row_major
-};
diff -r dd991b426d75 -r 1042a48dad5a Layout.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Layout.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,9 @@
+/* A simple enum to select what kind of storage order you want.
+   Useful if you're mixing these classes with libraries with something
+   that has row-major (not C/C++ standard) ordering like Fortran or
+   some graphics libraries (Direct-X?). */
+
+enum Layout {
+  column_major,
+  row_major
+};
diff -r dd991b426d75 -r 1042a48dad5a Number.h
--- a/Number.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-/* This index class allows you to explicitly use a part of a tensor.
-   If you want to explicitly list all of the indices, just use
-   int's. The usual way to do this is to declare a Number like
-   
-   Number<0> N; */
-
-template<const int N>
-class Number
-{
-public:
-  Number() {};
-  operator int() const
-  {
-    return N;
-  }
-};
diff -r dd991b426d75 -r 1042a48dad5a Number.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Number.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,16 @@
+/* This index class allows you to explicitly use a part of a tensor.
+   If you want to explicitly list all of the indices, just use
+   int's. The usual way to do this is to declare a Number like
+   
+   Number<0> N; */
+
+template<const int N>
+class Number
+{
+public:
+  Number() {};
+  operator int() const
+  {
+    return N;
+  }
+};
diff -r dd991b426d75 -r 1042a48dad5a README
--- a/README	Sun Dec 13 21:43:54 2009 -0800
+++ b/README	Mon Dec 14 00:52:50 2009 -0800
@@ -56,9 +56,9 @@ constructor like
 
   Tensor1<double,5> T1(0,1,2,3,4);
 
-You have to go in to FTensor_new/Tensor1/Tensor1_value.h and add it
+You have to go in to FTensor_new/Tensor1/Tensor1_value.hpp and add it
 in.  If you want to use it for pointers, you have to add it to
-FTensor_new/Tensor1/Tensor1_pointer.h.  You don't have to do this.
+FTensor_new/Tensor1/Tensor1_pointer.hpp.  You don't have to do this.
 You could instead just type
 
   Tensor1<double,5> T1;
diff -r dd991b426d75 -r 1042a48dad5a Tensor0.h
--- a/Tensor0.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-/* A Tensor0 class that really just ends up being an alias for a
-   pointer to a templated type T. Note that the T * is mutable, so the
-   pointer can change, allowing iterating over a array.  Also note
-   that diffusion and interpolate are included at the end of this
-   file, because it needs the full definition of Tensor0. */
-
-#include "Tensor0/dTensor0.h"
-#include "Tensor0/ddTensor0.h"
-#include "Tensor0/d_boundary_Tensor0.h"
-#include "Tensor0/dd_boundary_Tensor0.h"
-
-template <class T>
-class Tensor0
-{};
-
-template <class T>
-class Tensor0<T*>
-{
-  mutable T * restrict data;
-public:
-  Tensor0(T *d): data(d) {}
-
-  const Tensor0 & operator=(const Tensor0 &a)
-  {
-    *data=*(a.data);
-    return *this;
-  }
-
-  template<class U>
-  const Tensor0<T*> & operator=(const U &d)
-  {
-    *data=d;
-    return *this;
-  }
-  template<class U>
-  const Tensor0<T*> & operator+=(const U &d)
-  {
-    *data+=d;
-    return *this;
-  }
-  template<class U>
-  const Tensor0<T*> & operator-=(const U &d)
-  {
-    *data-=d;
-    return *this;
-  }
-  template<class U>
-  const Tensor0<T*> & operator*=(const U &d)
-  {
-    *data*=d;
-    return *this;
-  }
-  template<class U>
-  const Tensor0<T*> & operator/=(const U &d)
-  {
-    *data/=d;
-    return *this;
-  }
-
-  /* Note that the conversion operator& to T * only works on
-     consts, so it doesn't allow you to change the value of *data.
-     You have to use the = operators to change that.  The idea is that
-     operator& is only used for stencils and such.  */
-
-  const T * operator&() const
-  {
-    return data;
-  }
-  operator T() const
-  {
-    return *data;
-  }
-
-  /* The ++ operator increments the pointer, not the number that the
-     pointer points to.  This allows iterating over a grid. */
-
-  const Tensor0<T*> & operator++() const
-  {
-    ++data;
-    return *this;
-  }
-};
-
-#include "Tensor0/d_one_sided_Tensor0.h"
-#include "Tensor0/diffusion_Tensor0.h"
-#include "Tensor0/interpolate_Tensor0.h"
diff -r dd991b426d75 -r 1042a48dad5a Tensor0.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor0.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,86 @@
+/* A Tensor0 class that really just ends up being an alias for a
+   pointer to a templated type T. Note that the T * is mutable, so the
+   pointer can change, allowing iterating over a array.  Also note
+   that diffusion and interpolate are included at the end of this
+   file, because it needs the full definition of Tensor0. */
+
+#include "Tensor0/dTensor0.hpp"
+#include "Tensor0/ddTensor0.hpp"
+#include "Tensor0/d_boundary_Tensor0.hpp"
+#include "Tensor0/dd_boundary_Tensor0.hpp"
+
+template <class T>
+class Tensor0
+{};
+
+template <class T>
+class Tensor0<T*>
+{
+  mutable T * restrict data;
+public:
+  Tensor0(T *d): data(d) {}
+
+  const Tensor0 & operator=(const Tensor0 &a)
+  {
+    *data=*(a.data);
+    return *this;
+  }
+
+  template<class U>
+  const Tensor0<T*> & operator=(const U &d)
+  {
+    *data=d;
+    return *this;
+  }
+  template<class U>
+  const Tensor0<T*> & operator+=(const U &d)
+  {
+    *data+=d;
+    return *this;
+  }
+  template<class U>
+  const Tensor0<T*> & operator-=(const U &d)
+  {
+    *data-=d;
+    return *this;
+  }
+  template<class U>
+  const Tensor0<T*> & operator*=(const U &d)
+  {
+    *data*=d;
+    return *this;
+  }
+  template<class U>
+  const Tensor0<T*> & operator/=(const U &d)
+  {
+    *data/=d;
+    return *this;
+  }
+
+  /* Note that the conversion operator& to T * only works on
+     consts, so it doesn't allow you to change the value of *data.
+     You have to use the = operators to change that.  The idea is that
+     operator& is only used for stencils and such.  */
+
+  const T * operator&() const
+  {
+    return data;
+  }
+  operator T() const
+  {
+    return *data;
+  }
+
+  /* The ++ operator increments the pointer, not the number that the
+     pointer points to.  This allows iterating over a grid. */
+
+  const Tensor0<T*> & operator++() const
+  {
+    ++data;
+    return *this;
+  }
+};
+
+#include "Tensor0/d_one_sided_Tensor0.hpp"
+#include "Tensor0/diffusion_Tensor0.hpp"
+#include "Tensor0/interpolate_Tensor0.hpp"
diff -r dd991b426d75 -r 1042a48dad5a Tensor0/dTensor0.h
--- a/Tensor0/dTensor0.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-/* Takes a derivative of a Tensor0<T*> yielding a Tensor1. */
-
-template<class T, int Dim, char i>
-class dTensor0
-{
-  const Tensor0<T*> &a;
-  const Tensor1<int,Dim> &d_ijk;
-  const Tensor1<double,Dim> &d_xyz;
-public:
-  typename promote<T,double>::V operator()(const int N) const
-  {
-    return (*(&a+d_ijk(N))-*(&a-d_ijk(N)))*d_xyz(N)*0.5;
-  }
-  dTensor0(const Tensor0<T*> &A,
-	   const Tensor1<int,Dim> &D_ijk,
-	   const Tensor1<double,Dim> &D_xyz)
-    : a(A), d_ijk(D_ijk), d_xyz(D_xyz) {}
-};
-
-template<class T, int Dim, char i>
-inline const Tensor1_Expr<const dTensor0<T,Dim,i>,typename promote<T,double>::V,Dim,i>
-d(const Tensor0<T*> &a, const Index<i,Dim> index, 
-  const Tensor1<int,Dim> &d_ijk,
-  const Tensor1<double,Dim> &d_xyz)
-{
-  typedef const dTensor0<T,Dim,i> Tensor_Expr;
-  return Tensor1_Expr<Tensor_Expr,typename promote<T,double>::V,Dim,i>
-    (Tensor_Expr(a,d_ijk,d_xyz));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor0/dTensor0.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor0/dTensor0.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,29 @@
+/* Takes a derivative of a Tensor0<T*> yielding a Tensor1. */
+
+template<class T, int Dim, char i>
+class dTensor0
+{
+  const Tensor0<T*> &a;
+  const Tensor1<int,Dim> &d_ijk;
+  const Tensor1<double,Dim> &d_xyz;
+public:
+  typename promote<T,double>::V operator()(const int N) const
+  {
+    return (*(&a+d_ijk(N))-*(&a-d_ijk(N)))*d_xyz(N)*0.5;
+  }
+  dTensor0(const Tensor0<T*> &A,
+	   const Tensor1<int,Dim> &D_ijk,
+	   const Tensor1<double,Dim> &D_xyz)
+    : a(A), d_ijk(D_ijk), d_xyz(D_xyz) {}
+};
+
+template<class T, int Dim, char i>
+inline const Tensor1_Expr<const dTensor0<T,Dim,i>,typename promote<T,double>::V,Dim,i>
+d(const Tensor0<T*> &a, const Index<i,Dim> index, 
+  const Tensor1<int,Dim> &d_ijk,
+  const Tensor1<double,Dim> &d_xyz)
+{
+  typedef const dTensor0<T,Dim,i> Tensor_Expr;
+  return Tensor1_Expr<Tensor_Expr,typename promote<T,double>::V,Dim,i>
+    (Tensor_Expr(a,d_ijk,d_xyz));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor0/d_boundary_Tensor0.h
--- a/Tensor0/d_boundary_Tensor0.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-/* Takes a derivative of a Tensor0<T*> yielding a Tensor1.  It checks
-   whether we're at a boundary, and takes a one-sided derivative
-   there. */
-
-template<class T, int Dim, char i>
-class d_boundary_Tensor0
-{
-  const Tensor0<T*> &a;
-  const Tensor1<int,Dim> &d_ijk;
-  const Tensor1<double,Dim> &d_xyz;
-  const Tensor2<bool,Dim,2> &boundary;
-public:
-  typename promote<T,double>::V operator()(const int N) const
-  {
-    return boundary(N,0) ? (*(&a+d_ijk(N))-a)*d_xyz(N) :
-      (boundary(N,1) ? (a-*(&a-d_ijk(N)))*d_xyz(N) :
-       (*(&a+d_ijk(N))-*(&a-d_ijk(N)))*d_xyz(N)*0.5);
-  }
-  d_boundary_Tensor0(const Tensor0<T*> &A,
-		     const Tensor1<int,Dim> &D_ijk,
-		     const Tensor1<double,Dim> &D_xyz,
-		     const Tensor2<bool,Dim,2> &Boundary)
-    : a(A), d_ijk(D_ijk), d_xyz(D_xyz), boundary(Boundary) {}
-};
-
-template<class T, int Dim, char i>
-inline const Tensor1_Expr<const d_boundary_Tensor0<T,Dim,i>,typename promote<T,double>::V,Dim,i>
-d_boundary(const Tensor0<T*> &a, const Index<i,Dim> index, 
-	   const Tensor1<int,Dim> &d_ijk,
-	   const Tensor1<double,Dim> &d_xyz,
-	   const Tensor2<bool,Dim,2> &boundary)
-{
-  typedef const d_boundary_Tensor0<T,Dim,i> Tensor_Expr;
-  return Tensor1_Expr<Tensor_Expr,typename promote<T,double>::V,Dim,i>
-    (Tensor_Expr(a,d_ijk,d_xyz,boundary));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor0/d_boundary_Tensor0.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor0/d_boundary_Tensor0.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,36 @@
+/* Takes a derivative of a Tensor0<T*> yielding a Tensor1.  It checks
+   whether we're at a boundary, and takes a one-sided derivative
+   there. */
+
+template<class T, int Dim, char i>
+class d_boundary_Tensor0
+{
+  const Tensor0<T*> &a;
+  const Tensor1<int,Dim> &d_ijk;
+  const Tensor1<double,Dim> &d_xyz;
+  const Tensor2<bool,Dim,2> &boundary;
+public:
+  typename promote<T,double>::V operator()(const int N) const
+  {
+    return boundary(N,0) ? (*(&a+d_ijk(N))-a)*d_xyz(N) :
+      (boundary(N,1) ? (a-*(&a-d_ijk(N)))*d_xyz(N) :
+       (*(&a+d_ijk(N))-*(&a-d_ijk(N)))*d_xyz(N)*0.5);
+  }
+  d_boundary_Tensor0(const Tensor0<T*> &A,
+		     const Tensor1<int,Dim> &D_ijk,
+		     const Tensor1<double,Dim> &D_xyz,
+		     const Tensor2<bool,Dim,2> &Boundary)
+    : a(A), d_ijk(D_ijk), d_xyz(D_xyz), boundary(Boundary) {}
+};
+
+template<class T, int Dim, char i>
+inline const Tensor1_Expr<const d_boundary_Tensor0<T,Dim,i>,typename promote<T,double>::V,Dim,i>
+d_boundary(const Tensor0<T*> &a, const Index<i,Dim> index, 
+	   const Tensor1<int,Dim> &d_ijk,
+	   const Tensor1<double,Dim> &d_xyz,
+	   const Tensor2<bool,Dim,2> &boundary)
+{
+  typedef const d_boundary_Tensor0<T,Dim,i> Tensor_Expr;
+  return Tensor1_Expr<Tensor_Expr,typename promote<T,double>::V,Dim,i>
+    (Tensor_Expr(a,d_ijk,d_xyz,boundary));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor0/d_one_sided_Tensor0.h
--- a/Tensor0/d_one_sided_Tensor0.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/* Takes a one-sided derivative of a Tensor0 in a particular
-   direction, yielding a typename promote<T,double>::V. */
-
-template<class T>
-inline const typename promote<T,double>::V
-d_one_sided(const Tensor0<T*> &a, const Number<0> n1,
-		 const int &di, const int &dj, const int &dk,
-		 const double &dx, const double &dy,
-		 const double &dz)
-{
-  return (a-*(&a-di))*dx;
-}
-
-template<class T>
-inline const typename promote<T,double>::V
-d_one_sided(const Tensor0<T*> &a, const Number<1> n1,
-		 const int &di, const int &dj, const int &dk,
-		 const double &dx, const double &dy,
-		 const double &dz)
-{
-  return (a-*(&a-dj))*dy;
-}
-
-template<class T>
-inline const typename promote<T,double>::V
-d_one_sided(const Tensor0<T*> &a, const Number<2> n1,
-		 const int &di, const int &dj, const int &dk,
-		 const double &dx, const double &dy,
-		 const double &dz)
-{
-  return (a-*(&a-dk))*dz;
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor0/d_one_sided_Tensor0.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor0/d_one_sided_Tensor0.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,32 @@
+/* Takes a one-sided derivative of a Tensor0 in a particular
+   direction, yielding a typename promote<T,double>::V. */
+
+template<class T>
+inline const typename promote<T,double>::V
+d_one_sided(const Tensor0<T*> &a, const Number<0> n1,
+		 const int &di, const int &dj, const int &dk,
+		 const double &dx, const double &dy,
+		 const double &dz)
+{
+  return (a-*(&a-di))*dx;
+}
+
+template<class T>
+inline const typename promote<T,double>::V
+d_one_sided(const Tensor0<T*> &a, const Number<1> n1,
+		 const int &di, const int &dj, const int &dk,
+		 const double &dx, const double &dy,
+		 const double &dz)
+{
+  return (a-*(&a-dj))*dy;
+}
+
+template<class T>
+inline const typename promote<T,double>::V
+d_one_sided(const Tensor0<T*> &a, const Number<2> n1,
+		 const int &di, const int &dj, const int &dk,
+		 const double &dx, const double &dy,
+		 const double &dz)
+{
+  return (a-*(&a-dk))*dz;
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor0/ddTensor0.h
--- a/Tensor0/ddTensor0.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-/* Takes a second derivative of a Tensor0 yielding a Tensor2_symmetric. */
-
-template<class T, int Dim, char i, char j>
-class ddTensor0
-{
-  const Tensor0<T*> &a;
-  const Tensor1<int,Dim> &d_ijk;
-  const Tensor1<double,Dim> &d_xyz;
-public:
-  typename promote<T,double>::V operator()(const int N1, const int N2) const
-  {
-    return
-      N1==N2 ? (*(&a+d_ijk(N1))-2*a+*(&a-d_ijk(N1)))
-      *d_xyz(N1)*d_xyz(N1) :
-      (*(&a+d_ijk(N1)+d_ijk(N2)) - *(&a-d_ijk(N1)+d_ijk(N2))
-       - *(&a+d_ijk(N1)-d_ijk(N2)) + *(&a-d_ijk(N1)-d_ijk(N2)))
-      *d_xyz(N1)*d_xyz(N2)*0.25;
-  }
-  ddTensor0(const Tensor0<T*> &A,
-	    const Tensor1<int,Dim> &D_ijk,
-	    const Tensor1<double,Dim> &D_xyz)
-    : a(A), d_ijk(D_ijk), d_xyz(D_xyz) {}
-};
-
-template<class T, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr<const ddTensor0<T,Dim,i,j>,
-  typename promote<T,double>::V,Dim,i,j>
-dd(const Tensor0<T*> &a, const Index<i,Dim> index1, const Index<j,Dim> index2,
-   const Tensor1<int,Dim> &d_ijk, const Tensor1<double,Dim> &d_xyz)
-{
-  typedef const ddTensor0<T,Dim,i,j> Tensor_Expr;
-  return Tensor2_symmetric_Expr<Tensor_Expr,typename promote<T,double>::V,Dim,i,j>
-    (Tensor_Expr(a,d_ijk,d_xyz));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor0/ddTensor0.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor0/ddTensor0.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,35 @@
+/* Takes a second derivative of a Tensor0 yielding a Tensor2_symmetric. */
+
+template<class T, int Dim, char i, char j>
+class ddTensor0
+{
+  const Tensor0<T*> &a;
+  const Tensor1<int,Dim> &d_ijk;
+  const Tensor1<double,Dim> &d_xyz;
+public:
+  typename promote<T,double>::V operator()(const int N1, const int N2) const
+  {
+    return
+      N1==N2 ? (*(&a+d_ijk(N1))-2*a+*(&a-d_ijk(N1)))
+      *d_xyz(N1)*d_xyz(N1) :
+      (*(&a+d_ijk(N1)+d_ijk(N2)) - *(&a-d_ijk(N1)+d_ijk(N2))
+       - *(&a+d_ijk(N1)-d_ijk(N2)) + *(&a-d_ijk(N1)-d_ijk(N2)))
+      *d_xyz(N1)*d_xyz(N2)*0.25;
+  }
+  ddTensor0(const Tensor0<T*> &A,
+	    const Tensor1<int,Dim> &D_ijk,
+	    const Tensor1<double,Dim> &D_xyz)
+    : a(A), d_ijk(D_ijk), d_xyz(D_xyz) {}
+};
+
+template<class T, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr<const ddTensor0<T,Dim,i,j>,
+  typename promote<T,double>::V,Dim,i,j>
+dd(const Tensor0<T*> &a, const Index<i,Dim> index1, const Index<j,Dim> index2,
+   const Tensor1<int,Dim> &d_ijk, const Tensor1<double,Dim> &d_xyz)
+{
+  typedef const ddTensor0<T,Dim,i,j> Tensor_Expr;
+  return Tensor2_symmetric_Expr<Tensor_Expr,typename promote<T,double>::V,Dim,i,j>
+    (Tensor_Expr(a,d_ijk,d_xyz));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor0/dd_boundary_Tensor0.h
--- a/Tensor0/dd_boundary_Tensor0.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-/* Takes a second derivative of a Tensor0<T*> yielding a Tensor1.
-   This is primarily useful at boundaries, where you have to take
-   one-sided derivatives. */
-
-template<class T, int Dim, char i, char j>
-class dd_boundary_Tensor0
-{
-  const Tensor0<T*> &a;
-  const Tensor1<int,Dim> &d_ijk;
-  const Tensor1<double,Dim> &d_xyz;
-  const Tensor2<bool,Dim,2> &boundary;
-public:
-  typename promote<T,double>::V operator()(const int N1, const int N2) const
-  {
-    return N1==N2 ?
-      (boundary(N1,0) ?
-       (*(&a+2*d_ijk(N1))-2**(&a+d_ijk(N1))+a) :
-       (boundary(N1,1) ?
-	(a-2**(&a-d_ijk(N1))+*(&a-2*d_ijk(N1))):
-	(*(&a+d_ijk(N1))-2*a+*(&a-d_ijk(N1)))))
-       *d_xyz(N1)*d_xyz(N1) :
-      (boundary(N1,0) ?
-       (boundary(N2,0) ?
-	((*(&a+d_ijk(N1)+d_ijk(N2)) - *(&a+d_ijk(N2))
-	  - *(&a+d_ijk(N1)) + a)*d_xyz(N1)*d_xyz(N2)) :
-	(boundary(N2,1) ?
-	 ((*(&a+d_ijk(N1)) - a
-	   - *(&a+d_ijk(N1)-d_ijk(N2))
-	   + *(&a-d_ijk(N2)))*d_xyz(N1)*d_xyz(N2)) :
-	 (*(&a+d_ijk(N1)+d_ijk(N2))
-	  - *(&a+d_ijk(N2))
-	  - *(&a+d_ijk(N1)-d_ijk(N2))
-	  + *(&a-d_ijk(N2)))*d_xyz(N1)*d_xyz(N2)*0.5)) :
-       (boundary(N1,1) ?
-	(boundary(N2,0) ?
-	 ((*(&a+d_ijk(N2)) - *(&a-d_ijk(N1)+d_ijk(N2))
-	   - a + *(&a-d_ijk(N1)))*d_xyz(N1)*d_xyz(N2)) :
-	 (boundary(N2,1) ?
-	  ((a - *(&a-d_ijk(N1))
-	    - *(&a-d_ijk(N2))
-	    + *(&a-d_ijk(N1)-d_ijk(N2)))*d_xyz(N1)*d_xyz(N2)) :
-	  (*(&a+d_ijk(N2))
-	   - *(&a-d_ijk(N1)+d_ijk(N2))
-	   - *(&a-d_ijk(N2))
-	   + *(&a-d_ijk(N1)-d_ijk(N2)))*d_xyz(N1)*d_xyz(N2)*0.5)) :
-	(boundary(N2,0) ?
-	 ((*(&a+d_ijk(N1)+d_ijk(N2))
-	   - *(&a-d_ijk(N1)+d_ijk(N2))
-	   - *(&a+d_ijk(N1))
-	   + *(&a-d_ijk(N1)))*d_xyz(N1)*d_xyz(N2)*0.5) :
-	 (boundary(N2,1) ?
-	  ((*(&a+d_ijk(N1))
-	    - *(&a-d_ijk(N1))
-	    - *(&a+d_ijk(N1)-d_ijk(N2))
-	    + *(&a-d_ijk(N1)-d_ijk(N2)))*d_xyz(N1)*d_xyz(N2)*0.5) :
-	  ((*(&a+d_ijk(N1)+d_ijk(N2))
-	    - *(&a-d_ijk(N1)+d_ijk(N2))
-	    - *(&a+d_ijk(N1)-d_ijk(N2))
-	    + *(&a-d_ijk(N1)-d_ijk(N2)))*d_xyz(N1)*d_xyz(N2)*0.25)))));
-  }
-  dd_boundary_Tensor0(const Tensor0<T*> &A,
-		      const Tensor1<int,Dim> &D_ijk,
-		      const Tensor1<double,Dim> &D_xyz,
-		      const Tensor2<bool,Dim,2> &Boundary)
-    : a(A), d_ijk(D_ijk), d_xyz(D_xyz), boundary(Boundary) {}
-};
-
-template<class T, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr<const dd_boundary_Tensor0<T,Dim,i,j>,
-  typename promote<T,double>::V,Dim,i,j>
-dd_boundary(const Tensor0<T*> &a,
-	    const Index<i,Dim> index3, const Index<j,Dim> index4,
-	    const Tensor1<int,Dim> &d_ijk, const Tensor1<double,Dim> &d_xyz,
-	    const Tensor2<bool,Dim,2> &boundary)
-{
-  typedef const dd_boundary_Tensor0<T,Dim,i,j> Tensor_Expr;
-  return Tensor2_symmetric_Expr<Tensor_Expr,typename promote<T,double>::V,Dim,i,j>
-    (Tensor_Expr(a,d_ijk,d_xyz,boundary));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor0/dd_boundary_Tensor0.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor0/dd_boundary_Tensor0.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,79 @@
+/* Takes a second derivative of a Tensor0<T*> yielding a Tensor1.
+   This is primarily useful at boundaries, where you have to take
+   one-sided derivatives. */
+
+template<class T, int Dim, char i, char j>
+class dd_boundary_Tensor0
+{
+  const Tensor0<T*> &a;
+  const Tensor1<int,Dim> &d_ijk;
+  const Tensor1<double,Dim> &d_xyz;
+  const Tensor2<bool,Dim,2> &boundary;
+public:
+  typename promote<T,double>::V operator()(const int N1, const int N2) const
+  {
+    return N1==N2 ?
+      (boundary(N1,0) ?
+       (*(&a+2*d_ijk(N1))-2**(&a+d_ijk(N1))+a) :
+       (boundary(N1,1) ?
+	(a-2**(&a-d_ijk(N1))+*(&a-2*d_ijk(N1))):
+	(*(&a+d_ijk(N1))-2*a+*(&a-d_ijk(N1)))))
+       *d_xyz(N1)*d_xyz(N1) :
+      (boundary(N1,0) ?
+       (boundary(N2,0) ?
+	((*(&a+d_ijk(N1)+d_ijk(N2)) - *(&a+d_ijk(N2))
+	  - *(&a+d_ijk(N1)) + a)*d_xyz(N1)*d_xyz(N2)) :
+	(boundary(N2,1) ?
+	 ((*(&a+d_ijk(N1)) - a
+	   - *(&a+d_ijk(N1)-d_ijk(N2))
+	   + *(&a-d_ijk(N2)))*d_xyz(N1)*d_xyz(N2)) :
+	 (*(&a+d_ijk(N1)+d_ijk(N2))
+	  - *(&a+d_ijk(N2))
+	  - *(&a+d_ijk(N1)-d_ijk(N2))
+	  + *(&a-d_ijk(N2)))*d_xyz(N1)*d_xyz(N2)*0.5)) :
+       (boundary(N1,1) ?
+	(boundary(N2,0) ?
+	 ((*(&a+d_ijk(N2)) - *(&a-d_ijk(N1)+d_ijk(N2))
+	   - a + *(&a-d_ijk(N1)))*d_xyz(N1)*d_xyz(N2)) :
+	 (boundary(N2,1) ?
+	  ((a - *(&a-d_ijk(N1))
+	    - *(&a-d_ijk(N2))
+	    + *(&a-d_ijk(N1)-d_ijk(N2)))*d_xyz(N1)*d_xyz(N2)) :
+	  (*(&a+d_ijk(N2))
+	   - *(&a-d_ijk(N1)+d_ijk(N2))
+	   - *(&a-d_ijk(N2))
+	   + *(&a-d_ijk(N1)-d_ijk(N2)))*d_xyz(N1)*d_xyz(N2)*0.5)) :
+	(boundary(N2,0) ?
+	 ((*(&a+d_ijk(N1)+d_ijk(N2))
+	   - *(&a-d_ijk(N1)+d_ijk(N2))
+	   - *(&a+d_ijk(N1))
+	   + *(&a-d_ijk(N1)))*d_xyz(N1)*d_xyz(N2)*0.5) :
+	 (boundary(N2,1) ?
+	  ((*(&a+d_ijk(N1))
+	    - *(&a-d_ijk(N1))
+	    - *(&a+d_ijk(N1)-d_ijk(N2))
+	    + *(&a-d_ijk(N1)-d_ijk(N2)))*d_xyz(N1)*d_xyz(N2)*0.5) :
+	  ((*(&a+d_ijk(N1)+d_ijk(N2))
+	    - *(&a-d_ijk(N1)+d_ijk(N2))
+	    - *(&a+d_ijk(N1)-d_ijk(N2))
+	    + *(&a-d_ijk(N1)-d_ijk(N2)))*d_xyz(N1)*d_xyz(N2)*0.25)))));
+  }
+  dd_boundary_Tensor0(const Tensor0<T*> &A,
+		      const Tensor1<int,Dim> &D_ijk,
+		      const Tensor1<double,Dim> &D_xyz,
+		      const Tensor2<bool,Dim,2> &Boundary)
+    : a(A), d_ijk(D_ijk), d_xyz(D_xyz), boundary(Boundary) {}
+};
+
+template<class T, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr<const dd_boundary_Tensor0<T,Dim,i,j>,
+  typename promote<T,double>::V,Dim,i,j>
+dd_boundary(const Tensor0<T*> &a,
+	    const Index<i,Dim> index3, const Index<j,Dim> index4,
+	    const Tensor1<int,Dim> &d_ijk, const Tensor1<double,Dim> &d_xyz,
+	    const Tensor2<bool,Dim,2> &boundary)
+{
+  typedef const dd_boundary_Tensor0<T,Dim,i,j> Tensor_Expr;
+  return Tensor2_symmetric_Expr<Tensor_Expr,typename promote<T,double>::V,Dim,i,j>
+    (Tensor_Expr(a,d_ijk,d_xyz,boundary));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor0/diffusion_Tensor0.h
--- a/Tensor0/diffusion_Tensor0.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-/* Computes 2*del^2 of a Tensor0_ptr but uses diagonal derivatives for
-   half of it. */
-
-template<class T>
-inline const typename promote<T,double>::V
-diffusion(const Tensor0<T*> &a, const int &di, const int &dj,
-	  const int &dk, const double &dx)
-{
-  return 
-    ((*(&a+di) - 2*a + *(&a-di)) + (*(&a+dj) - 2*a + *(&a-dj))
-     + (*(&a+dk) - 2*a + *(&a-dk))
-     + ((*(&a+di+dj) + *(&a+di-dj) + *(&a-di+dj) + *(&a-di-dj) - 4*a)
-	+ (*(&a+di+dk) + *(&a+di-dk) + *(&a-di+dk) + *(&a-di-dk) - 4*a)
-	+ (*(&a+dj+dk) + *(&a+dj-dk) + *(&a-dj+dk) + *(&a-dj-dk) - 4*a))
-     /(std::sqrt(2.0)))*dx*dx;
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor0/diffusion_Tensor0.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor0/diffusion_Tensor0.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,16 @@
+/* Computes 2*del^2 of a Tensor0_ptr but uses diagonal derivatives for
+   half of it. */
+
+template<class T>
+inline const typename promote<T,double>::V
+diffusion(const Tensor0<T*> &a, const int &di, const int &dj,
+	  const int &dk, const double &dx)
+{
+  return 
+    ((*(&a+di) - 2*a + *(&a-di)) + (*(&a+dj) - 2*a + *(&a-dj))
+     + (*(&a+dk) - 2*a + *(&a-dk))
+     + ((*(&a+di+dj) + *(&a+di-dj) + *(&a-di+dj) + *(&a-di-dj) - 4*a)
+	+ (*(&a+di+dk) + *(&a+di-dk) + *(&a-di+dk) + *(&a-di-dk) - 4*a)
+	+ (*(&a+dj+dk) + *(&a+dj-dk) + *(&a-dj+dk) + *(&a-dj-dk) - 4*a))
+     /(std::sqrt(2.0)))*dx*dx;
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor0/interpolate_Tensor0.h
--- a/Tensor0/interpolate_Tensor0.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/* Interpolates to (i0+distance[0], j0+distance[1], k0+distance[2]),
-   yielding a double.  (i0,j0,k0) are 3D array coordinates,
-   conjugate==1-distance, and (di,dj,dk) are the stride of the array
-   coordinates.  It is assumed that the Tensor0_ptr is zero
-   centered. */
-
-template <class T>
-inline const typename promote<T,double>::V
-interpolate(const Tensor0<T*> &a, const int &di, const int &dj,
-	    const int &dk, const int &i0, const int &j0,
-	    const int &k0, const double distance[3],
-	    const double conjugate[3])
-{
-  return 
-    conjugate[0]*conjugate[1]*conjugate[2]
-    * (*(&a + di*i0 + dj*j0 + dk*k0))
-    + distance[0]*conjugate[1]*conjugate[2]
-    * (*(&a + di*(i0+1) + dj*(j0) + dk*(k0)))
-    + conjugate[0]*distance[1]*conjugate[2]
-    * (*(&a + di*(i0) + dj*(j0+1) + dk*(k0)))
-    + distance[0]*distance[1]*conjugate[2]
-    * (*(&a + di*(i0+1) + dj*(j0+1) + dk*(k0)))
-    + conjugate[0]*conjugate[1]*distance[2]
-    * (*(&a + di*(i0) + dj*(j0) + dk*(k0+1)))
-    + distance[0]*conjugate[1]*distance[2]
-    * (*(&a + di*(i0+1) + dj*(j0) + dk*(k0+1)))
-    + conjugate[0]*distance[1]*distance[2]
-    * (*(&a + di*(i0) + dj*(j0+1) + dk*(k0+1)))
-    + distance[0]*distance[1]*distance[2]
-    * (*(&a + di*(i0+1) + dj*(j0+1) + dk*(k0+1)));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor0/interpolate_Tensor0.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor0/interpolate_Tensor0.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,31 @@
+/* Interpolates to (i0+distance[0], j0+distance[1], k0+distance[2]),
+   yielding a double.  (i0,j0,k0) are 3D array coordinates,
+   conjugate==1-distance, and (di,dj,dk) are the stride of the array
+   coordinates.  It is assumed that the Tensor0_ptr is zero
+   centered. */
+
+template <class T>
+inline const typename promote<T,double>::V
+interpolate(const Tensor0<T*> &a, const int &di, const int &dj,
+	    const int &dk, const int &i0, const int &j0,
+	    const int &k0, const double distance[3],
+	    const double conjugate[3])
+{
+  return 
+    conjugate[0]*conjugate[1]*conjugate[2]
+    * (*(&a + di*i0 + dj*j0 + dk*k0))
+    + distance[0]*conjugate[1]*conjugate[2]
+    * (*(&a + di*(i0+1) + dj*(j0) + dk*(k0)))
+    + conjugate[0]*distance[1]*conjugate[2]
+    * (*(&a + di*(i0) + dj*(j0+1) + dk*(k0)))
+    + distance[0]*distance[1]*conjugate[2]
+    * (*(&a + di*(i0+1) + dj*(j0+1) + dk*(k0)))
+    + conjugate[0]*conjugate[1]*distance[2]
+    * (*(&a + di*(i0) + dj*(j0) + dk*(k0+1)))
+    + distance[0]*conjugate[1]*distance[2]
+    * (*(&a + di*(i0+1) + dj*(j0) + dk*(k0+1)))
+    + conjugate[0]*distance[1]*distance[2]
+    * (*(&a + di*(i0) + dj*(j0+1) + dk*(k0+1)))
+    + distance[0]*distance[1]*distance[2]
+    * (*(&a + di*(i0+1) + dj*(j0+1) + dk*(k0+1)));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1.h
--- a/Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-/* Declarations for Tensor1. */
-
-#include "Tensor1/Tensor1_constructor.h"
-#include "Tensor1/Tensor1_value.h"
-#include "Tensor1/Tensor1_pointer.h"
-
-#include "Tensor1/Tensor1_Expr.h"
diff -r dd991b426d75 -r 1042a48dad5a Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,7 @@
+/* Declarations for Tensor1. */
+
+#include "Tensor1/Tensor1_constructor.hpp"
+#include "Tensor1/Tensor1_value.hpp"
+#include "Tensor1/Tensor1_pointer.hpp"
+
+#include "Tensor1/Tensor1_Expr.hpp"
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_Expr.h
--- a/Tensor1/Tensor1_Expr.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,249 +0,0 @@
-/* Declares a wrapper class for rank 1 Tensor expressions. Note that
-   Tensor1_Expr_equals is included at the end, since it needs the
-   definition of the class in order to compile. */
-
-#include "Tensor1_plus_Tensor1.h"
-#include "Tensor1_minus_Tensor1.h"
-#include "Tensor1_times_Tensor1.h"
-#include "Tensor1_or_Tensor1.h"
-#include "Tensor1_carat_Tensor1.h"
-#include "Tensor1_and_Tensor1.h"
-#include "Tensor1_plus_generic.h"
-#include "Tensor1_minus_generic.h"
-#include "Tensor1_times_generic.h"
-#include "Tensor1_divide_generic.h"
-#include "generic_minus_Tensor1.h"
-#include "minus_Tensor1.h"
-#include "dTensor1.h"
-#include "ddTensor1.h"
-#include "d_one_sided_Tensor1.h"
-#include "diffusion_Tensor1.h"
-#include "interpolate_Tensor1.h"
-
-template<class A, class T, int Dim, char i>
-class Tensor1_Expr
-{
-  A iter;
-public:
-  Tensor1_Expr(A &a): iter(a) {}
-  T operator()(const int N) const
-  {
-    return iter(N);
-  }
-};
-
-template<class A, class T, int Tensor_Dim, int Dim, char i>
-class Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i>
-{
-  Tensor1<A,Tensor_Dim> &iter;
-public:
-  Tensor1_Expr(Tensor1<A,Tensor_Dim> &a): iter(a) {}
-
-  T & operator()(const int N)
-  {
-    return iter(N);
-  }
-  T operator()(const int N) const
-  {
-    return iter(N);
-  }
-
-  /* Various assignment operators.  I have to explicitly declare the
-     second operator= because otherwise the compiler will generate its
-     own and not use the template code. */
-
-  template<class B, class U>
-  inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
-  operator=(const Tensor1_Expr<B,U,Dim,i> &result);
-
-  const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
-  operator=(const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &result);
-
-  template<class B, class U> inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
-  operator+=(const Tensor1_Expr<B,U,Dim,i> &result);
-
-  template<class B, class U> inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
-  operator-=(const Tensor1_Expr<B,U,Dim,i> &result);
-
-  /* General template assignment operators intended mostly for
-     doubles (type T), but could be applied to anything you want, like
-     complex, etc.  All that is required is that T=B works (or T+=B,
-     etc.)  */
-
-  template<class B> inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
-  operator=(const B &d);
-  template<class B> inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
-  operator+=(const B &d);
-  template<class B> inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
-  operator-=(const B &d);
-  template<class B> inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
-  operator*=(const B &d);
-  template<class B> inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
-  operator/=(const B &d);
-};
-
-/* Specialized for Tensor2_number_rhs_0 (Tensor2{_symmetric} with the
-   first index explicitly given). */
-
-template<class A, class T, int Dim1, char i, int N>
-class Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i>
-{
-  A &iter;
-public:
-  Tensor1_Expr(A &a): iter(a) {}
-  T & operator()(const int N1)
-  {
-    return iter(N,N1);
-  }
-  T operator()(const int N1) const
-  {
-    return iter(N,N1);
-  }
-
-  /* Various assignment operators.  I have to explicitly declare the
-     second operator= because otherwise the compiler will generate its
-     own and not use the template code. */
-
-  template<class B, class U>
-  const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
-  operator=(const Tensor1_Expr<B,U,Dim1,i> &result);
-
-  const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> &
-  operator=(const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> &result);
-
-  template<class B> inline
-  const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
-  operator=(const B &result);
-
-  template<class B> inline
-  const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
-  operator+=(const B &result);
-
-  template<class B> inline
-  const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
-  operator-=(const B &result);
-
-  template<class B> inline
-  const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
-  operator*=(const B &result);
-
-  template<class B> inline
-  const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
-  operator/=(const B &result);
-};
-
-
-/* Specialized for Tensor2_number_rhs_1 (Tensor2{_symmetric} with the
-   second index explicitly given). */
-
-template<class A, class T, int Dim1, char i, int N>
-class Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i>
-{
-  A &iter;
-public:
-  Tensor1_Expr(A &a): iter(a) {}
-  T & operator()(const int N1)
-  {
-    return iter(N1,N);
-  }
-  T operator()(const int N1) const
-  {
-    return iter(N1,N);
-  }
-
-  /* Various assignment operators.  I have to explicitly declare the
-     second operator= because otherwise the compiler will generate its
-     own and not use the template code. */
-
-  template<class B, class U>
-  const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
-  operator=(const Tensor1_Expr<B,U,Dim1,i> &result);
-
-  const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> &
-  operator=(const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> &result);
-
-  template<class B> inline
-  const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
-  operator=(const B &result);
-
-  template<class B> inline
-  const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
-  operator+=(const B &result);
-
-  template<class B> inline
-  const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
-  operator-=(const B &result);
-
-  template<class B> inline
-  const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
-  operator*=(const B &result);
-
-  template<class B> inline
-  const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
-  operator/=(const B &result);
-};
-
-/* Specialized for Tensor3_dg_number_rhs_12 (A Tensor3_dg with
-   explicit numbers in the (first or second) and third slots). */
-
-template<class A, class T, int Dim, char i, int N1, int N2>
-class Tensor1_Expr<Tensor3_dg_number_rhs_12<A,T,N1,N2>,T,Dim,i>
-{
-  A &iter;
-public:
-  Tensor1_Expr(A &a):iter(a) {}
-  T & operator()(const int N)
-  {
-    return iter(N,N1,N2);
-  }
-  T operator()(const int N) const
-  {
-    return iter(N,N1,N2);
-  }
-
-  /* Various assignment operators.  I have to explicitly declare the
-     second operator= because otherwise the compiler will generate its
-     own and not use the template code. */
-
-  template<class B, class U>
-  const Tensor1_Expr<Tensor3_dg_number_rhs_12<A,T,N1,N2>,T,Dim,i> & 
-  operator=(const Tensor1_Expr<B,U,Dim,i> &result);
-
-  const Tensor1_Expr<Tensor3_dg_number_rhs_12<A,T,N1,N2>,T,Dim,i> &
-  operator=(const Tensor1_Expr<Tensor3_dg_number_rhs_12<A,T,N1,N2>,T,Dim,i>
-	    &result);
-};
-
-/* Specialized for Tensor3_dg_number_rhs_01 (A Tensor3_dg with
-   explicit numbers in the first and second slots). */
-
-template<class A, class T, int Dim, char i, int N1, int N2>
-class Tensor1_Expr<Tensor3_dg_number_rhs_01<A,T,N1,N2>,T,Dim,i>
-{
-  A &iter;
-public:
-  Tensor1_Expr(A &a):iter(a) {}
-  T & operator()(const int N)
-  {
-    return iter(N1,N2,N);
-  }
-  T operator()(const int N) const
-  {
-    return iter(N1,N2,N);
-  }
-
-  /* Various assignment operators.  I have to explicitly declare the
-     second operator= because otherwise the compiler will generate its
-     own and not use the template code. */
-
-  template<class B, class U>
-  const Tensor1_Expr<Tensor3_dg_number_rhs_01<A,T,N1,N2>,T,Dim,i> & 
-  operator=(const Tensor1_Expr<B,U,Dim,i> &result);
-
-  const Tensor1_Expr<Tensor3_dg_number_rhs_01<A,T,N1,N2>,T,Dim,i> &
-  operator=(const Tensor1_Expr<Tensor3_dg_number_rhs_01<A,T,N1,N2>,T,Dim,i>
-	    &result);
-};
-
-#include "Tensor1_Expr_equals.h"
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_Expr.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/Tensor1_Expr.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,249 @@
+/* Declares a wrapper class for rank 1 Tensor expressions. Note that
+   Tensor1_Expr_equals is included at the end, since it needs the
+   definition of the class in order to compile. */
+
+#include "Tensor1_plus_Tensor1.hpp"
+#include "Tensor1_minus_Tensor1.hpp"
+#include "Tensor1_times_Tensor1.hpp"
+#include "Tensor1_or_Tensor1.hpp"
+#include "Tensor1_carat_Tensor1.hpp"
+#include "Tensor1_and_Tensor1.hpp"
+#include "Tensor1_plus_generic.hpp"
+#include "Tensor1_minus_generic.hpp"
+#include "Tensor1_times_generic.hpp"
+#include "Tensor1_divide_generic.hpp"
+#include "generic_minus_Tensor1.hpp"
+#include "minus_Tensor1.hpp"
+#include "dTensor1.hpp"
+#include "ddTensor1.hpp"
+#include "d_one_sided_Tensor1.hpp"
+#include "diffusion_Tensor1.hpp"
+#include "interpolate_Tensor1.hpp"
+
+template<class A, class T, int Dim, char i>
+class Tensor1_Expr
+{
+  A iter;
+public:
+  Tensor1_Expr(A &a): iter(a) {}
+  T operator()(const int N) const
+  {
+    return iter(N);
+  }
+};
+
+template<class A, class T, int Tensor_Dim, int Dim, char i>
+class Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i>
+{
+  Tensor1<A,Tensor_Dim> &iter;
+public:
+  Tensor1_Expr(Tensor1<A,Tensor_Dim> &a): iter(a) {}
+
+  T & operator()(const int N)
+  {
+    return iter(N);
+  }
+  T operator()(const int N) const
+  {
+    return iter(N);
+  }
+
+  /* Various assignment operators.  I have to explicitly declare the
+     second operator= because otherwise the compiler will generate its
+     own and not use the template code. */
+
+  template<class B, class U>
+  inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
+  operator=(const Tensor1_Expr<B,U,Dim,i> &result);
+
+  const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
+  operator=(const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &result);
+
+  template<class B, class U> inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
+  operator+=(const Tensor1_Expr<B,U,Dim,i> &result);
+
+  template<class B, class U> inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
+  operator-=(const Tensor1_Expr<B,U,Dim,i> &result);
+
+  /* General template assignment operators intended mostly for
+     doubles (type T), but could be applied to anything you want, like
+     complex, etc.  All that is required is that T=B works (or T+=B,
+     etc.)  */
+
+  template<class B> inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
+  operator=(const B &d);
+  template<class B> inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
+  operator+=(const B &d);
+  template<class B> inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
+  operator-=(const B &d);
+  template<class B> inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
+  operator*=(const B &d);
+  template<class B> inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
+  operator/=(const B &d);
+};
+
+/* Specialized for Tensor2_number_rhs_0 (Tensor2{_symmetric} with the
+   first index explicitly given). */
+
+template<class A, class T, int Dim1, char i, int N>
+class Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i>
+{
+  A &iter;
+public:
+  Tensor1_Expr(A &a): iter(a) {}
+  T & operator()(const int N1)
+  {
+    return iter(N,N1);
+  }
+  T operator()(const int N1) const
+  {
+    return iter(N,N1);
+  }
+
+  /* Various assignment operators.  I have to explicitly declare the
+     second operator= because otherwise the compiler will generate its
+     own and not use the template code. */
+
+  template<class B, class U>
+  const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
+  operator=(const Tensor1_Expr<B,U,Dim1,i> &result);
+
+  const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> &
+  operator=(const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> &result);
+
+  template<class B> inline
+  const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
+  operator=(const B &result);
+
+  template<class B> inline
+  const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
+  operator+=(const B &result);
+
+  template<class B> inline
+  const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
+  operator-=(const B &result);
+
+  template<class B> inline
+  const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
+  operator*=(const B &result);
+
+  template<class B> inline
+  const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
+  operator/=(const B &result);
+};
+
+
+/* Specialized for Tensor2_number_rhs_1 (Tensor2{_symmetric} with the
+   second index explicitly given). */
+
+template<class A, class T, int Dim1, char i, int N>
+class Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i>
+{
+  A &iter;
+public:
+  Tensor1_Expr(A &a): iter(a) {}
+  T & operator()(const int N1)
+  {
+    return iter(N1,N);
+  }
+  T operator()(const int N1) const
+  {
+    return iter(N1,N);
+  }
+
+  /* Various assignment operators.  I have to explicitly declare the
+     second operator= because otherwise the compiler will generate its
+     own and not use the template code. */
+
+  template<class B, class U>
+  const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
+  operator=(const Tensor1_Expr<B,U,Dim1,i> &result);
+
+  const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> &
+  operator=(const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> &result);
+
+  template<class B> inline
+  const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
+  operator=(const B &result);
+
+  template<class B> inline
+  const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
+  operator+=(const B &result);
+
+  template<class B> inline
+  const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
+  operator-=(const B &result);
+
+  template<class B> inline
+  const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
+  operator*=(const B &result);
+
+  template<class B> inline
+  const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
+  operator/=(const B &result);
+};
+
+/* Specialized for Tensor3_dg_number_rhs_12 (A Tensor3_dg with
+   explicit numbers in the (first or second) and third slots). */
+
+template<class A, class T, int Dim, char i, int N1, int N2>
+class Tensor1_Expr<Tensor3_dg_number_rhs_12<A,T,N1,N2>,T,Dim,i>
+{
+  A &iter;
+public:
+  Tensor1_Expr(A &a):iter(a) {}
+  T & operator()(const int N)
+  {
+    return iter(N,N1,N2);
+  }
+  T operator()(const int N) const
+  {
+    return iter(N,N1,N2);
+  }
+
+  /* Various assignment operators.  I have to explicitly declare the
+     second operator= because otherwise the compiler will generate its
+     own and not use the template code. */
+
+  template<class B, class U>
+  const Tensor1_Expr<Tensor3_dg_number_rhs_12<A,T,N1,N2>,T,Dim,i> & 
+  operator=(const Tensor1_Expr<B,U,Dim,i> &result);
+
+  const Tensor1_Expr<Tensor3_dg_number_rhs_12<A,T,N1,N2>,T,Dim,i> &
+  operator=(const Tensor1_Expr<Tensor3_dg_number_rhs_12<A,T,N1,N2>,T,Dim,i>
+	    &result);
+};
+
+/* Specialized for Tensor3_dg_number_rhs_01 (A Tensor3_dg with
+   explicit numbers in the first and second slots). */
+
+template<class A, class T, int Dim, char i, int N1, int N2>
+class Tensor1_Expr<Tensor3_dg_number_rhs_01<A,T,N1,N2>,T,Dim,i>
+{
+  A &iter;
+public:
+  Tensor1_Expr(A &a):iter(a) {}
+  T & operator()(const int N)
+  {
+    return iter(N1,N2,N);
+  }
+  T operator()(const int N) const
+  {
+    return iter(N1,N2,N);
+  }
+
+  /* Various assignment operators.  I have to explicitly declare the
+     second operator= because otherwise the compiler will generate its
+     own and not use the template code. */
+
+  template<class B, class U>
+  const Tensor1_Expr<Tensor3_dg_number_rhs_01<A,T,N1,N2>,T,Dim,i> & 
+  operator=(const Tensor1_Expr<B,U,Dim,i> &result);
+
+  const Tensor1_Expr<Tensor3_dg_number_rhs_01<A,T,N1,N2>,T,Dim,i> &
+  operator=(const Tensor1_Expr<Tensor3_dg_number_rhs_01<A,T,N1,N2>,T,Dim,i>
+	    &result);
+};
+
+#include "Tensor1_Expr_equals.hpp"
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_Expr_equals.h
--- a/Tensor1/Tensor1_Expr_equals.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,647 +0,0 @@
-/* Various assignment operators for generic Tensor1_Expr's as well as
-   specializations for Tensor2_number_rhs's.  I have to explicitly
-   declare the second operator= because otherwise the compiler will
-   generate its own and not use the template code. */
-
-/* =T1_Expr */
-
-template<class A, class B, class U, int Dim, char i, int Current_Dim>
-inline void T1_equals_T1(A &iter, const Tensor1_Expr<B,U,Dim,i> result,
-			 const Number<Current_Dim> &N)
-{
-  iter(Current_Dim-1)=result(Current_Dim-1);
-  T1_equals_T1(iter,result,Number<Current_Dim-1>());
-}
-
-template<class A, class B, class U, int Dim, char i>
-inline void T1_equals_T1(A &iter, const Tensor1_Expr<B,U,Dim,i> result,
-			 const Number<1> &N)
-{
-  iter(0)=result(0);
-}
-
-template<class A, class T, int Tensor_Dim, int Dim, char i>
-template<class B, class U>
-inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
-Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i>::operator=(const Tensor1_Expr<B,U,Dim,i> &result)
-{
-  T1_equals_T1(iter,result,Number<Dim>());
-  return *this;
-}
-
-/* =T1_Expr(T1) */
-
-template<class A, class T, int Tensor_Dim, int Dim, char i>
-inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
-Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i>::operator=(const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &result)
-{
-  return operator=<Tensor1<A,Tensor_Dim>,T>(result);
-}
-
-/* +=T1 */
-
-template<class A, class B, class U, int Dim, char i, int Current_Dim>
-inline void T1_plus_equals_T1(A &iter, const Tensor1_Expr<B,U,Dim,i> result,
-			 const Number<Current_Dim> &N)
-{
-  iter(Current_Dim-1)+=result(Current_Dim-1);
-  T1_plus_equals_T1(iter,result,Number<Current_Dim-1>());
-}
-
-template<class A, class B, class U, int Dim, char i>
-inline void T1_plus_equals_T1(A &iter, const Tensor1_Expr<B,U,Dim,i> result,
-			 const Number<1> &N)
-{
-  iter(0)+=result(0);
-}
-
-template<class A, class T, int Tensor_Dim, int Dim, char i>
-template<class B, class U>
-inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
-Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i>::operator+=(const Tensor1_Expr<B,U,Dim,i> &result)
-{
-  T1_plus_equals_T1(iter,result,Number<Dim>());
-  return *this;
-}
-
-/* -=T1 */
-
-template<class A, class B, class U, int Dim, char i, int Current_Dim>
-inline void T1_minus_equals_T1(A &iter, const Tensor1_Expr<B,U,Dim,i> result,
-			 const Number<Current_Dim> &N)
-{
-  iter(Current_Dim-1)-=result(Current_Dim-1);
-  T1_minus_equals_T1(iter,result,Number<Current_Dim-1>());
-}
-
-template<class A, class B, class U, int Dim, char i>
-inline void T1_minus_equals_T1(A &iter, const Tensor1_Expr<B,U,Dim,i> result,
-			 const Number<1> &N)
-{
-  iter(0)-=result(0);
-}
-
-template<class A, class T, int Tensor_Dim, int Dim, char i>
-template<class B, class U>
-inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
-Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i>::operator-=(const Tensor1_Expr<B,U,Dim,i> &result)
-{
-  T1_minus_equals_T1(iter,result,Number<Dim>());
-  return *this;
-}
-
-/* General template assignment operators intended mostly for
-   doubles (type U), but could be applied to anything you want, like
-   complex, etc.  All that is required is that T=U works (or T+=U,
-   etc.)  */
-
-/* =U */
-
-template<class A, class U, int Current_Dim>
-inline void T1_equals_generic(A &iter, const U &u,
-			      const Number<Current_Dim> &N)
-{
-  iter(Current_Dim-1)=u;
-  T1_equals_generic(iter,u,Number<Current_Dim-1>());
-}
-
-template<class A, class U>
-inline void T1_equals_generic(A &iter, const U &u,
-			      const Number<1> &N)
-{
-  iter(0)=u;
-}
-
-template<class A, class T, int Tensor_Dim, int Dim, char i>
-template<class U>
-inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
-Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i>::operator=(const U &u)
-{
-  T1_equals_generic(iter,u,Number<Dim>());
-  return *this;
-}
-
-/* +=U */
-
-template<class A, class U, int Current_Dim>
-inline void T1_plus_equals_generic(A &iter, const U &u,
-				   const Number<Current_Dim> &N)
-{
-  iter(Current_Dim-1)+=u;
-  T1_plus_equals_generic(iter,u,Number<Current_Dim-1>());
-}
-
-template<class A, class U>
-inline void T1_plus_equals_generic(A &iter, const U &u,
-				   const Number<1> &N)
-{
-  iter(0)+=u;
-}
-
-template<class A, class T, int Tensor_Dim, int Dim, char i>
-template<class U>
-inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
-Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i>::operator+=(const U &u)
-{
-  T1_plus_equals_generic(iter,u,Number<Dim>());
-  return *this;
-}
-
-/* -=U */
-
-template<class A, class U, int Current_Dim>
-inline void T1_minus_equals_generic(A &iter, const U &u,
-				    const Number<Current_Dim> &N)
-{
-  iter(Current_Dim-1)-=u;
-  T1_minus_equals_generic(iter,u,Number<Current_Dim-1>());
-}
-
-template<class A, class U>
-inline void T1_minus_equals_generic(A &iter, const U &u,
-				    const Number<1> &N)
-{
-  iter(0)-=u;
-}
-
-template<class A, class T, int Tensor_Dim, int Dim, char i>
-template<class U>
-inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
-Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i>::operator-=(const U &u)
-{
-  T1_minus_equals_generic(iter,u,Number<Dim>());
-  return *this;
-}
-
-/* *=U */
-
-template<class A, class U, int Current_Dim>
-inline void T1_times_equals_generic(A &iter, const U &u,
-				    const Number<Current_Dim> &N)
-{
-  iter(Current_Dim-1)*=u;
-  T1_times_equals_generic(iter,u,Number<Current_Dim-1>());
-}
-
-template<class A, class U>
-inline void T1_times_equals_generic(A &iter, const U &u,
-				    const Number<1> &N)
-{
-  iter(0)*=u;
-}
-
-template<class A, class T, int Tensor_Dim, int Dim, char i>
-template<class U>
-inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
-Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i>::operator*=(const U &u)
-{
-  T1_times_equals_generic(iter,u,Number<Dim>());
-  return *this;
-}
-
-/* /=U */
-
-template<class A, class U, int Current_Dim>
-inline void T1_divide_equals_generic(A &iter, const U &u,
-				     const Number<Current_Dim> &N)
-{
-  iter(Current_Dim-1)/=u;
-  T1_divide_equals_generic(iter,u,Number<Current_Dim-1>());
-}
-
-template<class A, class U>
-inline void T1_divide_equals_generic(A &iter, const U &u,
-				     const Number<1> &N)
-{
-  iter(0)/=u;
-}
-
-template<class A, class T, int Tensor_Dim, int Dim, char i>
-template<class U>
-inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
-Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i>::operator/=(const U &u)
-{
-  T1_divide_equals_generic(iter,u,Number<Dim>());
-  return *this;
-}
-
-/* Specializations for Tensor2_number_rhs_0's */
-
-/* =T1 */
-
-template<class A, class B, class U, int Dim1, char i, int N, int Current_Dim>
-inline void T2rhs0_equals_T1(A &iter, const Tensor1_Expr<B,U,Dim1,i> &result,
-			     const Number<N> &N1,
-			     const Number<Current_Dim> &N2)
-{
-  iter(N,Current_Dim-1)=result(Current_Dim-1);
-  T2rhs0_equals_T1(iter,result,N1,Number<Current_Dim-1>());
-}
-
-template<class A, class B, class U, int Dim1, char i, int N>
-inline void T2rhs0_equals_T1(A &iter, const Tensor1_Expr<B,U,Dim1,i> &result,
-			     const Number<N> &N1,
-			     const Number<1> &N2)
-{
-  iter(N,0)=result(0);
-}
-
-template<class A, class T, int Dim1, char i, int N>
-template<class B, class U> inline
-const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
-Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i>::operator=(const Tensor1_Expr<B,U,Dim1,i> &result)
-{
-  T2rhs0_equals_T1(iter,result,Number<N>(),Number<Dim1>());
-  return *this;
-}
-
-template<class A, class T, int Dim1, char i, int N> inline
-const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> &
-Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i>::operator=(const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> &result)
-{
-  return operator=<Tensor2_number_rhs_0<A,T,N>,T>(result);
-}
-
-
-/* =U */
-
-template<class A, class U, int N, int Current_Dim>
-inline void T2rhs0_equals_generic(A &iter, const U &u, const Number<N> &N1,
-				  const Number<Current_Dim> &N2)
-{
-  iter(N,Current_Dim-1)=u;
-  T2rhs0_equals_generic(iter,u,N1,Number<Current_Dim-1>());
-}
-
-template<class A, class U, int N>
-inline void T2rhs0_equals_generic(A &iter, const U &u, const Number<N> &N1,
-				  const Number<1> &N2)
-{
-  iter(N,0)=u;
-}
-
-template<class A, class T, int Dim1, char i, int N>
-template<class U> inline
-const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
-Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i>::operator=(const U &u)
-{
-  T2rhs0_equals_generic(iter,u,Number<N>(),Number<Dim1>());
-  return *this;
-}
-
-/* +=U */
-
-template<class A, class U, int N, int Current_Dim>
-inline void T2rhs0_plus_equals_generic(A &iter, const U &u, const Number<N> &N1,
-				  const Number<Current_Dim> &N2)
-{
-  iter(N,Current_Dim-1)+=u;
-  T2rhs0_plus_equals_generic(iter,u,N1,Number<Current_Dim-1>());
-}
-
-template<class A, class U, int N>
-inline void T2rhs0_plus_equals_generic(A &iter, const U &u, const Number<N> &N1,
-				  const Number<1> &N2)
-{
-  iter(N,0)+=u;
-}
-
-template<class A, class T, int Dim1, char i, int N>
-template<class U> inline
-const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
-Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i>::operator+=(const U &u)
-{
-  T2rhs0_plus_equals_generic(iter,u,Number<N>(),Number<Dim1>());
-  return *this;
-}
-
-/* -=U */
-
-template<class A, class U, int N, int Current_Dim>
-inline void T2rhs0_minus_equals_generic(A &iter, const U &u, const Number<N> &N1,
-				  const Number<Current_Dim> &N2)
-{
-  iter(N,Current_Dim-1)-=u;
-  T2rhs0_minus_equals_generic(iter,u,N1,Number<Current_Dim-1>());
-}
-
-template<class A, class U, int N>
-inline void T2rhs0_minus_equals_generic(A &iter, const U &u, const Number<N> &N1,
-				  const Number<1> &N2)
-{
-  iter(N,0)-=u;
-}
-
-template<class A, class T, int Dim1, char i, int N>
-template<class U> inline
-const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
-Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i>::operator-=(const U &u)
-{
-  T2rhs0_minus_equals_generic(iter,u,Number<N>(),Number<Dim1>());
-  return *this;
-}
-
-/* *=U */
-
-template<class A, class U, int N, int Current_Dim>
-inline void T2rhs0_times_equals_generic(A &iter, const U &u, const Number<N> &N1,
-				  const Number<Current_Dim> &N2)
-{
-  iter(N,Current_Dim-1)*=u;
-  T2rhs0_times_equals_generic(iter,u,N1,Number<Current_Dim-1>());
-}
-
-template<class A, class U, int N>
-inline void T2rhs0_times_equals_generic(A &iter, const U &u, const Number<N> &N1,
-				  const Number<1> &N2)
-{
-  iter(N,0)*=u;
-}
-
-template<class A, class T, int Dim1, char i, int N>
-template<class U> inline
-const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
-Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i>::operator*=(const U &u)
-{
-  T2rhs0_times_equals_generic(iter,u,Number<N>(),Number<Dim1>());
-  return *this;
-}
-
-/* /=U */
-
-template<class A, class U, int N, int Current_Dim>
-inline void T2rhs0_divide_equals_generic(A &iter, const U &u, const Number<N> &N1,
-				  const Number<Current_Dim> &N2)
-{
-  iter(N,Current_Dim-1)/=u;
-  T2rhs0_divide_equals_generic(iter,u,N1,Number<Current_Dim-1>());
-}
-
-template<class A, class U, int N>
-inline void T2rhs0_divide_equals_generic(A &iter, const U &u, const Number<N> &N1,
-				  const Number<1> &N2)
-{
-  iter(N,0)/=u;
-}
-
-template<class A, class T, int Dim1, char i, int N>
-template<class U> inline
-const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
-Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i>::operator/=(const U &u)
-{
-  T2rhs0_divide_equals_generic(iter,u,Number<N>(),Number<Dim1>());
-  return *this;
-}
-
-/* Specializations for Tensor2_number_rhs_1's */
-
-/* =T1 */
-
-template<class A, class B, class U, int Dim1, char i, int N, int Current_Dim>
-inline void T2rhs1_equals_T1(A &iter, const Tensor1_Expr<B,U,Dim1,i> &result,
-			     const Number<N> &N1,
-			     const Number<Current_Dim> &N2)
-{
-  iter(Current_Dim-1,N)=result(Current_Dim-1);
-  T2rhs1_equals_T1(iter,result,N1,Number<Current_Dim-1>());
-}
-
-template<class A, class B, class U, int Dim1, char i, int N>
-inline void T2rhs1_equals_T1(A &iter, const Tensor1_Expr<B,U,Dim1,i> &result,
-			     const Number<N> &N1,
-			     const Number<1> &N2)
-{
-  iter(0,N)=result(0);
-}
-
-template<class A, class T, int Dim1, char i, int N>
-template<class B, class U> inline
-const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
-Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i>::operator=(const Tensor1_Expr<B,U,Dim1,i> &result)
-{
-  T2rhs1_equals_T1(iter,result,Number<N>(),Number<Dim1>());
-  return *this;
-}
-
-template<class A, class T, int Dim1, char i, int N> inline
-const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> &
-Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i>::operator=(const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> &result)
-{
-  return operator=<Tensor2_number_rhs_1<A,T,N>,T>(result);
-}
-
-/* =U */
-
-template<class A, class U, int N, int Current_Dim>
-inline void T2rhs1_equals_generic(A &iter, const U &u, const Number<N> &N1,
-				  const Number<Current_Dim> &N2)
-{
-  iter(Current_Dim-1,N)=u;
-  T2rhs1_equals_generic(iter,u,N1,Number<Current_Dim-1>());
-}
-
-template<class A, class U, int N>
-inline void T2rhs1_equals_generic(A &iter, const U &u, const Number<N> &N1,
-				  const Number<1> &N2)
-{
-  iter(0,N)=u;
-}
-
-template<class A, class T, int Dim1, char i, int N>
-template<class U> inline
-const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
-Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i>::operator=(const U &u)
-{
-  T2rhs1_equals_generic(iter,u,Number<N>(),Number<Dim1>());
-  return *this;
-}
-
-/* +=U */
-
-template<class A, class U, int N, int Current_Dim>
-inline void T2rhs1_plus_equals_generic(A &iter, const U &u, const Number<N> &N1,
-				  const Number<Current_Dim> &N2)
-{
-  iter(Current_Dim-1,N)+=u;
-  T2rhs1_plus_equals_generic(iter,u,N1,Number<Current_Dim-1>());
-}
-
-template<class A, class U, int N>
-inline void T2rhs1_plus_equals_generic(A &iter, const U &u, const Number<N> &N1,
-				  const Number<1> &N2)
-{
-  iter(0,N)+=u;
-}
-
-template<class A, class T, int Dim1, char i, int N>
-template<class U> inline
-const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
-Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i>::operator+=(const U &u)
-{
-  T2rhs1_plus_equals_generic(iter,u,Number<N>(),Number<Dim1>());
-  return *this;
-}
-
-/* -=U */
-
-template<class A, class U, int N, int Current_Dim>
-inline void T2rhs1_minus_equals_generic(A &iter, const U &u, const Number<N> &N1,
-				  const Number<Current_Dim> &N2)
-{
-  iter(Current_Dim-1,N)-=u;
-  T2rhs1_minus_equals_generic(iter,u,N1,Number<Current_Dim-1>());
-}
-
-template<class A, class U, int N>
-inline void T2rhs1_minus_equals_generic(A &iter, const U &u, const Number<N> &N1,
-				  const Number<1> &N2)
-{
-  iter(0,N)-=u;
-}
-
-template<class A, class T, int Dim1, char i, int N>
-template<class U> inline
-const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
-Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i>::operator-=(const U &u)
-{
-  T2rhs1_minus_equals_generic(iter,u,Number<N>(),Number<Dim1>());
-  return *this;
-}
-
-/* *=U */
-
-template<class A, class U, int N, int Current_Dim>
-inline void T2rhs1_times_equals_generic(A &iter, const U &u, const Number<N> &N1,
-				  const Number<Current_Dim> &N2)
-{
-  iter(Current_Dim-1,N)*=u;
-  T2rhs1_times_equals_generic(iter,u,N1,Number<Current_Dim-1>());
-}
-
-template<class A, class U, int N>
-inline void T2rhs1_times_equals_generic(A &iter, const U &u, const Number<N> &N1,
-				  const Number<1> &N2)
-{
-  iter(0,N)*=u;
-}
-
-template<class A, class T, int Dim1, char i, int N>
-template<class U> inline
-const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
-Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i>::operator*=(const U &u)
-{
-  T2rhs1_times_equals_generic(iter,u,Number<N>(),Number<Dim1>());
-  return *this;
-}
-
-/* /=U */
-
-template<class A, class U, int N, int Current_Dim>
-inline void T2rhs1_divide_equals_generic(A &iter, const U &u, const Number<N> &N1,
-				  const Number<Current_Dim> &N2)
-{
-  iter(Current_Dim-1,N)/=u;
-  T2rhs1_divide_equals_generic(iter,u,N1,Number<Current_Dim-1>());
-}
-
-template<class A, class U, int N>
-inline void T2rhs1_divide_equals_generic(A &iter, const U &u, const Number<N> &N1,
-				  const Number<1> &N2)
-{
-  iter(0,N)/=u;
-}
-
-template<class A, class T, int Dim1, char i, int N>
-template<class U> inline
-const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
-Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i>::operator/=(const U &u)
-{
-  T2rhs1_divide_equals_generic(iter,u,Number<N>(),Number<Dim1>());
-  return *this;
-}
-
-
-/* Specializations for Tensor3_dg_number_rhs_12's */
-
-template<class A, class B, class U, int Dim, char i, int N1, int N2, int Current_Dim>
-inline void T3dgrhs12_equals_T1(A &iter,
-				const Tensor1_Expr<B,U,Dim,i> &result,
-				const Number<N1> &NN1,
-				const Number<N2> &NN2,
-				const Number<Current_Dim> &ND)
-{
-  iter(Current_Dim-1,N1,N2)=result(Current_Dim-1);
-  T3dgrhs12_equals_T1(iter,result,NN1,NN2,Number<Current_Dim-1>());
-}
-
-template<class A, class B, class U, int Dim, char i, int N1, int N2>
-inline void T3dgrhs12_equals_T1(A &iter,
-				const Tensor1_Expr<B,U,Dim,i> &result,
-				const Number<N1> &NN1,
-				const Number<N2> &NN2,
-				const Number<1> &ND)
-{
-  iter(0,N1,N2)=result(0);
-}
-
-template<class A, class T, int Dim, char i, int N1, int N2>
-template<class B, class U> inline
-const Tensor1_Expr<Tensor3_dg_number_rhs_12<A,T,N1,N2>,T,Dim,i> & 
-Tensor1_Expr<Tensor3_dg_number_rhs_12<A,T,N1,N2>,T,Dim,i>
-::operator=(const Tensor1_Expr<B,U,Dim,i> &result)
-{
-  T3dgrhs12_equals_T1(iter,result,Number<N1>(),Number<N2>(),Number<Dim>());
-  return *this;
-}
-
-template<class A, class T, int Dim, char i, int N1, int N2> inline
-const Tensor1_Expr<Tensor3_dg_number_rhs_12<A,T,N1,N2>,T,Dim,i> &
-Tensor1_Expr<Tensor3_dg_number_rhs_12<A,T,N1,N2>,T,Dim,i>
-::operator=(const Tensor1_Expr<Tensor3_dg_number_rhs_12<A,T,N1,N2>,T,Dim,i>
-	    &result)
-{
-  return operator=<Tensor3_dg_number_rhs_12<A,T,N1,N2>,T>(result);
-}
-
-
-/* Specializations for Tensor3_dg_number_rhs_01's */
-
-template<class A, class B, class U, int Dim, char i, int N1, int N2, int Current_Dim>
-inline void T3dgrhs01_equals_T1(A &iter,
-				const Tensor1_Expr<B,U,Dim,i> &result,
-				const Number<N1> &NN1,
-				const Number<N2> &NN2,
-				const Number<Current_Dim> &ND)
-{
-  iter(N1,N2,Current_Dim-1)=result(Current_Dim-1);
-  T3dgrhs01_equals_T1(iter,result,NN1,NN2,Number<Current_Dim-1>());
-}
-
-template<class A, class B, class U, int Dim, char i, int N1, int N2>
-inline void T3dgrhs01_equals_T1(A &iter,
-				const Tensor1_Expr<B,U,Dim,i> &result,
-				const Number<N1> &NN1,
-				const Number<N2> &NN2,
-				const Number<1> &ND)
-{
-  iter(N1,N2,0)=result(0);
-}
-
-template<class A, class T, int Dim, char i, int N1, int N2>
-template<class B, class U> inline
-const Tensor1_Expr<Tensor3_dg_number_rhs_01<A,T,N1,N2>,T,Dim,i> & 
-Tensor1_Expr<Tensor3_dg_number_rhs_01<A,T,N1,N2>,T,Dim,i>
-::operator=(const Tensor1_Expr<B,U,Dim,i> &result)
-{
-  T3dgrhs01_equals_T1(iter,result,Number<N1>(),Number<N2>(),Number<Dim>());
-  return *this;
-}
-
-template<class A, class T, int Dim, char i, int N1, int N2> inline
-const Tensor1_Expr<Tensor3_dg_number_rhs_01<A,T,N1,N2>,T,Dim,i> &
-Tensor1_Expr<Tensor3_dg_number_rhs_01<A,T,N1,N2>,T,Dim,i>
-::operator=(const Tensor1_Expr<Tensor3_dg_number_rhs_01<A,T,N1,N2>,T,Dim,i>
-	    &result)
-{
-  return operator=<Tensor3_dg_number_rhs_01<A,T,N1,N2>,T>(result);
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_Expr_equals.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/Tensor1_Expr_equals.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,647 @@
+/* Various assignment operators for generic Tensor1_Expr's as well as
+   specializations for Tensor2_number_rhs's.  I have to explicitly
+   declare the second operator= because otherwise the compiler will
+   generate its own and not use the template code. */
+
+/* =T1_Expr */
+
+template<class A, class B, class U, int Dim, char i, int Current_Dim>
+inline void T1_equals_T1(A &iter, const Tensor1_Expr<B,U,Dim,i> result,
+			 const Number<Current_Dim> &N)
+{
+  iter(Current_Dim-1)=result(Current_Dim-1);
+  T1_equals_T1(iter,result,Number<Current_Dim-1>());
+}
+
+template<class A, class B, class U, int Dim, char i>
+inline void T1_equals_T1(A &iter, const Tensor1_Expr<B,U,Dim,i> result,
+			 const Number<1> &N)
+{
+  iter(0)=result(0);
+}
+
+template<class A, class T, int Tensor_Dim, int Dim, char i>
+template<class B, class U>
+inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
+Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i>::operator=(const Tensor1_Expr<B,U,Dim,i> &result)
+{
+  T1_equals_T1(iter,result,Number<Dim>());
+  return *this;
+}
+
+/* =T1_Expr(T1) */
+
+template<class A, class T, int Tensor_Dim, int Dim, char i>
+inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
+Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i>::operator=(const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &result)
+{
+  return operator=<Tensor1<A,Tensor_Dim>,T>(result);
+}
+
+/* +=T1 */
+
+template<class A, class B, class U, int Dim, char i, int Current_Dim>
+inline void T1_plus_equals_T1(A &iter, const Tensor1_Expr<B,U,Dim,i> result,
+			 const Number<Current_Dim> &N)
+{
+  iter(Current_Dim-1)+=result(Current_Dim-1);
+  T1_plus_equals_T1(iter,result,Number<Current_Dim-1>());
+}
+
+template<class A, class B, class U, int Dim, char i>
+inline void T1_plus_equals_T1(A &iter, const Tensor1_Expr<B,U,Dim,i> result,
+			 const Number<1> &N)
+{
+  iter(0)+=result(0);
+}
+
+template<class A, class T, int Tensor_Dim, int Dim, char i>
+template<class B, class U>
+inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
+Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i>::operator+=(const Tensor1_Expr<B,U,Dim,i> &result)
+{
+  T1_plus_equals_T1(iter,result,Number<Dim>());
+  return *this;
+}
+
+/* -=T1 */
+
+template<class A, class B, class U, int Dim, char i, int Current_Dim>
+inline void T1_minus_equals_T1(A &iter, const Tensor1_Expr<B,U,Dim,i> result,
+			 const Number<Current_Dim> &N)
+{
+  iter(Current_Dim-1)-=result(Current_Dim-1);
+  T1_minus_equals_T1(iter,result,Number<Current_Dim-1>());
+}
+
+template<class A, class B, class U, int Dim, char i>
+inline void T1_minus_equals_T1(A &iter, const Tensor1_Expr<B,U,Dim,i> result,
+			 const Number<1> &N)
+{
+  iter(0)-=result(0);
+}
+
+template<class A, class T, int Tensor_Dim, int Dim, char i>
+template<class B, class U>
+inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
+Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i>::operator-=(const Tensor1_Expr<B,U,Dim,i> &result)
+{
+  T1_minus_equals_T1(iter,result,Number<Dim>());
+  return *this;
+}
+
+/* General template assignment operators intended mostly for
+   doubles (type U), but could be applied to anything you want, like
+   complex, etc.  All that is required is that T=U works (or T+=U,
+   etc.)  */
+
+/* =U */
+
+template<class A, class U, int Current_Dim>
+inline void T1_equals_generic(A &iter, const U &u,
+			      const Number<Current_Dim> &N)
+{
+  iter(Current_Dim-1)=u;
+  T1_equals_generic(iter,u,Number<Current_Dim-1>());
+}
+
+template<class A, class U>
+inline void T1_equals_generic(A &iter, const U &u,
+			      const Number<1> &N)
+{
+  iter(0)=u;
+}
+
+template<class A, class T, int Tensor_Dim, int Dim, char i>
+template<class U>
+inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
+Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i>::operator=(const U &u)
+{
+  T1_equals_generic(iter,u,Number<Dim>());
+  return *this;
+}
+
+/* +=U */
+
+template<class A, class U, int Current_Dim>
+inline void T1_plus_equals_generic(A &iter, const U &u,
+				   const Number<Current_Dim> &N)
+{
+  iter(Current_Dim-1)+=u;
+  T1_plus_equals_generic(iter,u,Number<Current_Dim-1>());
+}
+
+template<class A, class U>
+inline void T1_plus_equals_generic(A &iter, const U &u,
+				   const Number<1> &N)
+{
+  iter(0)+=u;
+}
+
+template<class A, class T, int Tensor_Dim, int Dim, char i>
+template<class U>
+inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
+Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i>::operator+=(const U &u)
+{
+  T1_plus_equals_generic(iter,u,Number<Dim>());
+  return *this;
+}
+
+/* -=U */
+
+template<class A, class U, int Current_Dim>
+inline void T1_minus_equals_generic(A &iter, const U &u,
+				    const Number<Current_Dim> &N)
+{
+  iter(Current_Dim-1)-=u;
+  T1_minus_equals_generic(iter,u,Number<Current_Dim-1>());
+}
+
+template<class A, class U>
+inline void T1_minus_equals_generic(A &iter, const U &u,
+				    const Number<1> &N)
+{
+  iter(0)-=u;
+}
+
+template<class A, class T, int Tensor_Dim, int Dim, char i>
+template<class U>
+inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
+Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i>::operator-=(const U &u)
+{
+  T1_minus_equals_generic(iter,u,Number<Dim>());
+  return *this;
+}
+
+/* *=U */
+
+template<class A, class U, int Current_Dim>
+inline void T1_times_equals_generic(A &iter, const U &u,
+				    const Number<Current_Dim> &N)
+{
+  iter(Current_Dim-1)*=u;
+  T1_times_equals_generic(iter,u,Number<Current_Dim-1>());
+}
+
+template<class A, class U>
+inline void T1_times_equals_generic(A &iter, const U &u,
+				    const Number<1> &N)
+{
+  iter(0)*=u;
+}
+
+template<class A, class T, int Tensor_Dim, int Dim, char i>
+template<class U>
+inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
+Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i>::operator*=(const U &u)
+{
+  T1_times_equals_generic(iter,u,Number<Dim>());
+  return *this;
+}
+
+/* /=U */
+
+template<class A, class U, int Current_Dim>
+inline void T1_divide_equals_generic(A &iter, const U &u,
+				     const Number<Current_Dim> &N)
+{
+  iter(Current_Dim-1)/=u;
+  T1_divide_equals_generic(iter,u,Number<Current_Dim-1>());
+}
+
+template<class A, class U>
+inline void T1_divide_equals_generic(A &iter, const U &u,
+				     const Number<1> &N)
+{
+  iter(0)/=u;
+}
+
+template<class A, class T, int Tensor_Dim, int Dim, char i>
+template<class U>
+inline const Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i> &
+Tensor1_Expr<Tensor1<A,Tensor_Dim>,T,Dim,i>::operator/=(const U &u)
+{
+  T1_divide_equals_generic(iter,u,Number<Dim>());
+  return *this;
+}
+
+/* Specializations for Tensor2_number_rhs_0's */
+
+/* =T1 */
+
+template<class A, class B, class U, int Dim1, char i, int N, int Current_Dim>
+inline void T2rhs0_equals_T1(A &iter, const Tensor1_Expr<B,U,Dim1,i> &result,
+			     const Number<N> &N1,
+			     const Number<Current_Dim> &N2)
+{
+  iter(N,Current_Dim-1)=result(Current_Dim-1);
+  T2rhs0_equals_T1(iter,result,N1,Number<Current_Dim-1>());
+}
+
+template<class A, class B, class U, int Dim1, char i, int N>
+inline void T2rhs0_equals_T1(A &iter, const Tensor1_Expr<B,U,Dim1,i> &result,
+			     const Number<N> &N1,
+			     const Number<1> &N2)
+{
+  iter(N,0)=result(0);
+}
+
+template<class A, class T, int Dim1, char i, int N>
+template<class B, class U> inline
+const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
+Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i>::operator=(const Tensor1_Expr<B,U,Dim1,i> &result)
+{
+  T2rhs0_equals_T1(iter,result,Number<N>(),Number<Dim1>());
+  return *this;
+}
+
+template<class A, class T, int Dim1, char i, int N> inline
+const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> &
+Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i>::operator=(const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> &result)
+{
+  return operator=<Tensor2_number_rhs_0<A,T,N>,T>(result);
+}
+
+
+/* =U */
+
+template<class A, class U, int N, int Current_Dim>
+inline void T2rhs0_equals_generic(A &iter, const U &u, const Number<N> &N1,
+				  const Number<Current_Dim> &N2)
+{
+  iter(N,Current_Dim-1)=u;
+  T2rhs0_equals_generic(iter,u,N1,Number<Current_Dim-1>());
+}
+
+template<class A, class U, int N>
+inline void T2rhs0_equals_generic(A &iter, const U &u, const Number<N> &N1,
+				  const Number<1> &N2)
+{
+  iter(N,0)=u;
+}
+
+template<class A, class T, int Dim1, char i, int N>
+template<class U> inline
+const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
+Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i>::operator=(const U &u)
+{
+  T2rhs0_equals_generic(iter,u,Number<N>(),Number<Dim1>());
+  return *this;
+}
+
+/* +=U */
+
+template<class A, class U, int N, int Current_Dim>
+inline void T2rhs0_plus_equals_generic(A &iter, const U &u, const Number<N> &N1,
+				  const Number<Current_Dim> &N2)
+{
+  iter(N,Current_Dim-1)+=u;
+  T2rhs0_plus_equals_generic(iter,u,N1,Number<Current_Dim-1>());
+}
+
+template<class A, class U, int N>
+inline void T2rhs0_plus_equals_generic(A &iter, const U &u, const Number<N> &N1,
+				  const Number<1> &N2)
+{
+  iter(N,0)+=u;
+}
+
+template<class A, class T, int Dim1, char i, int N>
+template<class U> inline
+const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
+Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i>::operator+=(const U &u)
+{
+  T2rhs0_plus_equals_generic(iter,u,Number<N>(),Number<Dim1>());
+  return *this;
+}
+
+/* -=U */
+
+template<class A, class U, int N, int Current_Dim>
+inline void T2rhs0_minus_equals_generic(A &iter, const U &u, const Number<N> &N1,
+				  const Number<Current_Dim> &N2)
+{
+  iter(N,Current_Dim-1)-=u;
+  T2rhs0_minus_equals_generic(iter,u,N1,Number<Current_Dim-1>());
+}
+
+template<class A, class U, int N>
+inline void T2rhs0_minus_equals_generic(A &iter, const U &u, const Number<N> &N1,
+				  const Number<1> &N2)
+{
+  iter(N,0)-=u;
+}
+
+template<class A, class T, int Dim1, char i, int N>
+template<class U> inline
+const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
+Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i>::operator-=(const U &u)
+{
+  T2rhs0_minus_equals_generic(iter,u,Number<N>(),Number<Dim1>());
+  return *this;
+}
+
+/* *=U */
+
+template<class A, class U, int N, int Current_Dim>
+inline void T2rhs0_times_equals_generic(A &iter, const U &u, const Number<N> &N1,
+				  const Number<Current_Dim> &N2)
+{
+  iter(N,Current_Dim-1)*=u;
+  T2rhs0_times_equals_generic(iter,u,N1,Number<Current_Dim-1>());
+}
+
+template<class A, class U, int N>
+inline void T2rhs0_times_equals_generic(A &iter, const U &u, const Number<N> &N1,
+				  const Number<1> &N2)
+{
+  iter(N,0)*=u;
+}
+
+template<class A, class T, int Dim1, char i, int N>
+template<class U> inline
+const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
+Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i>::operator*=(const U &u)
+{
+  T2rhs0_times_equals_generic(iter,u,Number<N>(),Number<Dim1>());
+  return *this;
+}
+
+/* /=U */
+
+template<class A, class U, int N, int Current_Dim>
+inline void T2rhs0_divide_equals_generic(A &iter, const U &u, const Number<N> &N1,
+				  const Number<Current_Dim> &N2)
+{
+  iter(N,Current_Dim-1)/=u;
+  T2rhs0_divide_equals_generic(iter,u,N1,Number<Current_Dim-1>());
+}
+
+template<class A, class U, int N>
+inline void T2rhs0_divide_equals_generic(A &iter, const U &u, const Number<N> &N1,
+				  const Number<1> &N2)
+{
+  iter(N,0)/=u;
+}
+
+template<class A, class T, int Dim1, char i, int N>
+template<class U> inline
+const Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i> & 
+Tensor1_Expr<Tensor2_number_rhs_0<A,T,N>,T,Dim1,i>::operator/=(const U &u)
+{
+  T2rhs0_divide_equals_generic(iter,u,Number<N>(),Number<Dim1>());
+  return *this;
+}
+
+/* Specializations for Tensor2_number_rhs_1's */
+
+/* =T1 */
+
+template<class A, class B, class U, int Dim1, char i, int N, int Current_Dim>
+inline void T2rhs1_equals_T1(A &iter, const Tensor1_Expr<B,U,Dim1,i> &result,
+			     const Number<N> &N1,
+			     const Number<Current_Dim> &N2)
+{
+  iter(Current_Dim-1,N)=result(Current_Dim-1);
+  T2rhs1_equals_T1(iter,result,N1,Number<Current_Dim-1>());
+}
+
+template<class A, class B, class U, int Dim1, char i, int N>
+inline void T2rhs1_equals_T1(A &iter, const Tensor1_Expr<B,U,Dim1,i> &result,
+			     const Number<N> &N1,
+			     const Number<1> &N2)
+{
+  iter(0,N)=result(0);
+}
+
+template<class A, class T, int Dim1, char i, int N>
+template<class B, class U> inline
+const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
+Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i>::operator=(const Tensor1_Expr<B,U,Dim1,i> &result)
+{
+  T2rhs1_equals_T1(iter,result,Number<N>(),Number<Dim1>());
+  return *this;
+}
+
+template<class A, class T, int Dim1, char i, int N> inline
+const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> &
+Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i>::operator=(const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> &result)
+{
+  return operator=<Tensor2_number_rhs_1<A,T,N>,T>(result);
+}
+
+/* =U */
+
+template<class A, class U, int N, int Current_Dim>
+inline void T2rhs1_equals_generic(A &iter, const U &u, const Number<N> &N1,
+				  const Number<Current_Dim> &N2)
+{
+  iter(Current_Dim-1,N)=u;
+  T2rhs1_equals_generic(iter,u,N1,Number<Current_Dim-1>());
+}
+
+template<class A, class U, int N>
+inline void T2rhs1_equals_generic(A &iter, const U &u, const Number<N> &N1,
+				  const Number<1> &N2)
+{
+  iter(0,N)=u;
+}
+
+template<class A, class T, int Dim1, char i, int N>
+template<class U> inline
+const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
+Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i>::operator=(const U &u)
+{
+  T2rhs1_equals_generic(iter,u,Number<N>(),Number<Dim1>());
+  return *this;
+}
+
+/* +=U */
+
+template<class A, class U, int N, int Current_Dim>
+inline void T2rhs1_plus_equals_generic(A &iter, const U &u, const Number<N> &N1,
+				  const Number<Current_Dim> &N2)
+{
+  iter(Current_Dim-1,N)+=u;
+  T2rhs1_plus_equals_generic(iter,u,N1,Number<Current_Dim-1>());
+}
+
+template<class A, class U, int N>
+inline void T2rhs1_plus_equals_generic(A &iter, const U &u, const Number<N> &N1,
+				  const Number<1> &N2)
+{
+  iter(0,N)+=u;
+}
+
+template<class A, class T, int Dim1, char i, int N>
+template<class U> inline
+const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
+Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i>::operator+=(const U &u)
+{
+  T2rhs1_plus_equals_generic(iter,u,Number<N>(),Number<Dim1>());
+  return *this;
+}
+
+/* -=U */
+
+template<class A, class U, int N, int Current_Dim>
+inline void T2rhs1_minus_equals_generic(A &iter, const U &u, const Number<N> &N1,
+				  const Number<Current_Dim> &N2)
+{
+  iter(Current_Dim-1,N)-=u;
+  T2rhs1_minus_equals_generic(iter,u,N1,Number<Current_Dim-1>());
+}
+
+template<class A, class U, int N>
+inline void T2rhs1_minus_equals_generic(A &iter, const U &u, const Number<N> &N1,
+				  const Number<1> &N2)
+{
+  iter(0,N)-=u;
+}
+
+template<class A, class T, int Dim1, char i, int N>
+template<class U> inline
+const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
+Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i>::operator-=(const U &u)
+{
+  T2rhs1_minus_equals_generic(iter,u,Number<N>(),Number<Dim1>());
+  return *this;
+}
+
+/* *=U */
+
+template<class A, class U, int N, int Current_Dim>
+inline void T2rhs1_times_equals_generic(A &iter, const U &u, const Number<N> &N1,
+				  const Number<Current_Dim> &N2)
+{
+  iter(Current_Dim-1,N)*=u;
+  T2rhs1_times_equals_generic(iter,u,N1,Number<Current_Dim-1>());
+}
+
+template<class A, class U, int N>
+inline void T2rhs1_times_equals_generic(A &iter, const U &u, const Number<N> &N1,
+				  const Number<1> &N2)
+{
+  iter(0,N)*=u;
+}
+
+template<class A, class T, int Dim1, char i, int N>
+template<class U> inline
+const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
+Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i>::operator*=(const U &u)
+{
+  T2rhs1_times_equals_generic(iter,u,Number<N>(),Number<Dim1>());
+  return *this;
+}
+
+/* /=U */
+
+template<class A, class U, int N, int Current_Dim>
+inline void T2rhs1_divide_equals_generic(A &iter, const U &u, const Number<N> &N1,
+				  const Number<Current_Dim> &N2)
+{
+  iter(Current_Dim-1,N)/=u;
+  T2rhs1_divide_equals_generic(iter,u,N1,Number<Current_Dim-1>());
+}
+
+template<class A, class U, int N>
+inline void T2rhs1_divide_equals_generic(A &iter, const U &u, const Number<N> &N1,
+				  const Number<1> &N2)
+{
+  iter(0,N)/=u;
+}
+
+template<class A, class T, int Dim1, char i, int N>
+template<class U> inline
+const Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i> & 
+Tensor1_Expr<Tensor2_number_rhs_1<A,T,N>,T,Dim1,i>::operator/=(const U &u)
+{
+  T2rhs1_divide_equals_generic(iter,u,Number<N>(),Number<Dim1>());
+  return *this;
+}
+
+
+/* Specializations for Tensor3_dg_number_rhs_12's */
+
+template<class A, class B, class U, int Dim, char i, int N1, int N2, int Current_Dim>
+inline void T3dgrhs12_equals_T1(A &iter,
+				const Tensor1_Expr<B,U,Dim,i> &result,
+				const Number<N1> &NN1,
+				const Number<N2> &NN2,
+				const Number<Current_Dim> &ND)
+{
+  iter(Current_Dim-1,N1,N2)=result(Current_Dim-1);
+  T3dgrhs12_equals_T1(iter,result,NN1,NN2,Number<Current_Dim-1>());
+}
+
+template<class A, class B, class U, int Dim, char i, int N1, int N2>
+inline void T3dgrhs12_equals_T1(A &iter,
+				const Tensor1_Expr<B,U,Dim,i> &result,
+				const Number<N1> &NN1,
+				const Number<N2> &NN2,
+				const Number<1> &ND)
+{
+  iter(0,N1,N2)=result(0);
+}
+
+template<class A, class T, int Dim, char i, int N1, int N2>
+template<class B, class U> inline
+const Tensor1_Expr<Tensor3_dg_number_rhs_12<A,T,N1,N2>,T,Dim,i> & 
+Tensor1_Expr<Tensor3_dg_number_rhs_12<A,T,N1,N2>,T,Dim,i>
+::operator=(const Tensor1_Expr<B,U,Dim,i> &result)
+{
+  T3dgrhs12_equals_T1(iter,result,Number<N1>(),Number<N2>(),Number<Dim>());
+  return *this;
+}
+
+template<class A, class T, int Dim, char i, int N1, int N2> inline
+const Tensor1_Expr<Tensor3_dg_number_rhs_12<A,T,N1,N2>,T,Dim,i> &
+Tensor1_Expr<Tensor3_dg_number_rhs_12<A,T,N1,N2>,T,Dim,i>
+::operator=(const Tensor1_Expr<Tensor3_dg_number_rhs_12<A,T,N1,N2>,T,Dim,i>
+	    &result)
+{
+  return operator=<Tensor3_dg_number_rhs_12<A,T,N1,N2>,T>(result);
+}
+
+
+/* Specializations for Tensor3_dg_number_rhs_01's */
+
+template<class A, class B, class U, int Dim, char i, int N1, int N2, int Current_Dim>
+inline void T3dgrhs01_equals_T1(A &iter,
+				const Tensor1_Expr<B,U,Dim,i> &result,
+				const Number<N1> &NN1,
+				const Number<N2> &NN2,
+				const Number<Current_Dim> &ND)
+{
+  iter(N1,N2,Current_Dim-1)=result(Current_Dim-1);
+  T3dgrhs01_equals_T1(iter,result,NN1,NN2,Number<Current_Dim-1>());
+}
+
+template<class A, class B, class U, int Dim, char i, int N1, int N2>
+inline void T3dgrhs01_equals_T1(A &iter,
+				const Tensor1_Expr<B,U,Dim,i> &result,
+				const Number<N1> &NN1,
+				const Number<N2> &NN2,
+				const Number<1> &ND)
+{
+  iter(N1,N2,0)=result(0);
+}
+
+template<class A, class T, int Dim, char i, int N1, int N2>
+template<class B, class U> inline
+const Tensor1_Expr<Tensor3_dg_number_rhs_01<A,T,N1,N2>,T,Dim,i> & 
+Tensor1_Expr<Tensor3_dg_number_rhs_01<A,T,N1,N2>,T,Dim,i>
+::operator=(const Tensor1_Expr<B,U,Dim,i> &result)
+{
+  T3dgrhs01_equals_T1(iter,result,Number<N1>(),Number<N2>(),Number<Dim>());
+  return *this;
+}
+
+template<class A, class T, int Dim, char i, int N1, int N2> inline
+const Tensor1_Expr<Tensor3_dg_number_rhs_01<A,T,N1,N2>,T,Dim,i> &
+Tensor1_Expr<Tensor3_dg_number_rhs_01<A,T,N1,N2>,T,Dim,i>
+::operator=(const Tensor1_Expr<Tensor3_dg_number_rhs_01<A,T,N1,N2>,T,Dim,i>
+	    &result)
+{
+  return operator=<Tensor3_dg_number_rhs_01<A,T,N1,N2>,T>(result);
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_and_Tensor1.h
--- a/Tensor1/Tensor1_and_Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-/* Multiply two Tensor1's together but don't contract, yielding a
-   Tensor1. */
-
-template<class A, class B, class T, class U, int Dim, char i>
-class Tensor1_and_Tensor1
-{
-  const Tensor1_Expr<A,T,Dim,i> iterA;
-  const Tensor1_Expr<B,U,Dim,i> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N) const
-  {
-    return iterA(N)*iterB(N);
-  }
-
-  Tensor1_and_Tensor1(const Tensor1_Expr<A,T,Dim,i> &a,
-		      const Tensor1_Expr<B,U,Dim,i> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i>
-inline const Tensor1_Expr<const Tensor1_and_Tensor1<A,B,T,U,Dim,i>,
-  typename promote<T,U>::V,Dim,i>
-operator&(const Tensor1_Expr<A,T,Dim,i> &a, const Tensor1_Expr<B,U,Dim,i> &b)
-{
-  typedef const Tensor1_and_Tensor1<A,B,T,U,Dim,i> TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_and_Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/Tensor1_and_Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,27 @@
+/* Multiply two Tensor1's together but don't contract, yielding a
+   Tensor1. */
+
+template<class A, class B, class T, class U, int Dim, char i>
+class Tensor1_and_Tensor1
+{
+  const Tensor1_Expr<A,T,Dim,i> iterA;
+  const Tensor1_Expr<B,U,Dim,i> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N) const
+  {
+    return iterA(N)*iterB(N);
+  }
+
+  Tensor1_and_Tensor1(const Tensor1_Expr<A,T,Dim,i> &a,
+		      const Tensor1_Expr<B,U,Dim,i> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i>
+inline const Tensor1_Expr<const Tensor1_and_Tensor1<A,B,T,U,Dim,i>,
+  typename promote<T,U>::V,Dim,i>
+operator&(const Tensor1_Expr<A,T,Dim,i> &a, const Tensor1_Expr<B,U,Dim,i> &b)
+{
+  typedef const Tensor1_and_Tensor1<A,B,T,U,Dim,i> TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_carat_Tensor1.h
--- a/Tensor1/Tensor1_carat_Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-/* Multiplies two Tensor1's together yielding a Tensor2_symmetric. */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-class Tensor1_carat_Tensor1
-{
-  const Tensor1_Expr<A,T,Dim,i> iterA;
-  const Tensor1_Expr<B,U,Dim,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1)*iterB(N2);
-  }
-
-  Tensor1_carat_Tensor1(const Tensor1_Expr<A,T,Dim,i> &a,
-			const Tensor1_Expr<B,U,Dim,j> &b)
-    : iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr<const Tensor1_carat_Tensor1<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,i,j>
-operator^(const Tensor1_Expr<A,T,Dim,i> &a, const Tensor1_Expr<B,U,Dim,j> &b)
-{
-  typedef const Tensor1_carat_Tensor1<A,B,T,U,Dim,i,j> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_carat_Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/Tensor1_carat_Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,27 @@
+/* Multiplies two Tensor1's together yielding a Tensor2_symmetric. */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+class Tensor1_carat_Tensor1
+{
+  const Tensor1_Expr<A,T,Dim,i> iterA;
+  const Tensor1_Expr<B,U,Dim,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1)*iterB(N2);
+  }
+
+  Tensor1_carat_Tensor1(const Tensor1_Expr<A,T,Dim,i> &a,
+			const Tensor1_Expr<B,U,Dim,j> &b)
+    : iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr<const Tensor1_carat_Tensor1<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,i,j>
+operator^(const Tensor1_Expr<A,T,Dim,i> &a, const Tensor1_Expr<B,U,Dim,j> &b)
+{
+  typedef const Tensor1_carat_Tensor1<A,B,T,U,Dim,i,j> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_constructor.h
--- a/Tensor1/Tensor1_constructor.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-/* A helper class that allows simple initialization of the Tensor1,
-   but only if it has the correct number of elements. */
-
-template<class T, int Tensor_Dim>
-class Tensor1_constructor;
-
-template<class T>
-class Tensor1_constructor<T,2>
-{
-public:
-  Tensor1_constructor(T data[], T d0, T d1)
-  {
-    data[0]=d0;
-    data[1]=d1;
-  }
-};
-
-template<class T>
-class Tensor1_constructor<T,3>
-{
-public:
-  Tensor1_constructor(T data[], T d0, T d1, T d2)
-  {
-    data[0]=d0;
-    data[1]=d1;
-    data[2]=d2;
-  }
-};
-
-template<class T>
-class Tensor1_constructor<T,4>
-{
-public:
-  Tensor1_constructor(T data[], T d0, T d1, T d2, T d3)
-  {
-    data[0]=d0;
-    data[1]=d1;
-    data[2]=d2;
-    data[3]=d3;
-  }
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_constructor.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/Tensor1_constructor.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,41 @@
+/* A helper class that allows simple initialization of the Tensor1,
+   but only if it has the correct number of elements. */
+
+template<class T, int Tensor_Dim>
+class Tensor1_constructor;
+
+template<class T>
+class Tensor1_constructor<T,2>
+{
+public:
+  Tensor1_constructor(T data[], T d0, T d1)
+  {
+    data[0]=d0;
+    data[1]=d1;
+  }
+};
+
+template<class T>
+class Tensor1_constructor<T,3>
+{
+public:
+  Tensor1_constructor(T data[], T d0, T d1, T d2)
+  {
+    data[0]=d0;
+    data[1]=d1;
+    data[2]=d2;
+  }
+};
+
+template<class T>
+class Tensor1_constructor<T,4>
+{
+public:
+  Tensor1_constructor(T data[], T d0, T d1, T d2, T d3)
+  {
+    data[0]=d0;
+    data[1]=d1;
+    data[2]=d2;
+    data[3]=d3;
+  }
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_divide_generic.h
--- a/Tensor1/Tensor1_divide_generic.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-/* Divides a Tensor1 by a generic, yielding a Tensor1.  Usually used
-   for doubles, but could be used for complex, etc.  All that it
-   requires is that you can add an element of the Tensor1 to it.  */
-
-/* A(i) / d0 -> Tensor1 */
-
-template<class A, class T, class U, int Dim, char i>
-class Tensor1_divide_generic
-{
-  const Tensor1_Expr<A,T,Dim,i> iterA;
-  const U d;
-public:
-  typename promote<T,U>::V operator()(const int N) const
-  {
-    return iterA(N)/d;
-  }
-
-  Tensor1_divide_generic(const Tensor1_Expr<A,T,Dim,i> &a, const U &d0):
-    iterA(a), d(d0) {}
-};
-
-template<class A, class T, class U, int Dim, char i>
-inline const Tensor1_Expr<const Tensor1_divide_generic<A,T,U,Dim,i>,
-  typename promote<T,U>::V,Dim,i>
-operator/(const Tensor1_Expr<A,T,Dim,i> &a, const U &d0)
-{
-  typedef const Tensor1_divide_generic<A,T,U,Dim,i> TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,d0));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_divide_generic.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/Tensor1_divide_generic.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,30 @@
+/* Divides a Tensor1 by a generic, yielding a Tensor1.  Usually used
+   for doubles, but could be used for complex, etc.  All that it
+   requires is that you can add an element of the Tensor1 to it.  */
+
+/* A(i) / d0 -> Tensor1 */
+
+template<class A, class T, class U, int Dim, char i>
+class Tensor1_divide_generic
+{
+  const Tensor1_Expr<A,T,Dim,i> iterA;
+  const U d;
+public:
+  typename promote<T,U>::V operator()(const int N) const
+  {
+    return iterA(N)/d;
+  }
+
+  Tensor1_divide_generic(const Tensor1_Expr<A,T,Dim,i> &a, const U &d0):
+    iterA(a), d(d0) {}
+};
+
+template<class A, class T, class U, int Dim, char i>
+inline const Tensor1_Expr<const Tensor1_divide_generic<A,T,U,Dim,i>,
+  typename promote<T,U>::V,Dim,i>
+operator/(const Tensor1_Expr<A,T,Dim,i> &a, const U &d0)
+{
+  typedef const Tensor1_divide_generic<A,T,U,Dim,i> TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,d0));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_minus_Tensor1.h
--- a/Tensor1/Tensor1_minus_Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-/* Subtracts a Tensor1 from a Tensor1, yielding a Tensor1. */
-
-template<class A, class B, class T, class U, int Dim, char i>
-class Tensor1_minus_Tensor1
-{
-  const Tensor1_Expr<A,T,Dim,i> iterA;
-  const Tensor1_Expr<B,U,Dim,i> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N) const
-  {
-    return iterA(N)-iterB(N);
-  }
-
-  Tensor1_minus_Tensor1(const Tensor1_Expr<A,T,Dim,i> &a,
-			const Tensor1_Expr<B,U,Dim,i> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, char i, int Dim>
-inline const Tensor1_Expr<const Tensor1_minus_Tensor1<A,B,T,U,Dim,i>,
-  typename promote<T,U>::V,Dim,i>
-operator-(const Tensor1_Expr<A,T,Dim,i> &a, const Tensor1_Expr<B,U,Dim,i> &b)
-{
-  typedef const Tensor1_minus_Tensor1<A,B,T,U,Dim,i> TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_minus_Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/Tensor1_minus_Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,27 @@
+/* Subtracts a Tensor1 from a Tensor1, yielding a Tensor1. */
+
+template<class A, class B, class T, class U, int Dim, char i>
+class Tensor1_minus_Tensor1
+{
+  const Tensor1_Expr<A,T,Dim,i> iterA;
+  const Tensor1_Expr<B,U,Dim,i> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N) const
+  {
+    return iterA(N)-iterB(N);
+  }
+
+  Tensor1_minus_Tensor1(const Tensor1_Expr<A,T,Dim,i> &a,
+			const Tensor1_Expr<B,U,Dim,i> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, char i, int Dim>
+inline const Tensor1_Expr<const Tensor1_minus_Tensor1<A,B,T,U,Dim,i>,
+  typename promote<T,U>::V,Dim,i>
+operator-(const Tensor1_Expr<A,T,Dim,i> &a, const Tensor1_Expr<B,U,Dim,i> &b)
+{
+  typedef const Tensor1_minus_Tensor1<A,B,T,U,Dim,i> TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_minus_generic.h
--- a/Tensor1/Tensor1_minus_generic.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/* Subtracts a Tensor1 from a generic (or vice versa), yielding a
-   Tensor1.  Usually used for doubles, but could be used for complex,
-   etc.  All that it requires is that you can add an element of the
-   Tensor1 to it.  */
-
-/* A(i) - d0 -> Tensor1 */
-
-template<class A, class T, class U, int Dim, char i>
-class Tensor1_minus_generic
-{
-  const Tensor1_Expr<A,T,Dim,i> iterA;
-  const U d;
-public:
-  typename promote<T,U>::V operator()(const int N) const
-  {
-    return iterA(N)-d;
-  }
-
-  Tensor1_minus_generic(const Tensor1_Expr<A,T,Dim,i> &a, const U &d0):
-    iterA(a), d(d0) {}
-};
-
-template<class A, class T, class U, int Dim, char i>
-inline const Tensor1_Expr<const Tensor1_minus_generic<A,T,U,Dim,i>,
-  typename promote<T,U>::V,Dim,i>
-operator-(const Tensor1_Expr<A,T,Dim,i> &a, const U &d0)
-{
-  typedef const Tensor1_minus_generic<A,T,U,Dim,i> TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,d0));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_minus_generic.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/Tensor1_minus_generic.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,31 @@
+/* Subtracts a Tensor1 from a generic (or vice versa), yielding a
+   Tensor1.  Usually used for doubles, but could be used for complex,
+   etc.  All that it requires is that you can add an element of the
+   Tensor1 to it.  */
+
+/* A(i) - d0 -> Tensor1 */
+
+template<class A, class T, class U, int Dim, char i>
+class Tensor1_minus_generic
+{
+  const Tensor1_Expr<A,T,Dim,i> iterA;
+  const U d;
+public:
+  typename promote<T,U>::V operator()(const int N) const
+  {
+    return iterA(N)-d;
+  }
+
+  Tensor1_minus_generic(const Tensor1_Expr<A,T,Dim,i> &a, const U &d0):
+    iterA(a), d(d0) {}
+};
+
+template<class A, class T, class U, int Dim, char i>
+inline const Tensor1_Expr<const Tensor1_minus_generic<A,T,U,Dim,i>,
+  typename promote<T,U>::V,Dim,i>
+operator-(const Tensor1_Expr<A,T,Dim,i> &a, const U &d0)
+{
+  typedef const Tensor1_minus_generic<A,T,U,Dim,i> TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,d0));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_or_Tensor1.h
--- a/Tensor1/Tensor1_or_Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-/* Adds two Tensor1's together yielding a Tensor2_symmetric. */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-class Tensor1_or_Tensor1
-{
-  const Tensor1_Expr<A,T,Dim,i> iterA;
-  const Tensor1_Expr<B,U,Dim,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1)+iterB(N2);
-  }
-
-  Tensor1_or_Tensor1(const Tensor1_Expr<A,T,Dim,i> &a,
-			const Tensor1_Expr<B,U,Dim,j> &b)
-    : iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr<const Tensor1_or_Tensor1<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,i,j>
-operator||(const Tensor1_Expr<A,T,Dim,i> &a, const Tensor1_Expr<B,U,Dim,j> &b)
-{
-  typedef const Tensor1_or_Tensor1<A,B,T,U,Dim,i,j> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_or_Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/Tensor1_or_Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,27 @@
+/* Adds two Tensor1's together yielding a Tensor2_symmetric. */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+class Tensor1_or_Tensor1
+{
+  const Tensor1_Expr<A,T,Dim,i> iterA;
+  const Tensor1_Expr<B,U,Dim,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1)+iterB(N2);
+  }
+
+  Tensor1_or_Tensor1(const Tensor1_Expr<A,T,Dim,i> &a,
+			const Tensor1_Expr<B,U,Dim,j> &b)
+    : iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr<const Tensor1_or_Tensor1<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,i,j>
+operator||(const Tensor1_Expr<A,T,Dim,i> &a, const Tensor1_Expr<B,U,Dim,j> &b)
+{
+  typedef const Tensor1_or_Tensor1<A,B,T,U,Dim,i,j> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_plus_Tensor1.h
--- a/Tensor1/Tensor1_plus_Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-/* Adds two Tensor1's together, yielding a Tensor1. */
-
-template<class A, class B, class T, class U, int Dim, char i>
-class Tensor1_plus_Tensor1
-{
-  const Tensor1_Expr<A,T,Dim,i> iterA;
-  const Tensor1_Expr<B,U,Dim,i> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N) const
-  {
-    return iterA(N)+iterB(N);
-  }
-
-  Tensor1_plus_Tensor1(const Tensor1_Expr<A,T,Dim,i> &a,
-		       const Tensor1_Expr<B,U,Dim,i> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, char i, int Dim>
-inline const Tensor1_Expr<const Tensor1_plus_Tensor1<A,B,T,U,Dim,i>,
-  typename promote<T,U>::V,Dim,i>
-operator+(const Tensor1_Expr<A,T,Dim,i> &a, const Tensor1_Expr<B,U,Dim,i> &b)
-{
-  typedef const Tensor1_plus_Tensor1<A,B,T,U,Dim,i> TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_plus_Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/Tensor1_plus_Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,27 @@
+/* Adds two Tensor1's together, yielding a Tensor1. */
+
+template<class A, class B, class T, class U, int Dim, char i>
+class Tensor1_plus_Tensor1
+{
+  const Tensor1_Expr<A,T,Dim,i> iterA;
+  const Tensor1_Expr<B,U,Dim,i> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N) const
+  {
+    return iterA(N)+iterB(N);
+  }
+
+  Tensor1_plus_Tensor1(const Tensor1_Expr<A,T,Dim,i> &a,
+		       const Tensor1_Expr<B,U,Dim,i> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, char i, int Dim>
+inline const Tensor1_Expr<const Tensor1_plus_Tensor1<A,B,T,U,Dim,i>,
+  typename promote<T,U>::V,Dim,i>
+operator+(const Tensor1_Expr<A,T,Dim,i> &a, const Tensor1_Expr<B,U,Dim,i> &b)
+{
+  typedef const Tensor1_plus_Tensor1<A,B,T,U,Dim,i> TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_plus_generic.h
--- a/Tensor1/Tensor1_plus_generic.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-/* Adds a Tensor1 to a generic (or vice versa), yielding a Tensor1.
-   Usually used for doubles, but could be used for complex, etc.  All
-   that it requires is that you can add an element of the Tensor1 to
-   it.  */
-
-/* A(i) + d0 -> Tensor1 */
-
-template<class A, class T, class U, int Dim, char i>
-class Tensor1_plus_generic
-{
-  const Tensor1_Expr<A,T,Dim,i> iterA;
-  const U d;
-public:
-  typename promote<T,U>::V operator()(const int N) const
-  {
-    return iterA(N)+d;
-  }
-
-  Tensor1_plus_generic(const Tensor1_Expr<A,T,Dim,i> &a, const U &d0):
-    iterA(a), d(d0) {}
-};
-
-template<class A, class T, class U, int Dim, char i>
-inline const Tensor1_Expr<const Tensor1_plus_generic<A,T,U,Dim,i>,
-  typename promote<T,U>::V,Dim,i>
-operator+(const Tensor1_Expr<A,T,Dim,i> &a, const U &d0)
-{
-  typedef const Tensor1_plus_generic<A,T,U,Dim,i> TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,d0));
-}
-
-/* d0 + A(i) -> Tensor1 */
-
-template<class A, class T, class U, int Dim, char i>
-inline const Tensor1_Expr<const Tensor1_plus_generic<A,T,U,Dim,i>,
-  typename promote<T,U>::V,Dim,i>
-operator+(const U &d0, const Tensor1_Expr<A,T,Dim,i> &a)
-{
-  typedef const Tensor1_plus_generic<A,T,U,Dim,i> TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,d0));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_plus_generic.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/Tensor1_plus_generic.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,41 @@
+/* Adds a Tensor1 to a generic (or vice versa), yielding a Tensor1.
+   Usually used for doubles, but could be used for complex, etc.  All
+   that it requires is that you can add an element of the Tensor1 to
+   it.  */
+
+/* A(i) + d0 -> Tensor1 */
+
+template<class A, class T, class U, int Dim, char i>
+class Tensor1_plus_generic
+{
+  const Tensor1_Expr<A,T,Dim,i> iterA;
+  const U d;
+public:
+  typename promote<T,U>::V operator()(const int N) const
+  {
+    return iterA(N)+d;
+  }
+
+  Tensor1_plus_generic(const Tensor1_Expr<A,T,Dim,i> &a, const U &d0):
+    iterA(a), d(d0) {}
+};
+
+template<class A, class T, class U, int Dim, char i>
+inline const Tensor1_Expr<const Tensor1_plus_generic<A,T,U,Dim,i>,
+  typename promote<T,U>::V,Dim,i>
+operator+(const Tensor1_Expr<A,T,Dim,i> &a, const U &d0)
+{
+  typedef const Tensor1_plus_generic<A,T,U,Dim,i> TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,d0));
+}
+
+/* d0 + A(i) -> Tensor1 */
+
+template<class A, class T, class U, int Dim, char i>
+inline const Tensor1_Expr<const Tensor1_plus_generic<A,T,U,Dim,i>,
+  typename promote<T,U>::V,Dim,i>
+operator+(const U &d0, const Tensor1_Expr<A,T,Dim,i> &a)
+{
+  typedef const Tensor1_plus_generic<A,T,U,Dim,i> TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,d0));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_pointer.h
--- a/Tensor1/Tensor1_pointer.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-/* A version for pointers, useful for previously
-   constructed arrays. */
-
-template <class T, int Tensor_Dim>
-class Tensor1<T*,Tensor_Dim>
-{
-  /* Note that the T *'s are mutable, so the pointer can change,
-     allowing iterating over a array. */
-
-  mutable T * restrict data[Tensor_Dim];
-public:
-  /* Initializations for varying numbers of elements, with each one
-     defined for a particular Tensor_Dim.  To initialize a different
-     dimension, just add the appropriate constructor and call to
-     the Tensor1_constructor constructor. */
-  Tensor1(T *d0, T *d1)
-  {
-    Tensor1_constructor<T* restrict,Tensor_Dim>(data,d0,d1);
-  }
-  Tensor1(T *d0, T *d1, T *d2)
-  {
-    Tensor1_constructor<T* restrict,Tensor_Dim>(data,d0,d1,d2);
-  }
-  Tensor1(T *d0, T *d1, T *d2, T *d3)
-  {
-    Tensor1_constructor<T* restrict,Tensor_Dim>(data,d0,d1,d2,d3);
-  }
-
-  /* There are two operator(int)'s, one for non-consts that lets you
-     change the value, and one for consts that doesn't. */
-
-  T & operator()(const int N)
-  {
-#ifdef FTENSOR_DEBUG
-    if(N>=Tensor_Dim || N<0)
-      {
-	std::stringstream s;
-        s << "Bad index in Tensor1<T*," << Tensor_Dim
-          << ">.operator(" << N << ")" << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return *data[N];
-  }
-  T operator()(const int N) const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N>=Tensor_Dim || N<0)
-      {
-	std::stringstream s;
-        s << "Bad index in Tensor1<T*," << Tensor_Dim
-          << ">.operator(" << N << ") const" << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return *data[N];
-  }
-  T * ptr(const int N) const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N>=Tensor_Dim || N<0)
-      {
-	std::stringstream s;
-        s << "Bad index in Tensor1<T*," << Tensor_Dim
-          << ">.ptr(" << N << ")" << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return data[N];
-  }
-
-  /* These operator()'s are the first part in constructing template
-     expressions.  They can be used to slice off lower dimensional
-     parts. They are not entirely safe, since you can accidently use a
-     higher dimension than what is really allowed (like Dim=5). */
-
-  template<char i, int Dim>
-  Tensor1_Expr<Tensor1<T*,Tensor_Dim>,T,Dim,i>
-  operator()(const Index<i,Dim> &index)
-  {
-    return Tensor1_Expr<Tensor1<T*,Tensor_Dim>,T,Dim,i>(*this);
-  }
-
-  template<char i, int Dim>
-  Tensor1_Expr<const Tensor1<T*,Tensor_Dim>,T,Dim,i>
-  operator()(const Index<i,Dim> &index) const
-  {
-    return Tensor1_Expr<const Tensor1<T*,Tensor_Dim>,T,Dim,i>(*this);
-  }
-
-  /* The ++ operator increments the pointer, not the number that the
-     pointer points to.  This allows iterating over a grid. */
-
-  const Tensor1 & operator++() const
-  {
-    for(int i=0;i<Tensor_Dim;++i)
-      ++data[i];
-    return *this;
-  }
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_pointer.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/Tensor1_pointer.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,100 @@
+/* A version for pointers, useful for previously
+   constructed arrays. */
+
+template <class T, int Tensor_Dim>
+class Tensor1<T*,Tensor_Dim>
+{
+  /* Note that the T *'s are mutable, so the pointer can change,
+     allowing iterating over a array. */
+
+  mutable T * restrict data[Tensor_Dim];
+public:
+  /* Initializations for varying numbers of elements, with each one
+     defined for a particular Tensor_Dim.  To initialize a different
+     dimension, just add the appropriate constructor and call to
+     the Tensor1_constructor constructor. */
+  Tensor1(T *d0, T *d1)
+  {
+    Tensor1_constructor<T* restrict,Tensor_Dim>(data,d0,d1);
+  }
+  Tensor1(T *d0, T *d1, T *d2)
+  {
+    Tensor1_constructor<T* restrict,Tensor_Dim>(data,d0,d1,d2);
+  }
+  Tensor1(T *d0, T *d1, T *d2, T *d3)
+  {
+    Tensor1_constructor<T* restrict,Tensor_Dim>(data,d0,d1,d2,d3);
+  }
+
+  /* There are two operator(int)'s, one for non-consts that lets you
+     change the value, and one for consts that doesn't. */
+
+  T & operator()(const int N)
+  {
+#ifdef FTENSOR_DEBUG
+    if(N>=Tensor_Dim || N<0)
+      {
+	std::stringstream s;
+        s << "Bad index in Tensor1<T*," << Tensor_Dim
+          << ">.operator(" << N << ")" << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return *data[N];
+  }
+  T operator()(const int N) const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N>=Tensor_Dim || N<0)
+      {
+	std::stringstream s;
+        s << "Bad index in Tensor1<T*," << Tensor_Dim
+          << ">.operator(" << N << ") const" << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return *data[N];
+  }
+  T * ptr(const int N) const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N>=Tensor_Dim || N<0)
+      {
+	std::stringstream s;
+        s << "Bad index in Tensor1<T*," << Tensor_Dim
+          << ">.ptr(" << N << ")" << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return data[N];
+  }
+
+  /* These operator()'s are the first part in constructing template
+     expressions.  They can be used to slice off lower dimensional
+     parts. They are not entirely safe, since you can accidently use a
+     higher dimension than what is really allowed (like Dim=5). */
+
+  template<char i, int Dim>
+  Tensor1_Expr<Tensor1<T*,Tensor_Dim>,T,Dim,i>
+  operator()(const Index<i,Dim> &index)
+  {
+    return Tensor1_Expr<Tensor1<T*,Tensor_Dim>,T,Dim,i>(*this);
+  }
+
+  template<char i, int Dim>
+  Tensor1_Expr<const Tensor1<T*,Tensor_Dim>,T,Dim,i>
+  operator()(const Index<i,Dim> &index) const
+  {
+    return Tensor1_Expr<const Tensor1<T*,Tensor_Dim>,T,Dim,i>(*this);
+  }
+
+  /* The ++ operator increments the pointer, not the number that the
+     pointer points to.  This allows iterating over a grid. */
+
+  const Tensor1 & operator++() const
+  {
+    for(int i=0;i<Tensor_Dim;++i)
+      ++data[i];
+    return *this;
+  }
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_times_Tensor1.h
--- a/Tensor1/Tensor1_times_Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/* Multiplies two Tensor1's together yielding a T (int, double, etc.)
-   or a Tensor2. */
-
-/* A(i)*B(i) -> T */
-
-template<class A, class B, class T, class U, int Dim, char i, int Current_Dim>
-inline const typename promote<T,U>::V T1_times_T1(const Tensor1_Expr<A,T,Dim,i> &a,
-				      const Tensor1_Expr<B,U,Dim,i> &b,
-				      const Number<Current_Dim> &N)
-{
-  return a(Current_Dim-1)*b(Current_Dim-1) + 
-    T1_times_T1(a,b,Number<Current_Dim-1>());
-}
-
-template<class A, class B, class T, class U, int Dim, char i>
-inline const typename promote<T,U>::V T1_times_T1(const Tensor1_Expr<A,T,Dim,i> &a,
-				      const Tensor1_Expr<B,U,Dim,i> &b,
-				      const Number<1> &N)
-{
-  return a(0)*b(0);
-}
-
-template<class A, class B, class T, class U, int Dim, char i>
-inline const typename promote<T,U>::V operator*(const Tensor1_Expr<A,T,Dim,i> &a,
-				 const Tensor1_Expr<B,U,Dim,i> &b)
-{
-  return T1_times_T1(a,b,Number<Dim>());
-}
-
-/* A(i)*B(j) -> Tensor2 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
-class Tensor1_times_Tensor1
-{
-  const Tensor1_Expr<A,T,Dim0,i> iterA;
-  const Tensor1_Expr<B,U,Dim1,j> iterB;
-public:
-  Tensor1_times_Tensor1(const Tensor1_Expr<A,T,Dim0,i> &a,
-			const Tensor1_Expr<B,U,Dim1,j> &b):
-    iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1)*iterB(N2);
-  }
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
-inline const Tensor2_Expr<const Tensor1_times_Tensor1<A,B,T,U,Dim0,Dim1,i,j>,
-  typename promote<T,U>::V,Dim0,Dim1,i,j>
-operator*(const Tensor1_Expr<A,T,Dim0,i> &a, const Tensor1_Expr<B,U,Dim1,j> &b)
-{
-  typedef const Tensor1_times_Tensor1<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_times_Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/Tensor1_times_Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,55 @@
+/* Multiplies two Tensor1's together yielding a T (int, double, etc.)
+   or a Tensor2. */
+
+/* A(i)*B(i) -> T */
+
+template<class A, class B, class T, class U, int Dim, char i, int Current_Dim>
+inline const typename promote<T,U>::V T1_times_T1(const Tensor1_Expr<A,T,Dim,i> &a,
+				      const Tensor1_Expr<B,U,Dim,i> &b,
+				      const Number<Current_Dim> &N)
+{
+  return a(Current_Dim-1)*b(Current_Dim-1) + 
+    T1_times_T1(a,b,Number<Current_Dim-1>());
+}
+
+template<class A, class B, class T, class U, int Dim, char i>
+inline const typename promote<T,U>::V T1_times_T1(const Tensor1_Expr<A,T,Dim,i> &a,
+				      const Tensor1_Expr<B,U,Dim,i> &b,
+				      const Number<1> &N)
+{
+  return a(0)*b(0);
+}
+
+template<class A, class B, class T, class U, int Dim, char i>
+inline const typename promote<T,U>::V operator*(const Tensor1_Expr<A,T,Dim,i> &a,
+				 const Tensor1_Expr<B,U,Dim,i> &b)
+{
+  return T1_times_T1(a,b,Number<Dim>());
+}
+
+/* A(i)*B(j) -> Tensor2 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
+class Tensor1_times_Tensor1
+{
+  const Tensor1_Expr<A,T,Dim0,i> iterA;
+  const Tensor1_Expr<B,U,Dim1,j> iterB;
+public:
+  Tensor1_times_Tensor1(const Tensor1_Expr<A,T,Dim0,i> &a,
+			const Tensor1_Expr<B,U,Dim1,j> &b):
+    iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1)*iterB(N2);
+  }
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
+inline const Tensor2_Expr<const Tensor1_times_Tensor1<A,B,T,U,Dim0,Dim1,i,j>,
+  typename promote<T,U>::V,Dim0,Dim1,i,j>
+operator*(const Tensor1_Expr<A,T,Dim0,i> &a, const Tensor1_Expr<B,U,Dim1,j> &b)
+{
+  typedef const Tensor1_times_Tensor1<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_times_generic.h
--- a/Tensor1/Tensor1_times_generic.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-/* Multipliess a Tensor1 by a generic (or vice versa), yielding a Tensor1.
-   Usually used for doubles, but could be used for complex, etc.  All
-   that it requires is that you can add an element of the Tensor1 to
-   it.  */
-
-/* A(i) * d0 -> Tensor1 */
-
-template<class A, class T, class U, int Dim, char i>
-class Tensor1_times_generic
-{
-  const Tensor1_Expr<A,T,Dim,i> iterA;
-  const U d;
-public:
-  typename promote<T,U>::V operator()(const int N) const
-  {
-    return iterA(N)*d;
-  }
-
-  Tensor1_times_generic(const Tensor1_Expr<A,T,Dim,i> &a, const U &d0):
-    iterA(a), d(d0) {}
-};
-
-template<class A, class T, class U, int Dim, char i>
-inline const Tensor1_Expr<const Tensor1_times_generic<A,T,U,Dim,i>,
-  typename promote<T,U>::V,Dim,i>
-operator*(const Tensor1_Expr<A,T,Dim,i> &a, const U &d0)
-{
-  typedef const Tensor1_times_generic<A,T,U,Dim,i> TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,d0));
-}
-
-/* d0 * A(i) -> Tensor1 */
-
-template<class A, class T, class U, int Dim, char i>
-inline const Tensor1_Expr<const Tensor1_times_generic<A,T,U,Dim,i>,
-  typename promote<T,U>::V,Dim,i>
-operator*(const U &d0, const Tensor1_Expr<A,T,Dim,i> &a)
-{
-  typedef const Tensor1_times_generic<A,T,U,Dim,i> TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,d0));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_times_generic.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/Tensor1_times_generic.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,41 @@
+/* Multipliess a Tensor1 by a generic (or vice versa), yielding a Tensor1.
+   Usually used for doubles, but could be used for complex, etc.  All
+   that it requires is that you can add an element of the Tensor1 to
+   it.  */
+
+/* A(i) * d0 -> Tensor1 */
+
+template<class A, class T, class U, int Dim, char i>
+class Tensor1_times_generic
+{
+  const Tensor1_Expr<A,T,Dim,i> iterA;
+  const U d;
+public:
+  typename promote<T,U>::V operator()(const int N) const
+  {
+    return iterA(N)*d;
+  }
+
+  Tensor1_times_generic(const Tensor1_Expr<A,T,Dim,i> &a, const U &d0):
+    iterA(a), d(d0) {}
+};
+
+template<class A, class T, class U, int Dim, char i>
+inline const Tensor1_Expr<const Tensor1_times_generic<A,T,U,Dim,i>,
+  typename promote<T,U>::V,Dim,i>
+operator*(const Tensor1_Expr<A,T,Dim,i> &a, const U &d0)
+{
+  typedef const Tensor1_times_generic<A,T,U,Dim,i> TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,d0));
+}
+
+/* d0 * A(i) -> Tensor1 */
+
+template<class A, class T, class U, int Dim, char i>
+inline const Tensor1_Expr<const Tensor1_times_generic<A,T,U,Dim,i>,
+  typename promote<T,U>::V,Dim,i>
+operator*(const U &d0, const Tensor1_Expr<A,T,Dim,i> &a)
+{
+  typedef const Tensor1_times_generic<A,T,U,Dim,i> TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,d0));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_value.h
--- a/Tensor1/Tensor1_value.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-/* The general version, not for pointers. */
-
-template <class T, int Tensor_Dim>
-class Tensor1
-{
-  T data[Tensor_Dim];
-public:
-  /* Initializations for varying numbers of elements, with each one
-     defined for a particular Tensor_Dim.  To initialize a different
-     dimension, just add the appropriate constructor and call to
-     the Tensor1_constructor constructor. */
-  Tensor1(T d0, T d1)
-  {
-    Tensor1_constructor<T,Tensor_Dim>(data,d0,d1);
-  }
-  Tensor1(T d0, T d1, T d2)
-  {
-    Tensor1_constructor<T,Tensor_Dim>(data,d0,d1,d2);
-  }
-  Tensor1(T d0, T d1, T d2, T d3)
-  {
-    Tensor1_constructor<T,Tensor_Dim>(data,d0,d1,d2,d3);
-  }
-
-  Tensor1() {}
-
-  /* There are two operator(int)'s, one for non-consts that lets you
-     change the value, and one for consts that doesn't. */
-
-  T & operator()(const int N)
-  {
-#ifdef FTENSOR_DEBUG
-    if(N>=Tensor_Dim || N<0)
-      {
-	std::stringstream s;
-        s << "Bad index in Tensor1<T," << Tensor_Dim
-          << ">.operator(" << N << ")" << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return data[N];
-  }
-  T operator()(const int N) const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N>=Tensor_Dim || N<0)
-      {
-	std::stringstream s;
-        s << "Bad index in Tensor1<T," << Tensor_Dim
-          << ">.operator(" << N << ") const" << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return data[N];
-  }
-
-  /* These operator()'s are the first part in constructing template
-     expressions.  They can be used to slice off lower dimensional
-     parts. They are not entirely safe, since you can accidently use a
-     higher dimension than what is really allowed (like Dim=5). */
-
-  template<char i, int Dim>
-  Tensor1_Expr<Tensor1<T,Tensor_Dim>,T,Dim,i>
-  operator()(const Index<i,Dim> &index)
-  {
-    return Tensor1_Expr<Tensor1<T,Tensor_Dim>,T,Dim,i>(*this);
-  }
-
-  template<char i, int Dim>
-  Tensor1_Expr<const Tensor1<T,Tensor_Dim>,T,Dim,i>
-  operator()(const Index<i,Dim> &index) const
-  {
-    return Tensor1_Expr<const Tensor1<T,Tensor_Dim>,T,Dim,i>(*this);
-  }
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/Tensor1_value.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/Tensor1_value.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,75 @@
+/* The general version, not for pointers. */
+
+template <class T, int Tensor_Dim>
+class Tensor1
+{
+  T data[Tensor_Dim];
+public:
+  /* Initializations for varying numbers of elements, with each one
+     defined for a particular Tensor_Dim.  To initialize a different
+     dimension, just add the appropriate constructor and call to
+     the Tensor1_constructor constructor. */
+  Tensor1(T d0, T d1)
+  {
+    Tensor1_constructor<T,Tensor_Dim>(data,d0,d1);
+  }
+  Tensor1(T d0, T d1, T d2)
+  {
+    Tensor1_constructor<T,Tensor_Dim>(data,d0,d1,d2);
+  }
+  Tensor1(T d0, T d1, T d2, T d3)
+  {
+    Tensor1_constructor<T,Tensor_Dim>(data,d0,d1,d2,d3);
+  }
+
+  Tensor1() {}
+
+  /* There are two operator(int)'s, one for non-consts that lets you
+     change the value, and one for consts that doesn't. */
+
+  T & operator()(const int N)
+  {
+#ifdef FTENSOR_DEBUG
+    if(N>=Tensor_Dim || N<0)
+      {
+	std::stringstream s;
+        s << "Bad index in Tensor1<T," << Tensor_Dim
+          << ">.operator(" << N << ")" << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return data[N];
+  }
+  T operator()(const int N) const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N>=Tensor_Dim || N<0)
+      {
+	std::stringstream s;
+        s << "Bad index in Tensor1<T," << Tensor_Dim
+          << ">.operator(" << N << ") const" << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return data[N];
+  }
+
+  /* These operator()'s are the first part in constructing template
+     expressions.  They can be used to slice off lower dimensional
+     parts. They are not entirely safe, since you can accidently use a
+     higher dimension than what is really allowed (like Dim=5). */
+
+  template<char i, int Dim>
+  Tensor1_Expr<Tensor1<T,Tensor_Dim>,T,Dim,i>
+  operator()(const Index<i,Dim> &index)
+  {
+    return Tensor1_Expr<Tensor1<T,Tensor_Dim>,T,Dim,i>(*this);
+  }
+
+  template<char i, int Dim>
+  Tensor1_Expr<const Tensor1<T,Tensor_Dim>,T,Dim,i>
+  operator()(const Index<i,Dim> &index) const
+  {
+    return Tensor1_Expr<const Tensor1<T,Tensor_Dim>,T,Dim,i>(*this);
+  }
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/dTensor1.h
--- a/Tensor1/dTensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-/* Takes a derivative of a Tensor1, yielding a Tensor2. */
-
-//  template<class T, int Dim, char i, char j>
-//  class dTensor1
-//  {
-//    const Tensor1<T*,Dim> &a;
-//    const int di,dj,dk;
-//    const double dx,dy,dz;
-//  public:
-//    typename promote<T,double>::V operator()(const int N1, const int N2) const
-//    {
-//      return N2==0 ? (*(a.ptr(N1)+di)-*(a.ptr(N1)-di))*dx*0.5
-//        : (N2==1 ? (*(a.ptr(N1)+dj)-*(a.ptr(N1)-dj))*dy*0.5
-//  	 : (*(a.ptr(N1)+dk)-*(a.ptr(N1)-dk))*dz*0.5);
-//    }
-//    dTensor1(const Tensor1<T*,Dim> &A,
-//  	   const int Di, const int Dj, const int Dk,
-//  	   const double Dx, const double Dy, const double Dz):
-//      a(A), di(Di), dj(Dj), dk(Dk), dx(Dx), dy(Dy), dz(Dz) {}
-//  };
-
-//  template<class T, int Dim, char i, char j>
-//  inline const Tensor2_Expr<const dTensor1<T,Dim,i,j>,
-//    typename promote<T,double>::V,Dim,3,i,j>
-//  d(const Tensor1<T*,Dim> &a, const Index<i,Dim> index1, const Index<j,3> index2,
-//    const int &di, const int &dj, const int &dk,
-//    const double &dx, const double &dy, const double &dz)
-//  {
-//    typedef const dTensor1<T,Dim,i,j> TensorExpr;
-//    return Tensor2_Expr<TensorExpr,typename promote<T,double>::V,Dim,3,i,j>
-//      (TensorExpr(a,di,dj,dk,dx,dy,dz));
-//  }
-
-
-template<class T, int Dim0, int Dim1, char i, char j>
-class dTensor1
-{
-  const Tensor1<T*,Dim0> &a;
-  const Tensor1<int,Dim1> &d_ijk;
-  const Tensor1<double,Dim1> &d_xyz;
-public:
-  typename promote<T,double>::V operator()(const int N1, const int N2) const
-  {
-    return (*(a.ptr(N1)+d_ijk(N2))-*(a.ptr(N1)-d_ijk(N2)))*d_xyz(N2)*0.5;
-  }
-  dTensor1(const Tensor1<T*,Dim0> &A,
-	   const Tensor1<int,Dim1> &D_ijk,
-	   const Tensor1<double,Dim1> &D_xyz)
-    : a(A), d_ijk(D_ijk), d_xyz(D_xyz) {}
-};
-
-template<class T, int Dim0, int Dim1, char i, char j>
-inline const Tensor2_Expr<const dTensor1<T,Dim0,Dim1,i,j>,
-  typename promote<T,double>::V,Dim0,Dim1,i,j>
-d(const Tensor1<T*,Dim0> &a, const Index<i,Dim0> index1,
-  const Index<j,Dim1> index2,
-  const Tensor1<int,Dim1> &d_ijk,
-  const Tensor1<double,Dim1> &d_xyz)
-{
-  typedef const dTensor1<T,Dim0,Dim1,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,double>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,d_ijk,d_xyz));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/dTensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/dTensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,63 @@
+/* Takes a derivative of a Tensor1, yielding a Tensor2. */
+
+//  template<class T, int Dim, char i, char j>
+//  class dTensor1
+//  {
+//    const Tensor1<T*,Dim> &a;
+//    const int di,dj,dk;
+//    const double dx,dy,dz;
+//  public:
+//    typename promote<T,double>::V operator()(const int N1, const int N2) const
+//    {
+//      return N2==0 ? (*(a.ptr(N1)+di)-*(a.ptr(N1)-di))*dx*0.5
+//        : (N2==1 ? (*(a.ptr(N1)+dj)-*(a.ptr(N1)-dj))*dy*0.5
+//  	 : (*(a.ptr(N1)+dk)-*(a.ptr(N1)-dk))*dz*0.5);
+//    }
+//    dTensor1(const Tensor1<T*,Dim> &A,
+//  	   const int Di, const int Dj, const int Dk,
+//  	   const double Dx, const double Dy, const double Dz):
+//      a(A), di(Di), dj(Dj), dk(Dk), dx(Dx), dy(Dy), dz(Dz) {}
+//  };
+
+//  template<class T, int Dim, char i, char j>
+//  inline const Tensor2_Expr<const dTensor1<T,Dim,i,j>,
+//    typename promote<T,double>::V,Dim,3,i,j>
+//  d(const Tensor1<T*,Dim> &a, const Index<i,Dim> index1, const Index<j,3> index2,
+//    const int &di, const int &dj, const int &dk,
+//    const double &dx, const double &dy, const double &dz)
+//  {
+//    typedef const dTensor1<T,Dim,i,j> TensorExpr;
+//    return Tensor2_Expr<TensorExpr,typename promote<T,double>::V,Dim,3,i,j>
+//      (TensorExpr(a,di,dj,dk,dx,dy,dz));
+//  }
+
+
+template<class T, int Dim0, int Dim1, char i, char j>
+class dTensor1
+{
+  const Tensor1<T*,Dim0> &a;
+  const Tensor1<int,Dim1> &d_ijk;
+  const Tensor1<double,Dim1> &d_xyz;
+public:
+  typename promote<T,double>::V operator()(const int N1, const int N2) const
+  {
+    return (*(a.ptr(N1)+d_ijk(N2))-*(a.ptr(N1)-d_ijk(N2)))*d_xyz(N2)*0.5;
+  }
+  dTensor1(const Tensor1<T*,Dim0> &A,
+	   const Tensor1<int,Dim1> &D_ijk,
+	   const Tensor1<double,Dim1> &D_xyz)
+    : a(A), d_ijk(D_ijk), d_xyz(D_xyz) {}
+};
+
+template<class T, int Dim0, int Dim1, char i, char j>
+inline const Tensor2_Expr<const dTensor1<T,Dim0,Dim1,i,j>,
+  typename promote<T,double>::V,Dim0,Dim1,i,j>
+d(const Tensor1<T*,Dim0> &a, const Index<i,Dim0> index1,
+  const Index<j,Dim1> index2,
+  const Tensor1<int,Dim1> &d_ijk,
+  const Tensor1<double,Dim1> &d_xyz)
+{
+  typedef const dTensor1<T,Dim0,Dim1,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,double>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,d_ijk,d_xyz));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/d_one_sided_Tensor1.h
--- a/Tensor1/d_one_sided_Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-/* Takes a one-sided derivative of a Tensor1 in a particular
-   direction, yieldind a Tensor1. */
-
-template<class T, int Dim, char i, int axis>
-class d_one_sided_Tensor1
-{
-  const Tensor1<T*,Dim> &a;
-  const int di,dj,dk;
-  const double dx,dy,dz;
-public:
-  typename promote<T,double>::V operator()(const int N1) const
-  {
-    return axis==0 ? (a(N1)-*(a.ptr(N1)-di))*dx
-      : (axis==1 ? (a(N1)-*(a.ptr(N1)-dj))*dy
-	 : (a(N1)-*(a.ptr(N1)-dk))*dz);
-  }
-  d_one_sided_Tensor1(const Tensor1<T*,Dim> &A,
-		      const int Di, const int Dj, const int Dk,
-		      const double Dx, const double Dy, const double Dz):
-    a(A), di(Di), dj(Dj), dk(Dk), dx(Dx), dy(Dy), dz(Dz) {}
-};
-
-template<class T, int Dim, char i, int axis>
-inline const Tensor1_Expr<const d_one_sided_Tensor1<T,Dim,i,axis>,
-  typename promote<T,double>::V,Dim,i>
-d_one_sided(const Tensor1<T*,Dim> &a, const Number<axis> n1,
-	    const Index<i,Dim> index1,
-	    const int &di, const int &dj, const int &dk,
-	    const double &dx, const double &dy, const double &dz)
-{
-  typedef const d_one_sided_Tensor1<T,Dim,i,axis> TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,double>::V,Dim,i>
-    (TensorExpr(a,di,dj,dk,dx,dy,dz));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/d_one_sided_Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/d_one_sided_Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,34 @@
+/* Takes a one-sided derivative of a Tensor1 in a particular
+   direction, yieldind a Tensor1. */
+
+template<class T, int Dim, char i, int axis>
+class d_one_sided_Tensor1
+{
+  const Tensor1<T*,Dim> &a;
+  const int di,dj,dk;
+  const double dx,dy,dz;
+public:
+  typename promote<T,double>::V operator()(const int N1) const
+  {
+    return axis==0 ? (a(N1)-*(a.ptr(N1)-di))*dx
+      : (axis==1 ? (a(N1)-*(a.ptr(N1)-dj))*dy
+	 : (a(N1)-*(a.ptr(N1)-dk))*dz);
+  }
+  d_one_sided_Tensor1(const Tensor1<T*,Dim> &A,
+		      const int Di, const int Dj, const int Dk,
+		      const double Dx, const double Dy, const double Dz):
+    a(A), di(Di), dj(Dj), dk(Dk), dx(Dx), dy(Dy), dz(Dz) {}
+};
+
+template<class T, int Dim, char i, int axis>
+inline const Tensor1_Expr<const d_one_sided_Tensor1<T,Dim,i,axis>,
+  typename promote<T,double>::V,Dim,i>
+d_one_sided(const Tensor1<T*,Dim> &a, const Number<axis> n1,
+	    const Index<i,Dim> index1,
+	    const int &di, const int &dj, const int &dk,
+	    const double &dx, const double &dy, const double &dz)
+{
+  typedef const d_one_sided_Tensor1<T,Dim,i,axis> TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,double>::V,Dim,i>
+    (TensorExpr(a,di,dj,dk,dx,dy,dz));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/ddTensor1.h
--- a/Tensor1/ddTensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-/* Takes a second derivative of a Tensor1, yielding a Tensor3_dg, but
-   with it's indices switched around so that it has the symmetries of
-   a Tensor3_christof. */
-
-template<class T, int Dim0, int Dim12, char i, char j, char k>
-class ddTensor1
-{
-  const Tensor1<T*,Dim0> &a;
-  const Tensor1<int,Dim12> &d_ijk;
-  const Tensor1<double,Dim12> &d_xyz;
-public:
-
-  /* Note the indices switch here. */
-
-  typename promote<T,double>::V operator()(const int N2, const int N3,
-				  const int N1) const
-  {
-    return
-      N2==N3 ? (*(a.ptr(N1)+d_ijk(N2))-2*a(N1)+*(a.ptr(N1)-d_ijk(N2)))
-      *d_xyz(N2)*d_xyz(N2) :
-      (*(a.ptr(N1)+d_ijk(N2)+d_ijk(N3))
-       - *(a.ptr(N1)-d_ijk(N2)+d_ijk(N3))
-       - *(a.ptr(N1)+d_ijk(N2)-d_ijk(N3))
-       + *(a.ptr(N1)-d_ijk(N2)-d_ijk(N3)))*d_xyz(N2)*d_xyz(N3)*0.25;
-  }
-  ddTensor1(const Tensor1<T*,Dim0> &A,
-	    const Tensor1<int,Dim12> &D_ijk,
-	    const Tensor1<double,Dim12> &D_xyz)
-    : a(A), d_ijk(D_ijk), d_xyz(D_xyz) {}
-};
-
-/* Note that the indices are mixed up here to convert between being
-   symmetric on the last two indices to the first two indices. */
-
-
-template<class T, int Dim0, int Dim12, char i, char j, char k>
-inline const Tensor3_dg_Expr<const ddTensor1<T,Dim0,Dim12,i,j,k>,
-  typename promote<T,double>::V,Dim0,Dim12,i,j,k>
-dd(const Tensor1<T*,Dim0> &a, const Index<k,Dim0> index0,
-   const Index<i,Dim12> index1, const Index<j,Dim12> index2,
-   const Tensor1<int,Dim12> &d_ijk, const Tensor1<double,Dim12> &d_xyz)
-{
-  typedef const ddTensor1<T,Dim0,Dim12,i,j,k> TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,double>::V,Dim0,Dim12,i,j,k>
-    (TensorExpr(a,d_ijk,d_xyz));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/ddTensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/ddTensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,46 @@
+/* Takes a second derivative of a Tensor1, yielding a Tensor3_dg, but
+   with it's indices switched around so that it has the symmetries of
+   a Tensor3_christof. */
+
+template<class T, int Dim0, int Dim12, char i, char j, char k>
+class ddTensor1
+{
+  const Tensor1<T*,Dim0> &a;
+  const Tensor1<int,Dim12> &d_ijk;
+  const Tensor1<double,Dim12> &d_xyz;
+public:
+
+  /* Note the indices switch here. */
+
+  typename promote<T,double>::V operator()(const int N2, const int N3,
+				  const int N1) const
+  {
+    return
+      N2==N3 ? (*(a.ptr(N1)+d_ijk(N2))-2*a(N1)+*(a.ptr(N1)-d_ijk(N2)))
+      *d_xyz(N2)*d_xyz(N2) :
+      (*(a.ptr(N1)+d_ijk(N2)+d_ijk(N3))
+       - *(a.ptr(N1)-d_ijk(N2)+d_ijk(N3))
+       - *(a.ptr(N1)+d_ijk(N2)-d_ijk(N3))
+       + *(a.ptr(N1)-d_ijk(N2)-d_ijk(N3)))*d_xyz(N2)*d_xyz(N3)*0.25;
+  }
+  ddTensor1(const Tensor1<T*,Dim0> &A,
+	    const Tensor1<int,Dim12> &D_ijk,
+	    const Tensor1<double,Dim12> &D_xyz)
+    : a(A), d_ijk(D_ijk), d_xyz(D_xyz) {}
+};
+
+/* Note that the indices are mixed up here to convert between being
+   symmetric on the last two indices to the first two indices. */
+
+
+template<class T, int Dim0, int Dim12, char i, char j, char k>
+inline const Tensor3_dg_Expr<const ddTensor1<T,Dim0,Dim12,i,j,k>,
+  typename promote<T,double>::V,Dim0,Dim12,i,j,k>
+dd(const Tensor1<T*,Dim0> &a, const Index<k,Dim0> index0,
+   const Index<i,Dim12> index1, const Index<j,Dim12> index2,
+   const Tensor1<int,Dim12> &d_ijk, const Tensor1<double,Dim12> &d_xyz)
+{
+  typedef const ddTensor1<T,Dim0,Dim12,i,j,k> TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,double>::V,Dim0,Dim12,i,j,k>
+    (TensorExpr(a,d_ijk,d_xyz));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/diffusion_Tensor1.h
--- a/Tensor1/diffusion_Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/* Computes 2*del^2 of a Tensor1_ptr but uses diagonal derivatives for
-   half of it.  Yields a Tensor1. */
-
-template<class T, int Dim, char i>
-class diffusion_Tensor1
-{
-  const Tensor1<T*,Dim> &a;
-  const int di,dj,dk;
-  const double dx;
-public:
-  typename promote<T,double>::V operator()(const int N1) const
-  {
-    return
-      ((*(a.ptr(N1)+di) - 2*a(N1) + *(a.ptr(N1)-di))
-       + (*(a.ptr(N1)+dj) - 2*a(N1) + *(a.ptr(N1)-dj))
-       + (*(a.ptr(N1)+dk) - 2*a(N1) + *(a.ptr(N1)-dk))
-       + ((*(a.ptr(N1)+di+dj) + *(a.ptr(N1)+di-dj)
-	   + *(a.ptr(N1)-di+dj) + *(a.ptr(N1)-di-dj)
-	   - 4*a(N1))
-	  + (*(a.ptr(N1)+di+dk) + *(a.ptr(N1)+di-dk)
-	     + *(a.ptr(N1)-di+dk) + *(a.ptr(N1)-di-dk)
-	     - 4*a(N1))
-	  + (*(a.ptr(N1)+dj+dk) + *(a.ptr(N1)+dj-dk)
-	     + *(a.ptr(N1)-dj+dk) + *(a.ptr(N1)-dj-dk)
-	     - 4*a(N1)))/(std::sqrt(2.0)))*dx*dx;
-  }
-  diffusion_Tensor1(const Tensor1<T*,Dim> &A, const int Di,
-		    const int Dj, const int Dk, const double Dx):
-    a(A), di(Di), dj(Dj), dk(Dk), dx(Dx) {}
-};
-
-template<class T, int Dim, char i>
-inline const Tensor1_Expr<const diffusion_Tensor1<T,Dim,i>,
-  typename promote<T,double>::V,Dim,i>
-diffusion(const Tensor1<T*,Dim> &a, const Index<i,Dim> index1,
-	  const int &di, const int &dj, const int &dk,
-	  const double &dx)
-{
-  typedef const diffusion_Tensor1<T,Dim,i> Tensor_Expr;
-  return Tensor1_Expr<Tensor_Expr,typename promote<T,double>::V,Dim,i>
-    (Tensor_Expr(a,di,dj,dk,dx));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/diffusion_Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/diffusion_Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,42 @@
+/* Computes 2*del^2 of a Tensor1_ptr but uses diagonal derivatives for
+   half of it.  Yields a Tensor1. */
+
+template<class T, int Dim, char i>
+class diffusion_Tensor1
+{
+  const Tensor1<T*,Dim> &a;
+  const int di,dj,dk;
+  const double dx;
+public:
+  typename promote<T,double>::V operator()(const int N1) const
+  {
+    return
+      ((*(a.ptr(N1)+di) - 2*a(N1) + *(a.ptr(N1)-di))
+       + (*(a.ptr(N1)+dj) - 2*a(N1) + *(a.ptr(N1)-dj))
+       + (*(a.ptr(N1)+dk) - 2*a(N1) + *(a.ptr(N1)-dk))
+       + ((*(a.ptr(N1)+di+dj) + *(a.ptr(N1)+di-dj)
+	   + *(a.ptr(N1)-di+dj) + *(a.ptr(N1)-di-dj)
+	   - 4*a(N1))
+	  + (*(a.ptr(N1)+di+dk) + *(a.ptr(N1)+di-dk)
+	     + *(a.ptr(N1)-di+dk) + *(a.ptr(N1)-di-dk)
+	     - 4*a(N1))
+	  + (*(a.ptr(N1)+dj+dk) + *(a.ptr(N1)+dj-dk)
+	     + *(a.ptr(N1)-dj+dk) + *(a.ptr(N1)-dj-dk)
+	     - 4*a(N1)))/(std::sqrt(2.0)))*dx*dx;
+  }
+  diffusion_Tensor1(const Tensor1<T*,Dim> &A, const int Di,
+		    const int Dj, const int Dk, const double Dx):
+    a(A), di(Di), dj(Dj), dk(Dk), dx(Dx) {}
+};
+
+template<class T, int Dim, char i>
+inline const Tensor1_Expr<const diffusion_Tensor1<T,Dim,i>,
+  typename promote<T,double>::V,Dim,i>
+diffusion(const Tensor1<T*,Dim> &a, const Index<i,Dim> index1,
+	  const int &di, const int &dj, const int &dk,
+	  const double &dx)
+{
+  typedef const diffusion_Tensor1<T,Dim,i> Tensor_Expr;
+  return Tensor1_Expr<Tensor_Expr,typename promote<T,double>::V,Dim,i>
+    (Tensor_Expr(a,di,dj,dk,dx));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/generic_minus_Tensor1.h
--- a/Tensor1/generic_minus_Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/* Subtracts a Tensor1 from a generic, yielding a Tensor1. */
-
-template<class A, class T, class U, int Dim, char i>
-class generic_minus_Tensor1
-{
-  const Tensor1_Expr<A,T,Dim,i> iterA;
-  const U d;
-public:
-  typename promote<T,U>::V operator()(const int N) const
-  {
-    return d-iterA(N);
-  }
-
-  generic_minus_Tensor1(const Tensor1_Expr<A,T,Dim,i> &a, const U &d0):
-    iterA(a), d(d0) {}
-};
-
-template<class A, class T, class U, int Dim, char i>
-inline const Tensor1_Expr<const generic_minus_Tensor1<A,T,U,Dim,i>,
-  typename promote<T,U>::V,Dim,i>
-operator-(const U &d0, const Tensor1_Expr<A,T,Dim,i> &a)
-{
-  typedef const generic_minus_Tensor1<A,T,U,Dim,i> TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,d0));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/generic_minus_Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/generic_minus_Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,26 @@
+/* Subtracts a Tensor1 from a generic, yielding a Tensor1. */
+
+template<class A, class T, class U, int Dim, char i>
+class generic_minus_Tensor1
+{
+  const Tensor1_Expr<A,T,Dim,i> iterA;
+  const U d;
+public:
+  typename promote<T,U>::V operator()(const int N) const
+  {
+    return d-iterA(N);
+  }
+
+  generic_minus_Tensor1(const Tensor1_Expr<A,T,Dim,i> &a, const U &d0):
+    iterA(a), d(d0) {}
+};
+
+template<class A, class T, class U, int Dim, char i>
+inline const Tensor1_Expr<const generic_minus_Tensor1<A,T,U,Dim,i>,
+  typename promote<T,U>::V,Dim,i>
+operator-(const U &d0, const Tensor1_Expr<A,T,Dim,i> &a)
+{
+  typedef const generic_minus_Tensor1<A,T,U,Dim,i> TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,d0));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/interpolate_Tensor1.h
--- a/Tensor1/interpolate_Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/* Interpolates to (i0+distance[0], j0+distance[1], k0+distance[2])
-   yielding a Tensor1.  (i0,j0,k0) are 3D array coordinates,
-   conjugate==1-distance, and (di,dj,dk) are the stride of the array
-   coordinates.  It is assumed that the Tensor1<T*,Dim> is zero
-   centered. */
-
-template<class T, int Dim, char i>
-class interpolate_Tensor1
-{
-  const Tensor1<T*,Dim> &a;
-  const int di,dj,dk,i0,j0,k0;
-  const double *distance, *conjugate;
-public:
-  typename promote<T,double>::V operator()(const int N1) const
-  {
-  return 
-    conjugate[0]*conjugate[1]*conjugate[2]
-    * (*(a.ptr(N1) + di*i0 + dj*j0 + dk*k0))
-    + distance[0]*conjugate[1]*conjugate[2]
-    * (*(a.ptr(N1) + di*(i0+1) + dj*(j0) + dk*(k0)))
-    + conjugate[0]*distance[1]*conjugate[2]
-    * (*(a.ptr(N1) + di*(i0) + dj*(j0+1) + dk*(k0)))
-    + distance[0]*distance[1]*conjugate[2]
-    * (*(a.ptr(N1) + di*(i0+1) + dj*(j0+1) + dk*(k0)))
-    + conjugate[0]*conjugate[1]*distance[2]
-    * (*(a.ptr(N1) + di*(i0) + dj*(j0) + dk*(k0+1)))
-    + distance[0]*conjugate[1]*distance[2]
-    * (*(a.ptr(N1) + di*(i0+1) + dj*(j0) + dk*(k0+1)))
-    + conjugate[0]*distance[1]*distance[2]
-    * (*(a.ptr(N1) + di*(i0) + dj*(j0+1) + dk*(k0+1)))
-    + distance[0]*distance[1]*distance[2]
-    * (*(a.ptr(N1) + di*(i0+1) + dj*(j0+1) + dk*(k0+1)));
-  }
-  interpolate_Tensor1(const Tensor1<T*,Dim> &A, const int Di,
-		      const int Dj, const int Dk, const int I0,
-		      const int J0, const int K0, const double Distance[3],
-		      const double Conjugate[3]):
-    a(A), di(Di), dj(Dj), dk(Dk), i0(I0), j0(J0), k0(K0),
-    distance(Distance), conjugate(Conjugate) {}
-};
-
-template<class T, int Dim, char i>
-inline const Tensor1_Expr<const interpolate_Tensor1<T,Dim,i>,
-  typename promote<T,double>::V,Dim,i>
-interpolate(const Tensor1<T*,Dim> &a, const Index<i,Dim> index1,
-	    const int &di, const int &dj, const int &dk,
-	    const int &i0, const int &j0, const int &k0,
-	    const double distance[3], const double conjugate[3])
-{
-  typedef const interpolate_Tensor1<T,Dim,i> Tensor_Expr;
-  return Tensor1_Expr<Tensor_Expr,typename promote<T,double>::V,Dim,i>
-    (Tensor_Expr(a,di,dj,dk,i0,j0,k0,distance,conjugate));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/interpolate_Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/interpolate_Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,53 @@
+/* Interpolates to (i0+distance[0], j0+distance[1], k0+distance[2])
+   yielding a Tensor1.  (i0,j0,k0) are 3D array coordinates,
+   conjugate==1-distance, and (di,dj,dk) are the stride of the array
+   coordinates.  It is assumed that the Tensor1<T*,Dim> is zero
+   centered. */
+
+template<class T, int Dim, char i>
+class interpolate_Tensor1
+{
+  const Tensor1<T*,Dim> &a;
+  const int di,dj,dk,i0,j0,k0;
+  const double *distance, *conjugate;
+public:
+  typename promote<T,double>::V operator()(const int N1) const
+  {
+  return 
+    conjugate[0]*conjugate[1]*conjugate[2]
+    * (*(a.ptr(N1) + di*i0 + dj*j0 + dk*k0))
+    + distance[0]*conjugate[1]*conjugate[2]
+    * (*(a.ptr(N1) + di*(i0+1) + dj*(j0) + dk*(k0)))
+    + conjugate[0]*distance[1]*conjugate[2]
+    * (*(a.ptr(N1) + di*(i0) + dj*(j0+1) + dk*(k0)))
+    + distance[0]*distance[1]*conjugate[2]
+    * (*(a.ptr(N1) + di*(i0+1) + dj*(j0+1) + dk*(k0)))
+    + conjugate[0]*conjugate[1]*distance[2]
+    * (*(a.ptr(N1) + di*(i0) + dj*(j0) + dk*(k0+1)))
+    + distance[0]*conjugate[1]*distance[2]
+    * (*(a.ptr(N1) + di*(i0+1) + dj*(j0) + dk*(k0+1)))
+    + conjugate[0]*distance[1]*distance[2]
+    * (*(a.ptr(N1) + di*(i0) + dj*(j0+1) + dk*(k0+1)))
+    + distance[0]*distance[1]*distance[2]
+    * (*(a.ptr(N1) + di*(i0+1) + dj*(j0+1) + dk*(k0+1)));
+  }
+  interpolate_Tensor1(const Tensor1<T*,Dim> &A, const int Di,
+		      const int Dj, const int Dk, const int I0,
+		      const int J0, const int K0, const double Distance[3],
+		      const double Conjugate[3]):
+    a(A), di(Di), dj(Dj), dk(Dk), i0(I0), j0(J0), k0(K0),
+    distance(Distance), conjugate(Conjugate) {}
+};
+
+template<class T, int Dim, char i>
+inline const Tensor1_Expr<const interpolate_Tensor1<T,Dim,i>,
+  typename promote<T,double>::V,Dim,i>
+interpolate(const Tensor1<T*,Dim> &a, const Index<i,Dim> index1,
+	    const int &di, const int &dj, const int &dk,
+	    const int &i0, const int &j0, const int &k0,
+	    const double distance[3], const double conjugate[3])
+{
+  typedef const interpolate_Tensor1<T,Dim,i> Tensor_Expr;
+  return Tensor1_Expr<Tensor_Expr,typename promote<T,double>::V,Dim,i>
+    (Tensor_Expr(a,di,dj,dk,i0,j0,k0,distance,conjugate));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/minus_Tensor1.h
--- a/Tensor1/minus_Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-/* Declares a wrapper class for the unary minus (-) operator. */
-
-template<class A, class T, int Dim, char i>
-class minus_Tensor1
-{
-  const Tensor1_Expr<A,T,Dim,i> iterA;
-public:
-  T operator()(const int N) const
-  {
-    return -iterA(N);
-  }
-
-  minus_Tensor1(const Tensor1_Expr<A,T,Dim,i> &a): iterA(a) {}
-};
-
-template<class A, class T, int Dim, char i>
-inline const Tensor1_Expr<const minus_Tensor1<A,T,Dim,i>,T,Dim,i>
-operator-(const Tensor1_Expr<A,T,Dim,i> &a)
-{
-    typedef const minus_Tensor1<A,T,Dim,i> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(a));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor1/minus_Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor1/minus_Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,22 @@
+/* Declares a wrapper class for the unary minus (-) operator. */
+
+template<class A, class T, int Dim, char i>
+class minus_Tensor1
+{
+  const Tensor1_Expr<A,T,Dim,i> iterA;
+public:
+  T operator()(const int N) const
+  {
+    return -iterA(N);
+  }
+
+  minus_Tensor1(const Tensor1_Expr<A,T,Dim,i> &a): iterA(a) {}
+};
+
+template<class A, class T, int Dim, char i>
+inline const Tensor1_Expr<const minus_Tensor1<A,T,Dim,i>,T,Dim,i>
+operator-(const Tensor1_Expr<A,T,Dim,i> &a)
+{
+    typedef const minus_Tensor1<A,T,Dim,i> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(a));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2.h
--- a/Tensor2.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-/* Declarations for Tensor2. */
-
-#include "Tensor2/Tensor2_number.h"
-#include "Tensor2/Tensor2_numeral.h"
-
-#include "Tensor2/Tensor2_constructor.h"
-#include "Tensor2/Tensor2_value.h"
-#include "Tensor2/Tensor2_pointer.h"
-
-#include "Tensor2/Tensor2_Expr.h"
diff -r dd991b426d75 -r 1042a48dad5a Tensor2.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,10 @@
+/* Declarations for Tensor2. */
+
+#include "Tensor2/Tensor2_number.hpp"
+#include "Tensor2/Tensor2_numeral.hpp"
+
+#include "Tensor2/Tensor2_constructor.hpp"
+#include "Tensor2/Tensor2_value.hpp"
+#include "Tensor2/Tensor2_pointer.hpp"
+
+#include "Tensor2/Tensor2_Expr.hpp"
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_Expr.h
--- a/Tensor2/Tensor2_Expr.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,134 +0,0 @@
-/* Declares a wrapper class for rank 2 Tensor expressions.  I
-   specialize it for when I wrap a simple Tensor2 or Tensor2_ptr so
-   that it has a reference to the Tensor2(_ptr) and not a copy.
-   Otherwise assignment wouldn't work. */
-
-#include "Tensor2_plus_Tensor2.h"
-#include "Tensor2_minus_Tensor2.h"
-#include "Tensor2_or_Tensor2.h"
-#include "Tensor2_times_Tensor2.h"
-#include "Tensor2_carat_Tensor2.h"
-#include "Tensor2_times_Tensor1.h"
-#include "Tensor2_and_Tensor1.h"
-#include "Tensor2_times_generic.h"
-#include "Tensor2_divide_generic.h"
-#include "Tensor2_transform.h"
-#include "minus_Tensor2.h"
-#include "conj_Tensor2.h"
-
-template<class A, class T, int Dim0, int Dim1, char i, char j>
-class Tensor2_Expr
-{
-  A iter;
-public:
-  Tensor2_Expr(A &a): iter(a) {}
-  T operator()(const int N1, const int N2) const
-  {
-    return iter(N1,N2);
-  }
-};
-
-template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
-class Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>
-{
-  Tensor2<A,Dim0,Dim1,layout> &iter;
-public:
-  Tensor2_Expr(Tensor2<A,Dim0,Dim1,layout> &a): iter(a) {}
-  T & operator()(const int N1, const int N2)
-  {
-    return iter(N1,N2);
-  }
-  T operator()(const int N1, const int N2) const
-  {
-    return iter(N1,N2);
-  }
-
-  /* Various assignment operators.  I have to explicitly declare the
-     second operator= because otherwise the compiler will generate its
-     own and not use the template code. */
-
-  template<class B, class U>
-  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-  operator=(const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result);
-  
-  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-  operator=(const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &result);
-  
-  template<class B, class U>
-  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-  operator+=(const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result);
-
-  template<class B, class U>
-  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-  operator-=(const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result);
-
-  /* This is for when the indices are switched (i,j) -> (j,i). */
-
-  template<class B, class U>
-  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-  operator=(const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result);
-
-  template<class B, class U>
-  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-  operator+=(const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result);
-
-  template<class B, class U>
-  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-  operator-=(const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result);
-
-  /* This is for int's, double's, etc. */
-
-  template <class B>
-  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-  operator=(const B &d);
-
-  template <class B>
-  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-  operator+=(const B &d);
-
-  template <class B>
-  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-  operator-=(const B &d);
-
-  template <class B>
-  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-  operator*=(const B &d);
-
-  template <class B>
-  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-  operator/=(const B &d);
-};
-
-/* Specialized for Tensor3_dg_number_rhs_0 (Tensor3_dg with the
-   first or second index explicitly given). */
-
-template<class A, class T, int Dim0, int Dim1, char i, char j, int N>
-class Tensor2_Expr<Tensor3_dg_number_rhs_0<A,T,N>,T,Dim0,Dim1,i,j>
-{
-  A &iter;
-public:
-  Tensor2_Expr(A &a): iter(a) {}
-  T & operator()(const int N1, const int N2)
-  {
-    return iter(N,N1,N2);
-  }
-  T operator()(const int N1, const int N2) const
-  {
-    return iter(N,N1,N2);
-  }
-
-  /* Various assignment operators.  I have to explicitly declare the
-     second operator= because otherwise the compiler will generate its
-     own and not use the template code. */
-
-  template<class B, class U>
-  const Tensor2_Expr<Tensor3_dg_number_rhs_0<A,T,N>,T,Dim0,Dim1,i,j> &
-  operator=(const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result);
-
-  const Tensor2_Expr<Tensor3_dg_number_rhs_0<A,T,N>,T,Dim0,Dim1,i,j> &
-  operator=(const Tensor2_Expr<Tensor3_dg_number_rhs_0
-	    <A,T,N>,T,Dim0,Dim1,i,j> &result);
-
-};
-
-#include "Tensor2_Expr_equals.h"
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_Expr.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2/Tensor2_Expr.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,134 @@
+/* Declares a wrapper class for rank 2 Tensor expressions.  I
+   specialize it for when I wrap a simple Tensor2 or Tensor2_ptr so
+   that it has a reference to the Tensor2(_ptr) and not a copy.
+   Otherwise assignment wouldn't work. */
+
+#include "Tensor2_plus_Tensor2.hpp"
+#include "Tensor2_minus_Tensor2.hpp"
+#include "Tensor2_or_Tensor2.hpp"
+#include "Tensor2_times_Tensor2.hpp"
+#include "Tensor2_carat_Tensor2.hpp"
+#include "Tensor2_times_Tensor1.hpp"
+#include "Tensor2_and_Tensor1.hpp"
+#include "Tensor2_times_generic.hpp"
+#include "Tensor2_divide_generic.hpp"
+#include "Tensor2_transform.hpp"
+#include "minus_Tensor2.hpp"
+#include "conj_Tensor2.hpp"
+
+template<class A, class T, int Dim0, int Dim1, char i, char j>
+class Tensor2_Expr
+{
+  A iter;
+public:
+  Tensor2_Expr(A &a): iter(a) {}
+  T operator()(const int N1, const int N2) const
+  {
+    return iter(N1,N2);
+  }
+};
+
+template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
+class Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>
+{
+  Tensor2<A,Dim0,Dim1,layout> &iter;
+public:
+  Tensor2_Expr(Tensor2<A,Dim0,Dim1,layout> &a): iter(a) {}
+  T & operator()(const int N1, const int N2)
+  {
+    return iter(N1,N2);
+  }
+  T operator()(const int N1, const int N2) const
+  {
+    return iter(N1,N2);
+  }
+
+  /* Various assignment operators.  I have to explicitly declare the
+     second operator= because otherwise the compiler will generate its
+     own and not use the template code. */
+
+  template<class B, class U>
+  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+  operator=(const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result);
+  
+  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+  operator=(const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &result);
+  
+  template<class B, class U>
+  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+  operator+=(const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result);
+
+  template<class B, class U>
+  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+  operator-=(const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result);
+
+  /* This is for when the indices are switched (i,j) -> (j,i). */
+
+  template<class B, class U>
+  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+  operator=(const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result);
+
+  template<class B, class U>
+  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+  operator+=(const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result);
+
+  template<class B, class U>
+  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+  operator-=(const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result);
+
+  /* This is for int's, double's, etc. */
+
+  template <class B>
+  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+  operator=(const B &d);
+
+  template <class B>
+  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+  operator+=(const B &d);
+
+  template <class B>
+  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+  operator-=(const B &d);
+
+  template <class B>
+  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+  operator*=(const B &d);
+
+  template <class B>
+  const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+  operator/=(const B &d);
+};
+
+/* Specialized for Tensor3_dg_number_rhs_0 (Tensor3_dg with the
+   first or second index explicitly given). */
+
+template<class A, class T, int Dim0, int Dim1, char i, char j, int N>
+class Tensor2_Expr<Tensor3_dg_number_rhs_0<A,T,N>,T,Dim0,Dim1,i,j>
+{
+  A &iter;
+public:
+  Tensor2_Expr(A &a): iter(a) {}
+  T & operator()(const int N1, const int N2)
+  {
+    return iter(N,N1,N2);
+  }
+  T operator()(const int N1, const int N2) const
+  {
+    return iter(N,N1,N2);
+  }
+
+  /* Various assignment operators.  I have to explicitly declare the
+     second operator= because otherwise the compiler will generate its
+     own and not use the template code. */
+
+  template<class B, class U>
+  const Tensor2_Expr<Tensor3_dg_number_rhs_0<A,T,N>,T,Dim0,Dim1,i,j> &
+  operator=(const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result);
+
+  const Tensor2_Expr<Tensor3_dg_number_rhs_0<A,T,N>,T,Dim0,Dim1,i,j> &
+  operator=(const Tensor2_Expr<Tensor3_dg_number_rhs_0
+	    <A,T,N>,T,Dim0,Dim1,i,j> &result);
+
+};
+
+#include "Tensor2_Expr_equals.hpp"
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_Expr_equals.h
--- a/Tensor2/Tensor2_Expr_equals.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,516 +0,0 @@
-/* Various assignment operators. */
-
-/* T2=T2 */
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
-  int Current_Dim0, int Current_Dim1>
-inline void T2_equals_T2(A &iter,
-			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
-			 const Number<Current_Dim0> &N0,
-			 const Number<Current_Dim1> &N1)
-{
-  iter(Current_Dim0-1,Current_Dim1-1)=result(Current_Dim0-1,Current_Dim1-1);
-  T2_equals_T2(iter,result,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-}
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
-  int Current_Dim1>
-inline void T2_equals_T2(A &iter,
-			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
-			 const Number<1> &N0,
-			 const Number<Current_Dim1> &N1)
-{
-  iter(0,Current_Dim1-1)=result(0,Current_Dim1-1);
-  T2_equals_T2(iter,result,Number<Dim0>(),Number<Current_Dim1-1>());
-}
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j>
-inline void T2_equals_T2(A &iter,
-			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
-			 const Number<1> &N0,
-			 const Number<1> &N1)
-{
-  iter(0,0)=result(0,0);
-}
-
-template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
-template<class B, class U> inline
-const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
-operator=(const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result)
-{
-  T2_equals_T2(iter,result,Number<Dim0>(),Number<Dim1>());
-  return *this;
-}
-
-/* T2=T2_Expr(T2) */
-
-template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
-inline const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
-operator=(const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &result)
-{
-  return operator=<Tensor2<A,Dim0,Dim1,layout>,T>(result);
-}
-
-/* T2+=T2 */
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
-  int Current_Dim0, int Current_Dim1>
-inline void T2_plus_equals_T2(A &iter,
-			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
-			 const Number<Current_Dim0> &N0,
-			 const Number<Current_Dim1> &N1)
-{
-  iter(Current_Dim0-1,Current_Dim1-1)+=result(Current_Dim0-1,Current_Dim1-1);
-  T2_plus_equals_T2(iter,result,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-}
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
-  int Current_Dim1>
-inline void T2_plus_equals_T2(A &iter,
-			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
-			 const Number<1> &N0,
-			 const Number<Current_Dim1> &N1)
-{
-  iter(0,Current_Dim1-1)+=result(0,Current_Dim1-1);
-  T2_plus_equals_T2(iter,result,Number<Dim0>(),Number<Current_Dim1-1>());
-}
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j>
-inline void T2_plus_equals_T2(A &iter,
-			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
-			 const Number<1> &N0,
-			 const Number<1> &N1)
-{
-  iter(0,0)+=result(0,0);
-}
-
-template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
-template<class B, class U> inline
-const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
-operator+=(const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result)
-{
-  T2_plus_equals_T2(iter,result,Number<Dim0>(),Number<Dim1>());
-  return *this;
-}
-
-/* T2-=T2 */
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
-  int Current_Dim0, int Current_Dim1>
-inline void T2_minus_equals_T2(A &iter,
-			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
-			 const Number<Current_Dim0> &N0,
-			 const Number<Current_Dim1> &N1)
-{
-  iter(Current_Dim0-1,Current_Dim1-1)-=result(Current_Dim0-1,Current_Dim1-1);
-  T2_minus_equals_T2(iter,result,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-}
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
-  int Current_Dim1>
-inline void T2_minus_equals_T2(A &iter,
-			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
-			 const Number<1> &N0,
-			 const Number<Current_Dim1> &N1)
-{
-  iter(0,Current_Dim1-1)-=result(0,Current_Dim1-1);
-  T2_minus_equals_T2(iter,result,Number<Dim0>(),Number<Current_Dim1-1>());
-}
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j>
-inline void T2_minus_equals_T2(A &iter,
-			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
-			 const Number<1> &N0,
-			 const Number<1> &N1)
-{
-  iter(0,0)-=result(0,0);
-}
-
-template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
-template<class B, class U> inline
-const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
-operator-=(const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result)
-{
-  T2_minus_equals_T2(iter,result,Number<Dim0>(),Number<Dim1>());
-  return *this;
-}
-
-/* This is for when the indices are switched (i,j) -> (j,i). */
-
-/* T2(i,j)=T2(j,i) */
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
-  int Current_Dim0, int Current_Dim1>
-inline void T2_equals_switched_T2
-(A &iter, const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result,
- const Number<Current_Dim0> &N0, const Number<Current_Dim1> &N1)
-{
-  iter(Current_Dim0-1,Current_Dim1-1)=result(Current_Dim1-1,Current_Dim0-1);
-  T2_equals_switched_T2(iter,result,Number<Current_Dim0-1>(),
-			Number<Current_Dim1>());
-}
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
-  int Current_Dim1>
-inline void T2_equals_switched_T2
-(A &iter, const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result,
- const Number<1> &N0, const Number<Current_Dim1> &N1)
-{
-  iter(0,Current_Dim1-1)=result(Current_Dim1-1,0);
-  T2_equals_switched_T2(iter,result,Number<Dim0>(),Number<Current_Dim1-1>());
-}
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j>
-inline void T2_equals_switched_T2
-(A &iter, const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result,
- const Number<1> &N0, const Number<1> &N1)
-{
-  iter(0,0)=result(0,0);
-}
-
-template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
-template<class B, class U> inline
-const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
-operator=(const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result)
-{
-  T2_equals_switched_T2(iter,result,Number<Dim0>(),Number<Dim1>());
-  return *this;
-}
-
-/* T2(i,j)+=T2(j,i) */
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
-  int Current_Dim0, int Current_Dim1>
-inline void T2_plus_equals_switched_T2
-(A &iter, const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result,
- const Number<Current_Dim0> &N0, const Number<Current_Dim1> &N1)
-{
-  iter(Current_Dim0-1,Current_Dim1-1)+=result(Current_Dim1-1,Current_Dim0-1);
-  T2_plus_equals_switched_T2(iter,result,Number<Current_Dim0-1>(),
-			Number<Current_Dim1>());
-}
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
-  int Current_Dim1>
-inline void T2_plus_equals_switched_T2
-(A &iter, const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result,
- const Number<1> &N0, const Number<Current_Dim1> &N1)
-{
-  iter(0,Current_Dim1-1)+=result(Current_Dim1-1,0);
-  T2_plus_equals_switched_T2(iter,result,Number<Dim0>(),Number<Current_Dim1-1>());
-}
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j>
-inline void T2_plus_equals_switched_T2
-(A &iter, const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result,
- const Number<1> &N0, const Number<1> &N1)
-{
-  iter(0,0)+=result(0,0);
-}
-
-template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
-template<class B, class U> inline
-const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
-operator+=(const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result)
-{
-  T2_plus_equals_switched_T2(iter,result,Number<Dim0>(),Number<Dim1>());
-  return *this;
-}
-
-/* T2(i,j)-=T2(j,i) */
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
-  int Current_Dim0, int Current_Dim1>
-inline void T2_minus_equals_switched_T2
-(A &iter, const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result,
- const Number<Current_Dim0> &N0, const Number<Current_Dim1> &N1)
-{
-  iter(Current_Dim0-1,Current_Dim1-1)-=result(Current_Dim1-1,Current_Dim0-1);
-  T2_minus_equals_switched_T2(iter,result,Number<Current_Dim0-1>(),
-			Number<Current_Dim1>());
-}
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
-  int Current_Dim1>
-inline void T2_minus_equals_switched_T2
-(A &iter, const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result,
- const Number<1> &N0, const Number<Current_Dim1> &N1)
-{
-  iter(0,Current_Dim1-1)-=result(Current_Dim1-1,0);
-  T2_minus_equals_switched_T2(iter,result,Number<Dim0>(),Number<Current_Dim1-1>());
-}
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j>
-inline void T2_minus_equals_switched_T2
-(A &iter, const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result,
- const Number<1> &N0, const Number<1> &N1)
-{
-  iter(0,0)-=result(0,0);
-}
-
-template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
-template<class B, class U> inline
-const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
-operator-=(const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result)
-{
-  T2_minus_equals_switched_T2(iter,result,Number<Dim0>(),Number<Dim1>());
-  return *this;
-}
-
-/* For int's, double's, etc. */
-
-/* T2=U */
-
-template<class A, class U, int Dim0, int Dim1,
-  int Current_Dim0, int Current_Dim1, Layout layout>
-inline void T2_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
-			      const Number<Current_Dim0> &N0,
-			      const Number<Current_Dim1> &N1)
-{
-  iter(Current_Dim0-1,Current_Dim1-1)=u;
-  T2_equals_generic(iter,u,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-}
-
-template<class A, class U, int Dim0, int Dim1, int Current_Dim1, Layout layout>
-inline void T2_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
-			      const Number<1> &N0,
-			      const Number<Current_Dim1> &N1)
-{
-  iter(0,Current_Dim1-1)=u;
-  T2_equals_generic(iter,u,Number<Dim0>(),Number<Current_Dim1-1>());
-}
-
-template<class A, class U, int Dim0, int Dim1, Layout layout>
-inline void T2_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
-			      const Number<1> &N0, const Number<1> &N1)
-{
-  iter(0,0)=u;
-}
-
-template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
-template<class U> inline
-const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
-operator=(const U &u)
-{
-  T2_equals_generic(iter,u,Number<Dim0>(),Number<Dim1>());
-  return *this;
-}
-
-/* T2+=U */
-
-template<class A, class U, int Dim0, int Dim1,
-  int Current_Dim0, int Current_Dim1, Layout layout>
-inline void T2_plus_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
-				   const Number<Current_Dim0> &N0,
-				   const Number<Current_Dim1> &N1)
-{
-  iter(Current_Dim0-1,Current_Dim1-1)+=u;
-  T2_plus_equals_generic(iter,u,Number<Current_Dim0-1>(),
-			 Number<Current_Dim1>());
-}
-
-template<class A, class U, int Dim0, int Dim1, int Current_Dim1, Layout layout>
-inline void T2_plus_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
-				   const Number<1> &N0,
-				   const Number<Current_Dim1> &N1)
-{
-  iter(0,Current_Dim1-1)+=u;
-  T2_plus_equals_generic(iter,u,Number<Dim0>(),Number<Current_Dim1-1>());
-}
-
-template<class A, class U, int Dim0, int Dim1, Layout layout>
-inline void T2_plus_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
-				   const Number<1> &N0, const Number<1> &N1)
-{
-  iter(0,0)+=u;
-}
-
-template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
-template<class U> inline
-const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
-operator+=(const U &u)
-{
-  T2_plus_equals_generic(iter,u,Number<Dim0>(),Number<Dim1>());
-  return *this;
-}
-
-/* T2-=U */
-
-template<class A, class U, int Dim0, int Dim1,
-  int Current_Dim0, int Current_Dim1, Layout layout>
-inline void T2_minus_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
-			      const Number<Current_Dim0> &N0,
-			      const Number<Current_Dim1> &N1)
-{
-  iter(Current_Dim0-1,Current_Dim1-1)-=u;
-  T2_minus_equals_generic(iter,u,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-}
-
-template<class A, class U, int Dim0, int Dim1, int Current_Dim1, Layout layout>
-inline void T2_minus_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
-			      const Number<1> &N0,
-			      const Number<Current_Dim1> &N1)
-{
-  iter(0,Current_Dim1-1)-=u;
-  T2_minus_equals_generic(iter,u,Number<Dim0>(),Number<Current_Dim1-1>());
-}
-
-template<class A, class U, int Dim0, int Dim1, Layout layout>
-inline void T2_minus_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
-			      const Number<1> &N0, const Number<1> &N1)
-{
-  iter(0,0)-=u;
-}
-
-template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
-template<class U> inline
-const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
-operator-=(const U &u)
-{
-  T2_minus_equals_generic(iter,u,Number<Dim0>(),Number<Dim1>());
-  return *this;
-}
-
-/* T2*=U */
-
-template<class A, class U, int Dim0, int Dim1,
-  int Current_Dim0, int Current_Dim1, Layout layout>
-inline void T2_times_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
-			      const Number<Current_Dim0> &N0,
-			      const Number<Current_Dim1> &N1)
-{
-  iter(Current_Dim0-1,Current_Dim1-1)*=u;
-  T2_times_equals_generic(iter,u,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-}
-
-template<class A, class U, int Dim0, int Dim1, int Current_Dim1, Layout layout>
-inline void T2_times_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
-			      const Number<1> &N0,
-			      const Number<Current_Dim1> &N1)
-{
-  iter(0,Current_Dim1-1)*=u;
-  T2_times_equals_generic(iter,u,Number<Dim0>(),Number<Current_Dim1-1>());
-}
-
-template<class A, class U, int Dim0, int Dim1, Layout layout>
-inline void T2_times_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
-			      const Number<1> &N0, const Number<1> &N1)
-{
-  iter(0,0)*=u;
-}
-
-template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
-template<class U> inline
-const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
-operator*=(const U &u)
-{
-  T2_times_equals_generic(iter,u,Number<Dim0>(),Number<Dim1>());
-  return *this;
-}
-
-/* T2/=U */
-
-template<class A, class U, int Dim0, int Dim1,
-  int Current_Dim0, int Current_Dim1, Layout layout>
-inline void T2_divide_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
-			      const Number<Current_Dim0> &N0,
-			      const Number<Current_Dim1> &N1)
-{
-  iter(Current_Dim0-1,Current_Dim1-1)/=u;
-  T2_divide_equals_generic(iter,u,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-}
-
-template<class A, class U, int Dim0, int Dim1, int Current_Dim1, Layout layout>
-inline void T2_divide_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
-			      const Number<1> &N0,
-			      const Number<Current_Dim1> &N1)
-{
-  iter(0,Current_Dim1-1)/=u;
-  T2_divide_equals_generic(iter,u,Number<Dim0>(),Number<Current_Dim1-1>());
-}
-
-template<class A, class U, int Dim0, int Dim1, Layout layout>
-inline void T2_divide_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
-			      const Number<1> &N0, const Number<1> &N1)
-{
-  iter(0,0)/=u;
-}
-
-template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
-template<class U> inline
-const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
-Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
-operator/=(const U &u)
-{
-  T2_divide_equals_generic(iter,u,Number<Dim0>(),Number<Dim1>());
-  return *this;
-}
-
-
-/* Various assignment operators for Tensor3_dg_number_rhs_0.  I have
-   to explicitly declare the second operator= because otherwise the
-   compiler will generate its own and not use the template code. */
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j, int N,
-  int Current_Dim0, int Current_Dim1> inline
-void T3dgrhs0_equals_T2(A &iter,
-			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
-			 const Number<Current_Dim0> &N0,
-			 const Number<Current_Dim1> &N1, const Number<N> &NN)
-{
-  iter(N,Current_Dim0-1,Current_Dim1-1)=result(Current_Dim0-1,Current_Dim1-1);
-  T3dgrhs0_equals_T2(iter,result,Number<Current_Dim0-1>(),
-		      Number<Current_Dim1>(),Number<N>());
-}
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j, int N,
-  int Current_Dim1> inline
-void T3dgrhs0_equals_T2(A &iter,
-			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
-			 const Number<1> &N0, const Number<Current_Dim1> &N1,
-			 const Number<N> &NN)
-{
-  iter(N,0,Current_Dim1-1)=result(0,Current_Dim1-1);
-  T3dgrhs0_equals_T2(iter,result,Number<Dim0>(),
-		      Number<Current_Dim1-1>(),Number<N>());
-}
-
-template<class A, class B, class U, int Dim0, int Dim1, char i, char j, int N>
-inline
-void T3dgrhs0_equals_T2(A &iter,
-			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
-			 const Number<1> &N0, const Number<1> &N1,
-			 const Number<N> &NN)
-{
-  iter(N,0,0)=result(0,0);
-}
-
-template<class A, class T, int Dim0, int Dim1, char i, char j, int N>
-template<class B, class U> inline
-const Tensor2_Expr<Tensor3_dg_number_rhs_0<A,T,N>,T,Dim0,Dim1,i,j> &
-Tensor2_Expr<Tensor3_dg_number_rhs_0<A,T,N>,T,Dim0,Dim1,i,j>
-::operator=(const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result)
-{
-  T3dgrhs0_equals_T2(iter,result,Number<Dim0>(),Number<Dim1>(),Number<N>());
-  return *this;
-}
-
-template<class A, class T, int Dim0, int Dim1, char i, char j, int N> inline
-const Tensor2_Expr<Tensor3_dg_number_rhs_0<A,T,N>,T,Dim0,Dim1,i,j> &
-Tensor2_Expr<Tensor3_dg_number_rhs_0<A,T,N>,T,Dim0,Dim1,i,j>
-::operator=(const Tensor2_Expr<Tensor3_dg_number_rhs_0<A,T,N>,T,Dim0,Dim1,i,j>
-	    &result)
-{
-  return operator=<Tensor3_dg_number_rhs_0<A,T,N>,T>(result);
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_Expr_equals.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2/Tensor2_Expr_equals.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,516 @@
+/* Various assignment operators. */
+
+/* T2=T2 */
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
+  int Current_Dim0, int Current_Dim1>
+inline void T2_equals_T2(A &iter,
+			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
+			 const Number<Current_Dim0> &N0,
+			 const Number<Current_Dim1> &N1)
+{
+  iter(Current_Dim0-1,Current_Dim1-1)=result(Current_Dim0-1,Current_Dim1-1);
+  T2_equals_T2(iter,result,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+}
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
+  int Current_Dim1>
+inline void T2_equals_T2(A &iter,
+			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
+			 const Number<1> &N0,
+			 const Number<Current_Dim1> &N1)
+{
+  iter(0,Current_Dim1-1)=result(0,Current_Dim1-1);
+  T2_equals_T2(iter,result,Number<Dim0>(),Number<Current_Dim1-1>());
+}
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j>
+inline void T2_equals_T2(A &iter,
+			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
+			 const Number<1> &N0,
+			 const Number<1> &N1)
+{
+  iter(0,0)=result(0,0);
+}
+
+template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
+template<class B, class U> inline
+const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
+operator=(const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result)
+{
+  T2_equals_T2(iter,result,Number<Dim0>(),Number<Dim1>());
+  return *this;
+}
+
+/* T2=T2_Expr(T2) */
+
+template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
+inline const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
+operator=(const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &result)
+{
+  return operator=<Tensor2<A,Dim0,Dim1,layout>,T>(result);
+}
+
+/* T2+=T2 */
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
+  int Current_Dim0, int Current_Dim1>
+inline void T2_plus_equals_T2(A &iter,
+			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
+			 const Number<Current_Dim0> &N0,
+			 const Number<Current_Dim1> &N1)
+{
+  iter(Current_Dim0-1,Current_Dim1-1)+=result(Current_Dim0-1,Current_Dim1-1);
+  T2_plus_equals_T2(iter,result,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+}
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
+  int Current_Dim1>
+inline void T2_plus_equals_T2(A &iter,
+			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
+			 const Number<1> &N0,
+			 const Number<Current_Dim1> &N1)
+{
+  iter(0,Current_Dim1-1)+=result(0,Current_Dim1-1);
+  T2_plus_equals_T2(iter,result,Number<Dim0>(),Number<Current_Dim1-1>());
+}
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j>
+inline void T2_plus_equals_T2(A &iter,
+			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
+			 const Number<1> &N0,
+			 const Number<1> &N1)
+{
+  iter(0,0)+=result(0,0);
+}
+
+template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
+template<class B, class U> inline
+const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
+operator+=(const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result)
+{
+  T2_plus_equals_T2(iter,result,Number<Dim0>(),Number<Dim1>());
+  return *this;
+}
+
+/* T2-=T2 */
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
+  int Current_Dim0, int Current_Dim1>
+inline void T2_minus_equals_T2(A &iter,
+			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
+			 const Number<Current_Dim0> &N0,
+			 const Number<Current_Dim1> &N1)
+{
+  iter(Current_Dim0-1,Current_Dim1-1)-=result(Current_Dim0-1,Current_Dim1-1);
+  T2_minus_equals_T2(iter,result,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+}
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
+  int Current_Dim1>
+inline void T2_minus_equals_T2(A &iter,
+			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
+			 const Number<1> &N0,
+			 const Number<Current_Dim1> &N1)
+{
+  iter(0,Current_Dim1-1)-=result(0,Current_Dim1-1);
+  T2_minus_equals_T2(iter,result,Number<Dim0>(),Number<Current_Dim1-1>());
+}
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j>
+inline void T2_minus_equals_T2(A &iter,
+			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
+			 const Number<1> &N0,
+			 const Number<1> &N1)
+{
+  iter(0,0)-=result(0,0);
+}
+
+template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
+template<class B, class U> inline
+const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
+operator-=(const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result)
+{
+  T2_minus_equals_T2(iter,result,Number<Dim0>(),Number<Dim1>());
+  return *this;
+}
+
+/* This is for when the indices are switched (i,j) -> (j,i). */
+
+/* T2(i,j)=T2(j,i) */
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
+  int Current_Dim0, int Current_Dim1>
+inline void T2_equals_switched_T2
+(A &iter, const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result,
+ const Number<Current_Dim0> &N0, const Number<Current_Dim1> &N1)
+{
+  iter(Current_Dim0-1,Current_Dim1-1)=result(Current_Dim1-1,Current_Dim0-1);
+  T2_equals_switched_T2(iter,result,Number<Current_Dim0-1>(),
+			Number<Current_Dim1>());
+}
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
+  int Current_Dim1>
+inline void T2_equals_switched_T2
+(A &iter, const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result,
+ const Number<1> &N0, const Number<Current_Dim1> &N1)
+{
+  iter(0,Current_Dim1-1)=result(Current_Dim1-1,0);
+  T2_equals_switched_T2(iter,result,Number<Dim0>(),Number<Current_Dim1-1>());
+}
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j>
+inline void T2_equals_switched_T2
+(A &iter, const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result,
+ const Number<1> &N0, const Number<1> &N1)
+{
+  iter(0,0)=result(0,0);
+}
+
+template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
+template<class B, class U> inline
+const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
+operator=(const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result)
+{
+  T2_equals_switched_T2(iter,result,Number<Dim0>(),Number<Dim1>());
+  return *this;
+}
+
+/* T2(i,j)+=T2(j,i) */
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
+  int Current_Dim0, int Current_Dim1>
+inline void T2_plus_equals_switched_T2
+(A &iter, const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result,
+ const Number<Current_Dim0> &N0, const Number<Current_Dim1> &N1)
+{
+  iter(Current_Dim0-1,Current_Dim1-1)+=result(Current_Dim1-1,Current_Dim0-1);
+  T2_plus_equals_switched_T2(iter,result,Number<Current_Dim0-1>(),
+			Number<Current_Dim1>());
+}
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
+  int Current_Dim1>
+inline void T2_plus_equals_switched_T2
+(A &iter, const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result,
+ const Number<1> &N0, const Number<Current_Dim1> &N1)
+{
+  iter(0,Current_Dim1-1)+=result(Current_Dim1-1,0);
+  T2_plus_equals_switched_T2(iter,result,Number<Dim0>(),Number<Current_Dim1-1>());
+}
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j>
+inline void T2_plus_equals_switched_T2
+(A &iter, const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result,
+ const Number<1> &N0, const Number<1> &N1)
+{
+  iter(0,0)+=result(0,0);
+}
+
+template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
+template<class B, class U> inline
+const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
+operator+=(const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result)
+{
+  T2_plus_equals_switched_T2(iter,result,Number<Dim0>(),Number<Dim1>());
+  return *this;
+}
+
+/* T2(i,j)-=T2(j,i) */
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
+  int Current_Dim0, int Current_Dim1>
+inline void T2_minus_equals_switched_T2
+(A &iter, const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result,
+ const Number<Current_Dim0> &N0, const Number<Current_Dim1> &N1)
+{
+  iter(Current_Dim0-1,Current_Dim1-1)-=result(Current_Dim1-1,Current_Dim0-1);
+  T2_minus_equals_switched_T2(iter,result,Number<Current_Dim0-1>(),
+			Number<Current_Dim1>());
+}
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j,
+  int Current_Dim1>
+inline void T2_minus_equals_switched_T2
+(A &iter, const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result,
+ const Number<1> &N0, const Number<Current_Dim1> &N1)
+{
+  iter(0,Current_Dim1-1)-=result(Current_Dim1-1,0);
+  T2_minus_equals_switched_T2(iter,result,Number<Dim0>(),Number<Current_Dim1-1>());
+}
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j>
+inline void T2_minus_equals_switched_T2
+(A &iter, const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result,
+ const Number<1> &N0, const Number<1> &N1)
+{
+  iter(0,0)-=result(0,0);
+}
+
+template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
+template<class B, class U> inline
+const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
+operator-=(const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &result)
+{
+  T2_minus_equals_switched_T2(iter,result,Number<Dim0>(),Number<Dim1>());
+  return *this;
+}
+
+/* For int's, double's, etc. */
+
+/* T2=U */
+
+template<class A, class U, int Dim0, int Dim1,
+  int Current_Dim0, int Current_Dim1, Layout layout>
+inline void T2_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
+			      const Number<Current_Dim0> &N0,
+			      const Number<Current_Dim1> &N1)
+{
+  iter(Current_Dim0-1,Current_Dim1-1)=u;
+  T2_equals_generic(iter,u,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+}
+
+template<class A, class U, int Dim0, int Dim1, int Current_Dim1, Layout layout>
+inline void T2_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
+			      const Number<1> &N0,
+			      const Number<Current_Dim1> &N1)
+{
+  iter(0,Current_Dim1-1)=u;
+  T2_equals_generic(iter,u,Number<Dim0>(),Number<Current_Dim1-1>());
+}
+
+template<class A, class U, int Dim0, int Dim1, Layout layout>
+inline void T2_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
+			      const Number<1> &N0, const Number<1> &N1)
+{
+  iter(0,0)=u;
+}
+
+template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
+template<class U> inline
+const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
+operator=(const U &u)
+{
+  T2_equals_generic(iter,u,Number<Dim0>(),Number<Dim1>());
+  return *this;
+}
+
+/* T2+=U */
+
+template<class A, class U, int Dim0, int Dim1,
+  int Current_Dim0, int Current_Dim1, Layout layout>
+inline void T2_plus_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
+				   const Number<Current_Dim0> &N0,
+				   const Number<Current_Dim1> &N1)
+{
+  iter(Current_Dim0-1,Current_Dim1-1)+=u;
+  T2_plus_equals_generic(iter,u,Number<Current_Dim0-1>(),
+			 Number<Current_Dim1>());
+}
+
+template<class A, class U, int Dim0, int Dim1, int Current_Dim1, Layout layout>
+inline void T2_plus_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
+				   const Number<1> &N0,
+				   const Number<Current_Dim1> &N1)
+{
+  iter(0,Current_Dim1-1)+=u;
+  T2_plus_equals_generic(iter,u,Number<Dim0>(),Number<Current_Dim1-1>());
+}
+
+template<class A, class U, int Dim0, int Dim1, Layout layout>
+inline void T2_plus_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
+				   const Number<1> &N0, const Number<1> &N1)
+{
+  iter(0,0)+=u;
+}
+
+template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
+template<class U> inline
+const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
+operator+=(const U &u)
+{
+  T2_plus_equals_generic(iter,u,Number<Dim0>(),Number<Dim1>());
+  return *this;
+}
+
+/* T2-=U */
+
+template<class A, class U, int Dim0, int Dim1,
+  int Current_Dim0, int Current_Dim1, Layout layout>
+inline void T2_minus_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
+			      const Number<Current_Dim0> &N0,
+			      const Number<Current_Dim1> &N1)
+{
+  iter(Current_Dim0-1,Current_Dim1-1)-=u;
+  T2_minus_equals_generic(iter,u,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+}
+
+template<class A, class U, int Dim0, int Dim1, int Current_Dim1, Layout layout>
+inline void T2_minus_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
+			      const Number<1> &N0,
+			      const Number<Current_Dim1> &N1)
+{
+  iter(0,Current_Dim1-1)-=u;
+  T2_minus_equals_generic(iter,u,Number<Dim0>(),Number<Current_Dim1-1>());
+}
+
+template<class A, class U, int Dim0, int Dim1, Layout layout>
+inline void T2_minus_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
+			      const Number<1> &N0, const Number<1> &N1)
+{
+  iter(0,0)-=u;
+}
+
+template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
+template<class U> inline
+const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
+operator-=(const U &u)
+{
+  T2_minus_equals_generic(iter,u,Number<Dim0>(),Number<Dim1>());
+  return *this;
+}
+
+/* T2*=U */
+
+template<class A, class U, int Dim0, int Dim1,
+  int Current_Dim0, int Current_Dim1, Layout layout>
+inline void T2_times_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
+			      const Number<Current_Dim0> &N0,
+			      const Number<Current_Dim1> &N1)
+{
+  iter(Current_Dim0-1,Current_Dim1-1)*=u;
+  T2_times_equals_generic(iter,u,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+}
+
+template<class A, class U, int Dim0, int Dim1, int Current_Dim1, Layout layout>
+inline void T2_times_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
+			      const Number<1> &N0,
+			      const Number<Current_Dim1> &N1)
+{
+  iter(0,Current_Dim1-1)*=u;
+  T2_times_equals_generic(iter,u,Number<Dim0>(),Number<Current_Dim1-1>());
+}
+
+template<class A, class U, int Dim0, int Dim1, Layout layout>
+inline void T2_times_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
+			      const Number<1> &N0, const Number<1> &N1)
+{
+  iter(0,0)*=u;
+}
+
+template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
+template<class U> inline
+const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
+operator*=(const U &u)
+{
+  T2_times_equals_generic(iter,u,Number<Dim0>(),Number<Dim1>());
+  return *this;
+}
+
+/* T2/=U */
+
+template<class A, class U, int Dim0, int Dim1,
+  int Current_Dim0, int Current_Dim1, Layout layout>
+inline void T2_divide_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
+			      const Number<Current_Dim0> &N0,
+			      const Number<Current_Dim1> &N1)
+{
+  iter(Current_Dim0-1,Current_Dim1-1)/=u;
+  T2_divide_equals_generic(iter,u,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+}
+
+template<class A, class U, int Dim0, int Dim1, int Current_Dim1, Layout layout>
+inline void T2_divide_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
+			      const Number<1> &N0,
+			      const Number<Current_Dim1> &N1)
+{
+  iter(0,Current_Dim1-1)/=u;
+  T2_divide_equals_generic(iter,u,Number<Dim0>(),Number<Current_Dim1-1>());
+}
+
+template<class A, class U, int Dim0, int Dim1, Layout layout>
+inline void T2_divide_equals_generic(Tensor2<A,Dim0,Dim1,layout> &iter, const U &u,
+			      const Number<1> &N0, const Number<1> &N1)
+{
+  iter(0,0)/=u;
+}
+
+template<class A, class T, int Dim0, int Dim1, char i, char j, Layout layout>
+template<class U> inline
+const Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j> &
+Tensor2_Expr<Tensor2<A,Dim0,Dim1,layout>,T,Dim0,Dim1,i,j>::
+operator/=(const U &u)
+{
+  T2_divide_equals_generic(iter,u,Number<Dim0>(),Number<Dim1>());
+  return *this;
+}
+
+
+/* Various assignment operators for Tensor3_dg_number_rhs_0.  I have
+   to explicitly declare the second operator= because otherwise the
+   compiler will generate its own and not use the template code. */
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j, int N,
+  int Current_Dim0, int Current_Dim1> inline
+void T3dgrhs0_equals_T2(A &iter,
+			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
+			 const Number<Current_Dim0> &N0,
+			 const Number<Current_Dim1> &N1, const Number<N> &NN)
+{
+  iter(N,Current_Dim0-1,Current_Dim1-1)=result(Current_Dim0-1,Current_Dim1-1);
+  T3dgrhs0_equals_T2(iter,result,Number<Current_Dim0-1>(),
+		      Number<Current_Dim1>(),Number<N>());
+}
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j, int N,
+  int Current_Dim1> inline
+void T3dgrhs0_equals_T2(A &iter,
+			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
+			 const Number<1> &N0, const Number<Current_Dim1> &N1,
+			 const Number<N> &NN)
+{
+  iter(N,0,Current_Dim1-1)=result(0,Current_Dim1-1);
+  T3dgrhs0_equals_T2(iter,result,Number<Dim0>(),
+		      Number<Current_Dim1-1>(),Number<N>());
+}
+
+template<class A, class B, class U, int Dim0, int Dim1, char i, char j, int N>
+inline
+void T3dgrhs0_equals_T2(A &iter,
+			 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result,
+			 const Number<1> &N0, const Number<1> &N1,
+			 const Number<N> &NN)
+{
+  iter(N,0,0)=result(0,0);
+}
+
+template<class A, class T, int Dim0, int Dim1, char i, char j, int N>
+template<class B, class U> inline
+const Tensor2_Expr<Tensor3_dg_number_rhs_0<A,T,N>,T,Dim0,Dim1,i,j> &
+Tensor2_Expr<Tensor3_dg_number_rhs_0<A,T,N>,T,Dim0,Dim1,i,j>
+::operator=(const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &result)
+{
+  T3dgrhs0_equals_T2(iter,result,Number<Dim0>(),Number<Dim1>(),Number<N>());
+  return *this;
+}
+
+template<class A, class T, int Dim0, int Dim1, char i, char j, int N> inline
+const Tensor2_Expr<Tensor3_dg_number_rhs_0<A,T,N>,T,Dim0,Dim1,i,j> &
+Tensor2_Expr<Tensor3_dg_number_rhs_0<A,T,N>,T,Dim0,Dim1,i,j>
+::operator=(const Tensor2_Expr<Tensor3_dg_number_rhs_0<A,T,N>,T,Dim0,Dim1,i,j>
+	    &result)
+{
+  return operator=<Tensor3_dg_number_rhs_0<A,T,N>,T>(result);
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_and_Tensor1.h
--- a/Tensor2/Tensor2_and_Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,89 +0,0 @@
-/* Multiply a Tensor1 and a Tensor2 together but don't contract, yielding a
-   Tensor2. */
-
-/* A(i,j) & B(i) -> Tensor2 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
-class Tensor2_and_Tensor1_0
-{
-  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
-  const Tensor1_Expr<B,U,Dim0,i> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)*iterB(N1);
-  }
-
-  Tensor2_and_Tensor1_0(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-			const Tensor1_Expr<B,U,Dim0,i> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
-inline const Tensor2_Expr<const Tensor2_and_Tensor1_0<A,B,T,U,Dim0,Dim1,i,j>,
-  typename promote<T,U>::V,Dim0,Dim1,i,j>
-operator&(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-	  const Tensor1_Expr<B,U,Dim0,i> &b)
-{
-  typedef const Tensor2_and_Tensor1_0<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,b));
-}
-
-/* B(i) & A(i,j) -> Tensor2 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
-inline const Tensor2_Expr<const Tensor2_and_Tensor1_0
-<A,B,T,U,Dim0,Dim1,i,j>,typename promote<T,U>::V,Dim0,Dim1,i,j>
-operator&(const Tensor1_Expr<B,U,Dim0,i> &b,
-	  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a)
-{
-  typedef const Tensor2_and_Tensor1_0<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j) & B(j) -> Tensor2 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1,
-  char i, char j>
-class Tensor2_and_Tensor1_1
-{
-  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
-  const Tensor1_Expr<B,U,Dim1,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)*iterB(N2);
-  }
-
-  Tensor2_and_Tensor1_1(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-			const Tensor1_Expr<B,U,Dim1,j> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1,
-  char i, char j>
-inline const Tensor2_Expr<const Tensor2_and_Tensor1_1
-<A,B,T,U,Dim0,Dim1,i,j>,typename promote<T,U>::V,Dim0,Dim1,i,j>
-operator&(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-	  const Tensor1_Expr<B,U,Dim1,j> &b)
-{
-  typedef const Tensor2_and_Tensor1_1<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,b));
-}
-
-/* B(j) & A(i,j) -> Tensor2 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1,
-  char i, char j>
-inline const Tensor2_Expr<const Tensor2_and_Tensor1_1<A,B,T,U,Dim0,Dim1,i,j>,
-  typename promote<T,U>::V,Dim0,Dim1,i,j>
-operator&(const Tensor1_Expr<B,U,Dim1,j> &b,
-	  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a)
-{
-  typedef const Tensor2_and_Tensor1_1<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_and_Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2/Tensor2_and_Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,89 @@
+/* Multiply a Tensor1 and a Tensor2 together but don't contract, yielding a
+   Tensor2. */
+
+/* A(i,j) & B(i) -> Tensor2 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
+class Tensor2_and_Tensor1_0
+{
+  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
+  const Tensor1_Expr<B,U,Dim0,i> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)*iterB(N1);
+  }
+
+  Tensor2_and_Tensor1_0(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+			const Tensor1_Expr<B,U,Dim0,i> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
+inline const Tensor2_Expr<const Tensor2_and_Tensor1_0<A,B,T,U,Dim0,Dim1,i,j>,
+  typename promote<T,U>::V,Dim0,Dim1,i,j>
+operator&(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+	  const Tensor1_Expr<B,U,Dim0,i> &b)
+{
+  typedef const Tensor2_and_Tensor1_0<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,b));
+}
+
+/* B(i) & A(i,j) -> Tensor2 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
+inline const Tensor2_Expr<const Tensor2_and_Tensor1_0
+<A,B,T,U,Dim0,Dim1,i,j>,typename promote<T,U>::V,Dim0,Dim1,i,j>
+operator&(const Tensor1_Expr<B,U,Dim0,i> &b,
+	  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a)
+{
+  typedef const Tensor2_and_Tensor1_0<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j) & B(j) -> Tensor2 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1,
+  char i, char j>
+class Tensor2_and_Tensor1_1
+{
+  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
+  const Tensor1_Expr<B,U,Dim1,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)*iterB(N2);
+  }
+
+  Tensor2_and_Tensor1_1(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+			const Tensor1_Expr<B,U,Dim1,j> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1,
+  char i, char j>
+inline const Tensor2_Expr<const Tensor2_and_Tensor1_1
+<A,B,T,U,Dim0,Dim1,i,j>,typename promote<T,U>::V,Dim0,Dim1,i,j>
+operator&(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+	  const Tensor1_Expr<B,U,Dim1,j> &b)
+{
+  typedef const Tensor2_and_Tensor1_1<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,b));
+}
+
+/* B(j) & A(i,j) -> Tensor2 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1,
+  char i, char j>
+inline const Tensor2_Expr<const Tensor2_and_Tensor1_1<A,B,T,U,Dim0,Dim1,i,j>,
+  typename promote<T,U>::V,Dim0,Dim1,i,j>
+operator&(const Tensor1_Expr<B,U,Dim1,j> &b,
+	  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a)
+{
+  typedef const Tensor2_and_Tensor1_1<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_carat_Tensor2.h
--- a/Tensor2/Tensor2_carat_Tensor2.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,211 +0,0 @@
-/* Creates a Tensor2_symmetric expression by contracting two Tensor2's
-   together. There are different versions, depending on where the
-   contracting indices are located (i.e. whether it is A(i,j)^B(j,k)
-   or A(i,j)^B(k,j)).  The classes are numbered to differentiate
-   between these.  Thus, A(i,j)^B(j,k) has 10 appended to the name
-   because I count from 0. */
-
-/* A(i,j)^B(j,k) */
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-class Tensor2_carat_Tensor2_10
-{
-  const Tensor2_Expr<A,T,Dim,Dim1,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim1,Dim,j,k> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(N1,Current_Dim-1)*iterB(Current_Dim-1,N2)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
-  {
-    return iterA(N1,0)*iterB(0,N2);
-  }
-public:
-  Tensor2_carat_Tensor2_10(const Tensor2_Expr<A,T,Dim,Dim1,i,j> &a,
-			   const Tensor2_Expr<B,U,Dim1,Dim,j,k> &b):
-    iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim1>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_carat_Tensor2_10<A,B,T,U,Dim,Dim1,i,j,k>,
-  typename promote<T,U>::V,Dim,i,k>
-operator^(const Tensor2_Expr<A,T,Dim,Dim1,i,j> &a,
-	  const Tensor2_Expr<B,U,Dim1,Dim,j,k> &b)
-{
-  typedef const Tensor2_carat_Tensor2_10<A,B,T,U,Dim,Dim1,i,j,k> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j)^B(k,j) */
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-class Tensor2_carat_Tensor2_11
-{
-  const Tensor2_Expr<A,T,Dim,Dim1,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim,Dim1,k,j> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(N1,Current_Dim-1)*iterB(N2,Current_Dim-1)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
-  {
-    return iterA(N1,0)*iterB(N2,0);
-  }
-public:
-  Tensor2_carat_Tensor2_11(const Tensor2_Expr<A,T,Dim,Dim1,i,j> &a,
-			   const Tensor2_Expr<B,U,Dim,Dim1,k,j> &b):
-    iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim1>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_carat_Tensor2_11<A,B,T,U,Dim,Dim1,i,j,k>,
-  typename promote<T,U>::V,Dim,i,k>
-operator^(const Tensor2_Expr<A,T,Dim,Dim1,i,j> &a,
-	  const Tensor2_Expr<B,U,Dim,Dim1,k,j> &b)
-{
-  typedef const Tensor2_carat_Tensor2_11<A,B,T,U,Dim,Dim1,i,j,k> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
-    (TensorExpr(a,b));
-}
-
-/* A(j,i)^B(j,k) */
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-class Tensor2_carat_Tensor2_00
-{
-  const Tensor2_Expr<A,T,Dim1,Dim,j,i> iterA;
-  const Tensor2_Expr<B,U,Dim1,Dim,j,k> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(Current_Dim-1,N1)*iterB(Current_Dim-1,N2)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
-  {
-    return iterA(0,N1)*iterB(0,N2);
-  }
-public:
-  Tensor2_carat_Tensor2_00(const Tensor2_Expr<A,T,Dim1,Dim,j,i> &a,
-			   const Tensor2_Expr<B,U,Dim1,Dim,j,k> &b):
-    iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim1>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_carat_Tensor2_00<A,B,T,U,Dim,Dim1,i,j,k>,
-  typename promote<T,U>::V,Dim,i,k>
-operator^(const Tensor2_Expr<A,T,Dim1,Dim,j,i> &a,
-	  const Tensor2_Expr<B,U,Dim1,Dim,j,k> &b)
-{
-  typedef const Tensor2_carat_Tensor2_00<A,B,T,U,Dim,Dim1,i,j,k> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
-    (TensorExpr(a,b));
-}
-
-/* A(j,i)^B(k,j) */
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-class Tensor2_carat_Tensor2_01
-{
-  const Tensor2_Expr<A,T,Dim1,Dim,j,i> iterA;
-  const Tensor2_Expr<B,U,Dim,Dim1,k,j> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(Current_Dim-1,N1)*iterB(N2,Current_Dim-1)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
-  {
-    return iterA(0,N1)*iterB(N2,0);
-  }
-public:
-  Tensor2_carat_Tensor2_01(const Tensor2_Expr<A,T,Dim1,Dim,j,i> &a,
-			   const Tensor2_Expr<B,U,Dim,Dim1,k,j> &b):
-    iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim1>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_carat_Tensor2_01<A,B,T,U,Dim,Dim1,i,j,k>,
-  typename promote<T,U>::V,Dim,i,k>
-operator^(const Tensor2_Expr<A,T,Dim1,Dim,j,i> &a,
-	  const Tensor2_Expr<B,U,Dim,Dim1,k,j> &b)
-{
-  typedef const Tensor2_carat_Tensor2_01<A,B,T,U,Dim,Dim1,i,j,k> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
-    (TensorExpr(a,b));
-}
-
-/* I don't think that this product actually gives a Tensor4_ddg. */
-
-//  /* A(i,j)^B(k,l) -> Tensor4_ddg(i,k,j,l) */
-
-//  template<class A, class B, class T, class U, int Dim, int Dim1,
-//    char i, char j, char k>
-//  class Tensor2_carat_Tensor2_0213
-//  {
-//    const Tensor2_Expr<A,T,Dim01,Dim23,i,j> iterA;
-//    const Tensor2_Expr<B,U,Dim01,Dim23,k,l> iterB;
-//  public:
-//    Tensor2_carat_Tensor2_0213(const Tensor2_Expr<A,T,Dim01,Dim23,i,j> &a,
-//  			     const Tensor2_Expr<B,U,Dim01,Dim23,k,l> &b):
-//      iterA(a), iterB(b) {}
-//    typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-//  			     const int N4) const
-//    {
-//      return iterA(N1,N3)*iterB(N2,N4);
-//    }
-//  };
-
-//  template<class A, class B, class T, class U, int Dim01, int Dim23,
-//    char i, char j, char k, char l>
-//  inline const Tensor4_ddg_Expr<const Tensor2_carat_Tensor2_0213<A,B,T,U,Dim01,Dim23,i,j,k,l>,typename promote<T,U>::V,Dim01,Dim23,i,k,j,l>
-//  operator^(const Tensor2_Expr<A,T,Dim01,Dim23,i,j> &a,
-//  	  const Tensor2_Expr<B,U,Dim01,Dim23,k,l> &b)
-//  {
-//    typedef const Tensor2_carat_Tensor2_0213<A,B,T,U,Dim01,Dim23,i,j,k,l>
-//      TensorExpr;
-//    return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,k,j,l>
-//      (TensorExpr(a,b));
-//  }
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_carat_Tensor2.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2/Tensor2_carat_Tensor2.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,211 @@
+/* Creates a Tensor2_symmetric expression by contracting two Tensor2's
+   together. There are different versions, depending on where the
+   contracting indices are located (i.e. whether it is A(i,j)^B(j,k)
+   or A(i,j)^B(k,j)).  The classes are numbered to differentiate
+   between these.  Thus, A(i,j)^B(j,k) has 10 appended to the name
+   because I count from 0. */
+
+/* A(i,j)^B(j,k) */
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+class Tensor2_carat_Tensor2_10
+{
+  const Tensor2_Expr<A,T,Dim,Dim1,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim1,Dim,j,k> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(N1,Current_Dim-1)*iterB(Current_Dim-1,N2)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
+  {
+    return iterA(N1,0)*iterB(0,N2);
+  }
+public:
+  Tensor2_carat_Tensor2_10(const Tensor2_Expr<A,T,Dim,Dim1,i,j> &a,
+			   const Tensor2_Expr<B,U,Dim1,Dim,j,k> &b):
+    iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim1>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_carat_Tensor2_10<A,B,T,U,Dim,Dim1,i,j,k>,
+  typename promote<T,U>::V,Dim,i,k>
+operator^(const Tensor2_Expr<A,T,Dim,Dim1,i,j> &a,
+	  const Tensor2_Expr<B,U,Dim1,Dim,j,k> &b)
+{
+  typedef const Tensor2_carat_Tensor2_10<A,B,T,U,Dim,Dim1,i,j,k> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j)^B(k,j) */
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+class Tensor2_carat_Tensor2_11
+{
+  const Tensor2_Expr<A,T,Dim,Dim1,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim,Dim1,k,j> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(N1,Current_Dim-1)*iterB(N2,Current_Dim-1)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
+  {
+    return iterA(N1,0)*iterB(N2,0);
+  }
+public:
+  Tensor2_carat_Tensor2_11(const Tensor2_Expr<A,T,Dim,Dim1,i,j> &a,
+			   const Tensor2_Expr<B,U,Dim,Dim1,k,j> &b):
+    iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim1>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_carat_Tensor2_11<A,B,T,U,Dim,Dim1,i,j,k>,
+  typename promote<T,U>::V,Dim,i,k>
+operator^(const Tensor2_Expr<A,T,Dim,Dim1,i,j> &a,
+	  const Tensor2_Expr<B,U,Dim,Dim1,k,j> &b)
+{
+  typedef const Tensor2_carat_Tensor2_11<A,B,T,U,Dim,Dim1,i,j,k> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
+    (TensorExpr(a,b));
+}
+
+/* A(j,i)^B(j,k) */
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+class Tensor2_carat_Tensor2_00
+{
+  const Tensor2_Expr<A,T,Dim1,Dim,j,i> iterA;
+  const Tensor2_Expr<B,U,Dim1,Dim,j,k> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(Current_Dim-1,N1)*iterB(Current_Dim-1,N2)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
+  {
+    return iterA(0,N1)*iterB(0,N2);
+  }
+public:
+  Tensor2_carat_Tensor2_00(const Tensor2_Expr<A,T,Dim1,Dim,j,i> &a,
+			   const Tensor2_Expr<B,U,Dim1,Dim,j,k> &b):
+    iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim1>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_carat_Tensor2_00<A,B,T,U,Dim,Dim1,i,j,k>,
+  typename promote<T,U>::V,Dim,i,k>
+operator^(const Tensor2_Expr<A,T,Dim1,Dim,j,i> &a,
+	  const Tensor2_Expr<B,U,Dim1,Dim,j,k> &b)
+{
+  typedef const Tensor2_carat_Tensor2_00<A,B,T,U,Dim,Dim1,i,j,k> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
+    (TensorExpr(a,b));
+}
+
+/* A(j,i)^B(k,j) */
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+class Tensor2_carat_Tensor2_01
+{
+  const Tensor2_Expr<A,T,Dim1,Dim,j,i> iterA;
+  const Tensor2_Expr<B,U,Dim,Dim1,k,j> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(Current_Dim-1,N1)*iterB(N2,Current_Dim-1)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
+  {
+    return iterA(0,N1)*iterB(N2,0);
+  }
+public:
+  Tensor2_carat_Tensor2_01(const Tensor2_Expr<A,T,Dim1,Dim,j,i> &a,
+			   const Tensor2_Expr<B,U,Dim,Dim1,k,j> &b):
+    iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim1>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_carat_Tensor2_01<A,B,T,U,Dim,Dim1,i,j,k>,
+  typename promote<T,U>::V,Dim,i,k>
+operator^(const Tensor2_Expr<A,T,Dim1,Dim,j,i> &a,
+	  const Tensor2_Expr<B,U,Dim,Dim1,k,j> &b)
+{
+  typedef const Tensor2_carat_Tensor2_01<A,B,T,U,Dim,Dim1,i,j,k> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
+    (TensorExpr(a,b));
+}
+
+/* I don't think that this product actually gives a Tensor4_ddg. */
+
+//  /* A(i,j)^B(k,l) -> Tensor4_ddg(i,k,j,l) */
+
+//  template<class A, class B, class T, class U, int Dim, int Dim1,
+//    char i, char j, char k>
+//  class Tensor2_carat_Tensor2_0213
+//  {
+//    const Tensor2_Expr<A,T,Dim01,Dim23,i,j> iterA;
+//    const Tensor2_Expr<B,U,Dim01,Dim23,k,l> iterB;
+//  public:
+//    Tensor2_carat_Tensor2_0213(const Tensor2_Expr<A,T,Dim01,Dim23,i,j> &a,
+//  			     const Tensor2_Expr<B,U,Dim01,Dim23,k,l> &b):
+//      iterA(a), iterB(b) {}
+//    typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+//  			     const int N4) const
+//    {
+//      return iterA(N1,N3)*iterB(N2,N4);
+//    }
+//  };
+
+//  template<class A, class B, class T, class U, int Dim01, int Dim23,
+//    char i, char j, char k, char l>
+//  inline const Tensor4_ddg_Expr<const Tensor2_carat_Tensor2_0213<A,B,T,U,Dim01,Dim23,i,j,k,l>,typename promote<T,U>::V,Dim01,Dim23,i,k,j,l>
+//  operator^(const Tensor2_Expr<A,T,Dim01,Dim23,i,j> &a,
+//  	  const Tensor2_Expr<B,U,Dim01,Dim23,k,l> &b)
+//  {
+//    typedef const Tensor2_carat_Tensor2_0213<A,B,T,U,Dim01,Dim23,i,j,k,l>
+//      TensorExpr;
+//    return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,k,j,l>
+//      (TensorExpr(a,b));
+//  }
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_constructor.h
--- a/Tensor2/Tensor2_constructor.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,160 +0,0 @@
-/* A helper class that allows simple initialization of the Tensor2,
-   but only if it has the correct number of elements.  There are
-   specializations for column-major and row-major orderings. */
-
-template<class T, int Tensor_Dim0, int Tensor_Dim1, Layout layout>
-class Tensor2_constructor;
-
-/* Column major versions */
-
-template<class T>
-class Tensor2_constructor<T,2,2,column_major>
-{
-public:
-  Tensor2_constructor(T data[2][2],T d00,T d01,T d10,T d11)
-  {
-    data[0][0]=d00;
-    data[0][1]=d01;
-    data[1][0]=d10;
-    data[1][1]=d11;
-  }
-};
-
-template<class T>
-class Tensor2_constructor<T,3,2,column_major>
-{
-public:
-  Tensor2_constructor(T data[3][2],T d00, T d01, T d10, T d11,
-		      T d20, T d21)
-  {
-    data[0][0]=d00;
-    data[0][1]=d01;
-    data[1][0]=d10;
-    data[1][1]=d11;
-    data[2][0]=d20;
-    data[2][1]=d21;
-  }
-};
-
-template<class T>
-class Tensor2_constructor<T,3,3,column_major>
-{
-public:
-  Tensor2_constructor(T data[3][3],T d00, T d01, T d02, T d10, T d11, T d12,
-		      T d20, T d21, T d22)
-  {
-    data[0][0]=d00;
-    data[0][1]=d01;
-    data[0][2]=d02;
-    data[1][0]=d10;
-    data[1][1]=d11;
-    data[1][2]=d12;
-    data[2][0]=d20;
-    data[2][1]=d21;
-    data[2][2]=d22;
-  }
-};
-
-template<class T>
-class Tensor2_constructor<T,4,4,column_major>
-{
-public:
-  Tensor2_constructor(T data[4][4], T d00, T d01, T d02, T d03, T d10, T d11,
-		      T d12, T d13, T d20, T d21, T d22, T d23, T d30, T d31,
-		      T d32, T d33)
-  {
-    data[0][0]=d00;
-    data[0][1]=d01;
-    data[0][2]=d02;
-    data[0][3]=d03;
-    data[1][0]=d10;
-    data[1][1]=d11;
-    data[1][2]=d12;
-    data[1][3]=d13;
-    data[2][0]=d20;
-    data[2][1]=d21;
-    data[2][2]=d22;
-    data[2][3]=d23;
-    data[3][0]=d30;
-    data[3][1]=d31;
-    data[3][2]=d32;
-    data[3][3]=d33;
-  }
-};
-
-/* Row major versions */
-
-template<class T>
-class Tensor2_constructor<T,2,2,row_major>
-{
-public:
-  Tensor2_constructor(T data[2][2],T d00,T d01,T d10,T d11)
-  {
-    data[0][0]=d00;
-    data[1][0]=d01;
-    data[0][1]=d10;
-    data[1][1]=d11;
-  }
-};
-
-template<class T>
-class Tensor2_constructor<T,3,2,row_major>
-{
-public:
-  Tensor2_constructor(T data[2][3],T d00, T d01, T d10, T d11,
-		      T d20, T d21)
-  {
-    data[0][0]=d00;
-    data[1][0]=d01;
-    data[0][1]=d10;
-    data[1][1]=d11;
-    data[0][2]=d20;
-    data[1][2]=d21;
-  }
-};
-
-template<class T>
-class Tensor2_constructor<T,3,3,row_major>
-{
-public:
-  Tensor2_constructor(T data[3][3],T d00, T d01, T d02, T d10, T d11, T d12,
-		      T d20, T d21, T d22)
-  {
-    data[0][0]=d00;
-    data[1][0]=d01;
-    data[2][0]=d02;
-    data[0][1]=d10;
-    data[1][1]=d11;
-    data[2][1]=d12;
-    data[0][2]=d20;
-    data[1][2]=d21;
-    data[2][2]=d22;
-  }
-};
-
-template<class T>
-class Tensor2_constructor<T,4,4,row_major>
-{
-public:
-  Tensor2_constructor(T data[4][4], T d00, T d01, T d02, T d03, T d10, T d11,
-		      T d12, T d13, T d20, T d21, T d22, T d23, T d30, T d31,
-		      T d32, T d33)
-  {
-    data[0][0]=d00;
-    data[1][0]=d01;
-    data[2][0]=d02;
-    data[3][0]=d03;
-    data[0][1]=d10;
-    data[1][1]=d11;
-    data[2][1]=d12;
-    data[3][1]=d13;
-    data[0][2]=d20;
-    data[1][2]=d21;
-    data[2][2]=d22;
-    data[3][2]=d23;
-    data[0][3]=d30;
-    data[1][3]=d31;
-    data[2][3]=d32;
-    data[3][3]=d33;
-  }
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_constructor.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2/Tensor2_constructor.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,160 @@
+/* A helper class that allows simple initialization of the Tensor2,
+   but only if it has the correct number of elements.  There are
+   specializations for column-major and row-major orderings. */
+
+template<class T, int Tensor_Dim0, int Tensor_Dim1, Layout layout>
+class Tensor2_constructor;
+
+/* Column major versions */
+
+template<class T>
+class Tensor2_constructor<T,2,2,column_major>
+{
+public:
+  Tensor2_constructor(T data[2][2],T d00,T d01,T d10,T d11)
+  {
+    data[0][0]=d00;
+    data[0][1]=d01;
+    data[1][0]=d10;
+    data[1][1]=d11;
+  }
+};
+
+template<class T>
+class Tensor2_constructor<T,3,2,column_major>
+{
+public:
+  Tensor2_constructor(T data[3][2],T d00, T d01, T d10, T d11,
+		      T d20, T d21)
+  {
+    data[0][0]=d00;
+    data[0][1]=d01;
+    data[1][0]=d10;
+    data[1][1]=d11;
+    data[2][0]=d20;
+    data[2][1]=d21;
+  }
+};
+
+template<class T>
+class Tensor2_constructor<T,3,3,column_major>
+{
+public:
+  Tensor2_constructor(T data[3][3],T d00, T d01, T d02, T d10, T d11, T d12,
+		      T d20, T d21, T d22)
+  {
+    data[0][0]=d00;
+    data[0][1]=d01;
+    data[0][2]=d02;
+    data[1][0]=d10;
+    data[1][1]=d11;
+    data[1][2]=d12;
+    data[2][0]=d20;
+    data[2][1]=d21;
+    data[2][2]=d22;
+  }
+};
+
+template<class T>
+class Tensor2_constructor<T,4,4,column_major>
+{
+public:
+  Tensor2_constructor(T data[4][4], T d00, T d01, T d02, T d03, T d10, T d11,
+		      T d12, T d13, T d20, T d21, T d22, T d23, T d30, T d31,
+		      T d32, T d33)
+  {
+    data[0][0]=d00;
+    data[0][1]=d01;
+    data[0][2]=d02;
+    data[0][3]=d03;
+    data[1][0]=d10;
+    data[1][1]=d11;
+    data[1][2]=d12;
+    data[1][3]=d13;
+    data[2][0]=d20;
+    data[2][1]=d21;
+    data[2][2]=d22;
+    data[2][3]=d23;
+    data[3][0]=d30;
+    data[3][1]=d31;
+    data[3][2]=d32;
+    data[3][3]=d33;
+  }
+};
+
+/* Row major versions */
+
+template<class T>
+class Tensor2_constructor<T,2,2,row_major>
+{
+public:
+  Tensor2_constructor(T data[2][2],T d00,T d01,T d10,T d11)
+  {
+    data[0][0]=d00;
+    data[1][0]=d01;
+    data[0][1]=d10;
+    data[1][1]=d11;
+  }
+};
+
+template<class T>
+class Tensor2_constructor<T,3,2,row_major>
+{
+public:
+  Tensor2_constructor(T data[2][3],T d00, T d01, T d10, T d11,
+		      T d20, T d21)
+  {
+    data[0][0]=d00;
+    data[1][0]=d01;
+    data[0][1]=d10;
+    data[1][1]=d11;
+    data[0][2]=d20;
+    data[1][2]=d21;
+  }
+};
+
+template<class T>
+class Tensor2_constructor<T,3,3,row_major>
+{
+public:
+  Tensor2_constructor(T data[3][3],T d00, T d01, T d02, T d10, T d11, T d12,
+		      T d20, T d21, T d22)
+  {
+    data[0][0]=d00;
+    data[1][0]=d01;
+    data[2][0]=d02;
+    data[0][1]=d10;
+    data[1][1]=d11;
+    data[2][1]=d12;
+    data[0][2]=d20;
+    data[1][2]=d21;
+    data[2][2]=d22;
+  }
+};
+
+template<class T>
+class Tensor2_constructor<T,4,4,row_major>
+{
+public:
+  Tensor2_constructor(T data[4][4], T d00, T d01, T d02, T d03, T d10, T d11,
+		      T d12, T d13, T d20, T d21, T d22, T d23, T d30, T d31,
+		      T d32, T d33)
+  {
+    data[0][0]=d00;
+    data[1][0]=d01;
+    data[2][0]=d02;
+    data[3][0]=d03;
+    data[0][1]=d10;
+    data[1][1]=d11;
+    data[2][1]=d12;
+    data[3][1]=d13;
+    data[0][2]=d20;
+    data[1][2]=d21;
+    data[2][2]=d22;
+    data[3][2]=d23;
+    data[0][3]=d30;
+    data[1][3]=d31;
+    data[2][3]=d32;
+    data[3][3]=d33;
+  }
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_divide_generic.h
--- a/Tensor2/Tensor2_divide_generic.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-/* Divides a Tensor2 by a generic, yielding a Tensor2. */
-
-template<class A, class T, class U, int Dim0, int Dim1, char i, char j>
-class Tensor2_divide_generic
-{
-  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
-  const U d;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)/d;
-  }
-
-  Tensor2_divide_generic(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-			 const U &d0):
-    iterA(a), d(d0) {}
-};
-
-template<class A, class T, class U, int Dim0, int Dim1, char i, char j>
-inline const Tensor2_Expr<const Tensor2_divide_generic<A,T,U,Dim0,Dim1,i,j>,
-  typename promote<T,U>::V,Dim0,Dim1,i,j>
-operator/(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a, const U &d0)
-{
-  typedef const Tensor2_divide_generic<A,T,U,Dim0,Dim1,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,d0));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_divide_generic.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2/Tensor2_divide_generic.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,28 @@
+/* Divides a Tensor2 by a generic, yielding a Tensor2. */
+
+template<class A, class T, class U, int Dim0, int Dim1, char i, char j>
+class Tensor2_divide_generic
+{
+  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
+  const U d;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)/d;
+  }
+
+  Tensor2_divide_generic(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+			 const U &d0):
+    iterA(a), d(d0) {}
+};
+
+template<class A, class T, class U, int Dim0, int Dim1, char i, char j>
+inline const Tensor2_Expr<const Tensor2_divide_generic<A,T,U,Dim0,Dim1,i,j>,
+  typename promote<T,U>::V,Dim0,Dim1,i,j>
+operator/(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a, const U &d0)
+{
+  typedef const Tensor2_divide_generic<A,T,U,Dim0,Dim1,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,d0));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_minus_Tensor2.h
--- a/Tensor2/Tensor2_minus_Tensor2.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-/* Subtracts a Tensor2 from a Tensor2, yielding a Tensor2. */
-
-/* A(i,j)-B(i,j) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
-class Tensor2_minus_Tensor2_01
-{
-  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim0,Dim1,i,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)-iterB(N1,N2);
-  }
-
-  Tensor2_minus_Tensor2_01(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-			   const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
-inline const Tensor2_Expr<const Tensor2_minus_Tensor2_01<A,B,T,U,Dim0,Dim1,i,j>,
-  typename promote<T,U>::V,Dim0,Dim1,i,j>
-operator-(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-	  const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &b)
-{
-  typedef const Tensor2_minus_Tensor2_01<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j)-B(j,i) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
-class Tensor2_minus_Tensor2_10
-{
-  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim0,Dim1,j,i> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)-iterB(N2,N1);
-  }
-
-  Tensor2_minus_Tensor2_10(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-			  const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1,
-  char i, char j>
-inline const Tensor2_Expr<const Tensor2_minus_Tensor2_10<A,B,T,U,Dim0,Dim1,i,j>,
-  typename promote<T,U>::V,Dim0,Dim1,i,j>
-operator-(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-	  const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &b)
-{
-  typedef const Tensor2_minus_Tensor2_10<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_minus_Tensor2.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2/Tensor2_minus_Tensor2.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,60 @@
+/* Subtracts a Tensor2 from a Tensor2, yielding a Tensor2. */
+
+/* A(i,j)-B(i,j) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
+class Tensor2_minus_Tensor2_01
+{
+  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim0,Dim1,i,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)-iterB(N1,N2);
+  }
+
+  Tensor2_minus_Tensor2_01(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+			   const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
+inline const Tensor2_Expr<const Tensor2_minus_Tensor2_01<A,B,T,U,Dim0,Dim1,i,j>,
+  typename promote<T,U>::V,Dim0,Dim1,i,j>
+operator-(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+	  const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &b)
+{
+  typedef const Tensor2_minus_Tensor2_01<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j)-B(j,i) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
+class Tensor2_minus_Tensor2_10
+{
+  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim0,Dim1,j,i> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)-iterB(N2,N1);
+  }
+
+  Tensor2_minus_Tensor2_10(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+			  const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1,
+  char i, char j>
+inline const Tensor2_Expr<const Tensor2_minus_Tensor2_10<A,B,T,U,Dim0,Dim1,i,j>,
+  typename promote<T,U>::V,Dim0,Dim1,i,j>
+operator-(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+	  const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &b)
+{
+  typedef const Tensor2_minus_Tensor2_10<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_number.h
--- a/Tensor2/Tensor2_number.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-/* This is for expressions where a number is used for one slot, and
-   an index for another, yielding a Tensor1_Expr. */
-
-template<class A, class T, int N>
-class Tensor2_number_1
-{
-  A iterA;
-public:
-  T operator()(const int N1) const
-  {
-    return iterA(N1,N);
-  }
-  Tensor2_number_1(A &a): iterA(a) {}
-};
-
-template<class A, class T, int N>
-class Tensor2_number_0
-{
-  A iterA;
-public:
-  T operator()(const int N1) const
-  {
-    return iterA(N,N1);
-  }
-  Tensor2_number_0(A &a): iterA(a) {}
-};
-
-template<class A, class T, int N>
-class Tensor2_number_rhs_0
-{};
-
-template<class A, class T, int N>
-class Tensor2_number_rhs_1
-{};
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_number.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2/Tensor2_number.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,34 @@
+/* This is for expressions where a number is used for one slot, and
+   an index for another, yielding a Tensor1_Expr. */
+
+template<class A, class T, int N>
+class Tensor2_number_1
+{
+  A iterA;
+public:
+  T operator()(const int N1) const
+  {
+    return iterA(N1,N);
+  }
+  Tensor2_number_1(A &a): iterA(a) {}
+};
+
+template<class A, class T, int N>
+class Tensor2_number_0
+{
+  A iterA;
+public:
+  T operator()(const int N1) const
+  {
+    return iterA(N,N1);
+  }
+  Tensor2_number_0(A &a): iterA(a) {}
+};
+
+template<class A, class T, int N>
+class Tensor2_number_rhs_0
+{};
+
+template<class A, class T, int N>
+class Tensor2_number_rhs_1
+{};
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_numeral.h
--- a/Tensor2/Tensor2_numeral.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-/* This is for expressions where a number is used for one slot, and
-   an index for another, yielding a Tensor1_Expr. */
-
-template<class A, class T>
-class Tensor2_numeral_1
-{
-  A iterA;
-  const int N;
-public:
-  T operator()(const int N1) const
-  {
-    return iterA(N1,N);
-  }
-  Tensor2_numeral_1(A &a, const int NN): iterA(a), N(NN) {}
-};
-
-template<class A, class T>
-class Tensor2_numeral_0
-{
-  A iterA;
-  const int N;
-public:
-  T operator()(const int N1) const
-  {
-    return iterA(N,N1);
-  }
-  Tensor2_numeral_0(A &a, const int NN): iterA(a), N(NN) {}
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_numeral.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2/Tensor2_numeral.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,28 @@
+/* This is for expressions where a number is used for one slot, and
+   an index for another, yielding a Tensor1_Expr. */
+
+template<class A, class T>
+class Tensor2_numeral_1
+{
+  A iterA;
+  const int N;
+public:
+  T operator()(const int N1) const
+  {
+    return iterA(N1,N);
+  }
+  Tensor2_numeral_1(A &a, const int NN): iterA(a), N(NN) {}
+};
+
+template<class A, class T>
+class Tensor2_numeral_0
+{
+  A iterA;
+  const int N;
+public:
+  T operator()(const int N1) const
+  {
+    return iterA(N,N1);
+  }
+  Tensor2_numeral_0(A &a, const int NN): iterA(a), N(NN) {}
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_or_Tensor2.h
--- a/Tensor2/Tensor2_or_Tensor2.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-/* Creates a Tensor2_symmetric expression by adding two Tensor2's
-   together. */
-
-/* This version is for expressions like A(i,j)||B(i,j) */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-class Tensor2_or_Tensor2
-{
-  const Tensor2_Expr<A,T,Dim,Dim,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim,Dim,i,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)+iterB(N1,N2);
-  }
-
-  Tensor2_or_Tensor2(const Tensor2_Expr<A,T,Dim,Dim,i,j> &a,
-		     const Tensor2_Expr<B,U,Dim,Dim,i,j> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr<const Tensor2_or_Tensor2<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,i,j>
-operator||(const Tensor2_Expr<A,T,Dim,Dim,i,j> &a,
-	   const Tensor2_Expr<B,U,Dim,Dim,i,j> &b)
-{
-  typedef const Tensor2_or_Tensor2<A,B,T,U,Dim,i,j> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
-    (TensorExpr(a,b));
-}
-
-/* This version is for when the indices are switched as in
-   A(i,j)||B(j,i) (probably the most common case). */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-class Tensor2_or_Tensor2_switched
-{
-  const Tensor2_Expr<A,T,Dim,Dim,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim,Dim,j,i> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)+iterB(N2,N1);
-  }
-
-  Tensor2_or_Tensor2_switched(const Tensor2_Expr<A,T,Dim,Dim,i,j> &a,
-			      const Tensor2_Expr<B,U,Dim,Dim,j,i> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_or_Tensor2_switched<A,B,T,U,Dim,i,j>,typename promote<T,U>::V,Dim,i,j>
-operator||(const Tensor2_Expr<A,T,Dim,Dim,i,j> &a,
-	   const Tensor2_Expr<B,U,Dim,Dim,j,i> &b)
-{
-  typedef const Tensor2_or_Tensor2_switched<A,B,T,U,Dim,i,j> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_or_Tensor2.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2/Tensor2_or_Tensor2.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,61 @@
+/* Creates a Tensor2_symmetric expression by adding two Tensor2's
+   together. */
+
+/* This version is for expressions like A(i,j)||B(i,j) */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+class Tensor2_or_Tensor2
+{
+  const Tensor2_Expr<A,T,Dim,Dim,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim,Dim,i,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)+iterB(N1,N2);
+  }
+
+  Tensor2_or_Tensor2(const Tensor2_Expr<A,T,Dim,Dim,i,j> &a,
+		     const Tensor2_Expr<B,U,Dim,Dim,i,j> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr<const Tensor2_or_Tensor2<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,i,j>
+operator||(const Tensor2_Expr<A,T,Dim,Dim,i,j> &a,
+	   const Tensor2_Expr<B,U,Dim,Dim,i,j> &b)
+{
+  typedef const Tensor2_or_Tensor2<A,B,T,U,Dim,i,j> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
+    (TensorExpr(a,b));
+}
+
+/* This version is for when the indices are switched as in
+   A(i,j)||B(j,i) (probably the most common case). */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+class Tensor2_or_Tensor2_switched
+{
+  const Tensor2_Expr<A,T,Dim,Dim,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim,Dim,j,i> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)+iterB(N2,N1);
+  }
+
+  Tensor2_or_Tensor2_switched(const Tensor2_Expr<A,T,Dim,Dim,i,j> &a,
+			      const Tensor2_Expr<B,U,Dim,Dim,j,i> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_or_Tensor2_switched<A,B,T,U,Dim,i,j>,typename promote<T,U>::V,Dim,i,j>
+operator||(const Tensor2_Expr<A,T,Dim,Dim,i,j> &a,
+	   const Tensor2_Expr<B,U,Dim,Dim,j,i> &b)
+{
+  typedef const Tensor2_or_Tensor2_switched<A,B,T,U,Dim,i,j> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_plus_Tensor2.h
--- a/Tensor2/Tensor2_plus_Tensor2.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-/* Adds a Tensor2 to a Tensor2, yielding a Tensor2. */
-
-/* A(i,j)+B(i,j) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
-class Tensor2_plus_Tensor2_01
-{
-  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim0,Dim1,i,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)+iterB(N1,N2);
-  }
-
-  Tensor2_plus_Tensor2_01(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-			  const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
-inline const Tensor2_Expr<const Tensor2_plus_Tensor2_01<A,B,T,U,Dim0,Dim1,i,j>,
-  typename promote<T,U>::V,Dim0,Dim1,i,j>
-operator+(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-	  const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &b)
-{
-  typedef const Tensor2_plus_Tensor2_01<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j)+B(j,i) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
-class Tensor2_plus_Tensor2_10
-{
-  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim0,Dim1,j,i> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)+iterB(N2,N1);
-  }
-
-  Tensor2_plus_Tensor2_10(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-			  const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1,
-  char i, char j>
-inline const Tensor2_Expr<const Tensor2_plus_Tensor2_10<A,B,T,U,Dim0,Dim1,i,j>,
-  typename promote<T,U>::V,Dim0,Dim1,i,j>
-operator+(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-	  const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &b)
-{
-  typedef const Tensor2_plus_Tensor2_10<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_plus_Tensor2.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2/Tensor2_plus_Tensor2.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,60 @@
+/* Adds a Tensor2 to a Tensor2, yielding a Tensor2. */
+
+/* A(i,j)+B(i,j) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
+class Tensor2_plus_Tensor2_01
+{
+  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim0,Dim1,i,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)+iterB(N1,N2);
+  }
+
+  Tensor2_plus_Tensor2_01(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+			  const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
+inline const Tensor2_Expr<const Tensor2_plus_Tensor2_01<A,B,T,U,Dim0,Dim1,i,j>,
+  typename promote<T,U>::V,Dim0,Dim1,i,j>
+operator+(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+	  const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &b)
+{
+  typedef const Tensor2_plus_Tensor2_01<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j)+B(j,i) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
+class Tensor2_plus_Tensor2_10
+{
+  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim0,Dim1,j,i> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)+iterB(N2,N1);
+  }
+
+  Tensor2_plus_Tensor2_10(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+			  const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1,
+  char i, char j>
+inline const Tensor2_Expr<const Tensor2_plus_Tensor2_10<A,B,T,U,Dim0,Dim1,i,j>,
+  typename promote<T,U>::V,Dim0,Dim1,i,j>
+operator+(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+	  const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &b)
+{
+  typedef const Tensor2_plus_Tensor2_10<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_pointer.h
--- a/Tensor2/Tensor2_pointer.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,193 +0,0 @@
-/* A version for pointers. */
-
-template <class T, int Tensor_Dim0, int Tensor_Dim1,
-	  Layout layout>
-class Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>
-{
-  mutable T * restrict data[(layout==column_major) ? Tensor_Dim0 : Tensor_Dim1]
-  [(layout==column_major) ? Tensor_Dim1 : Tensor_Dim0];
-public:
-  /* Initializations for varying numbers of elements, with each one
-     defined for a particular Tensor_Dim.  To initialize a different
-     dimension, just add the appropriate constructor and call to
-     the Tensor2_constructor constructor. */
-  Tensor2(T* d00, T* d01,T* d10, T* d11)
-  {
-    Tensor2_constructor<T* restrict,Tensor_Dim0,Tensor_Dim1,layout>
-      (data,d00,d01,d10,d11);
-  }
-  Tensor2(T* d00, T* d01, T* d10, T* d11, T* d20, T* d21)
-  {
-    Tensor2_constructor<T* restrict,Tensor_Dim0,Tensor_Dim1,layout>
-      (data,d00,d01,d10,d11,d20,d21);
-  }
-  Tensor2(T* d00, T* d01, T* d02, T* d10, T* d11, T* d12, T* d20, T* d21, T* d22)
-  {
-    Tensor2_constructor<T* restrict,Tensor_Dim0,Tensor_Dim1,layout>
-      (data,d00,d01,d02,d10,d11,d12,d20,d21,d22);
-  }
-  Tensor2(T* d00, T* d01, T* d02, T* d03, T* d10, T* d11, T* d12, T* d13,
-	  T* d20, T* d21, T* d22, T* d23, T* d30, T* d31, T* d32, T* d33)
-  {
-    Tensor2_constructor<T* restrict,Tensor_Dim0,Tensor_Dim1,layout>
-      (data,d00,d01,d02,d03,d10,d11,d12,d13,d20,d21,d22,d23,d30,d31,d32,d33);
-  }
-  Tensor2() {}
-
-  /* There are two operator(int,int)'s, one for non-consts that lets you
-     change the value, and one for consts that doesn't. */
-
-  T & operator()(const int N1, const int N2)
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim0 || N1<0 || N2>=Tensor_Dim1 || N2<0)
-      {
-	std::stringstream s;
-        s << "Bad index in Tensor2<T*,"
-          << Tensor_Dim0 << "," << Tensor_Dim1
-          << ">.operator(" << N1 << "," << N2 << ")"
-          << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return ((layout==column_major) ? *data[N1][N2] : *data[N2][N1]);
-  }
-
-  T operator()(const int N1, const int N2) const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim0 || N1<0 || N2>=Tensor_Dim1 || N2<0)
-      {
-	std::stringstream s;
-        s << "Bad index in Tensor2<T*,"
-          << Tensor_Dim0 << "," << Tensor_Dim1
-          << ">.operator(" << N1 << "," << N2 << ") const"
-          << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return ((layout==column_major) ? *data[N1][N2] : *data[N2][N1]);
-  }
-
-  T* ptr(const int N1, const int N2) const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim0 || N1<0 || N2>=Tensor_Dim1 || N2<0)
-      {
-	std::stringstream s;
-        s << "Bad index in Tensor2<T*,"
-          << Tensor_Dim0 << "," << Tensor_Dim1
-          << ">.ptr(" << N1 << "," << N2 << ")" << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return ((layout==column_major) ? data[N1][N2] : data[N2][N1]);
-  }
-
-  /* These operator()'s are the first part in constructing template
-     expressions.  They can be used to slice off lower dimensional
-     parts. They are not entirely safe, since you can accidently use a
-     higher dimension than what is really allowed (like Dim=5). */
-
-  template<char i, char j, int Dim0, int Dim1>
-  Tensor2_Expr<Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,T,Dim0,Dim1,i,j>
-  operator()(const Index<i,Dim0> index1, const Index<j,Dim1> index2)
-  {
-    return Tensor2_Expr<Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,T,Dim0,Dim1,i,j>
-      (*this);
-  }
-
-  template<char i, char j, int Dim0, int Dim1>
-  Tensor2_Expr<const Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,T,Dim0,Dim1,i,j>
-  operator()(const Index<i,Dim0> index1, const Index<j,Dim1> index2) const
-  {
-    return Tensor2_Expr<const Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,
-      T,Dim0,Dim1,i,j>(*this);
-  }
-
-  /* This is for expressions where a number is used for one slot, and
-     an index for another, yielding a Tensor1_Expr.  The non-const
-     versions don't actually create a Tensor2_number_rhs_[01] object.
-     They create a Tensor1_Expr directly, which provides the
-     appropriate indexing operators.  The const versions do create a
-     Tensor2_number_[01]. */
-
-  template<char i, int Dim, int N>
-  Tensor1_Expr<Tensor2_number_rhs_1<Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,
-    T,N>,T,Dim,i>
-  operator()(const Index<i,Dim> index1, const Number<N> n1)
-  {
-    typedef Tensor2_number_rhs_1<Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,
-      T,N> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
-  }
-
-  template<char i, int Dim, int N>
-  Tensor1_Expr<Tensor2_number_rhs_0<Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,
-    T,N>,T,Dim,i>
-  operator()(const Number<N> n1, const Index<i,Dim> index1)
-  {
-    typedef Tensor2_number_rhs_0<Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,T,N>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
-  }
-
-  template<char i, int Dim, int N>
-  Tensor1_Expr<const Tensor2_number_1<const Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,
-    T,N>,T,Dim,i>
-  operator()(const Index<i,Dim> index1, const Number<N> n1) const
-  {
-    typedef const Tensor2_number_1<const Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,T,N>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-  template<char i, int Dim, int N>
-  Tensor1_Expr<const Tensor2_number_0<const Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,
-    T,N>,T,Dim,i>
-  operator()(const Number<N> n1, const Index<i,Dim> index1) const
-  {
-    typedef const Tensor2_number_0<const Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,T,N>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-  
-  /* The ++ operator increments the pointer, not the number that the
-     pointer points to.  This allows iterating over a grid. */
-
-  const Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout> & operator++() const
-  {
-    for(int i=0;i<Tensor_Dim0;++i)
-      for(int j=0;j<Tensor_Dim1;++j)
-	((layout==column_major) ? ++data[i][j] : ++data[j][i]);
-    return *this;
-  }
-
-  /* These two operator()'s return the Tensor2 with internal
-     contractions, yielding a T.  I have to specify one for both
-     const and non-const because otherwise they compiler will use the
-     operator() which gives a Tensor2_Expr<>. */
-
-  template<char i, int Dim>
-  T operator()(const Index<i,Dim> index1, const Index<i,Dim> index2)
-  {
-    return internal_contract(Number<Dim>());
-  }
-
-  template<char i, int Dim>
-  T operator()(const Index<i,Dim> index1, const Index<i,Dim> index2) const
-  {
-    return internal_contract(Number<Dim>());
-  }
-private:
-  template<int N>
-  T internal_contract(Number<N>)
-  {
-    return *data[N-1][N-1] + internal_contract(Number<N-1>());
-  }
-
-  T internal_contract(Number<1>)
-  {
-    return *data[0][0];
-  }
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_pointer.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2/Tensor2_pointer.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,193 @@
+/* A version for pointers. */
+
+template <class T, int Tensor_Dim0, int Tensor_Dim1,
+	  Layout layout>
+class Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>
+{
+  mutable T * restrict data[(layout==column_major) ? Tensor_Dim0 : Tensor_Dim1]
+  [(layout==column_major) ? Tensor_Dim1 : Tensor_Dim0];
+public:
+  /* Initializations for varying numbers of elements, with each one
+     defined for a particular Tensor_Dim.  To initialize a different
+     dimension, just add the appropriate constructor and call to
+     the Tensor2_constructor constructor. */
+  Tensor2(T* d00, T* d01,T* d10, T* d11)
+  {
+    Tensor2_constructor<T* restrict,Tensor_Dim0,Tensor_Dim1,layout>
+      (data,d00,d01,d10,d11);
+  }
+  Tensor2(T* d00, T* d01, T* d10, T* d11, T* d20, T* d21)
+  {
+    Tensor2_constructor<T* restrict,Tensor_Dim0,Tensor_Dim1,layout>
+      (data,d00,d01,d10,d11,d20,d21);
+  }
+  Tensor2(T* d00, T* d01, T* d02, T* d10, T* d11, T* d12, T* d20, T* d21, T* d22)
+  {
+    Tensor2_constructor<T* restrict,Tensor_Dim0,Tensor_Dim1,layout>
+      (data,d00,d01,d02,d10,d11,d12,d20,d21,d22);
+  }
+  Tensor2(T* d00, T* d01, T* d02, T* d03, T* d10, T* d11, T* d12, T* d13,
+	  T* d20, T* d21, T* d22, T* d23, T* d30, T* d31, T* d32, T* d33)
+  {
+    Tensor2_constructor<T* restrict,Tensor_Dim0,Tensor_Dim1,layout>
+      (data,d00,d01,d02,d03,d10,d11,d12,d13,d20,d21,d22,d23,d30,d31,d32,d33);
+  }
+  Tensor2() {}
+
+  /* There are two operator(int,int)'s, one for non-consts that lets you
+     change the value, and one for consts that doesn't. */
+
+  T & operator()(const int N1, const int N2)
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim0 || N1<0 || N2>=Tensor_Dim1 || N2<0)
+      {
+	std::stringstream s;
+        s << "Bad index in Tensor2<T*,"
+          << Tensor_Dim0 << "," << Tensor_Dim1
+          << ">.operator(" << N1 << "," << N2 << ")"
+          << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return ((layout==column_major) ? *data[N1][N2] : *data[N2][N1]);
+  }
+
+  T operator()(const int N1, const int N2) const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim0 || N1<0 || N2>=Tensor_Dim1 || N2<0)
+      {
+	std::stringstream s;
+        s << "Bad index in Tensor2<T*,"
+          << Tensor_Dim0 << "," << Tensor_Dim1
+          << ">.operator(" << N1 << "," << N2 << ") const"
+          << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return ((layout==column_major) ? *data[N1][N2] : *data[N2][N1]);
+  }
+
+  T* ptr(const int N1, const int N2) const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim0 || N1<0 || N2>=Tensor_Dim1 || N2<0)
+      {
+	std::stringstream s;
+        s << "Bad index in Tensor2<T*,"
+          << Tensor_Dim0 << "," << Tensor_Dim1
+          << ">.ptr(" << N1 << "," << N2 << ")" << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return ((layout==column_major) ? data[N1][N2] : data[N2][N1]);
+  }
+
+  /* These operator()'s are the first part in constructing template
+     expressions.  They can be used to slice off lower dimensional
+     parts. They are not entirely safe, since you can accidently use a
+     higher dimension than what is really allowed (like Dim=5). */
+
+  template<char i, char j, int Dim0, int Dim1>
+  Tensor2_Expr<Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,T,Dim0,Dim1,i,j>
+  operator()(const Index<i,Dim0> index1, const Index<j,Dim1> index2)
+  {
+    return Tensor2_Expr<Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,T,Dim0,Dim1,i,j>
+      (*this);
+  }
+
+  template<char i, char j, int Dim0, int Dim1>
+  Tensor2_Expr<const Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,T,Dim0,Dim1,i,j>
+  operator()(const Index<i,Dim0> index1, const Index<j,Dim1> index2) const
+  {
+    return Tensor2_Expr<const Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,
+      T,Dim0,Dim1,i,j>(*this);
+  }
+
+  /* This is for expressions where a number is used for one slot, and
+     an index for another, yielding a Tensor1_Expr.  The non-const
+     versions don't actually create a Tensor2_number_rhs_[01] object.
+     They create a Tensor1_Expr directly, which provides the
+     appropriate indexing operators.  The const versions do create a
+     Tensor2_number_[01]. */
+
+  template<char i, int Dim, int N>
+  Tensor1_Expr<Tensor2_number_rhs_1<Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,
+    T,N>,T,Dim,i>
+  operator()(const Index<i,Dim> index1, const Number<N> n1)
+  {
+    typedef Tensor2_number_rhs_1<Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,
+      T,N> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
+  }
+
+  template<char i, int Dim, int N>
+  Tensor1_Expr<Tensor2_number_rhs_0<Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,
+    T,N>,T,Dim,i>
+  operator()(const Number<N> n1, const Index<i,Dim> index1)
+  {
+    typedef Tensor2_number_rhs_0<Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,T,N>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
+  }
+
+  template<char i, int Dim, int N>
+  Tensor1_Expr<const Tensor2_number_1<const Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,
+    T,N>,T,Dim,i>
+  operator()(const Index<i,Dim> index1, const Number<N> n1) const
+  {
+    typedef const Tensor2_number_1<const Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,T,N>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+  template<char i, int Dim, int N>
+  Tensor1_Expr<const Tensor2_number_0<const Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,
+    T,N>,T,Dim,i>
+  operator()(const Number<N> n1, const Index<i,Dim> index1) const
+  {
+    typedef const Tensor2_number_0<const Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout>,T,N>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+  
+  /* The ++ operator increments the pointer, not the number that the
+     pointer points to.  This allows iterating over a grid. */
+
+  const Tensor2<T*,Tensor_Dim0,Tensor_Dim1,layout> & operator++() const
+  {
+    for(int i=0;i<Tensor_Dim0;++i)
+      for(int j=0;j<Tensor_Dim1;++j)
+	((layout==column_major) ? ++data[i][j] : ++data[j][i]);
+    return *this;
+  }
+
+  /* These two operator()'s return the Tensor2 with internal
+     contractions, yielding a T.  I have to specify one for both
+     const and non-const because otherwise they compiler will use the
+     operator() which gives a Tensor2_Expr<>. */
+
+  template<char i, int Dim>
+  T operator()(const Index<i,Dim> index1, const Index<i,Dim> index2)
+  {
+    return internal_contract(Number<Dim>());
+  }
+
+  template<char i, int Dim>
+  T operator()(const Index<i,Dim> index1, const Index<i,Dim> index2) const
+  {
+    return internal_contract(Number<Dim>());
+  }
+private:
+  template<int N>
+  T internal_contract(Number<N>)
+  {
+    return *data[N-1][N-1] + internal_contract(Number<N-1>());
+  }
+
+  T internal_contract(Number<1>)
+  {
+    return *data[0][0];
+  }
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_times_Tensor1.h
--- a/Tensor2/Tensor2_times_Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,147 +0,0 @@
-/* This file has all of the declarations for expressions like
-   Tensor2*Tensor1 and Tensor1*Tensor2, yielding a Tensor1 or
-   Tensor3. */
-
-/* A(i,j)*B(j) -> Tensor1 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
-class Tensor2_times_Tensor1_1
-{
-  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
-  const Tensor1_Expr<B,U,Dim1,j> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const Number<Current_Dim> &N) const
-  {
-    return iterA(N1,Current_Dim-1)*iterB(Current_Dim-1)
-      + eval(N1,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const Number<1> &N) const
-  {
-    return iterA(N1,0)*iterB(0);
-  }
-public:
-  Tensor2_times_Tensor1_1(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-			  const Tensor1_Expr<B,U,Dim1,j> &b):
-    iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim1>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
-inline const Tensor1_Expr<const Tensor2_times_Tensor1_1<A,B,T,U,Dim0,Dim1,i,j>,
-  typename promote<T,U>::V,Dim0,i>
-operator*(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-	  const Tensor1_Expr<B,U,Dim1,j> &b)
-{
-  typedef const Tensor2_times_Tensor1_1<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim0,i>(TensorExpr(a,b));
-}
-
-/* A(j,i)*B(j) -> Tensor1 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
-class Tensor2_times_Tensor1_0
-{
-  const Tensor2_Expr<A,T,Dim1,Dim0,j,i> iterA;
-  const Tensor1_Expr<B,U,Dim1,j> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const Number<Current_Dim> &N) const
-  {
-    return iterA(Current_Dim-1,N1)*iterB(Current_Dim-1)
-      + eval(N1,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const Number<1> &N) const
-  {
-    return iterA(0,N1)*iterB(0);
-  }
-public:
-  Tensor2_times_Tensor1_0(const Tensor2_Expr<A,T,Dim1,Dim0,j,i> &a,
-			  const Tensor1_Expr<B,U,Dim1,j> &b):
-    iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim1>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
-inline const Tensor1_Expr<const Tensor2_times_Tensor1_0<A,B,T,U,Dim0,Dim1,i,j>,
-  typename promote<T,U>::V,Dim0,i>
-operator*(const Tensor2_Expr<A,T,Dim1,Dim0,j,i> &a,
-	  const Tensor1_Expr<B,U,Dim1,j> &b)
-{
-  typedef const Tensor2_times_Tensor1_0<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim0,i>(TensorExpr(a,b));
-}
-
-/* B(j)*A(i,j) -> Tensor1 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
-inline const Tensor1_Expr<const Tensor2_times_Tensor1_1<A,B,T,U,Dim0,Dim1,i,j>,
-  typename promote<T,U>::V,Dim0,i>
-operator*(const Tensor1_Expr<B,U,Dim1,j> &b,
-	  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a)
-{
-  typedef const Tensor2_times_Tensor1_1<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim0,i>(TensorExpr(a,b));
-}
-
-/* B(j)*A(j,i) -> Tensor1 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
-inline const Tensor1_Expr<const Tensor2_times_Tensor1_0<A,B,T,U,Dim0,Dim1,i,j>,
-  typename promote<T,U>::V,Dim0,i>
-operator*(const Tensor1_Expr<B,U,Dim1,j> &b,
-	  const Tensor2_Expr<A,T,Dim1,Dim0,j,i> &a)
-{
-  typedef const Tensor2_times_Tensor1_0<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim0,i>(TensorExpr(a,b));
-}
-
-/* A(i,j)*B(k) -> Tensor3 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-class Tensor2_times_Tensor1
-{
-  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
-  const Tensor1_Expr<B,U,Dim2,k> iterB;
-public:
-  Tensor2_times_Tensor1(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-			const Tensor1_Expr<B,U,Dim2,k> &b):
-    iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2)*iterB(N3);
-  }
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_Expr<const Tensor2_times_Tensor1<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-operator*(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-	  const Tensor1_Expr<B,U,Dim2,k> &b)
-{
-  typedef const Tensor2_times_Tensor1<A,B,T,U,Dim0,Dim1,Dim2,i,j,k> TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-    (TensorExpr(a,b));
-}
-
-/* B(k)*A(i,j) -> Tensor3 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_Expr<const Tensor2_times_Tensor1<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-operator*(const Tensor1_Expr<B,U,Dim2,k> &b,
-	  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a)
-{
-  typedef const Tensor2_times_Tensor1<A,B,T,U,Dim0,Dim1,Dim2,i,j,k> TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_times_Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2/Tensor2_times_Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,147 @@
+/* This file has all of the declarations for expressions like
+   Tensor2*Tensor1 and Tensor1*Tensor2, yielding a Tensor1 or
+   Tensor3. */
+
+/* A(i,j)*B(j) -> Tensor1 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
+class Tensor2_times_Tensor1_1
+{
+  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
+  const Tensor1_Expr<B,U,Dim1,j> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const Number<Current_Dim> &N) const
+  {
+    return iterA(N1,Current_Dim-1)*iterB(Current_Dim-1)
+      + eval(N1,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const Number<1> &N) const
+  {
+    return iterA(N1,0)*iterB(0);
+  }
+public:
+  Tensor2_times_Tensor1_1(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+			  const Tensor1_Expr<B,U,Dim1,j> &b):
+    iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim1>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
+inline const Tensor1_Expr<const Tensor2_times_Tensor1_1<A,B,T,U,Dim0,Dim1,i,j>,
+  typename promote<T,U>::V,Dim0,i>
+operator*(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+	  const Tensor1_Expr<B,U,Dim1,j> &b)
+{
+  typedef const Tensor2_times_Tensor1_1<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim0,i>(TensorExpr(a,b));
+}
+
+/* A(j,i)*B(j) -> Tensor1 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
+class Tensor2_times_Tensor1_0
+{
+  const Tensor2_Expr<A,T,Dim1,Dim0,j,i> iterA;
+  const Tensor1_Expr<B,U,Dim1,j> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const Number<Current_Dim> &N) const
+  {
+    return iterA(Current_Dim-1,N1)*iterB(Current_Dim-1)
+      + eval(N1,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const Number<1> &N) const
+  {
+    return iterA(0,N1)*iterB(0);
+  }
+public:
+  Tensor2_times_Tensor1_0(const Tensor2_Expr<A,T,Dim1,Dim0,j,i> &a,
+			  const Tensor1_Expr<B,U,Dim1,j> &b):
+    iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim1>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
+inline const Tensor1_Expr<const Tensor2_times_Tensor1_0<A,B,T,U,Dim0,Dim1,i,j>,
+  typename promote<T,U>::V,Dim0,i>
+operator*(const Tensor2_Expr<A,T,Dim1,Dim0,j,i> &a,
+	  const Tensor1_Expr<B,U,Dim1,j> &b)
+{
+  typedef const Tensor2_times_Tensor1_0<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim0,i>(TensorExpr(a,b));
+}
+
+/* B(j)*A(i,j) -> Tensor1 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
+inline const Tensor1_Expr<const Tensor2_times_Tensor1_1<A,B,T,U,Dim0,Dim1,i,j>,
+  typename promote<T,U>::V,Dim0,i>
+operator*(const Tensor1_Expr<B,U,Dim1,j> &b,
+	  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a)
+{
+  typedef const Tensor2_times_Tensor1_1<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim0,i>(TensorExpr(a,b));
+}
+
+/* B(j)*A(j,i) -> Tensor1 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
+inline const Tensor1_Expr<const Tensor2_times_Tensor1_0<A,B,T,U,Dim0,Dim1,i,j>,
+  typename promote<T,U>::V,Dim0,i>
+operator*(const Tensor1_Expr<B,U,Dim1,j> &b,
+	  const Tensor2_Expr<A,T,Dim1,Dim0,j,i> &a)
+{
+  typedef const Tensor2_times_Tensor1_0<A,B,T,U,Dim0,Dim1,i,j> TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim0,i>(TensorExpr(a,b));
+}
+
+/* A(i,j)*B(k) -> Tensor3 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+class Tensor2_times_Tensor1
+{
+  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
+  const Tensor1_Expr<B,U,Dim2,k> iterB;
+public:
+  Tensor2_times_Tensor1(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+			const Tensor1_Expr<B,U,Dim2,k> &b):
+    iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2)*iterB(N3);
+  }
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_Expr<const Tensor2_times_Tensor1<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+operator*(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+	  const Tensor1_Expr<B,U,Dim2,k> &b)
+{
+  typedef const Tensor2_times_Tensor1<A,B,T,U,Dim0,Dim1,Dim2,i,j,k> TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+    (TensorExpr(a,b));
+}
+
+/* B(k)*A(i,j) -> Tensor3 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_Expr<const Tensor2_times_Tensor1<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+operator*(const Tensor1_Expr<B,U,Dim2,k> &b,
+	  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a)
+{
+  typedef const Tensor2_times_Tensor1<A,B,T,U,Dim0,Dim1,Dim2,i,j,k> TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_times_Tensor2.h
--- a/Tensor2/Tensor2_times_Tensor2.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,299 +0,0 @@
-/* This file has all of the declarations for Tensor2*Tensor2.  This
-   includes the double contraction A(i,j)*B(i,j) (yielding a
-   typename promote<T,U>) as well as the more complicated single contraction
-   A(i,j)*B(j,k) (yielding a Tensor2 expression) and no contraction
-   (yielding a Tensor4). */
-
-/* Double contraction. */
-
-/* A(i,j)*B(i,j) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,
-  char j, int Current_Dim0, int Current_Dim1>
-inline const typename promote<T,U>::V T2_times_T2(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-				   const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &b,
-				   const Number<Current_Dim0> &N0,
-				   const Number<Current_Dim1> &N1)
-{
-  return a(Current_Dim0-1,Current_Dim1-1)*b(Current_Dim0-1,Current_Dim1-1)
-    + T2_times_T2(a,b,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,
-  char j, int Current_Dim1>
-inline const typename promote<T,U>::V T2_times_T2(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-				   const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &b,
-				   const Number<1> &N0,
-				   const Number<Current_Dim1> &N1)
-{
-  return a(0,Current_Dim1-1)*b(0,Current_Dim1-1)
-    + T2_times_T2(a,b,Number<Dim0>(),Number<Current_Dim1-1>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,
-  char j>
-inline const typename promote<T,U>::V T2_times_T2(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-				   const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &b,
-				   const Number<1> &N0, const Number<1> &N1)
-{
-  return a(0,0)*b(0,0);
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
-inline const typename promote<T,U>::V operator*(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-				 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &b)
-{
-  return T2_times_T2(a,b,Number<Dim0>(),Number<Dim1>());
-}
-
-/* A(i,j)*B(j,i) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,
-  char j, int Current_Dim0, int Current_Dim1>
-inline const typename promote<T,U>::V
-T2_times_switched_T2(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-		     const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &b,
-		     const Number<Current_Dim0> &N0,
-		     const Number<Current_Dim1> &N1)
-{
-  return a(Current_Dim0-1,Current_Dim1-1)*b(Current_Dim1-1,Current_Dim0-1)
-    + T2_times_switched_T2(a,b,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,
-  char j, int Current_Dim1>
-inline const typename promote<T,U>::V
-T2_times_switched_T2(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-		     const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &b,
-		     const Number<1> &N0, const Number<Current_Dim1> &N1)
-{
-  return a(0,Current_Dim1-1)*b(Current_Dim1-1,0)
-    + T2_times_switched_T2(a,b,Number<Dim0>(),Number<Current_Dim1-1>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,
-  char j>
-inline const typename promote<T,U>::V
-T2_times_switched_T2(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-		     const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &b,
-		     const Number<1> &N0, const Number<1> &N1)
-{
-  return a(0,0)*b(0,0);
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
-inline const typename promote<T,U>::V operator*(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-				 const Tensor2_Expr<B,U,Dim1,Dim0,j,i> &b)
-{
-  return T2_times_switched_T2(a,b,Number<Dim0>(),Number<Dim1>());
-}
-
-/* Single contraction.  The wrapper class has a different name for
-   each possible placing of the indices (e.g. A(i,j)*B(j,k) has the
-   number 10 because the contraction indices are on the second and
-   first slots (counting from 0). */
-
-/* A(i,j)*B(j,k) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-class Tensor2_times_Tensor2_10
-{
-  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim1,Dim2,j,k> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(N1,Current_Dim-1)*iterB(Current_Dim-1,N2)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
-  {
-    return iterA(N1,0)*iterB(0,N2);
-  }
-public:
-  Tensor2_times_Tensor2_10(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-			   const Tensor2_Expr<B,U,Dim1,Dim2,j,k> &b):
-    iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim1>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor2_Expr<const Tensor2_times_Tensor2_10
-<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,typename promote<T,U>::V,Dim0,Dim2,i,k>
-operator*(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-	  const Tensor2_Expr<B,U,Dim1,Dim2,j,k> &b)
-{
-  typedef const Tensor2_times_Tensor2_10<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim2,i,k>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j)*B(k,j) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-class Tensor2_times_Tensor2_11
-{
-  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim2,Dim1,k,j> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(N1,Current_Dim-1)*iterB(N2,Current_Dim-1)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
-  {
-    return iterA(N1,0)*iterB(N2,0);
-  }
-public:
-  Tensor2_times_Tensor2_11(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-			   const Tensor2_Expr<B,U,Dim2,Dim1,k,j> &b):
-    iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim1>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor2_Expr<const Tensor2_times_Tensor2_11
-<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,typename promote<T,U>::V,Dim0,Dim2,i,k>
-operator*(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-	  const Tensor2_Expr<B,U,Dim2,Dim1,k,j> &b)
-{
-  typedef const Tensor2_times_Tensor2_11<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim2,i,k>
-    (TensorExpr(a,b));
-}
-
-/* A(j,i)*B(j,k) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-class Tensor2_times_Tensor2_00
-{
-  const Tensor2_Expr<A,T,Dim1,Dim0,j,i> iterA;
-  const Tensor2_Expr<B,U,Dim1,Dim2,j,k> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(Current_Dim-1,N1)*iterB(Current_Dim-1,N2)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
-  {
-    return iterA(0,N1)*iterB(0,N2);
-  }
-public:
-  Tensor2_times_Tensor2_00(const Tensor2_Expr<A,T,Dim1,Dim0,j,i> &a,
-			   const Tensor2_Expr<B,U,Dim1,Dim2,j,k> &b):
-    iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim1>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor2_Expr<const Tensor2_times_Tensor2_00
-<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,typename promote<T,U>::V,Dim0,Dim2,i,k>
-operator*(const Tensor2_Expr<A,T,Dim1,Dim0,j,i> &a,
-	  const Tensor2_Expr<B,U,Dim1,Dim2,j,k> &b)
-{
-  typedef const Tensor2_times_Tensor2_00<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim2,i,k>
-    (TensorExpr(a,b));
-}
-
-/* A(j,i)*B(k,j) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-class Tensor2_times_Tensor2_01
-{
-  const Tensor2_Expr<A,T,Dim1,Dim0,j,i> iterA;
-  const Tensor2_Expr<B,U,Dim2,Dim1,k,j> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(Current_Dim-1,N1)*iterB(N2,Current_Dim-1)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
-  {
-    return iterA(0,N1)*iterB(N2,0);
-  }
-public:
-  Tensor2_times_Tensor2_01(const Tensor2_Expr<A,T,Dim1,Dim0,j,i> &a,
-			   const Tensor2_Expr<B,U,Dim2,Dim1,k,j> &b):
-    iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim1>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor2_Expr<const Tensor2_times_Tensor2_01
-<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,typename promote<T,U>::V,Dim0,Dim2,i,k>
-operator*(const Tensor2_Expr<A,T,Dim1,Dim0,j,i> &a,
-	  const Tensor2_Expr<B,U,Dim2,Dim1,k,j> &b)
-{
-  typedef const Tensor2_times_Tensor2_01<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim2,i,k>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j)*B(k,l) -> Tensor4 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-class Tensor2_times_Tensor2
-{
-  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim2,Dim3,k,l> iterB;
-public:
-  Tensor2_times_Tensor2(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-			const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-			     const int N4) const
-  {
-    return iterA(N1,N2)*iterB(N3,N4);
-  }
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-inline Tensor4_Expr
-<const Tensor2_times_Tensor2<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
-operator*(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
-	  const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b)
-{
-  typedef const Tensor2_times_Tensor2<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
-    TensorExpr;
-  return Tensor4_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_times_Tensor2.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2/Tensor2_times_Tensor2.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,299 @@
+/* This file has all of the declarations for Tensor2*Tensor2.  This
+   includes the double contraction A(i,j)*B(i,j) (yielding a
+   typename promote<T,U>) as well as the more complicated single contraction
+   A(i,j)*B(j,k) (yielding a Tensor2 expression) and no contraction
+   (yielding a Tensor4). */
+
+/* Double contraction. */
+
+/* A(i,j)*B(i,j) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,
+  char j, int Current_Dim0, int Current_Dim1>
+inline const typename promote<T,U>::V T2_times_T2(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+				   const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &b,
+				   const Number<Current_Dim0> &N0,
+				   const Number<Current_Dim1> &N1)
+{
+  return a(Current_Dim0-1,Current_Dim1-1)*b(Current_Dim0-1,Current_Dim1-1)
+    + T2_times_T2(a,b,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,
+  char j, int Current_Dim1>
+inline const typename promote<T,U>::V T2_times_T2(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+				   const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &b,
+				   const Number<1> &N0,
+				   const Number<Current_Dim1> &N1)
+{
+  return a(0,Current_Dim1-1)*b(0,Current_Dim1-1)
+    + T2_times_T2(a,b,Number<Dim0>(),Number<Current_Dim1-1>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,
+  char j>
+inline const typename promote<T,U>::V T2_times_T2(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+				   const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &b,
+				   const Number<1> &N0, const Number<1> &N1)
+{
+  return a(0,0)*b(0,0);
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
+inline const typename promote<T,U>::V operator*(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+				 const Tensor2_Expr<B,U,Dim0,Dim1,i,j> &b)
+{
+  return T2_times_T2(a,b,Number<Dim0>(),Number<Dim1>());
+}
+
+/* A(i,j)*B(j,i) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,
+  char j, int Current_Dim0, int Current_Dim1>
+inline const typename promote<T,U>::V
+T2_times_switched_T2(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+		     const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &b,
+		     const Number<Current_Dim0> &N0,
+		     const Number<Current_Dim1> &N1)
+{
+  return a(Current_Dim0-1,Current_Dim1-1)*b(Current_Dim1-1,Current_Dim0-1)
+    + T2_times_switched_T2(a,b,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,
+  char j, int Current_Dim1>
+inline const typename promote<T,U>::V
+T2_times_switched_T2(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+		     const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &b,
+		     const Number<1> &N0, const Number<Current_Dim1> &N1)
+{
+  return a(0,Current_Dim1-1)*b(Current_Dim1-1,0)
+    + T2_times_switched_T2(a,b,Number<Dim0>(),Number<Current_Dim1-1>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,
+  char j>
+inline const typename promote<T,U>::V
+T2_times_switched_T2(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+		     const Tensor2_Expr<B,U,Dim0,Dim1,j,i> &b,
+		     const Number<1> &N0, const Number<1> &N1)
+{
+  return a(0,0)*b(0,0);
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, char i,char j>
+inline const typename promote<T,U>::V operator*(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+				 const Tensor2_Expr<B,U,Dim1,Dim0,j,i> &b)
+{
+  return T2_times_switched_T2(a,b,Number<Dim0>(),Number<Dim1>());
+}
+
+/* Single contraction.  The wrapper class has a different name for
+   each possible placing of the indices (e.g. A(i,j)*B(j,k) has the
+   number 10 because the contraction indices are on the second and
+   first slots (counting from 0). */
+
+/* A(i,j)*B(j,k) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+class Tensor2_times_Tensor2_10
+{
+  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim1,Dim2,j,k> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(N1,Current_Dim-1)*iterB(Current_Dim-1,N2)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
+  {
+    return iterA(N1,0)*iterB(0,N2);
+  }
+public:
+  Tensor2_times_Tensor2_10(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+			   const Tensor2_Expr<B,U,Dim1,Dim2,j,k> &b):
+    iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim1>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor2_Expr<const Tensor2_times_Tensor2_10
+<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,typename promote<T,U>::V,Dim0,Dim2,i,k>
+operator*(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+	  const Tensor2_Expr<B,U,Dim1,Dim2,j,k> &b)
+{
+  typedef const Tensor2_times_Tensor2_10<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim2,i,k>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j)*B(k,j) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+class Tensor2_times_Tensor2_11
+{
+  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim2,Dim1,k,j> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(N1,Current_Dim-1)*iterB(N2,Current_Dim-1)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
+  {
+    return iterA(N1,0)*iterB(N2,0);
+  }
+public:
+  Tensor2_times_Tensor2_11(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+			   const Tensor2_Expr<B,U,Dim2,Dim1,k,j> &b):
+    iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim1>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor2_Expr<const Tensor2_times_Tensor2_11
+<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,typename promote<T,U>::V,Dim0,Dim2,i,k>
+operator*(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+	  const Tensor2_Expr<B,U,Dim2,Dim1,k,j> &b)
+{
+  typedef const Tensor2_times_Tensor2_11<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim2,i,k>
+    (TensorExpr(a,b));
+}
+
+/* A(j,i)*B(j,k) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+class Tensor2_times_Tensor2_00
+{
+  const Tensor2_Expr<A,T,Dim1,Dim0,j,i> iterA;
+  const Tensor2_Expr<B,U,Dim1,Dim2,j,k> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(Current_Dim-1,N1)*iterB(Current_Dim-1,N2)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
+  {
+    return iterA(0,N1)*iterB(0,N2);
+  }
+public:
+  Tensor2_times_Tensor2_00(const Tensor2_Expr<A,T,Dim1,Dim0,j,i> &a,
+			   const Tensor2_Expr<B,U,Dim1,Dim2,j,k> &b):
+    iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim1>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor2_Expr<const Tensor2_times_Tensor2_00
+<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,typename promote<T,U>::V,Dim0,Dim2,i,k>
+operator*(const Tensor2_Expr<A,T,Dim1,Dim0,j,i> &a,
+	  const Tensor2_Expr<B,U,Dim1,Dim2,j,k> &b)
+{
+  typedef const Tensor2_times_Tensor2_00<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim2,i,k>
+    (TensorExpr(a,b));
+}
+
+/* A(j,i)*B(k,j) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+class Tensor2_times_Tensor2_01
+{
+  const Tensor2_Expr<A,T,Dim1,Dim0,j,i> iterA;
+  const Tensor2_Expr<B,U,Dim2,Dim1,k,j> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(Current_Dim-1,N1)*iterB(N2,Current_Dim-1)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
+  {
+    return iterA(0,N1)*iterB(N2,0);
+  }
+public:
+  Tensor2_times_Tensor2_01(const Tensor2_Expr<A,T,Dim1,Dim0,j,i> &a,
+			   const Tensor2_Expr<B,U,Dim2,Dim1,k,j> &b):
+    iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim1>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor2_Expr<const Tensor2_times_Tensor2_01
+<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,typename promote<T,U>::V,Dim0,Dim2,i,k>
+operator*(const Tensor2_Expr<A,T,Dim1,Dim0,j,i> &a,
+	  const Tensor2_Expr<B,U,Dim2,Dim1,k,j> &b)
+{
+  typedef const Tensor2_times_Tensor2_01<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim2,i,k>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j)*B(k,l) -> Tensor4 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+class Tensor2_times_Tensor2
+{
+  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim2,Dim3,k,l> iterB;
+public:
+  Tensor2_times_Tensor2(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+			const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+			     const int N4) const
+  {
+    return iterA(N1,N2)*iterB(N3,N4);
+  }
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+inline Tensor4_Expr
+<const Tensor2_times_Tensor2<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
+operator*(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a,
+	  const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b)
+{
+  typedef const Tensor2_times_Tensor2<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
+    TensorExpr;
+  return Tensor4_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_times_generic.h
--- a/Tensor2/Tensor2_times_generic.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-/* Multiplies a Tensor2 with a generic, yielding a Tensor2. */
-
-template<class A, class T, class U, int Dim0, int Dim1, char i, char j>
-class Tensor2_times_generic
-{
-  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
-  const U d;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)*d;
-  }
-
-  Tensor2_times_generic(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a, const U &d0):
-    iterA(a), d(d0) {}
-};
-
-template<class A, class T, class U, int Dim0, int Dim1, char i, char j>
-inline const Tensor2_Expr<const Tensor2_times_generic<A,T,U,Dim0,Dim1,i,j>,
-  typename promote<T,U>::V,Dim0,Dim1,i,j>
-operator*(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a, const U &d0)
-{
-  typedef const Tensor2_times_generic<A,T,U,Dim0,Dim1,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,d0));
-}
-
-template<class A, class T, class U, int Dim0, int Dim1, char i, char j>
-inline const Tensor2_Expr<const Tensor2_times_generic<A,T,U,Dim0,Dim1,i,j>,
-  typename promote<T,U>::V,Dim0,Dim1,i,j>
-operator*(const U &d0, const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a)
-{
-  typedef const Tensor2_times_generic<A,T,U,Dim0,Dim1,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,d0));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_times_generic.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2/Tensor2_times_generic.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,37 @@
+/* Multiplies a Tensor2 with a generic, yielding a Tensor2. */
+
+template<class A, class T, class U, int Dim0, int Dim1, char i, char j>
+class Tensor2_times_generic
+{
+  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
+  const U d;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)*d;
+  }
+
+  Tensor2_times_generic(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a, const U &d0):
+    iterA(a), d(d0) {}
+};
+
+template<class A, class T, class U, int Dim0, int Dim1, char i, char j>
+inline const Tensor2_Expr<const Tensor2_times_generic<A,T,U,Dim0,Dim1,i,j>,
+  typename promote<T,U>::V,Dim0,Dim1,i,j>
+operator*(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a, const U &d0)
+{
+  typedef const Tensor2_times_generic<A,T,U,Dim0,Dim1,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,d0));
+}
+
+template<class A, class T, class U, int Dim0, int Dim1, char i, char j>
+inline const Tensor2_Expr<const Tensor2_times_generic<A,T,U,Dim0,Dim1,i,j>,
+  typename promote<T,U>::V,Dim0,Dim1,i,j>
+operator*(const U &d0, const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a)
+{
+  typedef const Tensor2_times_generic<A,T,U,Dim0,Dim1,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,d0));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_transform.h
--- a/Tensor2/Tensor2_transform.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/* Applies an arbitrary function to the Tensor2_Expr. */
-
-template<class A, class B, class T, int Dim0, int Dim1, char i, char j>
-class transform_Tensor2
-{
-  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
-  B function;
-public:
-  T operator()(const int N1, const int N2) const
-  {
-    return function(iterA(N1,N2));
-  }
-
-  transform_Tensor2(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a, B func):
-    iterA(a), function(func) {}
-};
-
-template<class A, class B, class T, int Dim0, int Dim1, char i, char j>
-inline const Tensor2_Expr<const transform_Tensor2<A,B,T,Dim0,Dim1,i,j>,T,Dim0,Dim1,i,j>
-transform(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a, B function)
-{
-  typedef const transform_Tensor2<A,B,T,Dim0,Dim1,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,T,Dim0,Dim1,i,j>(TensorExpr(a,function));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_transform.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2/Tensor2_transform.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,25 @@
+/* Applies an arbitrary function to the Tensor2_Expr. */
+
+template<class A, class B, class T, int Dim0, int Dim1, char i, char j>
+class transform_Tensor2
+{
+  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
+  B function;
+public:
+  T operator()(const int N1, const int N2) const
+  {
+    return function(iterA(N1,N2));
+  }
+
+  transform_Tensor2(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a, B func):
+    iterA(a), function(func) {}
+};
+
+template<class A, class B, class T, int Dim0, int Dim1, char i, char j>
+inline const Tensor2_Expr<const transform_Tensor2<A,B,T,Dim0,Dim1,i,j>,T,Dim0,Dim1,i,j>
+transform(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a, B function)
+{
+  typedef const transform_Tensor2<A,B,T,Dim0,Dim1,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,T,Dim0,Dim1,i,j>(TensorExpr(a,function));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_value.h
--- a/Tensor2/Tensor2_value.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,191 +0,0 @@
-/* A general version, not for pointers. */
-
-template <class T, int Tensor_Dim0, int Tensor_Dim1,
-	  Layout layout>
-class Tensor2
-{
-  T data[(layout==column_major) ? Tensor_Dim0 : Tensor_Dim1]
-  [(layout==column_major) ? Tensor_Dim1 : Tensor_Dim0];
-public:
-  /* Initializations for varying numbers of elements, with each one
-     defined for a particular Tensor_Dim.  To initialize a different
-     dimension, just add the appropriate constructor and call to
-     the Tensor2_constructor constructor. */
-  Tensor2(T d00, T d01,T d10, T d11)
-  {
-    Tensor2_constructor<T,Tensor_Dim0,Tensor_Dim1,layout>
-      (data,d00,d01,d10,d11);
-  }
-  Tensor2(T d00, T d01, T d02, T d10, T d11, T d12, T d20, T d21, T d22)
-  {
-    Tensor2_constructor<T,Tensor_Dim0,Tensor_Dim1,layout>
-      (data,d00,d01,d02,d10,d11,d12,d20,d21,d22);
-  }
-  Tensor2(T d00, T d01, T d10, T d11, T d20, T d21)
-  {
-    Tensor2_constructor<T,Tensor_Dim0,Tensor_Dim1,layout>
-      (data,d00,d01,d10,d11,d20,d21);
-  }
-  Tensor2(T d00, T d01, T d02, T d03, T d10, T d11, T d12, T d13,
-	  T d20, T d21, T d22, T d23, T d30, T d31, T d32, T d33)
-  {
-    Tensor2_constructor<T,Tensor_Dim0,Tensor_Dim1,layout>
-      (data,d00,d01,d02,d03,d10,d11,d12,d13,d20,d21,d22,d23,d30,d31,d32,d33);
-  }
-  Tensor2() {}
-
-  /* There are two operator(int,int)'s, one for non-consts that lets you
-     change the value, and one for consts that doesn't. */
-
-  T & operator()(const int N1, const int N2)
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim0 || N1<0 || N2>=Tensor_Dim1 || N2<0)
-      {
-	std::stringstream s;
-        s << "Bad index in Tensor2<T,"
-          << Tensor_Dim0 << "," << Tensor_Dim1
-          << ">.operator(" << N1 << "," << N2 << ")"
-          << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return ((layout==column_major) ? data[N1][N2] : data[N2][N1]);
-  }
-
-  T operator()(const int N1, const int N2) const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim0 || N1<0 || N2>=Tensor_Dim1 || N2<0)
-      {
-	std::stringstream s;
-        s << "Bad index in Tensor2<T,"
-          << Tensor_Dim0 << "," << Tensor_Dim1
-          << ">.operator(" << N1 << "," << N2 << ") const"
-          << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return ((layout==column_major) ? data[N1][N2] : data[N2][N1]);
-  }
-
-  /* These operator()'s are the first part in constructing template
-     expressions.  They can be used to slice off lower dimensional
-     parts. They are not entirely safe, since you can accidently use a
-     higher dimension than what is really allowed (like Dim=5). */
-
-  template<char i, char j, int Dim0, int Dim1>
-  Tensor2_Expr<Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,T,Dim0,Dim1,i,j>
-  operator()(const Index<i,Dim0> index1, const Index<j,Dim1> index2)
-  {
-    return Tensor2_Expr<Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,T,Dim0,Dim1,i,j>
-      (*this);
-  }
-
-  template<char i, char j, int Dim0, int Dim1>
-  Tensor2_Expr<const Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,T,Dim0,Dim1,i,j>
-  operator()(const Index<i,Dim0> index1, const Index<j,Dim1> index2) const
-  {
-    return Tensor2_Expr<const Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,
-      T,Dim0,Dim1,i,j>(*this);
-  }
-
-  /* This is for expressions where a number is used for one slot, and
-     an index for another, yielding a Tensor1_Expr.  The non-const
-     versions don't actually create a Tensor2_number_rhs_[01] object.
-     They create a Tensor1_Expr directly, which provides the
-     appropriate indexing operators.  The const versions do create a
-     Tensor2_number_[01]. */
-
-  template<char i, int Dim, int N>
-  Tensor1_Expr<Tensor2_number_rhs_1<Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,
-    T,N>,T,Dim,i>
-  operator()(const Index<i,Dim> index1, const Number<N> n1)
-  {
-    typedef Tensor2_number_rhs_1<Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,
-      T,N> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
-  }
-
-  template<char i, int Dim, int N>
-  Tensor1_Expr<Tensor2_number_rhs_0<Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,
-    T,N>,T,Dim,i>
-  operator()(const Number<N> n1, const Index<i,Dim> index1)
-  {
-    typedef Tensor2_number_rhs_0<Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,T,N>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
-  }
-
-  template<char i, int Dim, int N>
-  Tensor1_Expr<const Tensor2_number_1<const Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,
-    T,N>,T,Dim,i>
-  operator()(const Index<i,Dim> index1, const Number<N> n1) const
-  {
-    typedef const Tensor2_number_1<const Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,T,N>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-  template<char i, int Dim, int N>
-  Tensor1_Expr<const Tensor2_number_0<const Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,
-    T,N>,T,Dim,i>
-  operator()(const Number<N> n1, const Index<i,Dim> index1) const
-  {
-    typedef const Tensor2_number_0<const Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,T,N>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-  /* This is for expressions where an actual number (not a Number<>)
-     is used for one slot, and an index for another, yielding a
-     Tensor1_Expr. */
-
-  template<char i, int Dim>
-  Tensor1_Expr<const Tensor2_numeral_1<const Tensor2
-  <T,Tensor_Dim0,Tensor_Dim1>,T>,T,Dim,i>
-  operator()(const Index<i,Dim> index1, const int N) const
-  {
-    typedef const Tensor2_numeral_1<const Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,T>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N));
-  }
-
-  template<char i, int Dim>
-  Tensor1_Expr<const Tensor2_numeral_0<const Tensor2
-  <T,Tensor_Dim0,Tensor_Dim1>,T>,T,Dim,i>
-  operator()(const int N, const Index<i,Dim> index1) const
-  {
-    typedef const Tensor2_numeral_0<const Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,T>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N));
-  }
-
-  /* These two operator()'s return the Tensor2 with internal
-     contractions, yielding a T.  I have to specify one for both
-     const and non-const because otherwise they compiler will use the
-     operator() which gives a Tensor2_Expr<>. */
-
-  template<char i, int Dim>
-  T operator()(const Index<i,Dim> index1, const Index<i,Dim> index2)
-  {
-    return internal_contract(Number<Dim>());
-  }
-
-  template<char i, int Dim>
-  T operator()(const Index<i,Dim> index1, const Index<i,Dim> index2) const
-  {
-    return internal_contract(Number<Dim>());
-  }
-private:
-  template<int N>
-  T internal_contract(Number<N>)
-  {
-    return data[N-1][N-1] + internal_contract(Number<N-1>());
-  }
-
-  T internal_contract(Number<1>)
-  {
-    return data[0][0];
-  }
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/Tensor2_value.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2/Tensor2_value.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,191 @@
+/* A general version, not for pointers. */
+
+template <class T, int Tensor_Dim0, int Tensor_Dim1,
+	  Layout layout>
+class Tensor2
+{
+  T data[(layout==column_major) ? Tensor_Dim0 : Tensor_Dim1]
+  [(layout==column_major) ? Tensor_Dim1 : Tensor_Dim0];
+public:
+  /* Initializations for varying numbers of elements, with each one
+     defined for a particular Tensor_Dim.  To initialize a different
+     dimension, just add the appropriate constructor and call to
+     the Tensor2_constructor constructor. */
+  Tensor2(T d00, T d01,T d10, T d11)
+  {
+    Tensor2_constructor<T,Tensor_Dim0,Tensor_Dim1,layout>
+      (data,d00,d01,d10,d11);
+  }
+  Tensor2(T d00, T d01, T d02, T d10, T d11, T d12, T d20, T d21, T d22)
+  {
+    Tensor2_constructor<T,Tensor_Dim0,Tensor_Dim1,layout>
+      (data,d00,d01,d02,d10,d11,d12,d20,d21,d22);
+  }
+  Tensor2(T d00, T d01, T d10, T d11, T d20, T d21)
+  {
+    Tensor2_constructor<T,Tensor_Dim0,Tensor_Dim1,layout>
+      (data,d00,d01,d10,d11,d20,d21);
+  }
+  Tensor2(T d00, T d01, T d02, T d03, T d10, T d11, T d12, T d13,
+	  T d20, T d21, T d22, T d23, T d30, T d31, T d32, T d33)
+  {
+    Tensor2_constructor<T,Tensor_Dim0,Tensor_Dim1,layout>
+      (data,d00,d01,d02,d03,d10,d11,d12,d13,d20,d21,d22,d23,d30,d31,d32,d33);
+  }
+  Tensor2() {}
+
+  /* There are two operator(int,int)'s, one for non-consts that lets you
+     change the value, and one for consts that doesn't. */
+
+  T & operator()(const int N1, const int N2)
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim0 || N1<0 || N2>=Tensor_Dim1 || N2<0)
+      {
+	std::stringstream s;
+        s << "Bad index in Tensor2<T,"
+          << Tensor_Dim0 << "," << Tensor_Dim1
+          << ">.operator(" << N1 << "," << N2 << ")"
+          << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return ((layout==column_major) ? data[N1][N2] : data[N2][N1]);
+  }
+
+  T operator()(const int N1, const int N2) const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim0 || N1<0 || N2>=Tensor_Dim1 || N2<0)
+      {
+	std::stringstream s;
+        s << "Bad index in Tensor2<T,"
+          << Tensor_Dim0 << "," << Tensor_Dim1
+          << ">.operator(" << N1 << "," << N2 << ") const"
+          << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return ((layout==column_major) ? data[N1][N2] : data[N2][N1]);
+  }
+
+  /* These operator()'s are the first part in constructing template
+     expressions.  They can be used to slice off lower dimensional
+     parts. They are not entirely safe, since you can accidently use a
+     higher dimension than what is really allowed (like Dim=5). */
+
+  template<char i, char j, int Dim0, int Dim1>
+  Tensor2_Expr<Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,T,Dim0,Dim1,i,j>
+  operator()(const Index<i,Dim0> index1, const Index<j,Dim1> index2)
+  {
+    return Tensor2_Expr<Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,T,Dim0,Dim1,i,j>
+      (*this);
+  }
+
+  template<char i, char j, int Dim0, int Dim1>
+  Tensor2_Expr<const Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,T,Dim0,Dim1,i,j>
+  operator()(const Index<i,Dim0> index1, const Index<j,Dim1> index2) const
+  {
+    return Tensor2_Expr<const Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,
+      T,Dim0,Dim1,i,j>(*this);
+  }
+
+  /* This is for expressions where a number is used for one slot, and
+     an index for another, yielding a Tensor1_Expr.  The non-const
+     versions don't actually create a Tensor2_number_rhs_[01] object.
+     They create a Tensor1_Expr directly, which provides the
+     appropriate indexing operators.  The const versions do create a
+     Tensor2_number_[01]. */
+
+  template<char i, int Dim, int N>
+  Tensor1_Expr<Tensor2_number_rhs_1<Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,
+    T,N>,T,Dim,i>
+  operator()(const Index<i,Dim> index1, const Number<N> n1)
+  {
+    typedef Tensor2_number_rhs_1<Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,
+      T,N> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
+  }
+
+  template<char i, int Dim, int N>
+  Tensor1_Expr<Tensor2_number_rhs_0<Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,
+    T,N>,T,Dim,i>
+  operator()(const Number<N> n1, const Index<i,Dim> index1)
+  {
+    typedef Tensor2_number_rhs_0<Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,T,N>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
+  }
+
+  template<char i, int Dim, int N>
+  Tensor1_Expr<const Tensor2_number_1<const Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,
+    T,N>,T,Dim,i>
+  operator()(const Index<i,Dim> index1, const Number<N> n1) const
+  {
+    typedef const Tensor2_number_1<const Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,T,N>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+  template<char i, int Dim, int N>
+  Tensor1_Expr<const Tensor2_number_0<const Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,
+    T,N>,T,Dim,i>
+  operator()(const Number<N> n1, const Index<i,Dim> index1) const
+  {
+    typedef const Tensor2_number_0<const Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,T,N>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+  /* This is for expressions where an actual number (not a Number<>)
+     is used for one slot, and an index for another, yielding a
+     Tensor1_Expr. */
+
+  template<char i, int Dim>
+  Tensor1_Expr<const Tensor2_numeral_1<const Tensor2
+  <T,Tensor_Dim0,Tensor_Dim1>,T>,T,Dim,i>
+  operator()(const Index<i,Dim> index1, const int N) const
+  {
+    typedef const Tensor2_numeral_1<const Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,T>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N));
+  }
+
+  template<char i, int Dim>
+  Tensor1_Expr<const Tensor2_numeral_0<const Tensor2
+  <T,Tensor_Dim0,Tensor_Dim1>,T>,T,Dim,i>
+  operator()(const int N, const Index<i,Dim> index1) const
+  {
+    typedef const Tensor2_numeral_0<const Tensor2<T,Tensor_Dim0,Tensor_Dim1,layout>,T>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N));
+  }
+
+  /* These two operator()'s return the Tensor2 with internal
+     contractions, yielding a T.  I have to specify one for both
+     const and non-const because otherwise they compiler will use the
+     operator() which gives a Tensor2_Expr<>. */
+
+  template<char i, int Dim>
+  T operator()(const Index<i,Dim> index1, const Index<i,Dim> index2)
+  {
+    return internal_contract(Number<Dim>());
+  }
+
+  template<char i, int Dim>
+  T operator()(const Index<i,Dim> index1, const Index<i,Dim> index2) const
+  {
+    return internal_contract(Number<Dim>());
+  }
+private:
+  template<int N>
+  T internal_contract(Number<N>)
+  {
+    return data[N-1][N-1] + internal_contract(Number<N-1>());
+  }
+
+  T internal_contract(Number<1>)
+  {
+    return data[0][0];
+  }
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/conj_Tensor2.h
--- a/Tensor2/conj_Tensor2.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-/* complex conjugate operator. */
-
-template<class A, class T, int Dim0, int Dim1, char i, char j>
-class conj_Tensor2
-{
-  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
-public:
-  T operator()(const int N1, const int N2) const
-  {
-    return conj(iterA(N1,N2));
-  }
-
-  conj_Tensor2(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a): iterA(a) {}
-};
-
-template<class A, class T, int Dim0, int Dim1, char i, char j>
-inline const Tensor2_Expr<const conj_Tensor2<A,T,Dim0,Dim1,i,j>,T,Dim0,Dim1,i,j>
-conj(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a)
-{
-  typedef const conj_Tensor2<A,T,Dim0,Dim1,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,T,Dim0,Dim1,i,j>(TensorExpr(a));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/conj_Tensor2.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2/conj_Tensor2.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,23 @@
+/* complex conjugate operator. */
+
+template<class A, class T, int Dim0, int Dim1, char i, char j>
+class conj_Tensor2
+{
+  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
+public:
+  T operator()(const int N1, const int N2) const
+  {
+    return conj(iterA(N1,N2));
+  }
+
+  conj_Tensor2(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a): iterA(a) {}
+};
+
+template<class A, class T, int Dim0, int Dim1, char i, char j>
+inline const Tensor2_Expr<const conj_Tensor2<A,T,Dim0,Dim1,i,j>,T,Dim0,Dim1,i,j>
+conj(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a)
+{
+  typedef const conj_Tensor2<A,T,Dim0,Dim1,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,T,Dim0,Dim1,i,j>(TensorExpr(a));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/minus_Tensor2.h
--- a/Tensor2/minus_Tensor2.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-/* Unary minus operator. */
-
-template<class A, class T, int Dim0, int Dim1, char i, char j>
-class minus_Tensor2
-{
-  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
-public:
-  T operator()(const int N1, const int N2) const
-  {
-    return -iterA(N1,N2);
-  }
-
-  minus_Tensor2(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a): iterA(a) {}
-};
-
-template<class A, class T, int Dim0, int Dim1, char i, char j>
-inline const Tensor2_Expr<const minus_Tensor2<A,T,Dim0,Dim1,i,j>,T,Dim0,Dim1,i,j>
-operator-(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a)
-{
-  typedef const minus_Tensor2<A,T,Dim0,Dim1,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,T,Dim0,Dim1,i,j>(TensorExpr(a));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor2/minus_Tensor2.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2/minus_Tensor2.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,23 @@
+/* Unary minus operator. */
+
+template<class A, class T, int Dim0, int Dim1, char i, char j>
+class minus_Tensor2
+{
+  const Tensor2_Expr<A,T,Dim0,Dim1,i,j> iterA;
+public:
+  T operator()(const int N1, const int N2) const
+  {
+    return -iterA(N1,N2);
+  }
+
+  minus_Tensor2(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a): iterA(a) {}
+};
+
+template<class A, class T, int Dim0, int Dim1, char i, char j>
+inline const Tensor2_Expr<const minus_Tensor2<A,T,Dim0,Dim1,i,j>,T,Dim0,Dim1,i,j>
+operator-(const Tensor2_Expr<A,T,Dim0,Dim1,i,j> &a)
+{
+  typedef const minus_Tensor2<A,T,Dim0,Dim1,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,T,Dim0,Dim1,i,j>(TensorExpr(a));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric.h
--- a/Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-/* Declarations for a Tensor2_symmetric.  This only has a single
-   dimension parameter, since the dimensions of the two indices must
-   be the same for it to be symmetric. */
-
-#include "Tensor2_symmetric/Tensor2_symmetric_constructor.h"
-#include "Tensor2_symmetric/Tensor2_symmetric_value.h"
-#include "Tensor2_symmetric/Tensor2_symmetric_pointer.h"
-
-#include "Tensor2_symmetric/Tensor2_symmetric_Expr.h"
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,9 @@
+/* Declarations for a Tensor2_symmetric.  This only has a single
+   dimension parameter, since the dimensions of the two indices must
+   be the same for it to be symmetric. */
+
+#include "Tensor2_symmetric/Tensor2_symmetric_constructor.hpp"
+#include "Tensor2_symmetric/Tensor2_symmetric_value.hpp"
+#include "Tensor2_symmetric/Tensor2_symmetric_pointer.hpp"
+
+#include "Tensor2_symmetric/Tensor2_symmetric_Expr.hpp"
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_Expr.h
--- a/Tensor2_symmetric/Tensor2_symmetric_Expr.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,175 +0,0 @@
-/* Declares a wrapper class for symmetric rank 2 Tensor expressions.
-   It is specialized for Tensor3_number_rhs_2.  Note that
-   Tensor2_symmetric_Expr_equals.h is included at the end, because it
-   needs the definition of Tensor2_symmetric_Expr. */
-
-#include "Tensor2_symmetric_plus_Tensor2_symmetric.h"
-#include "Tensor2_symmetric_minus_Tensor2_symmetric.h"
-#include "Tensor2_symmetric_plus_Tensor2.h"
-#include "Tensor2_symmetric_minus_Tensor2.h"
-#include "Tensor2_symmetric_times_Tensor2_symmetric.h"
-#include "Tensor2_symmetric_and_Tensor2_symmetric.h"
-#include "Tensor2_symmetric_mod_Tensor2_symmetric.h"
-#include "Tensor2_symmetric_times_Tensor2.h"
-#include "Tensor2_symmetric_carat_Tensor2.h"
-#include "Tensor2_symmetric_times_Tensor1.h"
-#include "Tensor2_symmetric_plus_generic.h"
-#include "Tensor2_symmetric_minus_generic.h"
-#include "generic_minus_Tensor2_symmetric.h"
-#include "Tensor2_symmetric_times_generic.h"
-#include "Tensor2_symmetric_divide_generic.h"
-#include "minus_Tensor2_symmetric.h"
-#include "dTensor2_symmetric.h"
-#include "ddTensor2_symmetric.h"
-#include "d_one_sided_Tensor2_symmetric.h"
-#include "d_boundary_Tensor2_symmetric.h"
-#include "dd_boundary_Tensor2_symmetric.h"
-#include "diffusion_Tensor2_symmetric.h"
-#include "interpolate_Tensor2_symmetric.h"
-
-
-template<class A, class T, int Dim, char i, char j>
-class Tensor2_symmetric_Expr
-{
-  A iter;
-public:
-  Tensor2_symmetric_Expr(A &a): iter(a) {}
-  T operator()(const int N1, const int N2) const
-  {
-    return iter(N1,N2);
-  }
-};
-
-template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
-class Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>
-{
-  Tensor2_symmetric<A,Tensor_Dim> &iter;
-public:
-  Tensor2_symmetric_Expr(Tensor2_symmetric<A,Tensor_Dim> &a): iter(a) {}
-  T & operator()(const int N1, const int N2)
-  {
-    return iter(N1,N2);
-  }
-  T operator()(const int N1, const int N2) const
-  {
-    return iter(N1,N2);
-  }
-
-  /* Various assignment operators.  I have to explicitly declare the
-     second operator= because otherwise the compiler will generate its
-     own and not use the template code. */
-
-  template<class B, class U>
-  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
-  operator=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result);
-
-  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
-  operator=(const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &result);
-
-  template<class B, class U> inline
-  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
-  operator+=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result);
-
-  template<class B, class U> inline
-  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
-  operator-=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result);
-  
-  template<class B, class U> inline
-  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
-  operator&=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result);
-
-  /* This is for when the indices are switched (i,j) -> (j,i). */
-
-  template<class B, class U> inline
-  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
-  operator=(const Tensor2_symmetric_Expr<B,U,Dim,j,i> &result);
-
-  template<class B, class U> inline
-  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
-  operator+=(const Tensor2_symmetric_Expr<B,U,Dim,j,i> &result);
-
-  template<class B, class U> inline
-  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
-  operator-=(const Tensor2_symmetric_Expr<B,U,Dim,j,i> &result);
-
-  /* Operations with just generics. */
-
-  template<class U> inline
-  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & operator=(const U &d);
-  template<class U> inline
-  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & operator+=(const U &d);
-  template<class U> inline
-  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & operator-=(const U &d);
-  template<class U> inline
-  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & operator*=(const U &d);
-  template<class U> inline
-  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & operator/=(const U &d);
-};
-
-/* Specialized for Tensor3_dg_number_rhs_2 (Tensor3_dg with the
-   second index explicitly given). */
-
-template<class A, class T, int Dim, char i, char j, int N>
-class Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<A,T,N>,T,Dim,i,j>
-{
-  A &iter;
-public:
-  Tensor2_symmetric_Expr(A &a): iter(a) {}
-  T & operator()(const int N1, const int N2)
-  {
-    return iter(N1,N2,N);
-  }
-  T operator()(const int N1, const int N2) const
-  {
-    return iter(N1,N2,N);
-  }
-
-  /* Various assignment operators.  I have to explicitly declare the
-     second operator= because otherwise the compiler will generate its
-     own and not use the template code. */
-
-  template<class B, class U>
-  const Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<A,T,N>,
-    T,Dim,i,j> &
-  operator=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result);
-
-  const Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<A,T,N>,
-    T,Dim,i,j> &
-  operator=(const Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<A,T,N>,
-	    T,Dim,i,j> &result);
-};
-
-/* Specialized for Tensor4_ddg_number_rhs_01 (Tensor4_ddg with the
-   first and second index explicitly given). */
-
-template<class A, class T, int Dim, char i, char j, int N0, int N1>
-class Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01<A,T,N0,N1>,T,Dim,i,j>
-{
-  A &iter;
-public:
-  Tensor2_symmetric_Expr(A &a): iter(a) {}
-  T & operator()(const int N2, const int N3)
-  {
-    return iter(N0,N1,N2,N3);
-  }
-  T operator()(const int N2, const int N3) const
-  {
-    return iter(N0,N1,N2,N3);
-  }
-
-  /* Various assignment operators.  I have to explicitly declare the
-     second operator= because otherwise the compiler will generate its
-     own and not use the template code. */
-
-  template<class B, class U>
-  const Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01<A,T,N0,N1>,
-    T,Dim,i,j> &
-  operator=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result);
-
-  const Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01<A,T,N0,N1>,
-    T,Dim,i,j> &
-  operator=(const Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01<A,T,N0,N1>,
-	    T,Dim,i,j> &result);
-};
-
-#include "Tensor2_symmetric_Expr_equals.h"
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_Expr.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/Tensor2_symmetric_Expr.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,175 @@
+/* Declares a wrapper class for symmetric rank 2 Tensor expressions.
+   It is specialized for Tensor3_number_rhs_2.  Note that
+   Tensor2_symmetric_Expr_equals.hpp is included at the end, because it
+   needs the definition of Tensor2_symmetric_Expr. */
+
+#include "Tensor2_symmetric_plus_Tensor2_symmetric.hpp"
+#include "Tensor2_symmetric_minus_Tensor2_symmetric.hpp"
+#include "Tensor2_symmetric_plus_Tensor2.hpp"
+#include "Tensor2_symmetric_minus_Tensor2.hpp"
+#include "Tensor2_symmetric_times_Tensor2_symmetric.hpp"
+#include "Tensor2_symmetric_and_Tensor2_symmetric.hpp"
+#include "Tensor2_symmetric_mod_Tensor2_symmetric.hpp"
+#include "Tensor2_symmetric_times_Tensor2.hpp"
+#include "Tensor2_symmetric_carat_Tensor2.hpp"
+#include "Tensor2_symmetric_times_Tensor1.hpp"
+#include "Tensor2_symmetric_plus_generic.hpp"
+#include "Tensor2_symmetric_minus_generic.hpp"
+#include "generic_minus_Tensor2_symmetric.hpp"
+#include "Tensor2_symmetric_times_generic.hpp"
+#include "Tensor2_symmetric_divide_generic.hpp"
+#include "minus_Tensor2_symmetric.hpp"
+#include "dTensor2_symmetric.hpp"
+#include "ddTensor2_symmetric.hpp"
+#include "d_one_sided_Tensor2_symmetric.hpp"
+#include "d_boundary_Tensor2_symmetric.hpp"
+#include "dd_boundary_Tensor2_symmetric.hpp"
+#include "diffusion_Tensor2_symmetric.hpp"
+#include "interpolate_Tensor2_symmetric.hpp"
+
+
+template<class A, class T, int Dim, char i, char j>
+class Tensor2_symmetric_Expr
+{
+  A iter;
+public:
+  Tensor2_symmetric_Expr(A &a): iter(a) {}
+  T operator()(const int N1, const int N2) const
+  {
+    return iter(N1,N2);
+  }
+};
+
+template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
+class Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>
+{
+  Tensor2_symmetric<A,Tensor_Dim> &iter;
+public:
+  Tensor2_symmetric_Expr(Tensor2_symmetric<A,Tensor_Dim> &a): iter(a) {}
+  T & operator()(const int N1, const int N2)
+  {
+    return iter(N1,N2);
+  }
+  T operator()(const int N1, const int N2) const
+  {
+    return iter(N1,N2);
+  }
+
+  /* Various assignment operators.  I have to explicitly declare the
+     second operator= because otherwise the compiler will generate its
+     own and not use the template code. */
+
+  template<class B, class U>
+  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
+  operator=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result);
+
+  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
+  operator=(const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &result);
+
+  template<class B, class U> inline
+  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
+  operator+=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result);
+
+  template<class B, class U> inline
+  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
+  operator-=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result);
+  
+  template<class B, class U> inline
+  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
+  operator&=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result);
+
+  /* This is for when the indices are switched (i,j) -> (j,i). */
+
+  template<class B, class U> inline
+  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
+  operator=(const Tensor2_symmetric_Expr<B,U,Dim,j,i> &result);
+
+  template<class B, class U> inline
+  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
+  operator+=(const Tensor2_symmetric_Expr<B,U,Dim,j,i> &result);
+
+  template<class B, class U> inline
+  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
+  operator-=(const Tensor2_symmetric_Expr<B,U,Dim,j,i> &result);
+
+  /* Operations with just generics. */
+
+  template<class U> inline
+  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & operator=(const U &d);
+  template<class U> inline
+  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & operator+=(const U &d);
+  template<class U> inline
+  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & operator-=(const U &d);
+  template<class U> inline
+  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & operator*=(const U &d);
+  template<class U> inline
+  const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & operator/=(const U &d);
+};
+
+/* Specialized for Tensor3_dg_number_rhs_2 (Tensor3_dg with the
+   second index explicitly given). */
+
+template<class A, class T, int Dim, char i, char j, int N>
+class Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<A,T,N>,T,Dim,i,j>
+{
+  A &iter;
+public:
+  Tensor2_symmetric_Expr(A &a): iter(a) {}
+  T & operator()(const int N1, const int N2)
+  {
+    return iter(N1,N2,N);
+  }
+  T operator()(const int N1, const int N2) const
+  {
+    return iter(N1,N2,N);
+  }
+
+  /* Various assignment operators.  I have to explicitly declare the
+     second operator= because otherwise the compiler will generate its
+     own and not use the template code. */
+
+  template<class B, class U>
+  const Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<A,T,N>,
+    T,Dim,i,j> &
+  operator=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result);
+
+  const Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<A,T,N>,
+    T,Dim,i,j> &
+  operator=(const Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<A,T,N>,
+	    T,Dim,i,j> &result);
+};
+
+/* Specialized for Tensor4_ddg_number_rhs_01 (Tensor4_ddg with the
+   first and second index explicitly given). */
+
+template<class A, class T, int Dim, char i, char j, int N0, int N1>
+class Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01<A,T,N0,N1>,T,Dim,i,j>
+{
+  A &iter;
+public:
+  Tensor2_symmetric_Expr(A &a): iter(a) {}
+  T & operator()(const int N2, const int N3)
+  {
+    return iter(N0,N1,N2,N3);
+  }
+  T operator()(const int N2, const int N3) const
+  {
+    return iter(N0,N1,N2,N3);
+  }
+
+  /* Various assignment operators.  I have to explicitly declare the
+     second operator= because otherwise the compiler will generate its
+     own and not use the template code. */
+
+  template<class B, class U>
+  const Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01<A,T,N0,N1>,
+    T,Dim,i,j> &
+  operator=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result);
+
+  const Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01<A,T,N0,N1>,
+    T,Dim,i,j> &
+  operator=(const Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01<A,T,N0,N1>,
+	    T,Dim,i,j> &result);
+};
+
+#include "Tensor2_symmetric_Expr_equals.hpp"
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_Expr_equals.h
--- a/Tensor2_symmetric/Tensor2_symmetric_Expr_equals.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,533 +0,0 @@
-/* Various assignment operators.  I have to explicitly declare the
-   second operator= because otherwise the compiler will generate its
-   own and not use the template code. */
-
-/* T2s=T2s */
-
-template<class A, class B, class U, int Dim, char i, char j,
-  int Current_Dim0, int Current_Dim1>
-inline void T2s_equals_T2s(A &iter,
-			   const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
-			   const Number<Current_Dim0> &N0,
-			   const Number<Current_Dim1> &N1)
-{
-  iter(Current_Dim0-1,Current_Dim1-1)=result(Current_Dim0-1,Current_Dim1-1);
-  T2s_equals_T2s(iter,result,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-}
-
-template<class A, class B, class U, int Dim, char i, char j, int Current_Dim1>
-inline void T2s_equals_T2s
-(A &iter, const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
- const Number<1> &N0, const Number<Current_Dim1> &N1)
-{
-  iter(0,Current_Dim1-1)=result(0,Current_Dim1-1);
-  T2s_equals_T2s(iter,result,Number<Current_Dim1-1>(),
-		 Number<Current_Dim1-1>());
-}
-
-template<class A, class B, class U, int Dim, char i, char j>
-inline void T2s_equals_T2s(A &iter,
-			   const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
-			   const Number<1> &N0, const Number<1> &N1)
-{
-  iter(0,0)=result(0,0);
-}
-
-template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
-template<class B, class U> inline
-const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &
-Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
-operator=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result)
-{
-  T2s_equals_T2s(iter,result,Number<Dim>(),Number<Dim>());
-  return *this;
-}
-
-/* T2s=T2s_Expr(T2s) */
-
-template<class A, class T, int Tensor_Dim, int Dim, char i, char j> inline
-const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
-Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
-operator=(const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &result)
-{
-  return operator=<Tensor2_symmetric<A,Tensor_Dim>,T>(result);
-}
-
-/* T2s+=T2s */
-
-template<class A, class B, class U, int Dim, char i, char j,
-  int Current_Dim0, int Current_Dim1>
-inline void
-T2s_plus_equals_T2s(A &iter, const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
-		    const Number<Current_Dim0> &N0,
-		    const Number<Current_Dim1> &N1)
-{
-  iter(Current_Dim0-1,Current_Dim1-1)+=result(Current_Dim0-1,Current_Dim1-1);
-  T2s_plus_equals_T2s(iter,result,Number<Current_Dim0-1>(),
-		      Number<Current_Dim1>());
-}
-
-template<class A, class B, class U, int Dim, char i, char j, int Current_Dim1>
-inline void
-T2s_plus_equals_T2s(A &iter, const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
-		    const Number<1> &N0, const Number<Current_Dim1> &N1)
-{
-  iter(0,Current_Dim1-1)+=result(0,Current_Dim1-1);
-  T2s_plus_equals_T2s(iter,result,Number<Current_Dim1-1>(),
-		 Number<Current_Dim1-1>());
-}
-
-template<class A, class B, class U, int Dim, char i, char j>
-inline void
-T2s_plus_equals_T2s(A &iter, const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
-		    const Number<1> &N0, const Number<1> &N1)
-{
-  iter(0,0)+=result(0,0);
-}
-
-template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
-template<class B, class U> inline
-const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &
-Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
-operator+=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result)
-{
-  T2s_plus_equals_T2s(iter,result,Number<Dim>(),Number<Dim>());
-  return *this;
-}
-
-/* T2s-=T2s */
-
-template<class A, class B, class U, int Dim, char i, char j,
-  int Current_Dim0, int Current_Dim1>
-inline void
-T2s_minus_equals_T2s(A &iter,
-		     const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
-		     const Number<Current_Dim0> &N0,
-		     const Number<Current_Dim1> &N1)
-{
-  iter(Current_Dim0-1,Current_Dim1-1)-=result(Current_Dim0-1,Current_Dim1-1);
-  T2s_minus_equals_T2s(iter,result,Number<Current_Dim0-1>(),
-		       Number<Current_Dim1>());
-}
-
-template<class A, class B, class U, int Dim, char i, char j, int Current_Dim1>
-inline void
-T2s_minus_equals_T2s(A &iter,
-		     const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
-		     const Number<1> &N0, const Number<Current_Dim1> &N1)
-{
-  iter(0,Current_Dim1-1)-=result(0,Current_Dim1-1);
-  T2s_minus_equals_T2s(iter,result,Number<Current_Dim1-1>(),
-		 Number<Current_Dim1-1>());
-}
-
-template<class A, class B, class U, int Dim, char i, char j>
-inline void
-T2s_minus_equals_T2s(A &iter,
-		     const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
-		     const Number<1> &N0, const Number<1> &N1)
-{
-  iter(0,0)-=result(0,0);
-}
-
-template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
-template<class B, class U> inline
-const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &
-Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
-operator-=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result)
-{
-  T2s_minus_equals_T2s(iter,result,Number<Dim>(),Number<Dim>());
-  return *this;
-}
-
-/* T2s&=T2s */
-
-template<class A, class B, class U, int Dim, char i, char j,
-  int Current_Dim0, int Current_Dim1>
-inline void
-T2s_and_equals_T2s(A &iter, const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
-		    const Number<Current_Dim0> &N0,
-		    const Number<Current_Dim1> &N1)
-{
-  iter(Current_Dim0-1,Current_Dim1-1)*=result(Current_Dim0-1,Current_Dim1-1);
-  T2s_and_equals_T2s(iter,result,Number<Current_Dim0-1>(),
-		      Number<Current_Dim1>());
-}
-
-template<class A, class B, class U, int Dim, char i, char j, int Current_Dim1>
-inline void
-T2s_and_equals_T2s(A &iter, const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
-		    const Number<1> &N0, const Number<Current_Dim1> &N1)
-{
-  iter(0,Current_Dim1-1)*=result(0,Current_Dim1-1);
-  T2s_and_equals_T2s(iter,result,Number<Current_Dim1-1>(),
-		 Number<Current_Dim1-1>());
-}
-
-template<class A, class B, class U, int Dim, char i, char j>
-inline void
-T2s_and_equals_T2s(A &iter, const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
-		    const Number<1> &N0, const Number<1> &N1)
-{
-  iter(0,0)*=result(0,0);
-}
-
-template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
-template<class B, class U> inline
-const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &
-Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
-operator&=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result)
-{
-  T2s_and_equals_T2s(iter,result,Number<Dim>(),Number<Dim>());
-  return *this;
-}
-
-/* This is for when the indices are switched (i,j) -> (j,i). */
-
-template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
-template<class B, class U> inline
-const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
-Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
-operator=(const Tensor2_symmetric_Expr<B,U,Dim,j,i> &result)
-{
-  T2s_equals_T2s(iter,result,Number<Dim>(),Number<Dim>());
-  return *this;
-}
-
-template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
-template<class B, class U> inline
-const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
-Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
-operator+=(const Tensor2_symmetric_Expr<B,U,Dim,j,i> &result)
-{
-  T2s_plus_equals_T2s(iter,result,Number<Dim>(),Number<Dim>());
-  return *this;
-}
-
-template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
-template<class B, class U> inline
-const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
-Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
-operator-=(const Tensor2_symmetric_Expr<B,U,Dim,j,i> &result)
-{
-  T2s_minus_equals_T2s(iter,result,Number<Dim>(),Number<Dim>());
-  return *this;
-}
-
-/* Operations with just generics. */
-
-/* T2s=U */
-
-template<class A, class U, int Current_Dim0, int Current_Dim1>
-inline void T2s_equals_generic(A &iter, const U &u,
-			   const Number<Current_Dim0> &N0,
-			   const Number<Current_Dim1> &N1)
-{
-  iter(Current_Dim0-1,Current_Dim1-1)=u;
-  T2s_equals_generic(iter,u,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-}
-
-template<class A, class U, int Current_Dim1>
-inline void T2s_equals_generic(A &iter, const U &u,
-			   const Number<1> &N0, const Number<Current_Dim1> &N1)
-{
-  iter(0,Current_Dim1-1)=u;
-  T2s_equals_generic(iter,u,Number<Current_Dim1-1>(),Number<Current_Dim1-1>());
-}
-
-template<class A, class U>
-inline void T2s_equals_generic(A &iter, const U &u,
-			       const Number<1> &N0, const Number<1> &N1)
-{
-  iter(0,0)=u;
-}
-
-template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
-template<class U> inline
-const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &
-Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
-operator=(const U &u)
-{
-  T2s_equals_generic(iter,u,Number<Dim>(),Number<Dim>());
-  return *this;
-}
-
-/* T2s+=U */
-
-template<class A, class U, int Current_Dim0, int Current_Dim1>
-inline void T2s_plus_equals_generic(A &iter, const U &u,
-			   const Number<Current_Dim0> &N0,
-			   const Number<Current_Dim1> &N1)
-{
-  iter(Current_Dim0-1,Current_Dim1-1)+=u;
-  T2s_plus_equals_generic(iter,u,Number<Current_Dim0-1>(),
-			  Number<Current_Dim1>());
-}
-
-template<class A, class U, int Current_Dim1>
-inline void T2s_plus_equals_generic(A &iter, const U &u,
-			   const Number<1> &N0, const Number<Current_Dim1> &N1)
-{
-  iter(0,Current_Dim1-1)+=u;
-  T2s_plus_equals_generic(iter,u,Number<Current_Dim1-1>(),
-			  Number<Current_Dim1-1>());
-}
-
-template<class A, class U>
-inline void T2s_plus_equals_generic(A &iter, const U &u,
-				    const Number<1> &N0, const Number<1> &N1)
-{
-  iter(0,0)+=u;
-}
-
-template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
-template<class U> inline
-const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &
-Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
-operator+=(const U &u)
-{
-  T2s_plus_equals_generic(iter,u,Number<Dim>(),Number<Dim>());
-  return *this;
-}
-
-/* T2s-=U */
-
-template<class A, class U, int Current_Dim0, int Current_Dim1>
-inline void T2s_minus_equals_generic(A &iter,
-				     const U &u,
-				     const Number<Current_Dim0> &N0,
-				     const Number<Current_Dim1> &N1)
-{
-  iter(Current_Dim0-1,Current_Dim1-1)-=u;
-  T2s_minus_equals_generic(iter,u,Number<Current_Dim0-1>(),
-			   Number<Current_Dim1>());
-}
-
-template<class A, class U, int Current_Dim1>
-inline void T2s_minus_equals_generic(A &iter,
-				     const U &u, const Number<1> &N0,
-				     const Number<Current_Dim1> &N1)
-{
-  iter(0,Current_Dim1-1)-=u;
-  T2s_minus_equals_generic(iter,u,Number<Current_Dim1-1>(),
-			   Number<Current_Dim1-1>());
-}
-
-template<class A, class U>
-inline void T2s_minus_equals_generic(A &iter,
-				     const U &u, const Number<1> &N0,
-				     const Number<1> &N1)
-{
-  iter(0,0)-=u;
-}
-
-template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
-template<class U> inline
-const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &
-Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
-operator-=(const U &u)
-{
-  T2s_minus_equals_generic(iter,u,Number<Dim>(),Number<Dim>());
-  return *this;
-}
-
-/* T2s*=U */
-
-template<class A, class U, int Current_Dim0, int Current_Dim1>
-inline void T2s_times_equals_generic(A &iter,
-				     const U &u,
-				     const Number<Current_Dim0> &N0,
-				     const Number<Current_Dim1> &N1)
-{
-  iter(Current_Dim0-1,Current_Dim1-1)*=u;
-  T2s_times_equals_generic(iter,u,Number<Current_Dim0-1>(),
-			   Number<Current_Dim1>());
-}
-
-template<class A, class U, int Current_Dim1>
-inline void T2s_times_equals_generic(A &iter,
-				     const U &u, const Number<1> &N0,
-				     const Number<Current_Dim1> &N1)
-{
-  iter(0,Current_Dim1-1)*=u;
-  T2s_times_equals_generic(iter,u,Number<Current_Dim1-1>(),
-			   Number<Current_Dim1-1>());
-}
-
-template<class A, class U>
-inline void T2s_times_equals_generic(A &iter,
-				     const U &u, const Number<1> &N0,
-				     const Number<1> &N1)
-{
-  iter(0,0)*=u;
-}
-
-template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
-template<class U> inline
-const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &
-Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
-operator*=(const U &u)
-{
-  T2s_times_equals_generic(iter,u,Number<Dim>(),Number<Dim>());
-  return *this;
-}
-
-/* T2s/=U */
-
-template<class A, class U, int Current_Dim0, int Current_Dim1>
-inline void T2s_divide_equals_generic(A &iter,
-				      const U &u,
-				      const Number<Current_Dim0> &N0,
-				      const Number<Current_Dim1> &N1)
-{
-  iter(Current_Dim0-1,Current_Dim1-1)/=u;
-  T2s_divide_equals_generic(iter,u,Number<Current_Dim0-1>(),
-			    Number<Current_Dim1>());
-}
-
-template<class A, class U, int Current_Dim1>
-inline void T2s_divide_equals_generic(A &iter,
-				      const U &u, const Number<1> &N0,
-				      const Number<Current_Dim1> &N1)
-{
-  iter(0,Current_Dim1-1)/=u;
-  T2s_divide_equals_generic(iter,u,Number<Current_Dim1-1>(),
-			    Number<Current_Dim1-1>());
-}
-
-template<class A, class U>
-inline void T2s_divide_equals_generic(A &iter,
-				      const U &u, const Number<1> &N0,
-				      const Number<1> &N1)
-{
-  iter(0,0)/=u;
-}
-
-template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
-template<class U> inline
-const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &
-Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
-operator/=(const U &u)
-{
-  T2s_divide_equals_generic(iter,u,Number<Dim>(),Number<Dim>());
-  return *this;
-}
-
-/* Various assignment operators for Tensor3_dg_number_rhs_2.  I have
-   to explicitly declare the second operator= because otherwise the
-   compiler will generate its own and not use the template code. */
-
-template<class A, class B, class U, int Dim01, char i, char j, int N,
-  int Current_Dim0, int Current_Dim1> inline
-void T3dgrhs2_equals_T2s(A &iter,
-			 const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &result,
-			 const Number<Current_Dim0> &N0,
-			 const Number<Current_Dim1> &N1, const Number<N> &NN)
-{
-  iter(Current_Dim0-1,Current_Dim1-1,N)=result(Current_Dim0-1,Current_Dim1-1);
-  T3dgrhs2_equals_T2s(iter,result,Number<Current_Dim0-1>(),
-		      Number<Current_Dim1>(),Number<N>());
-}
-
-template<class A, class B, class U, int Dim01, char i, char j, int N,
-  int Current_Dim1> inline
-void T3dgrhs2_equals_T2s(A &iter,
-			 const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &result,
-			 const Number<1> &N0, const Number<Current_Dim1> &N1,
-			 const Number<N> &NN)
-{
-  iter(0,Current_Dim1-1,N)=result(0,Current_Dim1-1);
-  T3dgrhs2_equals_T2s(iter,result,Number<Current_Dim1-1>(),
-		      Number<Current_Dim1-1>(),Number<N>());
-}
-
-template<class A, class B, class U, int Dim01, char i, char j, int N>
-inline
-void T3dgrhs2_equals_T2s(A &iter,
-			 const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &result,
-			 const Number<1> &N0, const Number<1> &N1,
-			 const Number<N> &NN)
-{
-  iter(0,0,N)=result(0,0);
-}
-
-template<class A, class T, int Dim, char i, char j, int N>
-template<class B, class U> inline
-const Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<A,T,N>,T,Dim,i,j> &
-Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<A,T,N>,
-  T,Dim,i,j>::operator=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result)
-{
-  T3dgrhs2_equals_T2s(iter,result,Number<Dim>(),Number<Dim>(),Number<N>());
-  return *this;
-}
-
-template<class A, class T, int Dim, char i, char j, int N> inline
-const Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<A,T,N>,T,Dim,i,j> &
-Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<A,T,N>,T,Dim,i,j>
-::operator=(const Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2
-	    <A,T,N>,T,Dim,i,j> &result)
-{
-  return operator=<Tensor3_dg_number_rhs_2<A,T,N>,T>(result);
-}
-
-
-/* Various assignment operators for Tensor4_ddg_number_rhs_01.  I have
-   to explicitly declare the second operator= because otherwise the
-   compiler will generate its own and not use the template code. */
-
-template<class A, class B, class U, int Dim01, char i, char j, int N0, int N1,
-  int Current_Dim0, int Current_Dim1> inline
-void T4ddgrhs01_equals_T2s(A &iter,
-			   const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &result,
-			   const Number<Current_Dim0> &N2,
-			   const Number<Current_Dim1> &N3,
-			   const Number<N0> &NN0,  const Number<N1> &NN1)
-{
-  iter(N0,N1,Current_Dim0-1,Current_Dim1-1)=
-    result(Current_Dim0-1,Current_Dim1-1);
-  T4ddgrhs01_equals_T2s(iter,result,Number<Current_Dim0-1>(),
-		      Number<Current_Dim1>(),Number<N0>(),Number<N1>());
-}
-
-template<class A, class B, class U, int Dim01, char i, char j, int N0, int N1,
-  int Current_Dim1> inline
-void T4ddgrhs01_equals_T2s(A &iter,
-			 const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &result,
-			 const Number<1> &N2, const Number<Current_Dim1> &N3,
-			   const Number<N0> &NN0, const Number<N1> &NN1)
-{
-  iter(N0,N1,0,Current_Dim1-1)=result(0,Current_Dim1-1);
-  T4ddgrhs01_equals_T2s(iter,result,Number<Current_Dim1-1>(),
-			Number<Current_Dim1-1>(),Number<N0>(),Number<N1>());
-}
-
-template<class A, class B, class U, int Dim01, char i, char j, int N0, int N1>
-inline
-void T4ddgrhs01_equals_T2s(A &iter,
-			 const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &result,
-			 const Number<1> &N2, const Number<1> &N3,
-			   const Number<N0> &NN0, const Number<N1> &NN1)
-{
-  iter(N0,N1,0,0)=result(0,0);
-}
-
-template<class A, class T, int Dim, char i, char j, int N0, int N1>
-template<class B, class U> inline
-const Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01<A,T,N0,N1>,T,Dim,i,j> &
-Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01<A,T,N0,N1>,
-  T,Dim,i,j>::operator=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result)
-{
-  T4ddgrhs01_equals_T2s(iter,result,Number<Dim>(),Number<Dim>(),
-			Number<N0>(),Number<N1>());
-  return *this;
-}
-
-template<class A, class T, int Dim, char i, char j, int N0, int N1> inline
-const Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01<A,T,N0,N1>,T,Dim,i,j> &
-Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01<A,T,N0,N1>,T,Dim,i,j>
-::operator=(const Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01
-	    <A,T,N0,N1>,T,Dim,i,j> &result)
-{
-  return operator=<Tensor4_ddg_number_rhs_01<A,T,N0,N1>,T>(result);
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_Expr_equals.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/Tensor2_symmetric_Expr_equals.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,533 @@
+/* Various assignment operators.  I have to explicitly declare the
+   second operator= because otherwise the compiler will generate its
+   own and not use the template code. */
+
+/* T2s=T2s */
+
+template<class A, class B, class U, int Dim, char i, char j,
+  int Current_Dim0, int Current_Dim1>
+inline void T2s_equals_T2s(A &iter,
+			   const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
+			   const Number<Current_Dim0> &N0,
+			   const Number<Current_Dim1> &N1)
+{
+  iter(Current_Dim0-1,Current_Dim1-1)=result(Current_Dim0-1,Current_Dim1-1);
+  T2s_equals_T2s(iter,result,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+}
+
+template<class A, class B, class U, int Dim, char i, char j, int Current_Dim1>
+inline void T2s_equals_T2s
+(A &iter, const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
+ const Number<1> &N0, const Number<Current_Dim1> &N1)
+{
+  iter(0,Current_Dim1-1)=result(0,Current_Dim1-1);
+  T2s_equals_T2s(iter,result,Number<Current_Dim1-1>(),
+		 Number<Current_Dim1-1>());
+}
+
+template<class A, class B, class U, int Dim, char i, char j>
+inline void T2s_equals_T2s(A &iter,
+			   const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
+			   const Number<1> &N0, const Number<1> &N1)
+{
+  iter(0,0)=result(0,0);
+}
+
+template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
+template<class B, class U> inline
+const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &
+Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
+operator=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result)
+{
+  T2s_equals_T2s(iter,result,Number<Dim>(),Number<Dim>());
+  return *this;
+}
+
+/* T2s=T2s_Expr(T2s) */
+
+template<class A, class T, int Tensor_Dim, int Dim, char i, char j> inline
+const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
+Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
+operator=(const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &result)
+{
+  return operator=<Tensor2_symmetric<A,Tensor_Dim>,T>(result);
+}
+
+/* T2s+=T2s */
+
+template<class A, class B, class U, int Dim, char i, char j,
+  int Current_Dim0, int Current_Dim1>
+inline void
+T2s_plus_equals_T2s(A &iter, const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
+		    const Number<Current_Dim0> &N0,
+		    const Number<Current_Dim1> &N1)
+{
+  iter(Current_Dim0-1,Current_Dim1-1)+=result(Current_Dim0-1,Current_Dim1-1);
+  T2s_plus_equals_T2s(iter,result,Number<Current_Dim0-1>(),
+		      Number<Current_Dim1>());
+}
+
+template<class A, class B, class U, int Dim, char i, char j, int Current_Dim1>
+inline void
+T2s_plus_equals_T2s(A &iter, const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
+		    const Number<1> &N0, const Number<Current_Dim1> &N1)
+{
+  iter(0,Current_Dim1-1)+=result(0,Current_Dim1-1);
+  T2s_plus_equals_T2s(iter,result,Number<Current_Dim1-1>(),
+		 Number<Current_Dim1-1>());
+}
+
+template<class A, class B, class U, int Dim, char i, char j>
+inline void
+T2s_plus_equals_T2s(A &iter, const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
+		    const Number<1> &N0, const Number<1> &N1)
+{
+  iter(0,0)+=result(0,0);
+}
+
+template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
+template<class B, class U> inline
+const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &
+Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
+operator+=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result)
+{
+  T2s_plus_equals_T2s(iter,result,Number<Dim>(),Number<Dim>());
+  return *this;
+}
+
+/* T2s-=T2s */
+
+template<class A, class B, class U, int Dim, char i, char j,
+  int Current_Dim0, int Current_Dim1>
+inline void
+T2s_minus_equals_T2s(A &iter,
+		     const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
+		     const Number<Current_Dim0> &N0,
+		     const Number<Current_Dim1> &N1)
+{
+  iter(Current_Dim0-1,Current_Dim1-1)-=result(Current_Dim0-1,Current_Dim1-1);
+  T2s_minus_equals_T2s(iter,result,Number<Current_Dim0-1>(),
+		       Number<Current_Dim1>());
+}
+
+template<class A, class B, class U, int Dim, char i, char j, int Current_Dim1>
+inline void
+T2s_minus_equals_T2s(A &iter,
+		     const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
+		     const Number<1> &N0, const Number<Current_Dim1> &N1)
+{
+  iter(0,Current_Dim1-1)-=result(0,Current_Dim1-1);
+  T2s_minus_equals_T2s(iter,result,Number<Current_Dim1-1>(),
+		 Number<Current_Dim1-1>());
+}
+
+template<class A, class B, class U, int Dim, char i, char j>
+inline void
+T2s_minus_equals_T2s(A &iter,
+		     const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
+		     const Number<1> &N0, const Number<1> &N1)
+{
+  iter(0,0)-=result(0,0);
+}
+
+template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
+template<class B, class U> inline
+const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &
+Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
+operator-=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result)
+{
+  T2s_minus_equals_T2s(iter,result,Number<Dim>(),Number<Dim>());
+  return *this;
+}
+
+/* T2s&=T2s */
+
+template<class A, class B, class U, int Dim, char i, char j,
+  int Current_Dim0, int Current_Dim1>
+inline void
+T2s_and_equals_T2s(A &iter, const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
+		    const Number<Current_Dim0> &N0,
+		    const Number<Current_Dim1> &N1)
+{
+  iter(Current_Dim0-1,Current_Dim1-1)*=result(Current_Dim0-1,Current_Dim1-1);
+  T2s_and_equals_T2s(iter,result,Number<Current_Dim0-1>(),
+		      Number<Current_Dim1>());
+}
+
+template<class A, class B, class U, int Dim, char i, char j, int Current_Dim1>
+inline void
+T2s_and_equals_T2s(A &iter, const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
+		    const Number<1> &N0, const Number<Current_Dim1> &N1)
+{
+  iter(0,Current_Dim1-1)*=result(0,Current_Dim1-1);
+  T2s_and_equals_T2s(iter,result,Number<Current_Dim1-1>(),
+		 Number<Current_Dim1-1>());
+}
+
+template<class A, class B, class U, int Dim, char i, char j>
+inline void
+T2s_and_equals_T2s(A &iter, const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result,
+		    const Number<1> &N0, const Number<1> &N1)
+{
+  iter(0,0)*=result(0,0);
+}
+
+template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
+template<class B, class U> inline
+const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &
+Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
+operator&=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result)
+{
+  T2s_and_equals_T2s(iter,result,Number<Dim>(),Number<Dim>());
+  return *this;
+}
+
+/* This is for when the indices are switched (i,j) -> (j,i). */
+
+template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
+template<class B, class U> inline
+const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
+Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
+operator=(const Tensor2_symmetric_Expr<B,U,Dim,j,i> &result)
+{
+  T2s_equals_T2s(iter,result,Number<Dim>(),Number<Dim>());
+  return *this;
+}
+
+template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
+template<class B, class U> inline
+const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
+Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
+operator+=(const Tensor2_symmetric_Expr<B,U,Dim,j,i> &result)
+{
+  T2s_plus_equals_T2s(iter,result,Number<Dim>(),Number<Dim>());
+  return *this;
+}
+
+template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
+template<class B, class U> inline
+const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> & 
+Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
+operator-=(const Tensor2_symmetric_Expr<B,U,Dim,j,i> &result)
+{
+  T2s_minus_equals_T2s(iter,result,Number<Dim>(),Number<Dim>());
+  return *this;
+}
+
+/* Operations with just generics. */
+
+/* T2s=U */
+
+template<class A, class U, int Current_Dim0, int Current_Dim1>
+inline void T2s_equals_generic(A &iter, const U &u,
+			   const Number<Current_Dim0> &N0,
+			   const Number<Current_Dim1> &N1)
+{
+  iter(Current_Dim0-1,Current_Dim1-1)=u;
+  T2s_equals_generic(iter,u,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+}
+
+template<class A, class U, int Current_Dim1>
+inline void T2s_equals_generic(A &iter, const U &u,
+			   const Number<1> &N0, const Number<Current_Dim1> &N1)
+{
+  iter(0,Current_Dim1-1)=u;
+  T2s_equals_generic(iter,u,Number<Current_Dim1-1>(),Number<Current_Dim1-1>());
+}
+
+template<class A, class U>
+inline void T2s_equals_generic(A &iter, const U &u,
+			       const Number<1> &N0, const Number<1> &N1)
+{
+  iter(0,0)=u;
+}
+
+template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
+template<class U> inline
+const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &
+Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
+operator=(const U &u)
+{
+  T2s_equals_generic(iter,u,Number<Dim>(),Number<Dim>());
+  return *this;
+}
+
+/* T2s+=U */
+
+template<class A, class U, int Current_Dim0, int Current_Dim1>
+inline void T2s_plus_equals_generic(A &iter, const U &u,
+			   const Number<Current_Dim0> &N0,
+			   const Number<Current_Dim1> &N1)
+{
+  iter(Current_Dim0-1,Current_Dim1-1)+=u;
+  T2s_plus_equals_generic(iter,u,Number<Current_Dim0-1>(),
+			  Number<Current_Dim1>());
+}
+
+template<class A, class U, int Current_Dim1>
+inline void T2s_plus_equals_generic(A &iter, const U &u,
+			   const Number<1> &N0, const Number<Current_Dim1> &N1)
+{
+  iter(0,Current_Dim1-1)+=u;
+  T2s_plus_equals_generic(iter,u,Number<Current_Dim1-1>(),
+			  Number<Current_Dim1-1>());
+}
+
+template<class A, class U>
+inline void T2s_plus_equals_generic(A &iter, const U &u,
+				    const Number<1> &N0, const Number<1> &N1)
+{
+  iter(0,0)+=u;
+}
+
+template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
+template<class U> inline
+const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &
+Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
+operator+=(const U &u)
+{
+  T2s_plus_equals_generic(iter,u,Number<Dim>(),Number<Dim>());
+  return *this;
+}
+
+/* T2s-=U */
+
+template<class A, class U, int Current_Dim0, int Current_Dim1>
+inline void T2s_minus_equals_generic(A &iter,
+				     const U &u,
+				     const Number<Current_Dim0> &N0,
+				     const Number<Current_Dim1> &N1)
+{
+  iter(Current_Dim0-1,Current_Dim1-1)-=u;
+  T2s_minus_equals_generic(iter,u,Number<Current_Dim0-1>(),
+			   Number<Current_Dim1>());
+}
+
+template<class A, class U, int Current_Dim1>
+inline void T2s_minus_equals_generic(A &iter,
+				     const U &u, const Number<1> &N0,
+				     const Number<Current_Dim1> &N1)
+{
+  iter(0,Current_Dim1-1)-=u;
+  T2s_minus_equals_generic(iter,u,Number<Current_Dim1-1>(),
+			   Number<Current_Dim1-1>());
+}
+
+template<class A, class U>
+inline void T2s_minus_equals_generic(A &iter,
+				     const U &u, const Number<1> &N0,
+				     const Number<1> &N1)
+{
+  iter(0,0)-=u;
+}
+
+template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
+template<class U> inline
+const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &
+Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
+operator-=(const U &u)
+{
+  T2s_minus_equals_generic(iter,u,Number<Dim>(),Number<Dim>());
+  return *this;
+}
+
+/* T2s*=U */
+
+template<class A, class U, int Current_Dim0, int Current_Dim1>
+inline void T2s_times_equals_generic(A &iter,
+				     const U &u,
+				     const Number<Current_Dim0> &N0,
+				     const Number<Current_Dim1> &N1)
+{
+  iter(Current_Dim0-1,Current_Dim1-1)*=u;
+  T2s_times_equals_generic(iter,u,Number<Current_Dim0-1>(),
+			   Number<Current_Dim1>());
+}
+
+template<class A, class U, int Current_Dim1>
+inline void T2s_times_equals_generic(A &iter,
+				     const U &u, const Number<1> &N0,
+				     const Number<Current_Dim1> &N1)
+{
+  iter(0,Current_Dim1-1)*=u;
+  T2s_times_equals_generic(iter,u,Number<Current_Dim1-1>(),
+			   Number<Current_Dim1-1>());
+}
+
+template<class A, class U>
+inline void T2s_times_equals_generic(A &iter,
+				     const U &u, const Number<1> &N0,
+				     const Number<1> &N1)
+{
+  iter(0,0)*=u;
+}
+
+template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
+template<class U> inline
+const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &
+Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
+operator*=(const U &u)
+{
+  T2s_times_equals_generic(iter,u,Number<Dim>(),Number<Dim>());
+  return *this;
+}
+
+/* T2s/=U */
+
+template<class A, class U, int Current_Dim0, int Current_Dim1>
+inline void T2s_divide_equals_generic(A &iter,
+				      const U &u,
+				      const Number<Current_Dim0> &N0,
+				      const Number<Current_Dim1> &N1)
+{
+  iter(Current_Dim0-1,Current_Dim1-1)/=u;
+  T2s_divide_equals_generic(iter,u,Number<Current_Dim0-1>(),
+			    Number<Current_Dim1>());
+}
+
+template<class A, class U, int Current_Dim1>
+inline void T2s_divide_equals_generic(A &iter,
+				      const U &u, const Number<1> &N0,
+				      const Number<Current_Dim1> &N1)
+{
+  iter(0,Current_Dim1-1)/=u;
+  T2s_divide_equals_generic(iter,u,Number<Current_Dim1-1>(),
+			    Number<Current_Dim1-1>());
+}
+
+template<class A, class U>
+inline void T2s_divide_equals_generic(A &iter,
+				      const U &u, const Number<1> &N0,
+				      const Number<1> &N1)
+{
+  iter(0,0)/=u;
+}
+
+template<class A, class T, int Tensor_Dim, int Dim, char i, char j>
+template<class U> inline
+const Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j> &
+Tensor2_symmetric_Expr<Tensor2_symmetric<A,Tensor_Dim>,T,Dim,i,j>::
+operator/=(const U &u)
+{
+  T2s_divide_equals_generic(iter,u,Number<Dim>(),Number<Dim>());
+  return *this;
+}
+
+/* Various assignment operators for Tensor3_dg_number_rhs_2.  I have
+   to explicitly declare the second operator= because otherwise the
+   compiler will generate its own and not use the template code. */
+
+template<class A, class B, class U, int Dim01, char i, char j, int N,
+  int Current_Dim0, int Current_Dim1> inline
+void T3dgrhs2_equals_T2s(A &iter,
+			 const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &result,
+			 const Number<Current_Dim0> &N0,
+			 const Number<Current_Dim1> &N1, const Number<N> &NN)
+{
+  iter(Current_Dim0-1,Current_Dim1-1,N)=result(Current_Dim0-1,Current_Dim1-1);
+  T3dgrhs2_equals_T2s(iter,result,Number<Current_Dim0-1>(),
+		      Number<Current_Dim1>(),Number<N>());
+}
+
+template<class A, class B, class U, int Dim01, char i, char j, int N,
+  int Current_Dim1> inline
+void T3dgrhs2_equals_T2s(A &iter,
+			 const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &result,
+			 const Number<1> &N0, const Number<Current_Dim1> &N1,
+			 const Number<N> &NN)
+{
+  iter(0,Current_Dim1-1,N)=result(0,Current_Dim1-1);
+  T3dgrhs2_equals_T2s(iter,result,Number<Current_Dim1-1>(),
+		      Number<Current_Dim1-1>(),Number<N>());
+}
+
+template<class A, class B, class U, int Dim01, char i, char j, int N>
+inline
+void T3dgrhs2_equals_T2s(A &iter,
+			 const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &result,
+			 const Number<1> &N0, const Number<1> &N1,
+			 const Number<N> &NN)
+{
+  iter(0,0,N)=result(0,0);
+}
+
+template<class A, class T, int Dim, char i, char j, int N>
+template<class B, class U> inline
+const Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<A,T,N>,T,Dim,i,j> &
+Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<A,T,N>,
+  T,Dim,i,j>::operator=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result)
+{
+  T3dgrhs2_equals_T2s(iter,result,Number<Dim>(),Number<Dim>(),Number<N>());
+  return *this;
+}
+
+template<class A, class T, int Dim, char i, char j, int N> inline
+const Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<A,T,N>,T,Dim,i,j> &
+Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<A,T,N>,T,Dim,i,j>
+::operator=(const Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2
+	    <A,T,N>,T,Dim,i,j> &result)
+{
+  return operator=<Tensor3_dg_number_rhs_2<A,T,N>,T>(result);
+}
+
+
+/* Various assignment operators for Tensor4_ddg_number_rhs_01.  I have
+   to explicitly declare the second operator= because otherwise the
+   compiler will generate its own and not use the template code. */
+
+template<class A, class B, class U, int Dim01, char i, char j, int N0, int N1,
+  int Current_Dim0, int Current_Dim1> inline
+void T4ddgrhs01_equals_T2s(A &iter,
+			   const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &result,
+			   const Number<Current_Dim0> &N2,
+			   const Number<Current_Dim1> &N3,
+			   const Number<N0> &NN0,  const Number<N1> &NN1)
+{
+  iter(N0,N1,Current_Dim0-1,Current_Dim1-1)=
+    result(Current_Dim0-1,Current_Dim1-1);
+  T4ddgrhs01_equals_T2s(iter,result,Number<Current_Dim0-1>(),
+		      Number<Current_Dim1>(),Number<N0>(),Number<N1>());
+}
+
+template<class A, class B, class U, int Dim01, char i, char j, int N0, int N1,
+  int Current_Dim1> inline
+void T4ddgrhs01_equals_T2s(A &iter,
+			 const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &result,
+			 const Number<1> &N2, const Number<Current_Dim1> &N3,
+			   const Number<N0> &NN0, const Number<N1> &NN1)
+{
+  iter(N0,N1,0,Current_Dim1-1)=result(0,Current_Dim1-1);
+  T4ddgrhs01_equals_T2s(iter,result,Number<Current_Dim1-1>(),
+			Number<Current_Dim1-1>(),Number<N0>(),Number<N1>());
+}
+
+template<class A, class B, class U, int Dim01, char i, char j, int N0, int N1>
+inline
+void T4ddgrhs01_equals_T2s(A &iter,
+			 const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &result,
+			 const Number<1> &N2, const Number<1> &N3,
+			   const Number<N0> &NN0, const Number<N1> &NN1)
+{
+  iter(N0,N1,0,0)=result(0,0);
+}
+
+template<class A, class T, int Dim, char i, char j, int N0, int N1>
+template<class B, class U> inline
+const Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01<A,T,N0,N1>,T,Dim,i,j> &
+Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01<A,T,N0,N1>,
+  T,Dim,i,j>::operator=(const Tensor2_symmetric_Expr<B,U,Dim,i,j> &result)
+{
+  T4ddgrhs01_equals_T2s(iter,result,Number<Dim>(),Number<Dim>(),
+			Number<N0>(),Number<N1>());
+  return *this;
+}
+
+template<class A, class T, int Dim, char i, char j, int N0, int N1> inline
+const Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01<A,T,N0,N1>,T,Dim,i,j> &
+Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01<A,T,N0,N1>,T,Dim,i,j>
+::operator=(const Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01
+	    <A,T,N0,N1>,T,Dim,i,j> &result)
+{
+  return operator=<Tensor4_ddg_number_rhs_01<A,T,N0,N1>,T>(result);
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_and_Tensor2_symmetric.h
--- a/Tensor2_symmetric/Tensor2_symmetric_and_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-/* Multiply a Tensor2_symmetric and a Tensor2_symmetric together but
-   don't contract, yielding a Tensor2_symmetric. */
-
-/* A(i,j) & B(i,j) -> Tensor2_symmetric */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-class Tensor2_symmetric_and_Tensor2_symmetric_01
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,i,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)*iterB(N1,N2);
-  }
-
-  Tensor2_symmetric_and_Tensor2_symmetric_01
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_symmetric_and_Tensor2_symmetric_01<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,i,j>
-operator&(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b)
-{
-  typedef const Tensor2_symmetric_and_Tensor2_symmetric_01<A,B,T,U,Dim,i,j>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j) & B(j,i) -> Tensor2_symmetric */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-class Tensor2_symmetric_and_Tensor2_symmetric_10
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,j,i> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)*iterB(N2,N1);
-  }
-
-  Tensor2_symmetric_and_Tensor2_symmetric_10
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr<const Tensor2_symmetric_and_Tensor2_symmetric_10
-<A,B,T,U,Dim,i,j>,typename promote<T,U>::V,Dim,i,j>
-operator&(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b)
-{
-  typedef const Tensor2_symmetric_and_Tensor2_symmetric_10<A,B,T,U,Dim,i,j>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
-    (TensorExpr(a,b));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_and_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/Tensor2_symmetric_and_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,64 @@
+/* Multiply a Tensor2_symmetric and a Tensor2_symmetric together but
+   don't contract, yielding a Tensor2_symmetric. */
+
+/* A(i,j) & B(i,j) -> Tensor2_symmetric */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+class Tensor2_symmetric_and_Tensor2_symmetric_01
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,i,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)*iterB(N1,N2);
+  }
+
+  Tensor2_symmetric_and_Tensor2_symmetric_01
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_symmetric_and_Tensor2_symmetric_01<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,i,j>
+operator&(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b)
+{
+  typedef const Tensor2_symmetric_and_Tensor2_symmetric_01<A,B,T,U,Dim,i,j>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j) & B(j,i) -> Tensor2_symmetric */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+class Tensor2_symmetric_and_Tensor2_symmetric_10
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,j,i> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)*iterB(N2,N1);
+  }
+
+  Tensor2_symmetric_and_Tensor2_symmetric_10
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr<const Tensor2_symmetric_and_Tensor2_symmetric_10
+<A,B,T,U,Dim,i,j>,typename promote<T,U>::V,Dim,i,j>
+operator&(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b)
+{
+  typedef const Tensor2_symmetric_and_Tensor2_symmetric_10<A,B,T,U,Dim,i,j>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
+    (TensorExpr(a,b));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_carat_Tensor2.h
--- a/Tensor2_symmetric/Tensor2_symmetric_carat_Tensor2.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,263 +0,0 @@
-/* Creates a Tensor2_symmetric expression by contracting a
-   Tensor2_symmetric and a Tensor2 together. There are different
-   versions, depending on where the contracting indices are located
-   (i.e. whether it is A(i,j)^B(j,k) or A(i,j)^B(k,j)).  The classes
-   are numbered to differentiate between these.  Thus, A(i,j)^B(j,k)
-   has 10 appended to the name because I count from 0. */
-
-/* A(i,j)*B(j,k) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-class Tensor2_symmetric_carat_Tensor2_10
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim,Dim,j,k> iterB;
-  
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(N1,Current_Dim-1)*iterB(Current_Dim-1,N2)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
-  {
-    return iterA(N1,0)*iterB(0,N2);
-  }
-public:
-  Tensor2_symmetric_carat_Tensor2_10
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor2_Expr<B,U,Dim,Dim,j,k> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_symmetric_carat_Tensor2_10<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,i,k>
-operator^(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor2_Expr<B,U,Dim,Dim,j,k> &b)
-{
-  typedef const Tensor2_symmetric_carat_Tensor2_10<A,B,T,U,Dim,i,j,k>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
-    (TensorExpr(a,b));
-}
-
-/* B(j,k)*A(i,j) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_symmetric_carat_Tensor2_10<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,i,k>
-operator^(const Tensor2_Expr<B,U,Dim,Dim,j,k> &b,
-	  const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
-{
-  typedef const Tensor2_symmetric_carat_Tensor2_10<A,B,T,U,Dim,i,j,k>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
-    (TensorExpr(a,b));
-}
-
-
-
-
-
-
-
-/* A(i,j)*B(k,j) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-class Tensor2_symmetric_carat_Tensor2_11
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim,Dim,k,j> iterB;
-  
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(N1,Current_Dim-1)*iterB(N2,Current_Dim-1)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
-  {
-    return iterA(N1,0)*iterB(N2,0);
-  }
-public:
-  Tensor2_symmetric_carat_Tensor2_11
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor2_Expr<B,U,Dim,Dim,k,j> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_symmetric_carat_Tensor2_11<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,i,k>
-operator^(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor2_Expr<B,U,Dim,Dim,k,j> &b)
-{
-  typedef const Tensor2_symmetric_carat_Tensor2_11<A,B,T,U,Dim,i,j,k>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
-    (TensorExpr(a,b));
-}
-
-/* B(k,j)*A(i,j) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_symmetric_carat_Tensor2_11<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,i,k>
-operator^(const Tensor2_Expr<B,U,Dim,Dim,k,j> &b,
-	  const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
-{
-  typedef const Tensor2_symmetric_carat_Tensor2_11<A,B,T,U,Dim,i,j,k>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
-    (TensorExpr(a,b));
-}
-
-
-
-
-
-
-
-/* A(j,i)*B(j,k) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-class Tensor2_symmetric_carat_Tensor2_00
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,j,i> iterA;
-  const Tensor2_Expr<B,U,Dim,Dim,j,k> iterB;
-  
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(Current_Dim-1,N1)*iterB(Current_Dim-1,N2)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
-  {
-    return iterA(0,N1)*iterB(0,N2);
-  }
-public:
-  Tensor2_symmetric_carat_Tensor2_00
-  (const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
-   const Tensor2_Expr<B,U,Dim,Dim,j,k> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_symmetric_carat_Tensor2_00<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,i,k>
-operator^(const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
-	  const Tensor2_Expr<B,U,Dim,Dim,j,k> &b)
-{
-  typedef const Tensor2_symmetric_carat_Tensor2_00<A,B,T,U,Dim,i,j,k>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
-    (TensorExpr(a,b));
-}
-
-/* B(j,k)*A(j,i) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_symmetric_carat_Tensor2_00<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,i,k>
-operator^(const Tensor2_Expr<B,U,Dim,Dim,j,k> &b,
-	  const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a)
-{
-  typedef const Tensor2_symmetric_carat_Tensor2_00<A,B,T,U,Dim,i,j,k>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
-    (TensorExpr(a,b));
-}
-
-
-
-
-
-
-/* A(j,i)*B(k,j) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-class Tensor2_symmetric_carat_Tensor2_01
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,j,i> iterA;
-  const Tensor2_Expr<B,U,Dim,Dim,k,j> iterB;
-  
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(Current_Dim-1,N1)*iterB(N2,Current_Dim-1)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
-  {
-    return iterA(0,N1)*iterB(N2,0);
-  }
-public:
-  Tensor2_symmetric_carat_Tensor2_01
-  (const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
-   const Tensor2_Expr<B,U,Dim,Dim,k,j> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_symmetric_carat_Tensor2_01<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,i,k>
-operator^(const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
-	  const Tensor2_Expr<B,U,Dim,Dim,k,j> &b)
-{
-  typedef const Tensor2_symmetric_carat_Tensor2_01<A,B,T,U,Dim,i,j,k>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
-    (TensorExpr(a,b));
-}
-
-/* B(k,j)*A(j,i) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_symmetric_carat_Tensor2_01<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,i,k>
-operator^(const Tensor2_Expr<B,U,Dim,Dim,k,j> &b,
-	  const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a)
-{
-  typedef const Tensor2_symmetric_carat_Tensor2_01<A,B,T,U,Dim,i,j,k>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_carat_Tensor2.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/Tensor2_symmetric_carat_Tensor2.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,263 @@
+/* Creates a Tensor2_symmetric expression by contracting a
+   Tensor2_symmetric and a Tensor2 together. There are different
+   versions, depending on where the contracting indices are located
+   (i.e. whether it is A(i,j)^B(j,k) or A(i,j)^B(k,j)).  The classes
+   are numbered to differentiate between these.  Thus, A(i,j)^B(j,k)
+   has 10 appended to the name because I count from 0. */
+
+/* A(i,j)*B(j,k) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+class Tensor2_symmetric_carat_Tensor2_10
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim,Dim,j,k> iterB;
+  
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(N1,Current_Dim-1)*iterB(Current_Dim-1,N2)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
+  {
+    return iterA(N1,0)*iterB(0,N2);
+  }
+public:
+  Tensor2_symmetric_carat_Tensor2_10
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor2_Expr<B,U,Dim,Dim,j,k> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_symmetric_carat_Tensor2_10<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,i,k>
+operator^(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor2_Expr<B,U,Dim,Dim,j,k> &b)
+{
+  typedef const Tensor2_symmetric_carat_Tensor2_10<A,B,T,U,Dim,i,j,k>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
+    (TensorExpr(a,b));
+}
+
+/* B(j,k)*A(i,j) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_symmetric_carat_Tensor2_10<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,i,k>
+operator^(const Tensor2_Expr<B,U,Dim,Dim,j,k> &b,
+	  const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
+{
+  typedef const Tensor2_symmetric_carat_Tensor2_10<A,B,T,U,Dim,i,j,k>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
+    (TensorExpr(a,b));
+}
+
+
+
+
+
+
+
+/* A(i,j)*B(k,j) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+class Tensor2_symmetric_carat_Tensor2_11
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim,Dim,k,j> iterB;
+  
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(N1,Current_Dim-1)*iterB(N2,Current_Dim-1)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
+  {
+    return iterA(N1,0)*iterB(N2,0);
+  }
+public:
+  Tensor2_symmetric_carat_Tensor2_11
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor2_Expr<B,U,Dim,Dim,k,j> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_symmetric_carat_Tensor2_11<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,i,k>
+operator^(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor2_Expr<B,U,Dim,Dim,k,j> &b)
+{
+  typedef const Tensor2_symmetric_carat_Tensor2_11<A,B,T,U,Dim,i,j,k>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
+    (TensorExpr(a,b));
+}
+
+/* B(k,j)*A(i,j) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_symmetric_carat_Tensor2_11<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,i,k>
+operator^(const Tensor2_Expr<B,U,Dim,Dim,k,j> &b,
+	  const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
+{
+  typedef const Tensor2_symmetric_carat_Tensor2_11<A,B,T,U,Dim,i,j,k>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
+    (TensorExpr(a,b));
+}
+
+
+
+
+
+
+
+/* A(j,i)*B(j,k) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+class Tensor2_symmetric_carat_Tensor2_00
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,j,i> iterA;
+  const Tensor2_Expr<B,U,Dim,Dim,j,k> iterB;
+  
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(Current_Dim-1,N1)*iterB(Current_Dim-1,N2)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
+  {
+    return iterA(0,N1)*iterB(0,N2);
+  }
+public:
+  Tensor2_symmetric_carat_Tensor2_00
+  (const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
+   const Tensor2_Expr<B,U,Dim,Dim,j,k> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_symmetric_carat_Tensor2_00<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,i,k>
+operator^(const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
+	  const Tensor2_Expr<B,U,Dim,Dim,j,k> &b)
+{
+  typedef const Tensor2_symmetric_carat_Tensor2_00<A,B,T,U,Dim,i,j,k>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
+    (TensorExpr(a,b));
+}
+
+/* B(j,k)*A(j,i) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_symmetric_carat_Tensor2_00<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,i,k>
+operator^(const Tensor2_Expr<B,U,Dim,Dim,j,k> &b,
+	  const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a)
+{
+  typedef const Tensor2_symmetric_carat_Tensor2_00<A,B,T,U,Dim,i,j,k>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
+    (TensorExpr(a,b));
+}
+
+
+
+
+
+
+/* A(j,i)*B(k,j) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+class Tensor2_symmetric_carat_Tensor2_01
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,j,i> iterA;
+  const Tensor2_Expr<B,U,Dim,Dim,k,j> iterB;
+  
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(Current_Dim-1,N1)*iterB(N2,Current_Dim-1)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
+  {
+    return iterA(0,N1)*iterB(N2,0);
+  }
+public:
+  Tensor2_symmetric_carat_Tensor2_01
+  (const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
+   const Tensor2_Expr<B,U,Dim,Dim,k,j> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_symmetric_carat_Tensor2_01<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,i,k>
+operator^(const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
+	  const Tensor2_Expr<B,U,Dim,Dim,k,j> &b)
+{
+  typedef const Tensor2_symmetric_carat_Tensor2_01<A,B,T,U,Dim,i,j,k>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
+    (TensorExpr(a,b));
+}
+
+/* B(k,j)*A(j,i) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_symmetric_carat_Tensor2_01<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,i,k>
+operator^(const Tensor2_Expr<B,U,Dim,Dim,k,j> &b,
+	  const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a)
+{
+  typedef const Tensor2_symmetric_carat_Tensor2_01<A,B,T,U,Dim,i,j,k>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_constructor.h
--- a/Tensor2_symmetric/Tensor2_symmetric_constructor.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/* A helper class that allows simple initialization of the Tensor2_symmetric,
-   but only if it has the correct number of elements. */
-
-template<class T, int Tensor_Dim>
-class Tensor2_symmetric_constructor;
-
-template<class T>
-class Tensor2_symmetric_constructor<T,2>
-{
-public:
-  Tensor2_symmetric_constructor(T data[(2*3)/2], T d00, T d01, T d11)
-  {
-    data[0]=d00;
-    data[1]=d01;
-    data[2]=d11;
-  }
-};
-
-template<class T>
-class Tensor2_symmetric_constructor<T,3>
-{
-public:
-  Tensor2_symmetric_constructor(T data[(3*4)/2], T d00, T d01, T d02,
-				T d11, T d12, T d22)
-  {
-    data[0]=d00;
-    data[1]=d01;
-    data[2]=d02;
-    data[3]=d11;
-    data[4]=d12;
-    data[5]=d22;
-  }
-};
-
-template<class T>
-class Tensor2_symmetric_constructor<T,4>
-{
-public:
-  Tensor2_symmetric_constructor(T data[(4*5)/2], T d00, T d01, T d02, T d03,
-				T d11, T d12, T d13, T d22, T d23, T d33)
-  {
-    data[0]=d00;
-    data[1]=d01;
-    data[2]=d02;
-    data[3]=d03;
-    data[4]=d11;
-    data[5]=d12;
-    data[6]=d13;
-    data[7]=d22;
-    data[8]=d23;
-    data[9]=d33;
-  }
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_constructor.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/Tensor2_symmetric_constructor.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,53 @@
+/* A helper class that allows simple initialization of the Tensor2_symmetric,
+   but only if it has the correct number of elements. */
+
+template<class T, int Tensor_Dim>
+class Tensor2_symmetric_constructor;
+
+template<class T>
+class Tensor2_symmetric_constructor<T,2>
+{
+public:
+  Tensor2_symmetric_constructor(T data[(2*3)/2], T d00, T d01, T d11)
+  {
+    data[0]=d00;
+    data[1]=d01;
+    data[2]=d11;
+  }
+};
+
+template<class T>
+class Tensor2_symmetric_constructor<T,3>
+{
+public:
+  Tensor2_symmetric_constructor(T data[(3*4)/2], T d00, T d01, T d02,
+				T d11, T d12, T d22)
+  {
+    data[0]=d00;
+    data[1]=d01;
+    data[2]=d02;
+    data[3]=d11;
+    data[4]=d12;
+    data[5]=d22;
+  }
+};
+
+template<class T>
+class Tensor2_symmetric_constructor<T,4>
+{
+public:
+  Tensor2_symmetric_constructor(T data[(4*5)/2], T d00, T d01, T d02, T d03,
+				T d11, T d12, T d13, T d22, T d23, T d33)
+  {
+    data[0]=d00;
+    data[1]=d01;
+    data[2]=d02;
+    data[3]=d03;
+    data[4]=d11;
+    data[5]=d12;
+    data[6]=d13;
+    data[7]=d22;
+    data[8]=d23;
+    data[9]=d33;
+  }
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_divide_generic.h
--- a/Tensor2_symmetric/Tensor2_symmetric_divide_generic.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-/* Divides a Tensor2_symmetric by a generic, yielding a
-   Tensor2_symmetric. */
-
-template<class A, class T, class U, int Dim, char i, char j>
-class Tensor2_symmetric_divide_generic
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const U d;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)/d;
-  }
-
-  Tensor2_symmetric_divide_generic
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a, const U &d0):
-    iterA(a), d(d0) {}
-};
-
-template<class A, class T, class U, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_symmetric_divide_generic<A,T,U,Dim,i,j>,typename promote<T,U>::V,Dim,i,j>
-operator/(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a, const U &d0)
-{
-  typedef const Tensor2_symmetric_divide_generic<A,T,U,Dim,i,j> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
-    (TensorExpr(a,d0));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_divide_generic.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/Tensor2_symmetric_divide_generic.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,28 @@
+/* Divides a Tensor2_symmetric by a generic, yielding a
+   Tensor2_symmetric. */
+
+template<class A, class T, class U, int Dim, char i, char j>
+class Tensor2_symmetric_divide_generic
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const U d;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)/d;
+  }
+
+  Tensor2_symmetric_divide_generic
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a, const U &d0):
+    iterA(a), d(d0) {}
+};
+
+template<class A, class T, class U, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_symmetric_divide_generic<A,T,U,Dim,i,j>,typename promote<T,U>::V,Dim,i,j>
+operator/(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a, const U &d0)
+{
+  typedef const Tensor2_symmetric_divide_generic<A,T,U,Dim,i,j> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
+    (TensorExpr(a,d0));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_minus_Tensor2.h
--- a/Tensor2_symmetric/Tensor2_symmetric_minus_Tensor2.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,115 +0,0 @@
-/* Subtracts a Tensor2 from a Tensor2_symmetric (or vice versa),
-   yielding a Tensor2. */
-
-/* A(i,j)-B(i,j), A is symmetric, B is not. */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-class Tensor2_symmetric_minus_Tensor2_01
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim,Dim,i,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)-iterB(N1,N2);
-  }
-
-  Tensor2_symmetric_minus_Tensor2_01
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor2_Expr<B,U,Dim,Dim,i,j> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const Tensor2_Expr<const Tensor2_symmetric_minus_Tensor2_01<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,Dim,i,j>
-operator-(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor2_Expr<B,U,Dim,Dim,i,j> &b)
-{
-  typedef const Tensor2_symmetric_minus_Tensor2_01<A,B,T,U,Dim,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j>(TensorExpr(a,b));
-}
-
-/* B(i,j)-A(i,j), A is symmetric, B is not. */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-class Tensor2_minus_Tensor2_symmetric_01
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim,Dim,i,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterB(N1,N2)-iterA(N1,N2);
-  }
-
-  Tensor2_minus_Tensor2_symmetric_01
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor2_Expr<B,U,Dim,Dim,i,j> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const Tensor2_Expr<const Tensor2_minus_Tensor2_symmetric_01<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,Dim,i,j>
-operator-(const Tensor2_Expr<B,U,Dim,Dim,i,j> &b,
-	  const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
-	  
-{
-  typedef const Tensor2_minus_Tensor2_symmetric_01<A,B,T,U,Dim,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j>(TensorExpr(a,b));
-}
-
-/* A(i,j)-B(j,i), A is symmetric, B is not. */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-class Tensor2_symmetric_minus_Tensor2_10
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim,Dim,j,i> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)-iterB(N2,N1);
-  }
-
-  Tensor2_symmetric_minus_Tensor2_10
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor2_Expr<B,U,Dim,Dim,j,i> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const Tensor2_Expr<const Tensor2_symmetric_minus_Tensor2_10<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,Dim,i,j>
-operator-(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor2_Expr<B,U,Dim,Dim,j,i> &b)
-{
-  typedef const Tensor2_symmetric_minus_Tensor2_10<A,B,T,U,Dim,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j>(TensorExpr(a,b));
-}
-
-/* B(j,i)-A(i,j), A is symmetric, B is not. */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-class Tensor2_minus_Tensor2_symmetric_10
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim,Dim,j,i> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterB(N2,N1)-iterA(N1,N2);
-  }
-
-  Tensor2_minus_Tensor2_symmetric_10
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor2_Expr<B,U,Dim,Dim,j,i> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const Tensor2_Expr<const Tensor2_minus_Tensor2_symmetric_10<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,Dim,i,j>
-operator-(const Tensor2_Expr<B,U,Dim,Dim,j,i> &b,
-	  const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
-{
-  typedef const Tensor2_minus_Tensor2_symmetric_10<A,B,T,U,Dim,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j>(TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_minus_Tensor2.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/Tensor2_symmetric_minus_Tensor2.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,115 @@
+/* Subtracts a Tensor2 from a Tensor2_symmetric (or vice versa),
+   yielding a Tensor2. */
+
+/* A(i,j)-B(i,j), A is symmetric, B is not. */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+class Tensor2_symmetric_minus_Tensor2_01
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim,Dim,i,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)-iterB(N1,N2);
+  }
+
+  Tensor2_symmetric_minus_Tensor2_01
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor2_Expr<B,U,Dim,Dim,i,j> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const Tensor2_Expr<const Tensor2_symmetric_minus_Tensor2_01<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,Dim,i,j>
+operator-(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor2_Expr<B,U,Dim,Dim,i,j> &b)
+{
+  typedef const Tensor2_symmetric_minus_Tensor2_01<A,B,T,U,Dim,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j>(TensorExpr(a,b));
+}
+
+/* B(i,j)-A(i,j), A is symmetric, B is not. */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+class Tensor2_minus_Tensor2_symmetric_01
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim,Dim,i,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterB(N1,N2)-iterA(N1,N2);
+  }
+
+  Tensor2_minus_Tensor2_symmetric_01
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor2_Expr<B,U,Dim,Dim,i,j> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const Tensor2_Expr<const Tensor2_minus_Tensor2_symmetric_01<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,Dim,i,j>
+operator-(const Tensor2_Expr<B,U,Dim,Dim,i,j> &b,
+	  const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
+	  
+{
+  typedef const Tensor2_minus_Tensor2_symmetric_01<A,B,T,U,Dim,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j>(TensorExpr(a,b));
+}
+
+/* A(i,j)-B(j,i), A is symmetric, B is not. */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+class Tensor2_symmetric_minus_Tensor2_10
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim,Dim,j,i> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)-iterB(N2,N1);
+  }
+
+  Tensor2_symmetric_minus_Tensor2_10
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor2_Expr<B,U,Dim,Dim,j,i> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const Tensor2_Expr<const Tensor2_symmetric_minus_Tensor2_10<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,Dim,i,j>
+operator-(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor2_Expr<B,U,Dim,Dim,j,i> &b)
+{
+  typedef const Tensor2_symmetric_minus_Tensor2_10<A,B,T,U,Dim,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j>(TensorExpr(a,b));
+}
+
+/* B(j,i)-A(i,j), A is symmetric, B is not. */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+class Tensor2_minus_Tensor2_symmetric_10
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim,Dim,j,i> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterB(N2,N1)-iterA(N1,N2);
+  }
+
+  Tensor2_minus_Tensor2_symmetric_10
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor2_Expr<B,U,Dim,Dim,j,i> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const Tensor2_Expr<const Tensor2_minus_Tensor2_symmetric_10<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,Dim,i,j>
+operator-(const Tensor2_Expr<B,U,Dim,Dim,j,i> &b,
+	  const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
+{
+  typedef const Tensor2_minus_Tensor2_symmetric_10<A,B,T,U,Dim,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j>(TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_minus_Tensor2_symmetric.h
--- a/Tensor2_symmetric/Tensor2_symmetric_minus_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-/* Subtracts a Tensor2_symmetric from a Tensor2_symmetric, yielding a
-   Tensor2_symmetric. */
-
-/* A(i,j) - B(i,j) */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-class Tensor2_symmetric_minus_Tensor2_symmetric_01
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,i,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)-iterB(N1,N2);
-  }
-
-  Tensor2_symmetric_minus_Tensor2_symmetric_01
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_symmetric_minus_Tensor2_symmetric_01<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,i,j>
-operator-(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b)
-{
-  typedef const Tensor2_symmetric_minus_Tensor2_symmetric_01<A,B,T,U,Dim,i,j>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j) - B(j,i) */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-class Tensor2_symmetric_minus_Tensor2_symmetric_10
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,j,i> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)-iterB(N1,N2);
-  }
-
-  Tensor2_symmetric_minus_Tensor2_symmetric_10
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_symmetric_minus_Tensor2_symmetric_10<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,i,j>
-operator-(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b)
-{
-  typedef const Tensor2_symmetric_minus_Tensor2_symmetric_10<A,B,T,U,Dim,i,j>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
-    (TensorExpr(a,b));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_minus_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/Tensor2_symmetric_minus_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,65 @@
+/* Subtracts a Tensor2_symmetric from a Tensor2_symmetric, yielding a
+   Tensor2_symmetric. */
+
+/* A(i,j) - B(i,j) */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+class Tensor2_symmetric_minus_Tensor2_symmetric_01
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,i,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)-iterB(N1,N2);
+  }
+
+  Tensor2_symmetric_minus_Tensor2_symmetric_01
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_symmetric_minus_Tensor2_symmetric_01<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,i,j>
+operator-(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b)
+{
+  typedef const Tensor2_symmetric_minus_Tensor2_symmetric_01<A,B,T,U,Dim,i,j>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j) - B(j,i) */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+class Tensor2_symmetric_minus_Tensor2_symmetric_10
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,j,i> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)-iterB(N1,N2);
+  }
+
+  Tensor2_symmetric_minus_Tensor2_symmetric_10
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_symmetric_minus_Tensor2_symmetric_10<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,i,j>
+operator-(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b)
+{
+  typedef const Tensor2_symmetric_minus_Tensor2_symmetric_10<A,B,T,U,Dim,i,j>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
+    (TensorExpr(a,b));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_minus_generic.h
--- a/Tensor2_symmetric/Tensor2_symmetric_minus_generic.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-/* Subtracts a generic from a Tensor2_symmetric, yielding a
-   Tensor2_symmetric. */
-
-template<class A, class T, class U, int Dim, char i, char j>
-class Tensor2_symmetric_minus_generic
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const U d;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)-d;
-  }
-
-  Tensor2_symmetric_minus_generic(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-				  const U &d0): iterA(a), d(d0) {}
-};
-
-template<class A, class T, class U, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_symmetric_minus_generic<A,T,U,Dim,i,j>,typename promote<T,U>::V,Dim,i,j>
-operator-(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a, const U &d0)
-{
-  typedef const Tensor2_symmetric_minus_generic<A,T,U,Dim,i,j> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
-    (TensorExpr(a,d0));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_minus_generic.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/Tensor2_symmetric_minus_generic.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,27 @@
+/* Subtracts a generic from a Tensor2_symmetric, yielding a
+   Tensor2_symmetric. */
+
+template<class A, class T, class U, int Dim, char i, char j>
+class Tensor2_symmetric_minus_generic
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const U d;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)-d;
+  }
+
+  Tensor2_symmetric_minus_generic(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+				  const U &d0): iterA(a), d(d0) {}
+};
+
+template<class A, class T, class U, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_symmetric_minus_generic<A,T,U,Dim,i,j>,typename promote<T,U>::V,Dim,i,j>
+operator-(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a, const U &d0)
+{
+  typedef const Tensor2_symmetric_minus_generic<A,T,U,Dim,i,j> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
+    (TensorExpr(a,d0));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_mod_Tensor2_symmetric.h
--- a/Tensor2_symmetric/Tensor2_symmetric_mod_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-/* Divides a Tensor2_symmetric by a Tensor2_symmetric together but
-   don't contract, yielding a Tensor2_symmetric. */
-
-/* A(i,j) % B(i,j) -> Tensor2_symmetric */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-class Tensor2_symmetric_mod_Tensor2_symmetric_01
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,i,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)/iterB(N1,N2);
-  }
-
-  Tensor2_symmetric_mod_Tensor2_symmetric_01
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_symmetric_mod_Tensor2_symmetric_01<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,i,j>
-operator%(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b)
-{
-  typedef const Tensor2_symmetric_mod_Tensor2_symmetric_01<A,B,T,U,Dim,i,j>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j) % B(j,i) -> Tensor2_symmetric */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-class Tensor2_symmetric_mod_Tensor2_symmetric_10
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,j,i> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)/iterB(N2,N1);
-  }
-
-  Tensor2_symmetric_mod_Tensor2_symmetric_10
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr<const Tensor2_symmetric_mod_Tensor2_symmetric_10
-<A,B,T,U,Dim,i,j>,typename promote<T,U>::V,Dim,i,j>
-operator%(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b)
-{
-  typedef const Tensor2_symmetric_mod_Tensor2_symmetric_10<A,B,T,U,Dim,i,j>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
-    (TensorExpr(a,b));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_mod_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/Tensor2_symmetric_mod_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,64 @@
+/* Divides a Tensor2_symmetric by a Tensor2_symmetric together but
+   don't contract, yielding a Tensor2_symmetric. */
+
+/* A(i,j) % B(i,j) -> Tensor2_symmetric */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+class Tensor2_symmetric_mod_Tensor2_symmetric_01
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,i,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)/iterB(N1,N2);
+  }
+
+  Tensor2_symmetric_mod_Tensor2_symmetric_01
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_symmetric_mod_Tensor2_symmetric_01<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,i,j>
+operator%(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b)
+{
+  typedef const Tensor2_symmetric_mod_Tensor2_symmetric_01<A,B,T,U,Dim,i,j>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j) % B(j,i) -> Tensor2_symmetric */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+class Tensor2_symmetric_mod_Tensor2_symmetric_10
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,j,i> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)/iterB(N2,N1);
+  }
+
+  Tensor2_symmetric_mod_Tensor2_symmetric_10
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr<const Tensor2_symmetric_mod_Tensor2_symmetric_10
+<A,B,T,U,Dim,i,j>,typename promote<T,U>::V,Dim,i,j>
+operator%(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b)
+{
+  typedef const Tensor2_symmetric_mod_Tensor2_symmetric_10<A,B,T,U,Dim,i,j>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
+    (TensorExpr(a,b));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_plus_Tensor2.h
--- a/Tensor2_symmetric/Tensor2_symmetric_plus_Tensor2.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,82 +0,0 @@
-/* Adds a Tensor2_symmetric to a Tensor2, yielding a Tensor2. */
-
-/* A(i,j)+B(i,j), A is symmetric, B is not. */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-class Tensor2_symmetric_plus_Tensor2_01
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim,Dim,i,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)+iterB(N1,N2);
-  }
-
-  Tensor2_symmetric_plus_Tensor2_01
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor2_Expr<B,U,Dim,Dim,i,j> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const Tensor2_Expr<const Tensor2_symmetric_plus_Tensor2_01<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,Dim,i,j>
-operator+(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor2_Expr<B,U,Dim,Dim,i,j> &b)
-{
-  typedef const Tensor2_symmetric_plus_Tensor2_01<A,B,T,U,Dim,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j>(TensorExpr(a,b));
-}
-
-/* B(i,j)+A(i,j), A is symmetric, B is not. */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const Tensor2_Expr<const Tensor2_symmetric_plus_Tensor2_01<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,Dim,i,j>
-operator+(const Tensor2_Expr<B,U,Dim,Dim,i,j> &b,
-	  const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
-{
-  typedef const Tensor2_symmetric_plus_Tensor2_01<A,B,T,U,Dim,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j>(TensorExpr(a,b));
-}
-
-/* A(i,j)+B(j,i), A is symmetric, B is not. */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-class Tensor2_symmetric_plus_Tensor2_10
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim,Dim,j,i> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)+iterB(N2,N1);
-  }
-
-  Tensor2_symmetric_plus_Tensor2_10
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor2_Expr<B,U,Dim,Dim,j,i> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const Tensor2_Expr<const Tensor2_symmetric_plus_Tensor2_10<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,Dim,i,j>
-operator+(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor2_Expr<B,U,Dim,Dim,j,i> &b)
-{
-  typedef const Tensor2_symmetric_plus_Tensor2_10<A,B,T,U,Dim,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j>(TensorExpr(a,b));
-}
-
-/* B(j,i)+A(i,j), A is symmetric, B is not. */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const Tensor2_Expr<const Tensor2_symmetric_plus_Tensor2_10<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,Dim,i,j>
-operator+(const Tensor2_Expr<B,U,Dim,Dim,j,i> &b,
-	  const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
-{
-  typedef const Tensor2_symmetric_plus_Tensor2_10<A,B,T,U,Dim,i,j> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j>(TensorExpr(a,b));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_plus_Tensor2.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/Tensor2_symmetric_plus_Tensor2.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,82 @@
+/* Adds a Tensor2_symmetric to a Tensor2, yielding a Tensor2. */
+
+/* A(i,j)+B(i,j), A is symmetric, B is not. */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+class Tensor2_symmetric_plus_Tensor2_01
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim,Dim,i,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)+iterB(N1,N2);
+  }
+
+  Tensor2_symmetric_plus_Tensor2_01
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor2_Expr<B,U,Dim,Dim,i,j> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const Tensor2_Expr<const Tensor2_symmetric_plus_Tensor2_01<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,Dim,i,j>
+operator+(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor2_Expr<B,U,Dim,Dim,i,j> &b)
+{
+  typedef const Tensor2_symmetric_plus_Tensor2_01<A,B,T,U,Dim,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j>(TensorExpr(a,b));
+}
+
+/* B(i,j)+A(i,j), A is symmetric, B is not. */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const Tensor2_Expr<const Tensor2_symmetric_plus_Tensor2_01<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,Dim,i,j>
+operator+(const Tensor2_Expr<B,U,Dim,Dim,i,j> &b,
+	  const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
+{
+  typedef const Tensor2_symmetric_plus_Tensor2_01<A,B,T,U,Dim,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j>(TensorExpr(a,b));
+}
+
+/* A(i,j)+B(j,i), A is symmetric, B is not. */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+class Tensor2_symmetric_plus_Tensor2_10
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim,Dim,j,i> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)+iterB(N2,N1);
+  }
+
+  Tensor2_symmetric_plus_Tensor2_10
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor2_Expr<B,U,Dim,Dim,j,i> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const Tensor2_Expr<const Tensor2_symmetric_plus_Tensor2_10<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,Dim,i,j>
+operator+(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor2_Expr<B,U,Dim,Dim,j,i> &b)
+{
+  typedef const Tensor2_symmetric_plus_Tensor2_10<A,B,T,U,Dim,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j>(TensorExpr(a,b));
+}
+
+/* B(j,i)+A(i,j), A is symmetric, B is not. */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const Tensor2_Expr<const Tensor2_symmetric_plus_Tensor2_10<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,Dim,i,j>
+operator+(const Tensor2_Expr<B,U,Dim,Dim,j,i> &b,
+	  const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
+{
+  typedef const Tensor2_symmetric_plus_Tensor2_10<A,B,T,U,Dim,i,j> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j>(TensorExpr(a,b));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_plus_Tensor2_symmetric.h
--- a/Tensor2_symmetric/Tensor2_symmetric_plus_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-/* Adds a Tensor2_symmetric to a Tensor2_symmetric, yielding a
-   Tensor2_symmetric. */
-
-/* A(i,j) + B(i,j) */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-class Tensor2_symmetric_plus_Tensor2_symmetric_01
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,i,j> iterB;
-public:
-  typename promote<T,U>::V  operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)+iterB(N1,N2);
-  }
-
-  Tensor2_symmetric_plus_Tensor2_symmetric_01
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_symmetric_plus_Tensor2_symmetric_01<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,i,j>
-operator+(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b)
-{
-  typedef const Tensor2_symmetric_plus_Tensor2_symmetric_01<A,B,T,U,Dim,i,j>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j) + B(j,i) */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-class Tensor2_symmetric_plus_Tensor2_symmetric_10
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,j,i> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)+iterB(N1,N2);
-  }
-
-  Tensor2_symmetric_plus_Tensor2_symmetric_10
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_symmetric_plus_Tensor2_symmetric_10<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,i,j>
-operator+(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b)
-{
-  typedef const Tensor2_symmetric_plus_Tensor2_symmetric_10<A,B,T,U,Dim,i,j>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_plus_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/Tensor2_symmetric_plus_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,64 @@
+/* Adds a Tensor2_symmetric to a Tensor2_symmetric, yielding a
+   Tensor2_symmetric. */
+
+/* A(i,j) + B(i,j) */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+class Tensor2_symmetric_plus_Tensor2_symmetric_01
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,i,j> iterB;
+public:
+  typename promote<T,U>::V  operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)+iterB(N1,N2);
+  }
+
+  Tensor2_symmetric_plus_Tensor2_symmetric_01
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_symmetric_plus_Tensor2_symmetric_01<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,i,j>
+operator+(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b)
+{
+  typedef const Tensor2_symmetric_plus_Tensor2_symmetric_01<A,B,T,U,Dim,i,j>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j) + B(j,i) */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+class Tensor2_symmetric_plus_Tensor2_symmetric_10
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,j,i> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)+iterB(N1,N2);
+  }
+
+  Tensor2_symmetric_plus_Tensor2_symmetric_10
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_symmetric_plus_Tensor2_symmetric_10<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,i,j>
+operator+(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b)
+{
+  typedef const Tensor2_symmetric_plus_Tensor2_symmetric_10<A,B,T,U,Dim,i,j>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_plus_generic.h
--- a/Tensor2_symmetric/Tensor2_symmetric_plus_generic.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-/* Adds a Tensor2_symmetric to a generic, yielding a
-   Tensor2_symmetric. */
-
-template<class A, class T, class U, int Dim, char i, char j>
-class Tensor2_symmetric_plus_generic
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const U d;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)+d;
-  }
-
-  Tensor2_symmetric_plus_generic(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-				  const U &d0): iterA(a), d(d0) {}
-};
-
-template<class A, class T, class U, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_symmetric_plus_generic<A,T,U,Dim,i,j>,typename promote<T,U>::V,Dim,i,j>
-operator+(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a, const U &d0)
-{
-  typedef const Tensor2_symmetric_plus_generic<A,T,U,Dim,i,j> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
-    (TensorExpr(a,d0));
-}
-
-template<class A, class T, class U, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_symmetric_plus_generic<A,T,U,Dim,i,j>,typename promote<T,U>::V,Dim,i,j>
-operator+(const U &d0, const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
-{
-  typedef const Tensor2_symmetric_plus_generic<A,T,U,Dim,i,j> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
-    (TensorExpr(a,d0));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_plus_generic.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/Tensor2_symmetric_plus_generic.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,37 @@
+/* Adds a Tensor2_symmetric to a generic, yielding a
+   Tensor2_symmetric. */
+
+template<class A, class T, class U, int Dim, char i, char j>
+class Tensor2_symmetric_plus_generic
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const U d;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)+d;
+  }
+
+  Tensor2_symmetric_plus_generic(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+				  const U &d0): iterA(a), d(d0) {}
+};
+
+template<class A, class T, class U, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_symmetric_plus_generic<A,T,U,Dim,i,j>,typename promote<T,U>::V,Dim,i,j>
+operator+(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a, const U &d0)
+{
+  typedef const Tensor2_symmetric_plus_generic<A,T,U,Dim,i,j> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
+    (TensorExpr(a,d0));
+}
+
+template<class A, class T, class U, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_symmetric_plus_generic<A,T,U,Dim,i,j>,typename promote<T,U>::V,Dim,i,j>
+operator+(const U &d0, const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
+{
+  typedef const Tensor2_symmetric_plus_generic<A,T,U,Dim,i,j> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
+    (TensorExpr(a,d0));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_pointer.h
--- a/Tensor2_symmetric/Tensor2_symmetric_pointer.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,233 +0,0 @@
-/* A version for pointers. */
-
-template <class T, int Tensor_Dim>
-class Tensor2_symmetric<T*,Tensor_Dim>
-{
-  mutable T* restrict data[(Tensor_Dim*(Tensor_Dim+1))/2];
-public:
-  Tensor2_symmetric() {}
-
-  /* Tensor_Dim=2 */
-  Tensor2_symmetric(T* d00, T* d01, T* d11)
-  {
-    Tensor2_symmetric_constructor<T* restrict,Tensor_Dim>(data,d00,d01,d11);
-  }
-
-  /* Tensor_Dim=3 */
-  Tensor2_symmetric(T* d00, T* d01, T* d02, T* d11, T* d12, T* d22)
-  {
-    Tensor2_symmetric_constructor<T* restrict,Tensor_Dim>(data,d00,d01,d02,d11,d12,d22);
-  }
-
-  /* Tensor_Dim=4 */
-  Tensor2_symmetric(T* d00, T* d01, T* d02, T* d03, T* d11, T* d12, T* d13,
-		    T* d22, T* d23, T* d33)
-  {
-    Tensor2_symmetric_constructor<T* restrict,Tensor_Dim>
-      (data,d00,d01,d02,d03,d11,d12,d13,d22,d23,d33);
-  }
-
-  /* There are two operator(int,int)'s, one for non-consts that lets you
-     change the value, and one for consts that doesn't. */
-
-  T & operator()(const int N1, const int N2)
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim || N1<0 || N2>=Tensor_Dim || N2<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor2_symmetric<T*,"
-          << Tensor_Dim
-          << ">.operator(" << N1 << "," << N2 << ")"
-          << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N1>N2 ? *data[N1+(N2*(2*Tensor_Dim-N2-1))/2]
-      : *data[N2+(N1*(2*Tensor_Dim-N1-1))/2];
-  }
-
-  T operator()(const int N1, const int N2) const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim || N1<0 || N2>=Tensor_Dim || N2<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor2_symmetric<T*,"
-          << Tensor_Dim
-          << ">.operator(" << N1 << "," << N2 << ") const"
-          << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N1>N2 ? *data[N1+(N2*(2*Tensor_Dim-N2-1))/2]
-      : *data[N2+(N1*(2*Tensor_Dim-N1-1))/2];
-  }
-
-  T* ptr(const int N1, const int N2) const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim || N1<0 || N2>=Tensor_Dim || N2<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor2_symmetric<T*,"
-          << Tensor_Dim
-          << ">.ptr(" << N1 << "," << N2 << ")" << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N1>N2 ? data[N1+(N2*(2*Tensor_Dim-N2-1))/2]
-      : data[N2+(N1*(2*Tensor_Dim-N1-1))/2];
-  }
-
-  /* These operator()'s are the first part in constructing template
-     expressions.  They can be used to slice off lower dimensional
-     parts. They are not entirely safe, since you can accidently use a
-     higher dimension than what is really allowed (like Dim=5). */
-
-  /* This returns a Tensor2_Expr, since the indices are not really
-     symmetric anymore since they cover different dimensions. */
-
-  template<char i, char j, int Dim0, int Dim1>
-  Tensor2_Expr<Tensor2_symmetric<T*,Tensor_Dim>,T,Dim0,Dim1,i,j>
-  operator()(const Index<i,Dim0> index1, const Index<j,Dim1> index2)
-  {
-    return Tensor2_Expr<Tensor2_symmetric<T*,Tensor_Dim>,T,Dim0,Dim1,i,j>
-      (*this);
-  }
-
-  template<char i, char j, int Dim0, int Dim1>
-  Tensor2_Expr<const Tensor2_symmetric<T*,Tensor_Dim>,T,Dim0,Dim1,i,j>
-  operator()(const Index<i,Dim0> index1, const Index<j,Dim1> index2) const
-  {
-    return Tensor2_Expr<const Tensor2_symmetric<T*,Tensor_Dim>,T,Dim0,Dim1,i,j>
-      (*this);
-  }
-
-  /* This returns a Tensor2_symmetric_Expr, since the indices are still
-     symmetric on the lower dimensions. */
-
-  template<char i, char j, int Dim>
-  Tensor2_symmetric_Expr<Tensor2_symmetric<T*,Tensor_Dim>,T,Dim,i,j>
-  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2)
-  {
-    return Tensor2_symmetric_Expr<Tensor2_symmetric<T*,Tensor_Dim>,T,Dim,i,j>
-      (*this);
-  }
-
-  template<char i, char j, int Dim>
-  Tensor2_symmetric_Expr<const Tensor2_symmetric<T*,Tensor_Dim>,T,Dim,i,j>
-  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2) const
-  {
-    return Tensor2_symmetric_Expr<const Tensor2_symmetric<T*,Tensor_Dim>,
-      T,Dim,i,j>(*this);
-  }
-
-  /* This is for expressions where a number is used for one slot, and
-     an index for another, yielding a Tensor1_Expr.  The non-const
-     versions don't actually create a Tensor2_number_rhs_[01] object.
-     They create a Tensor1_Expr directly, which provides the
-     appropriate indexing operators.  The const versions do create a
-     Tensor2_number_[01]. */
-
-  template<char i, int N, int Dim>
-  Tensor1_Expr<Tensor2_number_rhs_1<Tensor2_symmetric<T*,Tensor_Dim>,T,N>,
-    T,Dim,i>
-  operator()(const Index<i,Dim> index1, const Number<N> &n1)
-  {
-    typedef Tensor2_number_rhs_1<Tensor2_symmetric<T*,Tensor_Dim>,T,N>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
-  }
-
-  template<char i, int N, int Dim>
-  Tensor1_Expr<const Tensor2_number_1<const Tensor2_symmetric<T*,Tensor_Dim>,
-    T,N>,T,Dim,i>
-  operator()(const Index<i,Dim> index1, const Number<N> &n1) const
-  {
-    typedef const Tensor2_number_1<const Tensor2_symmetric<T*,Tensor_Dim>,T,N>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-  template<char i, int N, int Dim>
-  Tensor1_Expr<Tensor2_number_rhs_0<Tensor2_symmetric<T*,Tensor_Dim>,T,N>,
-    T,Dim,i>
-  operator()(const Number<N> &n1, const Index<i,Dim> index1)
-  {
-    typedef Tensor2_number_rhs_0<Tensor2_symmetric<T*,Tensor_Dim>,T,N>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
-  }
-
-  template<char i, int N, int Dim>
-  Tensor1_Expr<const Tensor2_number_0<const Tensor2_symmetric<T*,Tensor_Dim>,
-    T,N>,T,Dim,i>
-  operator()(const Number<N> &n1, const Index<i,Dim> index1) const
-  {
-    typedef const Tensor2_number_0<const Tensor2_symmetric<T*,Tensor_Dim>,T,N>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-  /* Specializations for using actual numbers instead of Number<> */
-
-  template<char i, int Dim>
-  Tensor1_Expr<const Tensor2_numeral_1<const Tensor2_symmetric<T*,Tensor_Dim>,
-    T>,T,Dim,i>
-  operator()(const Index<i,Dim> index1, const int N) const
-  {
-    typedef const Tensor2_numeral_1<const Tensor2_symmetric<T*,Tensor_Dim>,T>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N));
-  }
-
-  template<char i, int Dim>
-  Tensor1_Expr<const Tensor2_numeral_0<const Tensor2_symmetric<T*,Tensor_Dim>,
-    T>,T,Dim,i>
-  operator()(const int N, const Index<i,Dim> index1) const
-  {
-    typedef const Tensor2_numeral_0<const Tensor2_symmetric<T*,Tensor_Dim>,T>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N));
-  }
-  
-  /* The ++ operator increments the pointer, not the number that the
-     pointer points to.  This allows iterating over a grid. */
-
-  const Tensor2_symmetric<T*,Tensor_Dim> & operator++() const
-  {
-    for(int i=0;i<(Tensor_Dim*(Tensor_Dim+1))/2;++i)
-      ++data[i];
-    return *this;
-  }
-
-  /* These two operator()'s return the Tensor2 with internal
-     contractions, yielding a T.  I have to specify one for both
-     const and non-const because otherwise the compiler will use the
-     operator() which gives a Tensor2_Expr<>. */
-  
-  template<char i, int Dim>
-  T operator()(const Index<i,Dim> index1, const Index<i,Dim> index2)
-  {
-    return internal_contract(Number<Dim>());
-  }
-
-  template<char i, int Dim>
-  T operator()(const Index<i,Dim> index1, const Index<i,Dim> index2) const
-  {
-    return internal_contract(Number<Dim>());
-  }
-private:
-  template<int N>
-  T internal_contract(Number<N>)
-  {
-    return *data[N-1+((N-1)*(2*Tensor_Dim-N))/2]
-      + internal_contract(Number<N-1>());
-  }
-
-  T internal_contract(Number<1>)
-  {
-    return *data[0];
-  }
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_pointer.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/Tensor2_symmetric_pointer.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,233 @@
+/* A version for pointers. */
+
+template <class T, int Tensor_Dim>
+class Tensor2_symmetric<T*,Tensor_Dim>
+{
+  mutable T* restrict data[(Tensor_Dim*(Tensor_Dim+1))/2];
+public:
+  Tensor2_symmetric() {}
+
+  /* Tensor_Dim=2 */
+  Tensor2_symmetric(T* d00, T* d01, T* d11)
+  {
+    Tensor2_symmetric_constructor<T* restrict,Tensor_Dim>(data,d00,d01,d11);
+  }
+
+  /* Tensor_Dim=3 */
+  Tensor2_symmetric(T* d00, T* d01, T* d02, T* d11, T* d12, T* d22)
+  {
+    Tensor2_symmetric_constructor<T* restrict,Tensor_Dim>(data,d00,d01,d02,d11,d12,d22);
+  }
+
+  /* Tensor_Dim=4 */
+  Tensor2_symmetric(T* d00, T* d01, T* d02, T* d03, T* d11, T* d12, T* d13,
+		    T* d22, T* d23, T* d33)
+  {
+    Tensor2_symmetric_constructor<T* restrict,Tensor_Dim>
+      (data,d00,d01,d02,d03,d11,d12,d13,d22,d23,d33);
+  }
+
+  /* There are two operator(int,int)'s, one for non-consts that lets you
+     change the value, and one for consts that doesn't. */
+
+  T & operator()(const int N1, const int N2)
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim || N1<0 || N2>=Tensor_Dim || N2<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor2_symmetric<T*,"
+          << Tensor_Dim
+          << ">.operator(" << N1 << "," << N2 << ")"
+          << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N1>N2 ? *data[N1+(N2*(2*Tensor_Dim-N2-1))/2]
+      : *data[N2+(N1*(2*Tensor_Dim-N1-1))/2];
+  }
+
+  T operator()(const int N1, const int N2) const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim || N1<0 || N2>=Tensor_Dim || N2<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor2_symmetric<T*,"
+          << Tensor_Dim
+          << ">.operator(" << N1 << "," << N2 << ") const"
+          << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N1>N2 ? *data[N1+(N2*(2*Tensor_Dim-N2-1))/2]
+      : *data[N2+(N1*(2*Tensor_Dim-N1-1))/2];
+  }
+
+  T* ptr(const int N1, const int N2) const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim || N1<0 || N2>=Tensor_Dim || N2<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor2_symmetric<T*,"
+          << Tensor_Dim
+          << ">.ptr(" << N1 << "," << N2 << ")" << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N1>N2 ? data[N1+(N2*(2*Tensor_Dim-N2-1))/2]
+      : data[N2+(N1*(2*Tensor_Dim-N1-1))/2];
+  }
+
+  /* These operator()'s are the first part in constructing template
+     expressions.  They can be used to slice off lower dimensional
+     parts. They are not entirely safe, since you can accidently use a
+     higher dimension than what is really allowed (like Dim=5). */
+
+  /* This returns a Tensor2_Expr, since the indices are not really
+     symmetric anymore since they cover different dimensions. */
+
+  template<char i, char j, int Dim0, int Dim1>
+  Tensor2_Expr<Tensor2_symmetric<T*,Tensor_Dim>,T,Dim0,Dim1,i,j>
+  operator()(const Index<i,Dim0> index1, const Index<j,Dim1> index2)
+  {
+    return Tensor2_Expr<Tensor2_symmetric<T*,Tensor_Dim>,T,Dim0,Dim1,i,j>
+      (*this);
+  }
+
+  template<char i, char j, int Dim0, int Dim1>
+  Tensor2_Expr<const Tensor2_symmetric<T*,Tensor_Dim>,T,Dim0,Dim1,i,j>
+  operator()(const Index<i,Dim0> index1, const Index<j,Dim1> index2) const
+  {
+    return Tensor2_Expr<const Tensor2_symmetric<T*,Tensor_Dim>,T,Dim0,Dim1,i,j>
+      (*this);
+  }
+
+  /* This returns a Tensor2_symmetric_Expr, since the indices are still
+     symmetric on the lower dimensions. */
+
+  template<char i, char j, int Dim>
+  Tensor2_symmetric_Expr<Tensor2_symmetric<T*,Tensor_Dim>,T,Dim,i,j>
+  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2)
+  {
+    return Tensor2_symmetric_Expr<Tensor2_symmetric<T*,Tensor_Dim>,T,Dim,i,j>
+      (*this);
+  }
+
+  template<char i, char j, int Dim>
+  Tensor2_symmetric_Expr<const Tensor2_symmetric<T*,Tensor_Dim>,T,Dim,i,j>
+  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2) const
+  {
+    return Tensor2_symmetric_Expr<const Tensor2_symmetric<T*,Tensor_Dim>,
+      T,Dim,i,j>(*this);
+  }
+
+  /* This is for expressions where a number is used for one slot, and
+     an index for another, yielding a Tensor1_Expr.  The non-const
+     versions don't actually create a Tensor2_number_rhs_[01] object.
+     They create a Tensor1_Expr directly, which provides the
+     appropriate indexing operators.  The const versions do create a
+     Tensor2_number_[01]. */
+
+  template<char i, int N, int Dim>
+  Tensor1_Expr<Tensor2_number_rhs_1<Tensor2_symmetric<T*,Tensor_Dim>,T,N>,
+    T,Dim,i>
+  operator()(const Index<i,Dim> index1, const Number<N> &n1)
+  {
+    typedef Tensor2_number_rhs_1<Tensor2_symmetric<T*,Tensor_Dim>,T,N>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
+  }
+
+  template<char i, int N, int Dim>
+  Tensor1_Expr<const Tensor2_number_1<const Tensor2_symmetric<T*,Tensor_Dim>,
+    T,N>,T,Dim,i>
+  operator()(const Index<i,Dim> index1, const Number<N> &n1) const
+  {
+    typedef const Tensor2_number_1<const Tensor2_symmetric<T*,Tensor_Dim>,T,N>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+  template<char i, int N, int Dim>
+  Tensor1_Expr<Tensor2_number_rhs_0<Tensor2_symmetric<T*,Tensor_Dim>,T,N>,
+    T,Dim,i>
+  operator()(const Number<N> &n1, const Index<i,Dim> index1)
+  {
+    typedef Tensor2_number_rhs_0<Tensor2_symmetric<T*,Tensor_Dim>,T,N>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
+  }
+
+  template<char i, int N, int Dim>
+  Tensor1_Expr<const Tensor2_number_0<const Tensor2_symmetric<T*,Tensor_Dim>,
+    T,N>,T,Dim,i>
+  operator()(const Number<N> &n1, const Index<i,Dim> index1) const
+  {
+    typedef const Tensor2_number_0<const Tensor2_symmetric<T*,Tensor_Dim>,T,N>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+  /* Specializations for using actual numbers instead of Number<> */
+
+  template<char i, int Dim>
+  Tensor1_Expr<const Tensor2_numeral_1<const Tensor2_symmetric<T*,Tensor_Dim>,
+    T>,T,Dim,i>
+  operator()(const Index<i,Dim> index1, const int N) const
+  {
+    typedef const Tensor2_numeral_1<const Tensor2_symmetric<T*,Tensor_Dim>,T>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N));
+  }
+
+  template<char i, int Dim>
+  Tensor1_Expr<const Tensor2_numeral_0<const Tensor2_symmetric<T*,Tensor_Dim>,
+    T>,T,Dim,i>
+  operator()(const int N, const Index<i,Dim> index1) const
+  {
+    typedef const Tensor2_numeral_0<const Tensor2_symmetric<T*,Tensor_Dim>,T>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N));
+  }
+  
+  /* The ++ operator increments the pointer, not the number that the
+     pointer points to.  This allows iterating over a grid. */
+
+  const Tensor2_symmetric<T*,Tensor_Dim> & operator++() const
+  {
+    for(int i=0;i<(Tensor_Dim*(Tensor_Dim+1))/2;++i)
+      ++data[i];
+    return *this;
+  }
+
+  /* These two operator()'s return the Tensor2 with internal
+     contractions, yielding a T.  I have to specify one for both
+     const and non-const because otherwise the compiler will use the
+     operator() which gives a Tensor2_Expr<>. */
+  
+  template<char i, int Dim>
+  T operator()(const Index<i,Dim> index1, const Index<i,Dim> index2)
+  {
+    return internal_contract(Number<Dim>());
+  }
+
+  template<char i, int Dim>
+  T operator()(const Index<i,Dim> index1, const Index<i,Dim> index2) const
+  {
+    return internal_contract(Number<Dim>());
+  }
+private:
+  template<int N>
+  T internal_contract(Number<N>)
+  {
+    return *data[N-1+((N-1)*(2*Tensor_Dim-N))/2]
+      + internal_contract(Number<N-1>());
+  }
+
+  T internal_contract(Number<1>)
+  {
+    return *data[0];
+  }
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_times_Tensor1.h
--- a/Tensor2_symmetric/Tensor2_symmetric_times_Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,151 +0,0 @@
-/* This file has all of the declarations for expressions like
-   Tensor2_symmetric*Tensor1 and Tensor1*Tensor2_symmetric, yielding a
-   Tensor1 or Tensor3_dg. */
-
-/* A(i,j)*B(j) -> Tensor1 */
-
-template<class A, class B, class T, class U, int Dim, char i,char j>
-class Tensor2_symmetric_times_Tensor1_1
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor1_Expr<B,U,Dim,j> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const Number<Current_Dim> &N) const
-  {
-    return iterA(N1,Current_Dim-1)*iterB(Current_Dim-1)
-      + eval(N1,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const Number<1> &N) const
-  {
-    return iterA(N1,0)*iterB(0);
-  }
-public:
-  Tensor2_symmetric_times_Tensor1_1
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor1_Expr<B,U,Dim,j> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim, char i,char j>
-inline const Tensor1_Expr<const Tensor2_symmetric_times_Tensor1_1<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,i>
-operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor1_Expr<B,U,Dim,j> &b)
-{
-  typedef const Tensor2_symmetric_times_Tensor1_1<A,B,T,U,Dim,i,j> TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
-}
-
-/* A(j,i)*B(j) -> Tensor1 */
-
-template<class A, class B, class T, class U, int Dim, char i,char j>
-class Tensor2_symmetric_times_Tensor1_0
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,j,i> iterA;
-  const Tensor1_Expr<B,U,Dim,j> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const Number<Current_Dim> &N) const
-  {
-    return iterA(Current_Dim-1,N1)*iterB(Current_Dim-1)
-      + eval(N1,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const Number<1> &N) const
-  {
-    return iterA(0,N1)*iterB(0);
-  }
-public:
-  Tensor2_symmetric_times_Tensor1_0
-  (const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
-   const Tensor1_Expr<B,U,Dim,j> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim, char i,char j>
-inline const Tensor1_Expr<const Tensor2_symmetric_times_Tensor1_0<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,i>
-operator*(const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
-	  const Tensor1_Expr<B,U,Dim,j> &b)
-{
-  typedef const Tensor2_symmetric_times_Tensor1_0<A,B,T,U,Dim,i,j> TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
-}
-
-/* B(j)*A(i,j) -> Tensor1 */
-
-template<class A, class B, class T, class U, int Dim, char i,char j>
-inline const Tensor1_Expr<const Tensor2_symmetric_times_Tensor1_1<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,i>
-operator*(const Tensor1_Expr<B,U,Dim,j> &b,
-	  const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
-{
-  typedef const Tensor2_symmetric_times_Tensor1_1<A,B,T,U,Dim,i,j> TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
-}
-
-/* B(j)*A(j,i) -> Tensor1 */
-
-template<class A, class B, class T, class U, int Dim, char i,char j>
-inline const Tensor1_Expr<const Tensor2_symmetric_times_Tensor1_0<A,B,T,U,Dim,i,j>,
-  typename promote<T,U>::V,Dim,i>
-operator*(const Tensor1_Expr<B,U,Dim,j> &b,
-	  const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a)
-{
-  typedef const Tensor2_symmetric_times_Tensor1_0<A,B,T,U,Dim,i,j> TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
-}
-
-/* A(i,j)*B(k) -> Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim, int Dim2,
-  char i, char j, char k>
-class Tensor2_symmetric_times_Tensor1
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor1_Expr<B,U,Dim2,k> iterB;
-public:
-  Tensor2_symmetric_times_Tensor1(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-			const Tensor1_Expr<B,U,Dim2,k> &b):
-    iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2)*iterB(N3);
-  }
-};
-
-template<class A, class B, class T, class U, int Dim, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_dg_Expr
-<const Tensor2_symmetric_times_Tensor1<A,B,T,U,Dim,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim,Dim2,i,j,k>
-operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor1_Expr<B,U,Dim2,k> &b)
-{
-  typedef const Tensor2_symmetric_times_Tensor1<A,B,T,U,Dim,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim2,i,j,k>
-    (TensorExpr(a,b));
-}
-
-/* B(k)*A(i,j) -> Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_dg_Expr
-<const Tensor2_symmetric_times_Tensor1<A,B,T,U,Dim,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim,Dim2,i,j,k>
-operator*(const Tensor1_Expr<B,U,Dim2,k> &b,
-	  const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
-{
-  typedef const Tensor2_symmetric_times_Tensor1<A,B,T,U,Dim,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim2,i,j,k>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_times_Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/Tensor2_symmetric_times_Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,151 @@
+/* This file has all of the declarations for expressions like
+   Tensor2_symmetric*Tensor1 and Tensor1*Tensor2_symmetric, yielding a
+   Tensor1 or Tensor3_dg. */
+
+/* A(i,j)*B(j) -> Tensor1 */
+
+template<class A, class B, class T, class U, int Dim, char i,char j>
+class Tensor2_symmetric_times_Tensor1_1
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor1_Expr<B,U,Dim,j> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const Number<Current_Dim> &N) const
+  {
+    return iterA(N1,Current_Dim-1)*iterB(Current_Dim-1)
+      + eval(N1,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const Number<1> &N) const
+  {
+    return iterA(N1,0)*iterB(0);
+  }
+public:
+  Tensor2_symmetric_times_Tensor1_1
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor1_Expr<B,U,Dim,j> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim, char i,char j>
+inline const Tensor1_Expr<const Tensor2_symmetric_times_Tensor1_1<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,i>
+operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor1_Expr<B,U,Dim,j> &b)
+{
+  typedef const Tensor2_symmetric_times_Tensor1_1<A,B,T,U,Dim,i,j> TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
+}
+
+/* A(j,i)*B(j) -> Tensor1 */
+
+template<class A, class B, class T, class U, int Dim, char i,char j>
+class Tensor2_symmetric_times_Tensor1_0
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,j,i> iterA;
+  const Tensor1_Expr<B,U,Dim,j> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const Number<Current_Dim> &N) const
+  {
+    return iterA(Current_Dim-1,N1)*iterB(Current_Dim-1)
+      + eval(N1,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const Number<1> &N) const
+  {
+    return iterA(0,N1)*iterB(0);
+  }
+public:
+  Tensor2_symmetric_times_Tensor1_0
+  (const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
+   const Tensor1_Expr<B,U,Dim,j> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim, char i,char j>
+inline const Tensor1_Expr<const Tensor2_symmetric_times_Tensor1_0<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,i>
+operator*(const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
+	  const Tensor1_Expr<B,U,Dim,j> &b)
+{
+  typedef const Tensor2_symmetric_times_Tensor1_0<A,B,T,U,Dim,i,j> TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
+}
+
+/* B(j)*A(i,j) -> Tensor1 */
+
+template<class A, class B, class T, class U, int Dim, char i,char j>
+inline const Tensor1_Expr<const Tensor2_symmetric_times_Tensor1_1<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,i>
+operator*(const Tensor1_Expr<B,U,Dim,j> &b,
+	  const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
+{
+  typedef const Tensor2_symmetric_times_Tensor1_1<A,B,T,U,Dim,i,j> TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
+}
+
+/* B(j)*A(j,i) -> Tensor1 */
+
+template<class A, class B, class T, class U, int Dim, char i,char j>
+inline const Tensor1_Expr<const Tensor2_symmetric_times_Tensor1_0<A,B,T,U,Dim,i,j>,
+  typename promote<T,U>::V,Dim,i>
+operator*(const Tensor1_Expr<B,U,Dim,j> &b,
+	  const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a)
+{
+  typedef const Tensor2_symmetric_times_Tensor1_0<A,B,T,U,Dim,i,j> TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
+}
+
+/* A(i,j)*B(k) -> Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim, int Dim2,
+  char i, char j, char k>
+class Tensor2_symmetric_times_Tensor1
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor1_Expr<B,U,Dim2,k> iterB;
+public:
+  Tensor2_symmetric_times_Tensor1(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+			const Tensor1_Expr<B,U,Dim2,k> &b):
+    iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2)*iterB(N3);
+  }
+};
+
+template<class A, class B, class T, class U, int Dim, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_dg_Expr
+<const Tensor2_symmetric_times_Tensor1<A,B,T,U,Dim,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim,Dim2,i,j,k>
+operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor1_Expr<B,U,Dim2,k> &b)
+{
+  typedef const Tensor2_symmetric_times_Tensor1<A,B,T,U,Dim,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim2,i,j,k>
+    (TensorExpr(a,b));
+}
+
+/* B(k)*A(i,j) -> Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_dg_Expr
+<const Tensor2_symmetric_times_Tensor1<A,B,T,U,Dim,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim,Dim2,i,j,k>
+operator*(const Tensor1_Expr<B,U,Dim2,k> &b,
+	  const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
+{
+  typedef const Tensor2_symmetric_times_Tensor1<A,B,T,U,Dim,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim2,i,j,k>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_times_Tensor2.h
--- a/Tensor2_symmetric/Tensor2_symmetric_times_Tensor2.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,380 +0,0 @@
-/* This file has all of the declarations for
-   Tensor2_symmetric*Tensor2.  This includes the double
-   contraction A(i,j)*B(i,j) (yielding a double) as well as the more
-   complicated single contraction A(i,j)*B(j,k) (yielding a Tensor2
-   expression). */
-
-/* Double contraction. */
-
-/* A(i,j)*B(i,j) */
-
-template<class A, class B, class T, class U, int Dim, char i, char j,
-  int Current_Dim0, int Current_Dim1>
-inline const typename promote<T,U>::V
-T2s_times_T2_01(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-		const Tensor2_Expr<B,U,Dim,Dim,i,j> &b,
-		const Number<Current_Dim0> &N0,
-		const Number<Current_Dim1> &N1)
-{
-  return a(Current_Dim0-1,Current_Dim1-1)*b(Current_Dim0-1,Current_Dim1-1)
-    + T2s_times_T2_01(a,b,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-}
-
-template<class A, class B, class T, class U, int Dim, char i, char j,
-  int Current_Dim1>
-inline const typename promote<T,U>::V
-T2s_times_T2_01(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-		const Tensor2_Expr<B,U,Dim,Dim,i,j> &b,
-		const Number<1> &N0,
-		const Number<Current_Dim1> &N1)
-{
-  return a(0,Current_Dim1-1)*b(0,Current_Dim1-1)
-    + T2s_times_T2_01(a,b,Number<Dim>(),Number<Current_Dim1-1>());
-}
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const typename promote<T,U>::V
-T2s_times_T2_01(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-		const Tensor2_Expr<B,U,Dim,Dim,i,j> &b,
-		const Number<1> &N0,
-		const Number<1> &N1)
-{
-  return a(0,0)*b(0,0);
-}
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const typename promote<T,U>::V operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-				 const Tensor2_Expr<B,U,Dim,Dim,i,j> &b)
-{
-  return T2s_times_T2_01(a,b,Number<Dim>(),Number<Dim>());
-}
-
-/* B(i,j)*A(i,j) */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const typename promote<T,U>::V operator*(const Tensor2_Expr<B,U,Dim,Dim,i,j> &b,
-				 const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
-				 
-{
-  return T2s_times_T2_01(a,b,Number<Dim>(),Number<Dim>());
-}
-
-/* Double contraction with switched indices.  The perspicacious reader
-   will note that it just replicated code for the aligned indices case
-   above, but with B(i,j) -> B(j,i).  This is ok, since A is
-   symmetric. */
-
-/* A(i,j)*B(j,i) */
-
-template<class A, class B, class T, class U, int Dim, char i, char j,
-  int Current_Dim0, int Current_Dim1>
-inline const typename promote<T,U>::V
-T2s_times_T2_01(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-		const Tensor2_Expr<B,U,Dim,Dim,j,i> &b,
-		const Number<Current_Dim0> &N0,
-		const Number<Current_Dim1> &N1)
-{
-  return a(Current_Dim0-1,Current_Dim1-1)*b(Current_Dim0-1,Current_Dim1-1)
-    + T2s_times_T2_01(a,b,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-}
-
-template<class A, class B, class T, class U, int Dim, char i, char j,
-  int Current_Dim1>
-inline const typename promote<T,U>::V
-T2s_times_T2_01(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-		const Tensor2_Expr<B,U,Dim,Dim,j,i> &b,
-		const Number<1> &N0,
-		const Number<Current_Dim1> &N1)
-{
-  return a(0,Current_Dim1-1)*b(0,Current_Dim1-1)
-    + T2s_times_T2_01(a,b,Number<Dim>(),Number<Current_Dim1-1>());
-}
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const typename promote<T,U>::V
-T2s_times_T2_01(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-		const Tensor2_Expr<B,U,Dim,Dim,j,i> &b,
-		const Number<1> &N0,
-		const Number<1> &N1)
-{
-  return a(0,0)*b(0,0);
-}
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const typename promote<T,U>::V operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-				 const Tensor2_Expr<B,U,Dim,Dim,j,i> &b)
-{
-  return T2s_times_T2_01(a,b,Number<Dim>(),Number<Dim>());
-}
-
-/* B(j,i)*A(i,j) */
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const typename promote<T,U>::V operator*(const Tensor2_Expr<B,U,Dim,Dim,j,i> &b,
-				 const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
-				 
-{
-  return T2s_times_T2_01(a,b,Number<Dim>(),Number<Dim>());
-}
-
-/* Single contraction.  The wrapper class has a different name for
-   each possible placing of the indices (e.g. A(i,j)*B(j,k) has the
-   number 10 because the contraction indices are on the second and
-   first slots (counting from 0). */
-
-/* A(i,j)*B(j,k) */
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-class Tensor2_symmetric_times_Tensor2_10
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim,Dim1,j,k> iterB;
-  
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(N1,Current_Dim-1)*iterB(Current_Dim-1,N2)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
-  {
-    return iterA(N1,0)*iterB(0,N2);
-  }
-public:
-  Tensor2_symmetric_times_Tensor2_10
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor2_Expr<B,U,Dim,Dim1,j,k> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-inline const Tensor2_Expr
-<const Tensor2_symmetric_times_Tensor2_10<A,B,T,U,Dim,Dim1,i,j,k>,
-  typename promote<T,U>::V,Dim,Dim1,i,k>
-operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor2_Expr<B,U,Dim,Dim1,j,k> &b)
-{
-  typedef const Tensor2_symmetric_times_Tensor2_10<A,B,T,U,Dim,Dim1,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim1,i,k>
-    (TensorExpr(a,b));
-}
-
-/* B(j,k)*A(i,j) */
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-inline const Tensor2_Expr
-<const Tensor2_symmetric_times_Tensor2_10<A,B,T,U,Dim,Dim1,i,j,k>,
-  typename promote<T,U>::V,Dim,Dim1,i,k>
-operator*(const Tensor2_Expr<B,U,Dim,Dim1,j,k> &b,
-	  const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
-{
-  typedef const Tensor2_symmetric_times_Tensor2_10<A,B,T,U,Dim,Dim1,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim1,i,k>
-    (TensorExpr(a,b));
-}
-
-
-
-
-
-
-
-/* A(i,j)*B(k,j) */
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-class Tensor2_symmetric_times_Tensor2_11
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim1,Dim,k,j> iterB;
-  
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(N1,Current_Dim-1)*iterB(N2,Current_Dim-1)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
-  {
-    return iterA(N1,0)*iterB(N2,0);
-  }
-public:
-  Tensor2_symmetric_times_Tensor2_11
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor2_Expr<B,U,Dim1,Dim,k,j> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-inline const Tensor2_Expr
-<const Tensor2_symmetric_times_Tensor2_11<A,B,T,U,Dim,Dim1,i,j,k>,
-  typename promote<T,U>::V,Dim,Dim1,i,k>
-operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor2_Expr<B,U,Dim1,Dim,k,j> &b)
-{
-  typedef const Tensor2_symmetric_times_Tensor2_11<A,B,T,U,Dim,Dim1,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim1,i,k>
-    (TensorExpr(a,b));
-}
-
-/* B(k,j)*A(i,j) */
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-inline const Tensor2_Expr
-<const Tensor2_symmetric_times_Tensor2_11<A,B,T,U,Dim,Dim1,i,j,k>,
-  typename promote<T,U>::V,Dim,Dim1,i,k>
-operator*(const Tensor2_Expr<B,U,Dim1,Dim,k,j> &b,
-	  const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
-{
-  typedef const Tensor2_symmetric_times_Tensor2_11<A,B,T,U,Dim,Dim1,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim1,i,k>
-    (TensorExpr(a,b));
-}
-
-
-
-
-
-
-
-/* A(j,i)*B(j,k) */
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-class Tensor2_symmetric_times_Tensor2_00
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,j,i> iterA;
-  const Tensor2_Expr<B,U,Dim,Dim1,j,k> iterB;
-  
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(Current_Dim-1,N1)*iterB(Current_Dim-1,N2)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
-  {
-    return iterA(0,N1)*iterB(0,N2);
-  }
-public:
-  Tensor2_symmetric_times_Tensor2_00
-  (const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
-   const Tensor2_Expr<B,U,Dim,Dim1,j,k> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-inline const Tensor2_Expr
-<const Tensor2_symmetric_times_Tensor2_00<A,B,T,U,Dim,Dim1,i,j,k>,
-  typename promote<T,U>::V,Dim,Dim1,i,k>
-operator*(const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
-	  const Tensor2_Expr<B,U,Dim,Dim1,j,k> &b)
-{
-  typedef const Tensor2_symmetric_times_Tensor2_00<A,B,T,U,Dim,Dim1,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim1,i,k>
-    (TensorExpr(a,b));
-}
-
-/* B(j,k)*A(j,i) */
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-inline const Tensor2_Expr
-<const Tensor2_symmetric_times_Tensor2_00<A,B,T,U,Dim,Dim1,i,j,k>,
-  typename promote<T,U>::V,Dim,Dim1,i,k>
-operator*(const Tensor2_Expr<B,U,Dim,Dim1,j,k> &b,
-	  const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a)
-{
-  typedef const Tensor2_symmetric_times_Tensor2_00<A,B,T,U,Dim,Dim1,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim1,i,k>
-    (TensorExpr(a,b));
-}
-
-
-
-
-
-
-/* A(j,i)*B(k,j) */
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-class Tensor2_symmetric_times_Tensor2_01
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,j,i> iterA;
-  const Tensor2_Expr<B,U,Dim1,Dim,k,j> iterB;
-  
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(Current_Dim-1,N1)*iterB(N2,Current_Dim-1)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
-  {
-    return iterA(0,N1)*iterB(N2,0);
-  }
-public:
-  Tensor2_symmetric_times_Tensor2_01
-  (const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
-   const Tensor2_Expr<B,U,Dim1,Dim,k,j> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-inline const Tensor2_Expr
-<const Tensor2_symmetric_times_Tensor2_01<A,B,T,U,Dim,Dim1,i,j,k>,
-  typename promote<T,U>::V,Dim,Dim1,i,k>
-operator*(const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
-	  const Tensor2_Expr<B,U,Dim1,Dim,k,j> &b)
-{
-  typedef const Tensor2_symmetric_times_Tensor2_01<A,B,T,U,Dim,Dim1,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim1,i,k>
-    (TensorExpr(a,b));
-}
-
-/* B(k,j)*A(j,i) */
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-inline const Tensor2_Expr
-<const Tensor2_symmetric_times_Tensor2_01<A,B,T,U,Dim,Dim1,i,j,k>,
-  typename promote<T,U>::V,Dim,Dim1,i,k>
-operator*(const Tensor2_Expr<B,U,Dim1,Dim,k,j> &b,
-	  const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a)
-{
-  typedef const Tensor2_symmetric_times_Tensor2_01<A,B,T,U,Dim,Dim1,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim1,i,k>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_times_Tensor2.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/Tensor2_symmetric_times_Tensor2.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,380 @@
+/* This file has all of the declarations for
+   Tensor2_symmetric*Tensor2.  This includes the double
+   contraction A(i,j)*B(i,j) (yielding a double) as well as the more
+   complicated single contraction A(i,j)*B(j,k) (yielding a Tensor2
+   expression). */
+
+/* Double contraction. */
+
+/* A(i,j)*B(i,j) */
+
+template<class A, class B, class T, class U, int Dim, char i, char j,
+  int Current_Dim0, int Current_Dim1>
+inline const typename promote<T,U>::V
+T2s_times_T2_01(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+		const Tensor2_Expr<B,U,Dim,Dim,i,j> &b,
+		const Number<Current_Dim0> &N0,
+		const Number<Current_Dim1> &N1)
+{
+  return a(Current_Dim0-1,Current_Dim1-1)*b(Current_Dim0-1,Current_Dim1-1)
+    + T2s_times_T2_01(a,b,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+}
+
+template<class A, class B, class T, class U, int Dim, char i, char j,
+  int Current_Dim1>
+inline const typename promote<T,U>::V
+T2s_times_T2_01(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+		const Tensor2_Expr<B,U,Dim,Dim,i,j> &b,
+		const Number<1> &N0,
+		const Number<Current_Dim1> &N1)
+{
+  return a(0,Current_Dim1-1)*b(0,Current_Dim1-1)
+    + T2s_times_T2_01(a,b,Number<Dim>(),Number<Current_Dim1-1>());
+}
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const typename promote<T,U>::V
+T2s_times_T2_01(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+		const Tensor2_Expr<B,U,Dim,Dim,i,j> &b,
+		const Number<1> &N0,
+		const Number<1> &N1)
+{
+  return a(0,0)*b(0,0);
+}
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const typename promote<T,U>::V operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+				 const Tensor2_Expr<B,U,Dim,Dim,i,j> &b)
+{
+  return T2s_times_T2_01(a,b,Number<Dim>(),Number<Dim>());
+}
+
+/* B(i,j)*A(i,j) */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const typename promote<T,U>::V operator*(const Tensor2_Expr<B,U,Dim,Dim,i,j> &b,
+				 const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
+				 
+{
+  return T2s_times_T2_01(a,b,Number<Dim>(),Number<Dim>());
+}
+
+/* Double contraction with switched indices.  The perspicacious reader
+   will note that it just replicated code for the aligned indices case
+   above, but with B(i,j) -> B(j,i).  This is ok, since A is
+   symmetric. */
+
+/* A(i,j)*B(j,i) */
+
+template<class A, class B, class T, class U, int Dim, char i, char j,
+  int Current_Dim0, int Current_Dim1>
+inline const typename promote<T,U>::V
+T2s_times_T2_01(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+		const Tensor2_Expr<B,U,Dim,Dim,j,i> &b,
+		const Number<Current_Dim0> &N0,
+		const Number<Current_Dim1> &N1)
+{
+  return a(Current_Dim0-1,Current_Dim1-1)*b(Current_Dim0-1,Current_Dim1-1)
+    + T2s_times_T2_01(a,b,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+}
+
+template<class A, class B, class T, class U, int Dim, char i, char j,
+  int Current_Dim1>
+inline const typename promote<T,U>::V
+T2s_times_T2_01(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+		const Tensor2_Expr<B,U,Dim,Dim,j,i> &b,
+		const Number<1> &N0,
+		const Number<Current_Dim1> &N1)
+{
+  return a(0,Current_Dim1-1)*b(0,Current_Dim1-1)
+    + T2s_times_T2_01(a,b,Number<Dim>(),Number<Current_Dim1-1>());
+}
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const typename promote<T,U>::V
+T2s_times_T2_01(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+		const Tensor2_Expr<B,U,Dim,Dim,j,i> &b,
+		const Number<1> &N0,
+		const Number<1> &N1)
+{
+  return a(0,0)*b(0,0);
+}
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const typename promote<T,U>::V operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+				 const Tensor2_Expr<B,U,Dim,Dim,j,i> &b)
+{
+  return T2s_times_T2_01(a,b,Number<Dim>(),Number<Dim>());
+}
+
+/* B(j,i)*A(i,j) */
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const typename promote<T,U>::V operator*(const Tensor2_Expr<B,U,Dim,Dim,j,i> &b,
+				 const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
+				 
+{
+  return T2s_times_T2_01(a,b,Number<Dim>(),Number<Dim>());
+}
+
+/* Single contraction.  The wrapper class has a different name for
+   each possible placing of the indices (e.g. A(i,j)*B(j,k) has the
+   number 10 because the contraction indices are on the second and
+   first slots (counting from 0). */
+
+/* A(i,j)*B(j,k) */
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+class Tensor2_symmetric_times_Tensor2_10
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim,Dim1,j,k> iterB;
+  
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(N1,Current_Dim-1)*iterB(Current_Dim-1,N2)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
+  {
+    return iterA(N1,0)*iterB(0,N2);
+  }
+public:
+  Tensor2_symmetric_times_Tensor2_10
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor2_Expr<B,U,Dim,Dim1,j,k> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+inline const Tensor2_Expr
+<const Tensor2_symmetric_times_Tensor2_10<A,B,T,U,Dim,Dim1,i,j,k>,
+  typename promote<T,U>::V,Dim,Dim1,i,k>
+operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor2_Expr<B,U,Dim,Dim1,j,k> &b)
+{
+  typedef const Tensor2_symmetric_times_Tensor2_10<A,B,T,U,Dim,Dim1,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim1,i,k>
+    (TensorExpr(a,b));
+}
+
+/* B(j,k)*A(i,j) */
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+inline const Tensor2_Expr
+<const Tensor2_symmetric_times_Tensor2_10<A,B,T,U,Dim,Dim1,i,j,k>,
+  typename promote<T,U>::V,Dim,Dim1,i,k>
+operator*(const Tensor2_Expr<B,U,Dim,Dim1,j,k> &b,
+	  const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
+{
+  typedef const Tensor2_symmetric_times_Tensor2_10<A,B,T,U,Dim,Dim1,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim1,i,k>
+    (TensorExpr(a,b));
+}
+
+
+
+
+
+
+
+/* A(i,j)*B(k,j) */
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+class Tensor2_symmetric_times_Tensor2_11
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim1,Dim,k,j> iterB;
+  
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(N1,Current_Dim-1)*iterB(N2,Current_Dim-1)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
+  {
+    return iterA(N1,0)*iterB(N2,0);
+  }
+public:
+  Tensor2_symmetric_times_Tensor2_11
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor2_Expr<B,U,Dim1,Dim,k,j> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+inline const Tensor2_Expr
+<const Tensor2_symmetric_times_Tensor2_11<A,B,T,U,Dim,Dim1,i,j,k>,
+  typename promote<T,U>::V,Dim,Dim1,i,k>
+operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor2_Expr<B,U,Dim1,Dim,k,j> &b)
+{
+  typedef const Tensor2_symmetric_times_Tensor2_11<A,B,T,U,Dim,Dim1,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim1,i,k>
+    (TensorExpr(a,b));
+}
+
+/* B(k,j)*A(i,j) */
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+inline const Tensor2_Expr
+<const Tensor2_symmetric_times_Tensor2_11<A,B,T,U,Dim,Dim1,i,j,k>,
+  typename promote<T,U>::V,Dim,Dim1,i,k>
+operator*(const Tensor2_Expr<B,U,Dim1,Dim,k,j> &b,
+	  const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
+{
+  typedef const Tensor2_symmetric_times_Tensor2_11<A,B,T,U,Dim,Dim1,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim1,i,k>
+    (TensorExpr(a,b));
+}
+
+
+
+
+
+
+
+/* A(j,i)*B(j,k) */
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+class Tensor2_symmetric_times_Tensor2_00
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,j,i> iterA;
+  const Tensor2_Expr<B,U,Dim,Dim1,j,k> iterB;
+  
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(Current_Dim-1,N1)*iterB(Current_Dim-1,N2)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
+  {
+    return iterA(0,N1)*iterB(0,N2);
+  }
+public:
+  Tensor2_symmetric_times_Tensor2_00
+  (const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
+   const Tensor2_Expr<B,U,Dim,Dim1,j,k> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+inline const Tensor2_Expr
+<const Tensor2_symmetric_times_Tensor2_00<A,B,T,U,Dim,Dim1,i,j,k>,
+  typename promote<T,U>::V,Dim,Dim1,i,k>
+operator*(const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
+	  const Tensor2_Expr<B,U,Dim,Dim1,j,k> &b)
+{
+  typedef const Tensor2_symmetric_times_Tensor2_00<A,B,T,U,Dim,Dim1,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim1,i,k>
+    (TensorExpr(a,b));
+}
+
+/* B(j,k)*A(j,i) */
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+inline const Tensor2_Expr
+<const Tensor2_symmetric_times_Tensor2_00<A,B,T,U,Dim,Dim1,i,j,k>,
+  typename promote<T,U>::V,Dim,Dim1,i,k>
+operator*(const Tensor2_Expr<B,U,Dim,Dim1,j,k> &b,
+	  const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a)
+{
+  typedef const Tensor2_symmetric_times_Tensor2_00<A,B,T,U,Dim,Dim1,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim1,i,k>
+    (TensorExpr(a,b));
+}
+
+
+
+
+
+
+/* A(j,i)*B(k,j) */
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+class Tensor2_symmetric_times_Tensor2_01
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,j,i> iterA;
+  const Tensor2_Expr<B,U,Dim1,Dim,k,j> iterB;
+  
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(Current_Dim-1,N1)*iterB(N2,Current_Dim-1)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
+  {
+    return iterA(0,N1)*iterB(N2,0);
+  }
+public:
+  Tensor2_symmetric_times_Tensor2_01
+  (const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
+   const Tensor2_Expr<B,U,Dim1,Dim,k,j> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+inline const Tensor2_Expr
+<const Tensor2_symmetric_times_Tensor2_01<A,B,T,U,Dim,Dim1,i,j,k>,
+  typename promote<T,U>::V,Dim,Dim1,i,k>
+operator*(const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
+	  const Tensor2_Expr<B,U,Dim1,Dim,k,j> &b)
+{
+  typedef const Tensor2_symmetric_times_Tensor2_01<A,B,T,U,Dim,Dim1,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim1,i,k>
+    (TensorExpr(a,b));
+}
+
+/* B(k,j)*A(j,i) */
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+inline const Tensor2_Expr
+<const Tensor2_symmetric_times_Tensor2_01<A,B,T,U,Dim,Dim1,i,j,k>,
+  typename promote<T,U>::V,Dim,Dim1,i,k>
+operator*(const Tensor2_Expr<B,U,Dim1,Dim,k,j> &b,
+	  const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a)
+{
+  typedef const Tensor2_symmetric_times_Tensor2_01<A,B,T,U,Dim,Dim1,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim1,i,k>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_times_Tensor2_symmetric.h
--- a/Tensor2_symmetric/Tensor2_symmetric_times_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,296 +0,0 @@
-/* This file has all of the declarations for
-   Tensor2_symmetric*Tensor2_symmetric.  This includes the double
-   contraction A(i,j)*B(i,j) (yielding a typename promote<T,U>::V) as well as the more
-   complicated single contraction A(i,j)*B(j,k) (yielding a Tensor2
-   expression), and no contractions A(i,j)*B(k,l) -> Tensor4_ddg */
-
-/* Double contraction. */
-
-/* A(i,j)*B(i,j) */
-
-
-template<class A, class B, class T, class U, int Dim, char i,
-  char j, int Current_Dim0, int Current_Dim1>
-inline const typename promote<T,U>::V
-T2s_times_T2s(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	      const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b,
-	      const Number<Current_Dim0> &N0,
-	      const Number<Current_Dim1> &N1)
-{
-  return a(Current_Dim0-1,Current_Dim1-1)*b(Current_Dim0-1,Current_Dim1-1)
-    + T2s_times_T2s(a,b,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-}
-
-template<class A, class B, class T, class U, int Dim, char i,
-  char j, int Current_Dim1>
-inline const typename promote<T,U>::V
-T2s_times_T2s(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	      const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b,
-	      const Number<1> &N0,
-	      const Number<Current_Dim1> &N1)
-{
-  return a(0,Current_Dim1-1)*b(0,Current_Dim1-1)
-    + T2s_times_T2s(a,b,Number<Dim>(),Number<Current_Dim1-1>());
-}
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const typename promote<T,U>::V 
-T2s_times_T2s(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	      const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b,
-	      const Number<1> &N0, const Number<1> &N1)
-{
-  return a(0,0)*b(0,0);
-}
-
-template<class A, class B, class T, class U, int Dim, char i,char j>
-inline const typename promote<T,U>::V operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-				 const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b)
-{
-  return T2s_times_T2s(a,b,Number<Dim>(),Number<Dim>());
-}
-
-/* A(i,j)*B(j,i) */
-
-template<class A, class B, class T, class U, int Dim, char i,
-  char j, int Current_Dim0, int Current_Dim1>
-inline const typename promote<T,U>::V
-T2s_times_switched_T2s(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	      const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b,
-	      const Number<Current_Dim0> &N0,
-	      const Number<Current_Dim1> &N1)
-{
-  return a(Current_Dim0-1,Current_Dim1-1)*b(Current_Dim1-1,Current_Dim0-1)
-    + T2s_times_switched_T2s(a,b,Number<Current_Dim0-1>(),
-			     Number<Current_Dim1>());
-}
-
-template<class A, class B, class T, class U, int Dim, char i,
-  char j, int Current_Dim1>
-inline const typename promote<T,U>::V
-T2s_times_switched_T2s(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	      const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b,
-	      const Number<1> &N0,
-	      const Number<Current_Dim1> &N1)
-{
-  return a(0,Current_Dim1-1)*b(Current_Dim1-1,0)
-    + T2s_times_switched_T2s(a,b,Number<Dim>(),Number<Current_Dim1-1>());
-}
-
-template<class A, class B, class T, class U, int Dim, char i, char j>
-inline const typename promote<T,U>::V 
-T2s_times_switched_T2s(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	      const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b,
-	      const Number<1> &N0, const Number<1> &N1)
-{
-  return a(0,0)*b(0,0);
-}
-
-template<class A, class B, class T, class U, int Dim, char i,char j>
-inline const typename promote<T,U>::V
-operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b)
-{
-  return T2s_times_switched_T2s(a,b,Number<Dim>(),Number<Dim>());
-}
-
-/* Single contraction.  The wrapper class has a different name for
-   each possible placing of the indices (e.g. A(i,j)*B(j,k) has the
-   number 10 because the contraction indices are on the second and
-   first slots (counting from 0). */
-
-/* A(i,j)*B(j,k) */
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-class Tensor2_symmetric_times_Tensor2_symmetric_10
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,j,k> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(N1,Current_Dim-1)*iterB(Current_Dim-1,N2)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
-  {
-    return iterA(N1,0)*iterB(0,N2);
-  }
-public:
-  Tensor2_symmetric_times_Tensor2_symmetric_10
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-inline const Tensor2_Expr<const Tensor2_symmetric_times_Tensor2_symmetric_10
-<A,B,T,U,Dim,i,j,k>,typename promote<T,U>::V,Dim,Dim,i,k>
-operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
-{
-  typedef const Tensor2_symmetric_times_Tensor2_symmetric_10<A,B,T,U,Dim,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,k>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j)*B(k,j) */
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-class Tensor2_symmetric_times_Tensor2_symmetric_11
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,k,j> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(N1,Current_Dim-1)*iterB(N2,Current_Dim-1)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
-  {
-    return iterA(N1,0)*iterB(N2,0);
-  }
-public:
-  Tensor2_symmetric_times_Tensor2_symmetric_11
-  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,k,j> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-inline const Tensor2_Expr<const Tensor2_symmetric_times_Tensor2_symmetric_11
-<A,B,T,U,Dim,i,j,k>,typename promote<T,U>::V,Dim,Dim,i,k>
-operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,k,j> &b)
-{
-  typedef const Tensor2_symmetric_times_Tensor2_symmetric_11<A,B,T,U,Dim,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,k>
-    (TensorExpr(a,b));
-}
-
-/* A(j,i)*B(j,k) */
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-class Tensor2_symmetric_times_Tensor2_symmetric_00
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,j,i> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,j,k> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(Current_Dim-1,N1)*iterB(Current_Dim-1,N2)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
-  {
-    return iterA(0,N1)*iterB(0,N2);
-  }
-public:
-  Tensor2_symmetric_times_Tensor2_symmetric_00
-  (const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-inline const Tensor2_Expr<const Tensor2_symmetric_times_Tensor2_symmetric_00
-<A,B,T,U,Dim,i,j,k>,typename promote<T,U>::V,Dim,Dim,i,k>
-operator*(const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
-{
-  typedef const Tensor2_symmetric_times_Tensor2_symmetric_00<A,B,T,U,Dim,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,k>
-    (TensorExpr(a,b));
-}
-
-/* A(j,i)*B(k,j) */
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-class Tensor2_symmetric_times_Tensor2_symmetric_01
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,j,i> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,k,j> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(Current_Dim-1,N1)*iterB(N2,Current_Dim-1)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
-  {
-    return iterA(0,N1)*iterB(N2,0);
-  }
-public:
-  Tensor2_symmetric_times_Tensor2_symmetric_01
-  (const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,k,j> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-inline const Tensor2_Expr<const Tensor2_symmetric_times_Tensor2_symmetric_01
-<A,B,T,U,Dim,i,j,k>,typename promote<T,U>::V,Dim,Dim,i,k>
-operator*(const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,k,j> &b)
-{
-  typedef const Tensor2_symmetric_times_Tensor2_symmetric_01<A,B,T,U,Dim,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,k>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j)*B(k,l) -> Tensor4_ddg */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, 
-  char i, char j, char k, char l>
-class Tensor2_symmetric_times_Tensor2_symmetric
-{
-  const Tensor2_symmetric_Expr<A,T,Dim0,i,j> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim1,k,l> iterB;
-public:
-  Tensor2_symmetric_times_Tensor2_symmetric
-  (const Tensor2_symmetric_Expr<A,T,Dim0,i,j> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim1,k,l> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-			     const int N4) const
-  {
-    return iterA(N1,N2)*iterB(N3,N4);
-  }
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, 
-  char i, char j, char k, char l>
-inline const Tensor4_ddg_Expr
-<const Tensor2_symmetric_times_Tensor2_symmetric<A,B,T,U,Dim0,Dim1,i,j,k,l>,
-  typename promote<T,U>::V,Dim0,Dim1,i,j,k,l>
-operator*(const Tensor2_symmetric_Expr<A,T,Dim0,i,j> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim1,k,l> &b)
-{
-  typedef const Tensor2_symmetric_times_Tensor2_symmetric
-    <A,B,T,U,Dim0,Dim1,i,j,k,l> TensorExpr;
-  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j,k,l>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_times_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/Tensor2_symmetric_times_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,296 @@
+/* This file has all of the declarations for
+   Tensor2_symmetric*Tensor2_symmetric.  This includes the double
+   contraction A(i,j)*B(i,j) (yielding a typename promote<T,U>::V) as well as the more
+   complicated single contraction A(i,j)*B(j,k) (yielding a Tensor2
+   expression), and no contractions A(i,j)*B(k,l) -> Tensor4_ddg */
+
+/* Double contraction. */
+
+/* A(i,j)*B(i,j) */
+
+
+template<class A, class B, class T, class U, int Dim, char i,
+  char j, int Current_Dim0, int Current_Dim1>
+inline const typename promote<T,U>::V
+T2s_times_T2s(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	      const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b,
+	      const Number<Current_Dim0> &N0,
+	      const Number<Current_Dim1> &N1)
+{
+  return a(Current_Dim0-1,Current_Dim1-1)*b(Current_Dim0-1,Current_Dim1-1)
+    + T2s_times_T2s(a,b,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+}
+
+template<class A, class B, class T, class U, int Dim, char i,
+  char j, int Current_Dim1>
+inline const typename promote<T,U>::V
+T2s_times_T2s(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	      const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b,
+	      const Number<1> &N0,
+	      const Number<Current_Dim1> &N1)
+{
+  return a(0,Current_Dim1-1)*b(0,Current_Dim1-1)
+    + T2s_times_T2s(a,b,Number<Dim>(),Number<Current_Dim1-1>());
+}
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const typename promote<T,U>::V 
+T2s_times_T2s(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	      const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b,
+	      const Number<1> &N0, const Number<1> &N1)
+{
+  return a(0,0)*b(0,0);
+}
+
+template<class A, class B, class T, class U, int Dim, char i,char j>
+inline const typename promote<T,U>::V operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+				 const Tensor2_symmetric_Expr<B,U,Dim,i,j> &b)
+{
+  return T2s_times_T2s(a,b,Number<Dim>(),Number<Dim>());
+}
+
+/* A(i,j)*B(j,i) */
+
+template<class A, class B, class T, class U, int Dim, char i,
+  char j, int Current_Dim0, int Current_Dim1>
+inline const typename promote<T,U>::V
+T2s_times_switched_T2s(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	      const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b,
+	      const Number<Current_Dim0> &N0,
+	      const Number<Current_Dim1> &N1)
+{
+  return a(Current_Dim0-1,Current_Dim1-1)*b(Current_Dim1-1,Current_Dim0-1)
+    + T2s_times_switched_T2s(a,b,Number<Current_Dim0-1>(),
+			     Number<Current_Dim1>());
+}
+
+template<class A, class B, class T, class U, int Dim, char i,
+  char j, int Current_Dim1>
+inline const typename promote<T,U>::V
+T2s_times_switched_T2s(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	      const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b,
+	      const Number<1> &N0,
+	      const Number<Current_Dim1> &N1)
+{
+  return a(0,Current_Dim1-1)*b(Current_Dim1-1,0)
+    + T2s_times_switched_T2s(a,b,Number<Dim>(),Number<Current_Dim1-1>());
+}
+
+template<class A, class B, class T, class U, int Dim, char i, char j>
+inline const typename promote<T,U>::V 
+T2s_times_switched_T2s(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	      const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b,
+	      const Number<1> &N0, const Number<1> &N1)
+{
+  return a(0,0)*b(0,0);
+}
+
+template<class A, class B, class T, class U, int Dim, char i,char j>
+inline const typename promote<T,U>::V
+operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,j,i> &b)
+{
+  return T2s_times_switched_T2s(a,b,Number<Dim>(),Number<Dim>());
+}
+
+/* Single contraction.  The wrapper class has a different name for
+   each possible placing of the indices (e.g. A(i,j)*B(j,k) has the
+   number 10 because the contraction indices are on the second and
+   first slots (counting from 0). */
+
+/* A(i,j)*B(j,k) */
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+class Tensor2_symmetric_times_Tensor2_symmetric_10
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,j,k> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(N1,Current_Dim-1)*iterB(Current_Dim-1,N2)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
+  {
+    return iterA(N1,0)*iterB(0,N2);
+  }
+public:
+  Tensor2_symmetric_times_Tensor2_symmetric_10
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+inline const Tensor2_Expr<const Tensor2_symmetric_times_Tensor2_symmetric_10
+<A,B,T,U,Dim,i,j,k>,typename promote<T,U>::V,Dim,Dim,i,k>
+operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
+{
+  typedef const Tensor2_symmetric_times_Tensor2_symmetric_10<A,B,T,U,Dim,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,k>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j)*B(k,j) */
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+class Tensor2_symmetric_times_Tensor2_symmetric_11
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,k,j> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(N1,Current_Dim-1)*iterB(N2,Current_Dim-1)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
+  {
+    return iterA(N1,0)*iterB(N2,0);
+  }
+public:
+  Tensor2_symmetric_times_Tensor2_symmetric_11
+  (const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,k,j> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+inline const Tensor2_Expr<const Tensor2_symmetric_times_Tensor2_symmetric_11
+<A,B,T,U,Dim,i,j,k>,typename promote<T,U>::V,Dim,Dim,i,k>
+operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,k,j> &b)
+{
+  typedef const Tensor2_symmetric_times_Tensor2_symmetric_11<A,B,T,U,Dim,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,k>
+    (TensorExpr(a,b));
+}
+
+/* A(j,i)*B(j,k) */
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+class Tensor2_symmetric_times_Tensor2_symmetric_00
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,j,i> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,j,k> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(Current_Dim-1,N1)*iterB(Current_Dim-1,N2)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
+  {
+    return iterA(0,N1)*iterB(0,N2);
+  }
+public:
+  Tensor2_symmetric_times_Tensor2_symmetric_00
+  (const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+inline const Tensor2_Expr<const Tensor2_symmetric_times_Tensor2_symmetric_00
+<A,B,T,U,Dim,i,j,k>,typename promote<T,U>::V,Dim,Dim,i,k>
+operator*(const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
+{
+  typedef const Tensor2_symmetric_times_Tensor2_symmetric_00<A,B,T,U,Dim,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,k>
+    (TensorExpr(a,b));
+}
+
+/* A(j,i)*B(k,j) */
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+class Tensor2_symmetric_times_Tensor2_symmetric_01
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,j,i> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,k,j> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(Current_Dim-1,N1)*iterB(N2,Current_Dim-1)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const Number<1> &N) const
+  {
+    return iterA(0,N1)*iterB(N2,0);
+  }
+public:
+  Tensor2_symmetric_times_Tensor2_symmetric_01
+  (const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,k,j> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+inline const Tensor2_Expr<const Tensor2_symmetric_times_Tensor2_symmetric_01
+<A,B,T,U,Dim,i,j,k>,typename promote<T,U>::V,Dim,Dim,i,k>
+operator*(const Tensor2_symmetric_Expr<A,T,Dim,j,i> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,k,j> &b)
+{
+  typedef const Tensor2_symmetric_times_Tensor2_symmetric_01<A,B,T,U,Dim,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,k>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j)*B(k,l) -> Tensor4_ddg */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, 
+  char i, char j, char k, char l>
+class Tensor2_symmetric_times_Tensor2_symmetric
+{
+  const Tensor2_symmetric_Expr<A,T,Dim0,i,j> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim1,k,l> iterB;
+public:
+  Tensor2_symmetric_times_Tensor2_symmetric
+  (const Tensor2_symmetric_Expr<A,T,Dim0,i,j> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim1,k,l> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+			     const int N4) const
+  {
+    return iterA(N1,N2)*iterB(N3,N4);
+  }
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, 
+  char i, char j, char k, char l>
+inline const Tensor4_ddg_Expr
+<const Tensor2_symmetric_times_Tensor2_symmetric<A,B,T,U,Dim0,Dim1,i,j,k,l>,
+  typename promote<T,U>::V,Dim0,Dim1,i,j,k,l>
+operator*(const Tensor2_symmetric_Expr<A,T,Dim0,i,j> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim1,k,l> &b)
+{
+  typedef const Tensor2_symmetric_times_Tensor2_symmetric
+    <A,B,T,U,Dim0,Dim1,i,j,k,l> TensorExpr;
+  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j,k,l>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_times_generic.h
--- a/Tensor2_symmetric/Tensor2_symmetric_times_generic.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-/* Multiplies a Tensor2_symmetric with a generic, yielding a
-   Tensor2_symmetric. */
-
-template<class A, class T, class U, int Dim, char i, char j>
-class Tensor2_symmetric_times_generic
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const U d;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2)*d;
-  }
-
-  Tensor2_symmetric_times_generic(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-				  const U &d0): iterA(a), d(d0) {}
-};
-
-template<class A, class T, class U, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_symmetric_times_generic<A,T,U,Dim,i,j>,typename promote<T,U>::V,Dim,i,j>
-operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a, const U &d0)
-{
-  typedef const Tensor2_symmetric_times_generic<A,T,U,Dim,i,j> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
-    (TensorExpr(a,d0));
-}
-
-template<class A, class T, class U, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr
-<const Tensor2_symmetric_times_generic<A,T,U,Dim,i,j>,typename promote<T,U>::V,Dim,i,j>
-operator*(const U &d0, const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
-{
-  typedef const Tensor2_symmetric_times_generic<A,T,U,Dim,i,j> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
-    (TensorExpr(a,d0));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_times_generic.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/Tensor2_symmetric_times_generic.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,37 @@
+/* Multiplies a Tensor2_symmetric with a generic, yielding a
+   Tensor2_symmetric. */
+
+template<class A, class T, class U, int Dim, char i, char j>
+class Tensor2_symmetric_times_generic
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const U d;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2)*d;
+  }
+
+  Tensor2_symmetric_times_generic(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+				  const U &d0): iterA(a), d(d0) {}
+};
+
+template<class A, class T, class U, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_symmetric_times_generic<A,T,U,Dim,i,j>,typename promote<T,U>::V,Dim,i,j>
+operator*(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a, const U &d0)
+{
+  typedef const Tensor2_symmetric_times_generic<A,T,U,Dim,i,j> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
+    (TensorExpr(a,d0));
+}
+
+template<class A, class T, class U, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr
+<const Tensor2_symmetric_times_generic<A,T,U,Dim,i,j>,typename promote<T,U>::V,Dim,i,j>
+operator*(const U &d0, const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
+{
+  typedef const Tensor2_symmetric_times_generic<A,T,U,Dim,i,j> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
+    (TensorExpr(a,d0));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_value.h
--- a/Tensor2_symmetric/Tensor2_symmetric_value.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,205 +0,0 @@
-/* A general version, not for pointers. */
-
-template <class T, int Tensor_Dim>
-class Tensor2_symmetric
-{
-  T data[(Tensor_Dim*(Tensor_Dim+1))/2];
-public:
-  Tensor2_symmetric() {}
-
-  /* Tensor_Dim=2 */
-  Tensor2_symmetric(T d00, T d01, T d11)
-  {
-    Tensor2_symmetric_constructor<T,Tensor_Dim>(data,d00,d01,d11);
-  }
-
-  /* Tensor_Dim=3 */
-  Tensor2_symmetric(T d00, T d01, T d02, T d11, T d12, T d22)
-  {
-    Tensor2_symmetric_constructor<T,Tensor_Dim>(data,d00,d01,d02,d11,d12,d22);
-  }
-
-  /* Tensor_Dim=4 */
-  Tensor2_symmetric(T d00, T d01, T d02, T d03, T d11, T d12, T d13, T d22,
-		    T d23, T d33)
-  {
-    Tensor2_symmetric_constructor<T,Tensor_Dim>
-      (data,d00,d01,d02,d03,d11,d12,d13,d22,d23,d33);
-  }
-
-  /* There are two operator(int,int)'s, one for non-consts that lets you
-     change the value, and one for consts that doesn't. */
-
-  T & operator()(const int N1, const int N2)
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim || N1<0 || N2>=Tensor_Dim || N2<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor2_symmetric<T," << Tensor_Dim
-          << ">.operator(" << N1 << "," << N2 << ")"
-          << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N1>N2 ? data[N1+(N2*(2*Tensor_Dim-N2-1))/2]
-      : data[N2+(N1*(2*Tensor_Dim-N1-1))/2];
-  }
-
-  T operator()(const int N1, const int N2) const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim || N1<0 || N2>=Tensor_Dim || N2<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor2_symmetric<T," << Tensor_Dim
-          << ">.operator(" << N1 << "," << N2 << ") const"
-          << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N1>N2 ? data[N1+(N2*(2*Tensor_Dim-N2-1))/2]
-      : data[N2+(N1*(2*Tensor_Dim-N1-1))/2];
-  }
-
-  /* These operator()'s are the first part in constructing template
-     expressions.  They can be used to slice off lower dimensional
-     parts. They are not entirely safe, since you can accidently use a
-     higher dimension than what is really allowed (like Dim=5). */
-
-  /* This returns a Tensor2_Expr, since the indices are not really
-     symmetric anymore since they cover different dimensions. */
-
-  template<char i, char j, int Dim0, int Dim1>
-  Tensor2_Expr<Tensor2_symmetric<T,Tensor_Dim>,T,Dim0,Dim1,i,j>
-  operator()(const Index<i,Dim0> index1, const Index<j,Dim1> index2)
-  {
-    return Tensor2_Expr<Tensor2_symmetric<T,Tensor_Dim>,T,Dim0,Dim1,i,j>
-      (*this);
-  }
-
-  template<char i, char j, int Dim0, int Dim1>
-  Tensor2_Expr<const Tensor2_symmetric<T,Tensor_Dim>,T,Dim0,Dim1,i,j>
-  operator()(const Index<i,Dim0> index1, const Index<j,Dim1> index2) const
-  {
-    return Tensor2_Expr<const Tensor2_symmetric<T,Tensor_Dim>,T,Dim0,Dim1,i,j>
-      (*this);
-  }
-
-  /* This returns a Tensor2_symmetric_Expr, since the indices are still
-     symmetric on the lower dimensions. */
-
-  template<char i, char j, int Dim>
-  Tensor2_symmetric_Expr<Tensor2_symmetric<T,Tensor_Dim>,T,Dim,i,j>
-  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2)
-  {
-    return Tensor2_symmetric_Expr<Tensor2_symmetric<T,Tensor_Dim>,T,Dim,i,j>
-      (*this);
-  }
-
-  template<char i, char j, int Dim>
-  Tensor2_symmetric_Expr<const Tensor2_symmetric<T,Tensor_Dim>,T,Dim,i,j>
-  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2) const
-  {
-    return Tensor2_symmetric_Expr<const Tensor2_symmetric<T,Tensor_Dim>,
-      T,Dim,i,j>(*this);
-  }
-
-  /* This is for expressions where a number is used for one slot, and
-     an index for another, yielding a Tensor1_Expr.  The non-const
-     versions don't actually create a Tensor2_number_rhs_[01] object.
-     They create a Tensor1_Expr directly, which provides the
-     appropriate indexing operators.  The const versions do create a
-     Tensor2_number_[01]. */
-
-  template<char i, int N, int Dim>
-  Tensor1_Expr<Tensor2_number_rhs_1<Tensor2_symmetric<T,Tensor_Dim>,T,N>,
-    T,Dim,i>
-  operator()(const Index<i,Dim> index1, const Number<N> &n1)
-  {
-    typedef Tensor2_number_rhs_1<Tensor2_symmetric<T,Tensor_Dim>,T,N>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
-  }
-
-  template<char i, int N, int Dim>
-  Tensor1_Expr<const Tensor2_number_1<const Tensor2_symmetric<T,Tensor_Dim>,
-    T,N>,T,Dim,i>
-  operator()(const Index<i,Dim> index1, const Number<N> &n1) const
-  {
-    typedef const Tensor2_number_1<const Tensor2_symmetric<T,Tensor_Dim>,T,N>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-  template<char i, int N, int Dim>
-  Tensor1_Expr<Tensor2_number_rhs_0<Tensor2_symmetric<T,Tensor_Dim>,T,N>,
-    T,Dim,i>
-  operator()(const Number<N> &n1, const Index<i,Dim> index1)
-  {
-    typedef Tensor2_number_rhs_0<Tensor2_symmetric<T,Tensor_Dim>,T,N>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
-  }
-
-  template<char i, int N, int Dim>
-  Tensor1_Expr<const Tensor2_number_0<const Tensor2_symmetric<T,Tensor_Dim>,
-    T,N>,T,Dim,i>
-  operator()(const Number<N> &n1, const Index<i,Dim> index1) const
-  {
-    typedef const Tensor2_number_0<const Tensor2_symmetric<T,Tensor_Dim>,T,N>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-  /* Specializations for using actual numbers instead of Number<> */
-
-  template<char i, int Dim>
-  Tensor1_Expr<const Tensor2_numeral_1<const Tensor2_symmetric<T,Tensor_Dim>,
-    T>,T,Dim,i>
-  operator()(const Index<i,Dim> index1, const int N) const
-  {
-    typedef const Tensor2_numeral_1<const Tensor2_symmetric<T,Tensor_Dim>,T>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N));
-  }
-
-  template<char i, int Dim>
-  Tensor1_Expr<const Tensor2_numeral_0<const Tensor2_symmetric<T,Tensor_Dim>,
-    T>,T,Dim,i>
-  operator()(const int N, const Index<i,Dim> index1) const
-  {
-    typedef const Tensor2_numeral_0<const Tensor2_symmetric<T,Tensor_Dim>,T>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N));
-  }
-  
-  /* These two operator()'s return the Tensor2 with internal
-     contractions, yielding a T.  I have to specify one for both
-     const and non-const because otherwise the compiler will use the
-     operator() which gives a Tensor2_Expr<>. */
-  
-  template<char i, int Dim>
-  T operator()(const Index<i,Dim> index1, const Index<i,Dim> index2)
-  {
-    return internal_contract(Number<Dim>());
-  }
-
-  template<char i, int Dim>
-  T operator()(const Index<i,Dim> index1, const Index<i,Dim> index2) const
-  {
-    return internal_contract(Number<Dim>());
-  }
-private:
-  template<int N>
-  T internal_contract(const Number<N> &n)
-  {
-    return data[N-1+((N-1)*(2*Tensor_Dim-N))/2]
-      + internal_contract(Number<N-1>());
-  }
-
-  T internal_contract(const Number<1> &n)
-  {
-    return data[0];
-  }
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/Tensor2_symmetric_value.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/Tensor2_symmetric_value.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,205 @@
+/* A general version, not for pointers. */
+
+template <class T, int Tensor_Dim>
+class Tensor2_symmetric
+{
+  T data[(Tensor_Dim*(Tensor_Dim+1))/2];
+public:
+  Tensor2_symmetric() {}
+
+  /* Tensor_Dim=2 */
+  Tensor2_symmetric(T d00, T d01, T d11)
+  {
+    Tensor2_symmetric_constructor<T,Tensor_Dim>(data,d00,d01,d11);
+  }
+
+  /* Tensor_Dim=3 */
+  Tensor2_symmetric(T d00, T d01, T d02, T d11, T d12, T d22)
+  {
+    Tensor2_symmetric_constructor<T,Tensor_Dim>(data,d00,d01,d02,d11,d12,d22);
+  }
+
+  /* Tensor_Dim=4 */
+  Tensor2_symmetric(T d00, T d01, T d02, T d03, T d11, T d12, T d13, T d22,
+		    T d23, T d33)
+  {
+    Tensor2_symmetric_constructor<T,Tensor_Dim>
+      (data,d00,d01,d02,d03,d11,d12,d13,d22,d23,d33);
+  }
+
+  /* There are two operator(int,int)'s, one for non-consts that lets you
+     change the value, and one for consts that doesn't. */
+
+  T & operator()(const int N1, const int N2)
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim || N1<0 || N2>=Tensor_Dim || N2<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor2_symmetric<T," << Tensor_Dim
+          << ">.operator(" << N1 << "," << N2 << ")"
+          << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N1>N2 ? data[N1+(N2*(2*Tensor_Dim-N2-1))/2]
+      : data[N2+(N1*(2*Tensor_Dim-N1-1))/2];
+  }
+
+  T operator()(const int N1, const int N2) const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim || N1<0 || N2>=Tensor_Dim || N2<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor2_symmetric<T," << Tensor_Dim
+          << ">.operator(" << N1 << "," << N2 << ") const"
+          << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N1>N2 ? data[N1+(N2*(2*Tensor_Dim-N2-1))/2]
+      : data[N2+(N1*(2*Tensor_Dim-N1-1))/2];
+  }
+
+  /* These operator()'s are the first part in constructing template
+     expressions.  They can be used to slice off lower dimensional
+     parts. They are not entirely safe, since you can accidently use a
+     higher dimension than what is really allowed (like Dim=5). */
+
+  /* This returns a Tensor2_Expr, since the indices are not really
+     symmetric anymore since they cover different dimensions. */
+
+  template<char i, char j, int Dim0, int Dim1>
+  Tensor2_Expr<Tensor2_symmetric<T,Tensor_Dim>,T,Dim0,Dim1,i,j>
+  operator()(const Index<i,Dim0> index1, const Index<j,Dim1> index2)
+  {
+    return Tensor2_Expr<Tensor2_symmetric<T,Tensor_Dim>,T,Dim0,Dim1,i,j>
+      (*this);
+  }
+
+  template<char i, char j, int Dim0, int Dim1>
+  Tensor2_Expr<const Tensor2_symmetric<T,Tensor_Dim>,T,Dim0,Dim1,i,j>
+  operator()(const Index<i,Dim0> index1, const Index<j,Dim1> index2) const
+  {
+    return Tensor2_Expr<const Tensor2_symmetric<T,Tensor_Dim>,T,Dim0,Dim1,i,j>
+      (*this);
+  }
+
+  /* This returns a Tensor2_symmetric_Expr, since the indices are still
+     symmetric on the lower dimensions. */
+
+  template<char i, char j, int Dim>
+  Tensor2_symmetric_Expr<Tensor2_symmetric<T,Tensor_Dim>,T,Dim,i,j>
+  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2)
+  {
+    return Tensor2_symmetric_Expr<Tensor2_symmetric<T,Tensor_Dim>,T,Dim,i,j>
+      (*this);
+  }
+
+  template<char i, char j, int Dim>
+  Tensor2_symmetric_Expr<const Tensor2_symmetric<T,Tensor_Dim>,T,Dim,i,j>
+  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2) const
+  {
+    return Tensor2_symmetric_Expr<const Tensor2_symmetric<T,Tensor_Dim>,
+      T,Dim,i,j>(*this);
+  }
+
+  /* This is for expressions where a number is used for one slot, and
+     an index for another, yielding a Tensor1_Expr.  The non-const
+     versions don't actually create a Tensor2_number_rhs_[01] object.
+     They create a Tensor1_Expr directly, which provides the
+     appropriate indexing operators.  The const versions do create a
+     Tensor2_number_[01]. */
+
+  template<char i, int N, int Dim>
+  Tensor1_Expr<Tensor2_number_rhs_1<Tensor2_symmetric<T,Tensor_Dim>,T,N>,
+    T,Dim,i>
+  operator()(const Index<i,Dim> index1, const Number<N> &n1)
+  {
+    typedef Tensor2_number_rhs_1<Tensor2_symmetric<T,Tensor_Dim>,T,N>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
+  }
+
+  template<char i, int N, int Dim>
+  Tensor1_Expr<const Tensor2_number_1<const Tensor2_symmetric<T,Tensor_Dim>,
+    T,N>,T,Dim,i>
+  operator()(const Index<i,Dim> index1, const Number<N> &n1) const
+  {
+    typedef const Tensor2_number_1<const Tensor2_symmetric<T,Tensor_Dim>,T,N>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+  template<char i, int N, int Dim>
+  Tensor1_Expr<Tensor2_number_rhs_0<Tensor2_symmetric<T,Tensor_Dim>,T,N>,
+    T,Dim,i>
+  operator()(const Number<N> &n1, const Index<i,Dim> index1)
+  {
+    typedef Tensor2_number_rhs_0<Tensor2_symmetric<T,Tensor_Dim>,T,N>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
+  }
+
+  template<char i, int N, int Dim>
+  Tensor1_Expr<const Tensor2_number_0<const Tensor2_symmetric<T,Tensor_Dim>,
+    T,N>,T,Dim,i>
+  operator()(const Number<N> &n1, const Index<i,Dim> index1) const
+  {
+    typedef const Tensor2_number_0<const Tensor2_symmetric<T,Tensor_Dim>,T,N>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+  /* Specializations for using actual numbers instead of Number<> */
+
+  template<char i, int Dim>
+  Tensor1_Expr<const Tensor2_numeral_1<const Tensor2_symmetric<T,Tensor_Dim>,
+    T>,T,Dim,i>
+  operator()(const Index<i,Dim> index1, const int N) const
+  {
+    typedef const Tensor2_numeral_1<const Tensor2_symmetric<T,Tensor_Dim>,T>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N));
+  }
+
+  template<char i, int Dim>
+  Tensor1_Expr<const Tensor2_numeral_0<const Tensor2_symmetric<T,Tensor_Dim>,
+    T>,T,Dim,i>
+  operator()(const int N, const Index<i,Dim> index1) const
+  {
+    typedef const Tensor2_numeral_0<const Tensor2_symmetric<T,Tensor_Dim>,T>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N));
+  }
+  
+  /* These two operator()'s return the Tensor2 with internal
+     contractions, yielding a T.  I have to specify one for both
+     const and non-const because otherwise the compiler will use the
+     operator() which gives a Tensor2_Expr<>. */
+  
+  template<char i, int Dim>
+  T operator()(const Index<i,Dim> index1, const Index<i,Dim> index2)
+  {
+    return internal_contract(Number<Dim>());
+  }
+
+  template<char i, int Dim>
+  T operator()(const Index<i,Dim> index1, const Index<i,Dim> index2) const
+  {
+    return internal_contract(Number<Dim>());
+  }
+private:
+  template<int N>
+  T internal_contract(const Number<N> &n)
+  {
+    return data[N-1+((N-1)*(2*Tensor_Dim-N))/2]
+      + internal_contract(Number<N-1>());
+  }
+
+  T internal_contract(const Number<1> &n)
+  {
+    return data[0];
+  }
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/dTensor2_symmetric.h
--- a/Tensor2_symmetric/dTensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/* Takes a derivative of a Tensor2_symmetric, yielding a Tensor3_dg. */
-
-template<class T, int Dim01, int Dim2, char i, char j, char k>
-class dTensor2_symmetric
-{
-  const Tensor2_symmetric<T*,Dim01> &a;
-  const Tensor1<int,Dim2> &d_ijk;
-  const Tensor1<double,Dim2> &d_xyz;
-public:
-  typename promote<T,double>::V operator()(const int N1, const int N2,
-				  const int N3) const
-  {
-    return (*(a.ptr(N1,N2)+d_ijk(N3))-*(a.ptr(N1,N2)-d_ijk(N3)))*d_xyz(N3)*0.5;
-  }
-  dTensor2_symmetric(const Tensor2_symmetric<T*,Dim01> &A,
-		     const Tensor1<int,Dim2> &D_ijk,
-		     const Tensor1<double,Dim2> &D_xyz)
-    : a(A), d_ijk(D_ijk), d_xyz(D_xyz) {}
-};
-
-template<class T, int Dim01, int Dim2, char i, char j, char k>
-inline const Tensor3_dg_Expr<const dTensor2_symmetric<T,Dim01,Dim2,i,j,k>,
-  typename promote<T,double>::V,Dim01,Dim2,i,j,k>
-d(const Tensor2_symmetric<T*,Dim01> &a, const Index<i,Dim01> index1,
-  const Index<j,Dim01> index2, const Index<k,Dim2> index3,
-  const Tensor1<int,Dim2> &d_ijk,
-  const Tensor1<double,Dim2> &d_xyz)
-{
-  typedef const dTensor2_symmetric<T,Dim01,Dim2,i,j,k> TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,double>::V,Dim01,Dim2,i,j,k>
-    (TensorExpr(a,d_ijk,d_xyz));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/dTensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/dTensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,32 @@
+/* Takes a derivative of a Tensor2_symmetric, yielding a Tensor3_dg. */
+
+template<class T, int Dim01, int Dim2, char i, char j, char k>
+class dTensor2_symmetric
+{
+  const Tensor2_symmetric<T*,Dim01> &a;
+  const Tensor1<int,Dim2> &d_ijk;
+  const Tensor1<double,Dim2> &d_xyz;
+public:
+  typename promote<T,double>::V operator()(const int N1, const int N2,
+				  const int N3) const
+  {
+    return (*(a.ptr(N1,N2)+d_ijk(N3))-*(a.ptr(N1,N2)-d_ijk(N3)))*d_xyz(N3)*0.5;
+  }
+  dTensor2_symmetric(const Tensor2_symmetric<T*,Dim01> &A,
+		     const Tensor1<int,Dim2> &D_ijk,
+		     const Tensor1<double,Dim2> &D_xyz)
+    : a(A), d_ijk(D_ijk), d_xyz(D_xyz) {}
+};
+
+template<class T, int Dim01, int Dim2, char i, char j, char k>
+inline const Tensor3_dg_Expr<const dTensor2_symmetric<T,Dim01,Dim2,i,j,k>,
+  typename promote<T,double>::V,Dim01,Dim2,i,j,k>
+d(const Tensor2_symmetric<T*,Dim01> &a, const Index<i,Dim01> index1,
+  const Index<j,Dim01> index2, const Index<k,Dim2> index3,
+  const Tensor1<int,Dim2> &d_ijk,
+  const Tensor1<double,Dim2> &d_xyz)
+{
+  typedef const dTensor2_symmetric<T,Dim01,Dim2,i,j,k> TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,double>::V,Dim01,Dim2,i,j,k>
+    (TensorExpr(a,d_ijk,d_xyz));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/d_boundary_Tensor2_symmetric.h
--- a/Tensor2_symmetric/d_boundary_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/* Takes a derivative of a Tensor2_symmetric, yielding a Tensor3_dg.
-   This is mostly useful near boundaries where you might have to take
-   one-sided derivatives. */
-
-template<class T, int Dim01, int Dim2, char i, char j, char k>
-class d_boundary_Tensor2_symmetric
-{
-  const Tensor2_symmetric<T*,Dim01> &a;
-  const Tensor1<int,Dim2> &d_ijk;
-  const Tensor1<double,Dim2> &d_xyz;
-  const Tensor2<bool,Dim2,2> &boundary;
-public:
-  typename promote<T,double>::V operator()(const int N1, const int N2,
-				  const int N3) const
-  {
-    return boundary(N3,0) ? 
-      (*(a.ptr(N1,N2)+d_ijk(N3))-a(N1,N2))*d_xyz(N3) :
-      (boundary(N3,1) ? 
-       (a(N1,N2)-*(a.ptr(N1,N2)-d_ijk(N3)))*d_xyz(N3) :
-       (*(a.ptr(N1,N2)+d_ijk(N3))-*(a.ptr(N1,N2)-d_ijk(N3)))*d_xyz(N3)*0.5);
-  }
-  d_boundary_Tensor2_symmetric(const Tensor2_symmetric<T*,Dim01> &A,
-			       const Tensor1<int,Dim2> &D_ijk,
-			       const Tensor1<double,Dim2> &D_xyz,
-			       const Tensor2<bool,Dim2,2> &Boundary)
-    : a(A), d_ijk(D_ijk), d_xyz(D_xyz), boundary(Boundary) {}
-};
-
-template<class T, int Dim01, int Dim2, char i, char j, char k>
-inline const Tensor3_dg_Expr
-<const d_boundary_Tensor2_symmetric<T,Dim01,Dim2,i,j,k>,
-  typename promote<T,double>::V,Dim01,Dim2,i,j,k>
-d_boundary(const Tensor2_symmetric<T*,Dim01> &a, const Index<i,Dim01> index1,
-	   const Index<j,Dim01> index2, const Index<k,Dim2> index3,
-	   const Tensor1<int,Dim2> &d_ijk,
-	   const Tensor1<double,Dim2> &d_xyz,
-	   const Tensor2<bool,Dim2,2> &boundary)
-{
-  typedef const d_boundary_Tensor2_symmetric<T,Dim01,Dim2,i,j,k> TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,double>::V,Dim01,Dim2,i,j,k>
-    (TensorExpr(a,d_ijk,d_xyz,boundary));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/d_boundary_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/d_boundary_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,42 @@
+/* Takes a derivative of a Tensor2_symmetric, yielding a Tensor3_dg.
+   This is mostly useful near boundaries where you might have to take
+   one-sided derivatives. */
+
+template<class T, int Dim01, int Dim2, char i, char j, char k>
+class d_boundary_Tensor2_symmetric
+{
+  const Tensor2_symmetric<T*,Dim01> &a;
+  const Tensor1<int,Dim2> &d_ijk;
+  const Tensor1<double,Dim2> &d_xyz;
+  const Tensor2<bool,Dim2,2> &boundary;
+public:
+  typename promote<T,double>::V operator()(const int N1, const int N2,
+				  const int N3) const
+  {
+    return boundary(N3,0) ? 
+      (*(a.ptr(N1,N2)+d_ijk(N3))-a(N1,N2))*d_xyz(N3) :
+      (boundary(N3,1) ? 
+       (a(N1,N2)-*(a.ptr(N1,N2)-d_ijk(N3)))*d_xyz(N3) :
+       (*(a.ptr(N1,N2)+d_ijk(N3))-*(a.ptr(N1,N2)-d_ijk(N3)))*d_xyz(N3)*0.5);
+  }
+  d_boundary_Tensor2_symmetric(const Tensor2_symmetric<T*,Dim01> &A,
+			       const Tensor1<int,Dim2> &D_ijk,
+			       const Tensor1<double,Dim2> &D_xyz,
+			       const Tensor2<bool,Dim2,2> &Boundary)
+    : a(A), d_ijk(D_ijk), d_xyz(D_xyz), boundary(Boundary) {}
+};
+
+template<class T, int Dim01, int Dim2, char i, char j, char k>
+inline const Tensor3_dg_Expr
+<const d_boundary_Tensor2_symmetric<T,Dim01,Dim2,i,j,k>,
+  typename promote<T,double>::V,Dim01,Dim2,i,j,k>
+d_boundary(const Tensor2_symmetric<T*,Dim01> &a, const Index<i,Dim01> index1,
+	   const Index<j,Dim01> index2, const Index<k,Dim2> index3,
+	   const Tensor1<int,Dim2> &d_ijk,
+	   const Tensor1<double,Dim2> &d_xyz,
+	   const Tensor2<bool,Dim2,2> &boundary)
+{
+  typedef const d_boundary_Tensor2_symmetric<T,Dim01,Dim2,i,j,k> TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,double>::V,Dim01,Dim2,i,j,k>
+    (TensorExpr(a,d_ijk,d_xyz,boundary));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/d_one_sided_Tensor2_symmetric.h
--- a/Tensor2_symmetric/d_one_sided_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-/* Takes a one-sided derivative of a Tensor2_symmetric in a particular
-   direction, yielding a Tensor2_symmetric. */
-
-template<class T, int Dim, char i, char j, int axis>
-class d_one_sided_Tensor2_symmetric
-{
-  const Tensor2_symmetric<T*,Dim> &a;
-  const int di,dj,dk;
-  const double dx,dy,dz;
-public:
-  typename promote<T,double>::V operator()(const int N1, const int N2) const
-  {
-    return axis==0 ? (a(N1,N2)-*(a.ptr(N1,N2)-di))*dx
-      : (axis==1 ? (a(N1,N2)-*(a.ptr(N1,N2)-dj))*dy
-	 : (a(N1,N2)-*(a.ptr(N1,N2)-dk))*dz);
-  }
-  d_one_sided_Tensor2_symmetric(const Tensor2_symmetric<T*,Dim> &A,
-				const int Di, const int Dj, const int Dk,
-				const double Dx, const double Dy,
-				const double Dz):
-    a(A), di(Di), dj(Dj), dk(Dk), dx(Dx), dy(Dy), dz(Dz) {}
-};
-
-template<class T, int Dim, char i, char j, int axis>
-inline const Tensor2_symmetric_Expr
-<const d_one_sided_Tensor2_symmetric<T,Dim,i,j,axis>,
-  typename promote<T,double>::V,Dim,i,j>
-d_one_sided(const Tensor2_symmetric<T*,Dim> &a, const Number<axis> n1,
-	    const Index<i,Dim> index1,
-	    const Index<j,Dim> index2,
-	    const int &di, const int &dj, const int &dk,
-	    const double &dx, const double &dy, const double &dz)
-{
-  typedef const d_one_sided_Tensor2_symmetric<T,Dim,i,j,axis> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,double>::V,Dim,i,j>
-    (TensorExpr(a,di,dj,dk,dx,dy,dz));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/d_one_sided_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/d_one_sided_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,37 @@
+/* Takes a one-sided derivative of a Tensor2_symmetric in a particular
+   direction, yielding a Tensor2_symmetric. */
+
+template<class T, int Dim, char i, char j, int axis>
+class d_one_sided_Tensor2_symmetric
+{
+  const Tensor2_symmetric<T*,Dim> &a;
+  const int di,dj,dk;
+  const double dx,dy,dz;
+public:
+  typename promote<T,double>::V operator()(const int N1, const int N2) const
+  {
+    return axis==0 ? (a(N1,N2)-*(a.ptr(N1,N2)-di))*dx
+      : (axis==1 ? (a(N1,N2)-*(a.ptr(N1,N2)-dj))*dy
+	 : (a(N1,N2)-*(a.ptr(N1,N2)-dk))*dz);
+  }
+  d_one_sided_Tensor2_symmetric(const Tensor2_symmetric<T*,Dim> &A,
+				const int Di, const int Dj, const int Dk,
+				const double Dx, const double Dy,
+				const double Dz):
+    a(A), di(Di), dj(Dj), dk(Dk), dx(Dx), dy(Dy), dz(Dz) {}
+};
+
+template<class T, int Dim, char i, char j, int axis>
+inline const Tensor2_symmetric_Expr
+<const d_one_sided_Tensor2_symmetric<T,Dim,i,j,axis>,
+  typename promote<T,double>::V,Dim,i,j>
+d_one_sided(const Tensor2_symmetric<T*,Dim> &a, const Number<axis> n1,
+	    const Index<i,Dim> index1,
+	    const Index<j,Dim> index2,
+	    const int &di, const int &dj, const int &dk,
+	    const double &dx, const double &dy, const double &dz)
+{
+  typedef const d_one_sided_Tensor2_symmetric<T,Dim,i,j,axis> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,double>::V,Dim,i,j>
+    (TensorExpr(a,di,dj,dk,dx,dy,dz));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/ddTensor2_symmetric.h
--- a/Tensor2_symmetric/ddTensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/* Takes a second derivative of a Tensor2_symmetric, yielding a
-   Tensor4_ddg. */
-
-template<class T, int Dim01, int Dim23, char i, char j, char k, char l>
-class ddTensor2_symmetric
-{
-  const Tensor2_symmetric<T*,Dim01> &a;
-  const Tensor1<int,Dim23> &d_ijk;
-  const Tensor1<double,Dim23> &d_xyz;
-public:
-  typename promote<T,double>::V operator()(const int N1, const int N2, const int N3,
-				  const int N4) const
-  {
-    return
-      N3==N4 ? (*(a.ptr(N1,N2)+d_ijk(N3))-2*a(N1,N2)+*(a.ptr(N1,N2)-d_ijk(N3)))
-      *d_xyz(N3)*d_xyz(N3) :
-      (*(a.ptr(N1,N2)+d_ijk(N3)+d_ijk(N4))
-       - *(a.ptr(N1,N2)-d_ijk(N3)+d_ijk(N4))
-       - *(a.ptr(N1,N2)+d_ijk(N3)-d_ijk(N4))
-       + *(a.ptr(N1,N2)-d_ijk(N3)-d_ijk(N4)))*d_xyz(N3)*d_xyz(N4)*0.25;
-  }
-  ddTensor2_symmetric(const Tensor2_symmetric<T*,Dim01> &A,
-		      const Tensor1<int,Dim23> &D_ijk,
-		      const Tensor1<double,Dim23> &D_xyz)
-    : a(A), d_ijk(D_ijk), d_xyz(D_xyz) {}
-};
-
-template<class T, int Dim01, int Dim23, char i, char j, char k, char l>
-inline const Tensor4_ddg_Expr<const ddTensor2_symmetric<T,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,double>::V,Dim01,Dim23,i,j,k,l>
-dd(const Tensor2_symmetric<T*,Dim01> &a,
-   const Index<i,Dim01> index1, const Index<j,Dim01> index2,
-   const Index<k,Dim23> index3, const Index<l,Dim23> index4,
-   const Tensor1<int,Dim23> &d_ijk, const Tensor1<double,Dim23> &d_xyz)
-{
-  typedef const ddTensor2_symmetric<T,Dim01,Dim23,i,j,k,l> Tensor_Expr;
-  return Tensor4_ddg_Expr<Tensor_Expr,typename promote<T,double>::V,Dim01,Dim23,i,j,k,l>
-    (Tensor_Expr(a,d_ijk,d_xyz));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/ddTensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/ddTensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,39 @@
+/* Takes a second derivative of a Tensor2_symmetric, yielding a
+   Tensor4_ddg. */
+
+template<class T, int Dim01, int Dim23, char i, char j, char k, char l>
+class ddTensor2_symmetric
+{
+  const Tensor2_symmetric<T*,Dim01> &a;
+  const Tensor1<int,Dim23> &d_ijk;
+  const Tensor1<double,Dim23> &d_xyz;
+public:
+  typename promote<T,double>::V operator()(const int N1, const int N2, const int N3,
+				  const int N4) const
+  {
+    return
+      N3==N4 ? (*(a.ptr(N1,N2)+d_ijk(N3))-2*a(N1,N2)+*(a.ptr(N1,N2)-d_ijk(N3)))
+      *d_xyz(N3)*d_xyz(N3) :
+      (*(a.ptr(N1,N2)+d_ijk(N3)+d_ijk(N4))
+       - *(a.ptr(N1,N2)-d_ijk(N3)+d_ijk(N4))
+       - *(a.ptr(N1,N2)+d_ijk(N3)-d_ijk(N4))
+       + *(a.ptr(N1,N2)-d_ijk(N3)-d_ijk(N4)))*d_xyz(N3)*d_xyz(N4)*0.25;
+  }
+  ddTensor2_symmetric(const Tensor2_symmetric<T*,Dim01> &A,
+		      const Tensor1<int,Dim23> &D_ijk,
+		      const Tensor1<double,Dim23> &D_xyz)
+    : a(A), d_ijk(D_ijk), d_xyz(D_xyz) {}
+};
+
+template<class T, int Dim01, int Dim23, char i, char j, char k, char l>
+inline const Tensor4_ddg_Expr<const ddTensor2_symmetric<T,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,double>::V,Dim01,Dim23,i,j,k,l>
+dd(const Tensor2_symmetric<T*,Dim01> &a,
+   const Index<i,Dim01> index1, const Index<j,Dim01> index2,
+   const Index<k,Dim23> index3, const Index<l,Dim23> index4,
+   const Tensor1<int,Dim23> &d_ijk, const Tensor1<double,Dim23> &d_xyz)
+{
+  typedef const ddTensor2_symmetric<T,Dim01,Dim23,i,j,k,l> Tensor_Expr;
+  return Tensor4_ddg_Expr<Tensor_Expr,typename promote<T,double>::V,Dim01,Dim23,i,j,k,l>
+    (Tensor_Expr(a,d_ijk,d_xyz));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/dd_boundary_Tensor2_symmetric.h
--- a/Tensor2_symmetric/dd_boundary_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-/* Takes a second derivative of a Tensor2_symmetric, yielding a
-   Tensor4_ddg.  This is mostly useful near boundaries where you might
-   have to take one-sided derivatives. */
-
-template<class T, int Dim01, int Dim23, char i, char j, char k, char l>
-class dd_boundary_Tensor2_symmetric
-{
-  const Tensor2_symmetric<T*,Dim01> &a;
-  const Tensor1<int,Dim23> &d_ijk;
-  const Tensor1<double,Dim23> &d_xyz;
-  const Tensor2<bool,Dim23,2> &boundary;
-public:
-  typename promote<T,double>::V operator()(const int N1, const int N2, const int N3,
-				  const int N4) const
-  {
-    return N3==N4 ?
-      (boundary(N3,0) ?
-       (*(a.ptr(N1,N2)+2*d_ijk(N3))-2**(a.ptr(N1,N2)+d_ijk(N3))+a(N1,N2)) :
-       (boundary(N3,1) ?
-	(a(N1,N2)-2**(a.ptr(N1,N2)-d_ijk(N3))+*(a.ptr(N1,N2)-2*d_ijk(N3))):
-	(*(a.ptr(N1,N2)+d_ijk(N3))-2*a(N1,N2)+*(a.ptr(N1,N2)-d_ijk(N3)))))
-       *d_xyz(N3)*d_xyz(N3) :
-      (boundary(N3,0) ?
-       (boundary(N4,0) ?
-	((*(a.ptr(N1,N2)+d_ijk(N3)+d_ijk(N4)) - *(a.ptr(N1,N2)+d_ijk(N4))
-	  - *(a.ptr(N1,N2)+d_ijk(N3)) + a(N1,N2))*d_xyz(N3)*d_xyz(N4)) :
-	(boundary(N4,1) ?
-	 ((*(a.ptr(N1,N2)+d_ijk(N3)) - a(N1,N2)
-	   - *(a.ptr(N1,N2)+d_ijk(N3)-d_ijk(N4))
-	   + *(a.ptr(N1,N2)-d_ijk(N4)))*d_xyz(N3)*d_xyz(N4)) :
-	 (*(a.ptr(N1,N2)+d_ijk(N3)+d_ijk(N4))
-	  - *(a.ptr(N1,N2)+d_ijk(N4))
-	  - *(a.ptr(N1,N2)+d_ijk(N3)-d_ijk(N4))
-	  + *(a.ptr(N1,N2)-d_ijk(N4)))*d_xyz(N3)*d_xyz(N4)*0.5)) :
-       (boundary(N3,1) ?
-	(boundary(N4,0) ?
-	 ((*(a.ptr(N1,N2)+d_ijk(N4)) - *(a.ptr(N1,N2)-d_ijk(N3)+d_ijk(N4))
-	   - a(N1,N2) + *(a.ptr(N1,N2)-d_ijk(N3)))*d_xyz(N3)*d_xyz(N4)) :
-	 (boundary(N4,1) ?
-	  ((a(N1,N2) - *(a.ptr(N1,N2)-d_ijk(N3))
-	    - *(a.ptr(N1,N2)-d_ijk(N4))
-	    + *(a.ptr(N1,N2)-d_ijk(N3)-d_ijk(N4)))*d_xyz(N3)*d_xyz(N4)) :
-	  (*(a.ptr(N1,N2)+d_ijk(N4))
-	   - *(a.ptr(N1,N2)-d_ijk(N3)+d_ijk(N4))
-	   - *(a.ptr(N1,N2)-d_ijk(N4))
-	   + *(a.ptr(N1,N2)-d_ijk(N3)-d_ijk(N4)))*d_xyz(N3)*d_xyz(N4)*0.5)) :
-	(boundary(N4,0) ?
-	 ((*(a.ptr(N1,N2)+d_ijk(N3)+d_ijk(N4))
-	   - *(a.ptr(N1,N2)-d_ijk(N3)+d_ijk(N4))
-	   - *(a.ptr(N1,N2)+d_ijk(N3))
-	   + *(a.ptr(N1,N2)-d_ijk(N3)))*d_xyz(N3)*d_xyz(N4)*0.5) :
-	 (boundary(N4,1) ?
-	  ((*(a.ptr(N1,N2)+d_ijk(N3))
-	    - *(a.ptr(N1,N2)-d_ijk(N3))
-	    - *(a.ptr(N1,N2)+d_ijk(N3)-d_ijk(N4))
-	    + *(a.ptr(N1,N2)-d_ijk(N3)-d_ijk(N4)))*d_xyz(N3)*d_xyz(N4)*0.5) :
-	  ((*(a.ptr(N1,N2)+d_ijk(N3)+d_ijk(N4))
-	    - *(a.ptr(N1,N2)-d_ijk(N3)+d_ijk(N4))
-	    - *(a.ptr(N1,N2)+d_ijk(N3)-d_ijk(N4))
-	    + *(a.ptr(N1,N2)-d_ijk(N3)-d_ijk(N4)))*d_xyz(N3)*d_xyz(N4)*0.25)))));
-  }
-  dd_boundary_Tensor2_symmetric(const Tensor2_symmetric<T*,Dim01> &A,
-		      const Tensor1<int,Dim23> &D_ijk,
-		      const Tensor1<double,Dim23> &D_xyz,
-		      const Tensor2<bool,Dim23,2> &Boundary)
-    : a(A), d_ijk(D_ijk), d_xyz(D_xyz), boundary(Boundary) {}
-};
-
-template<class T, int Dim01, int Dim23, char i, char j, char k, char l>
-inline const Tensor4_ddg_Expr<const dd_boundary_Tensor2_symmetric<T,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,double>::V,Dim01,Dim23,i,j,k,l>
-dd_boundary(const Tensor2_symmetric<T*,Dim01> &a,
-   const Index<i,Dim01> index1, const Index<j,Dim01> index2,
-   const Index<k,Dim23> index3, const Index<l,Dim23> index4,
-   const Tensor1<int,Dim23> &d_ijk, const Tensor1<double,Dim23> &d_xyz,
-   const Tensor2<bool,Dim23,2> &boundary)
-{
-  typedef const dd_boundary_Tensor2_symmetric<T,Dim01,Dim23,i,j,k,l> Tensor_Expr;
-  return Tensor4_ddg_Expr<Tensor_Expr,typename promote<T,double>::V,Dim01,Dim23,i,j,k,l>
-    (Tensor_Expr(a,d_ijk,d_xyz,boundary));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/dd_boundary_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/dd_boundary_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,81 @@
+/* Takes a second derivative of a Tensor2_symmetric, yielding a
+   Tensor4_ddg.  This is mostly useful near boundaries where you might
+   have to take one-sided derivatives. */
+
+template<class T, int Dim01, int Dim23, char i, char j, char k, char l>
+class dd_boundary_Tensor2_symmetric
+{
+  const Tensor2_symmetric<T*,Dim01> &a;
+  const Tensor1<int,Dim23> &d_ijk;
+  const Tensor1<double,Dim23> &d_xyz;
+  const Tensor2<bool,Dim23,2> &boundary;
+public:
+  typename promote<T,double>::V operator()(const int N1, const int N2, const int N3,
+				  const int N4) const
+  {
+    return N3==N4 ?
+      (boundary(N3,0) ?
+       (*(a.ptr(N1,N2)+2*d_ijk(N3))-2**(a.ptr(N1,N2)+d_ijk(N3))+a(N1,N2)) :
+       (boundary(N3,1) ?
+	(a(N1,N2)-2**(a.ptr(N1,N2)-d_ijk(N3))+*(a.ptr(N1,N2)-2*d_ijk(N3))):
+	(*(a.ptr(N1,N2)+d_ijk(N3))-2*a(N1,N2)+*(a.ptr(N1,N2)-d_ijk(N3)))))
+       *d_xyz(N3)*d_xyz(N3) :
+      (boundary(N3,0) ?
+       (boundary(N4,0) ?
+	((*(a.ptr(N1,N2)+d_ijk(N3)+d_ijk(N4)) - *(a.ptr(N1,N2)+d_ijk(N4))
+	  - *(a.ptr(N1,N2)+d_ijk(N3)) + a(N1,N2))*d_xyz(N3)*d_xyz(N4)) :
+	(boundary(N4,1) ?
+	 ((*(a.ptr(N1,N2)+d_ijk(N3)) - a(N1,N2)
+	   - *(a.ptr(N1,N2)+d_ijk(N3)-d_ijk(N4))
+	   + *(a.ptr(N1,N2)-d_ijk(N4)))*d_xyz(N3)*d_xyz(N4)) :
+	 (*(a.ptr(N1,N2)+d_ijk(N3)+d_ijk(N4))
+	  - *(a.ptr(N1,N2)+d_ijk(N4))
+	  - *(a.ptr(N1,N2)+d_ijk(N3)-d_ijk(N4))
+	  + *(a.ptr(N1,N2)-d_ijk(N4)))*d_xyz(N3)*d_xyz(N4)*0.5)) :
+       (boundary(N3,1) ?
+	(boundary(N4,0) ?
+	 ((*(a.ptr(N1,N2)+d_ijk(N4)) - *(a.ptr(N1,N2)-d_ijk(N3)+d_ijk(N4))
+	   - a(N1,N2) + *(a.ptr(N1,N2)-d_ijk(N3)))*d_xyz(N3)*d_xyz(N4)) :
+	 (boundary(N4,1) ?
+	  ((a(N1,N2) - *(a.ptr(N1,N2)-d_ijk(N3))
+	    - *(a.ptr(N1,N2)-d_ijk(N4))
+	    + *(a.ptr(N1,N2)-d_ijk(N3)-d_ijk(N4)))*d_xyz(N3)*d_xyz(N4)) :
+	  (*(a.ptr(N1,N2)+d_ijk(N4))
+	   - *(a.ptr(N1,N2)-d_ijk(N3)+d_ijk(N4))
+	   - *(a.ptr(N1,N2)-d_ijk(N4))
+	   + *(a.ptr(N1,N2)-d_ijk(N3)-d_ijk(N4)))*d_xyz(N3)*d_xyz(N4)*0.5)) :
+	(boundary(N4,0) ?
+	 ((*(a.ptr(N1,N2)+d_ijk(N3)+d_ijk(N4))
+	   - *(a.ptr(N1,N2)-d_ijk(N3)+d_ijk(N4))
+	   - *(a.ptr(N1,N2)+d_ijk(N3))
+	   + *(a.ptr(N1,N2)-d_ijk(N3)))*d_xyz(N3)*d_xyz(N4)*0.5) :
+	 (boundary(N4,1) ?
+	  ((*(a.ptr(N1,N2)+d_ijk(N3))
+	    - *(a.ptr(N1,N2)-d_ijk(N3))
+	    - *(a.ptr(N1,N2)+d_ijk(N3)-d_ijk(N4))
+	    + *(a.ptr(N1,N2)-d_ijk(N3)-d_ijk(N4)))*d_xyz(N3)*d_xyz(N4)*0.5) :
+	  ((*(a.ptr(N1,N2)+d_ijk(N3)+d_ijk(N4))
+	    - *(a.ptr(N1,N2)-d_ijk(N3)+d_ijk(N4))
+	    - *(a.ptr(N1,N2)+d_ijk(N3)-d_ijk(N4))
+	    + *(a.ptr(N1,N2)-d_ijk(N3)-d_ijk(N4)))*d_xyz(N3)*d_xyz(N4)*0.25)))));
+  }
+  dd_boundary_Tensor2_symmetric(const Tensor2_symmetric<T*,Dim01> &A,
+		      const Tensor1<int,Dim23> &D_ijk,
+		      const Tensor1<double,Dim23> &D_xyz,
+		      const Tensor2<bool,Dim23,2> &Boundary)
+    : a(A), d_ijk(D_ijk), d_xyz(D_xyz), boundary(Boundary) {}
+};
+
+template<class T, int Dim01, int Dim23, char i, char j, char k, char l>
+inline const Tensor4_ddg_Expr<const dd_boundary_Tensor2_symmetric<T,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,double>::V,Dim01,Dim23,i,j,k,l>
+dd_boundary(const Tensor2_symmetric<T*,Dim01> &a,
+   const Index<i,Dim01> index1, const Index<j,Dim01> index2,
+   const Index<k,Dim23> index3, const Index<l,Dim23> index4,
+   const Tensor1<int,Dim23> &d_ijk, const Tensor1<double,Dim23> &d_xyz,
+   const Tensor2<bool,Dim23,2> &boundary)
+{
+  typedef const dd_boundary_Tensor2_symmetric<T,Dim01,Dim23,i,j,k,l> Tensor_Expr;
+  return Tensor4_ddg_Expr<Tensor_Expr,typename promote<T,double>::V,Dim01,Dim23,i,j,k,l>
+    (Tensor_Expr(a,d_ijk,d_xyz,boundary));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/diffusion_Tensor2_symmetric.h
--- a/Tensor2_symmetric/diffusion_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/* Computes 2*del^2 of a Tensor2_symmetric<T*,Dim> but uses diagonal
-   derivatives for half of it.  Yields a Tensor2_symmetric. */
-
-template<class T, int Dim, char i, char j>
-class diffusion_Tensor2_symmetric
-{
-  const Tensor2_symmetric<T*,Dim> &a;
-  const int di,dj,dk;
-  const double dx;
-public:
-  typename promote<T,double>::V operator()(const int N1, const int N2) const
-  {
-    return
-      ((*(a.ptr(N1,N2)+di) - 2*a(N1,N2) + *(a.ptr(N1,N2)-di))
-       + (*(a.ptr(N1,N2)+dj) - 2*a(N1,N2) + *(a.ptr(N1,N2)-dj))
-       + (*(a.ptr(N1,N2)+dk) - 2*a(N1,N2) + *(a.ptr(N1,N2)-dk))
-       + ((*(a.ptr(N1,N2)+di+dj) + *(a.ptr(N1,N2)+di-dj)
-	   + *(a.ptr(N1,N2)-di+dj) + *(a.ptr(N1,N2)-di-dj)
-	   - 4*a(N1,N2))
-	  + (*(a.ptr(N1,N2)+di+dk) + *(a.ptr(N1,N2)+di-dk)
-	     + *(a.ptr(N1,N2)-di+dk) + *(a.ptr(N1,N2)-di-dk)
-	     - 4*a(N1,N2))
-	  + (*(a.ptr(N1,N2)+dj+dk) + *(a.ptr(N1,N2)+dj-dk)
-	     + *(a.ptr(N1,N2)-dj+dk) + *(a.ptr(N1,N2)-dj-dk)
-	     - 4*a(N1,N2)))/(std::sqrt(2.0)))*dx*dx;
-  }
-  diffusion_Tensor2_symmetric(const Tensor2_symmetric<T*,Dim> &A, const int Di,
-			      const int Dj, const int Dk,
-			      const double Dx):
-    a(A), di(Di), dj(Dj), dk(Dk), dx(Dx) {}
-};
-
-template<class T, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr
-<const diffusion_Tensor2_symmetric<T,Dim,i,j>,typename promote<T,double>::V,Dim,i,j>
-diffusion(const Tensor2_symmetric<T*,Dim> &a, const Index<i,Dim> index1,
-	  const Index<j,Dim> index2,
-	  const int &di, const int &dj, const int &dk,
-	  const double &dx)
-{
-  typedef const diffusion_Tensor2_symmetric<T,Dim,i,j> Tensor_Expr;
-  return Tensor2_symmetric_Expr<Tensor_Expr,typename promote<T,double>::V,Dim,i,j>
-    (Tensor_Expr(a,di,dj,dk,dx));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/diffusion_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/diffusion_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,44 @@
+/* Computes 2*del^2 of a Tensor2_symmetric<T*,Dim> but uses diagonal
+   derivatives for half of it.  Yields a Tensor2_symmetric. */
+
+template<class T, int Dim, char i, char j>
+class diffusion_Tensor2_symmetric
+{
+  const Tensor2_symmetric<T*,Dim> &a;
+  const int di,dj,dk;
+  const double dx;
+public:
+  typename promote<T,double>::V operator()(const int N1, const int N2) const
+  {
+    return
+      ((*(a.ptr(N1,N2)+di) - 2*a(N1,N2) + *(a.ptr(N1,N2)-di))
+       + (*(a.ptr(N1,N2)+dj) - 2*a(N1,N2) + *(a.ptr(N1,N2)-dj))
+       + (*(a.ptr(N1,N2)+dk) - 2*a(N1,N2) + *(a.ptr(N1,N2)-dk))
+       + ((*(a.ptr(N1,N2)+di+dj) + *(a.ptr(N1,N2)+di-dj)
+	   + *(a.ptr(N1,N2)-di+dj) + *(a.ptr(N1,N2)-di-dj)
+	   - 4*a(N1,N2))
+	  + (*(a.ptr(N1,N2)+di+dk) + *(a.ptr(N1,N2)+di-dk)
+	     + *(a.ptr(N1,N2)-di+dk) + *(a.ptr(N1,N2)-di-dk)
+	     - 4*a(N1,N2))
+	  + (*(a.ptr(N1,N2)+dj+dk) + *(a.ptr(N1,N2)+dj-dk)
+	     + *(a.ptr(N1,N2)-dj+dk) + *(a.ptr(N1,N2)-dj-dk)
+	     - 4*a(N1,N2)))/(std::sqrt(2.0)))*dx*dx;
+  }
+  diffusion_Tensor2_symmetric(const Tensor2_symmetric<T*,Dim> &A, const int Di,
+			      const int Dj, const int Dk,
+			      const double Dx):
+    a(A), di(Di), dj(Dj), dk(Dk), dx(Dx) {}
+};
+
+template<class T, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr
+<const diffusion_Tensor2_symmetric<T,Dim,i,j>,typename promote<T,double>::V,Dim,i,j>
+diffusion(const Tensor2_symmetric<T*,Dim> &a, const Index<i,Dim> index1,
+	  const Index<j,Dim> index2,
+	  const int &di, const int &dj, const int &dk,
+	  const double &dx)
+{
+  typedef const diffusion_Tensor2_symmetric<T,Dim,i,j> Tensor_Expr;
+  return Tensor2_symmetric_Expr<Tensor_Expr,typename promote<T,double>::V,Dim,i,j>
+    (Tensor_Expr(a,di,dj,dk,dx));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/generic_minus_Tensor2_symmetric.h
--- a/Tensor2_symmetric/generic_minus_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/* Subtracts a generic from a Tensor2_symmetric, yielding a
-   Tensor2_symmetric. */
-
-template<class A, class T, class U, int Dim, char i, char j>
-class generic_minus_Tensor2_symmetric
-{
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-  const U d;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return d-iterA(N1,N2);
-  }
-  generic_minus_Tensor2_symmetric(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
-				  const U &d0): iterA(a), d(d0) {}
-};
-
-template<class A, class T, class U, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr
-<const generic_minus_Tensor2_symmetric<A,T,U,Dim,i,j>,typename promote<T,U>::V,Dim,i,j>
-operator-(const U &d0, const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
-{
-  typedef const generic_minus_Tensor2_symmetric<A,T,U,Dim,i,j> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
-    (TensorExpr(a,d0));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/generic_minus_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/generic_minus_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,26 @@
+/* Subtracts a generic from a Tensor2_symmetric, yielding a
+   Tensor2_symmetric. */
+
+template<class A, class T, class U, int Dim, char i, char j>
+class generic_minus_Tensor2_symmetric
+{
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+  const U d;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return d-iterA(N1,N2);
+  }
+  generic_minus_Tensor2_symmetric(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a,
+				  const U &d0): iterA(a), d(d0) {}
+};
+
+template<class A, class T, class U, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr
+<const generic_minus_Tensor2_symmetric<A,T,U,Dim,i,j>,typename promote<T,U>::V,Dim,i,j>
+operator-(const U &d0, const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
+{
+  typedef const generic_minus_Tensor2_symmetric<A,T,U,Dim,i,j> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j>
+    (TensorExpr(a,d0));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/interpolate_Tensor2_symmetric.h
--- a/Tensor2_symmetric/interpolate_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/* Interpolates to (i0+distance[0], j0+distance[1], k0+distance[2])
-   yielding a Tensor2_symmetric.  (i0,j0,k0) are 3D array coordinates,
-   conjugate==1-distance, and (di,dj,dk) are the stride of the array
-   coordinates.  It is assumed that the Tensor2_symmetric<T*,Dim> is zero
-   centered. */
-
-template<class T, int Dim, char i, char j>
-class interpolate_Tensor2_symmetric
-{
-  const Tensor2_symmetric<T*,Dim> &a;
-  const int di,dj,dk,i0,j0,k0;
-  const double *distance, *conjugate;
-public:
-  typename promote<T,double>::V operator()(const int N1, const int N2) const
-  {
-  return 
-    conjugate[0]*conjugate[1]*conjugate[2]
-    * (*(a.ptr(N1,N2) + di*i0 + dj*j0 + dk*k0))
-    + distance[0]*conjugate[1]*conjugate[2]
-    * (*(a.ptr(N1,N2) + di*(i0+1) + dj*(j0) + dk*(k0)))
-    + conjugate[0]*distance[1]*conjugate[2]
-    * (*(a.ptr(N1,N2) + di*(i0) + dj*(j0+1) + dk*(k0)))
-    + distance[0]*distance[1]*conjugate[2]
-    * (*(a.ptr(N1,N2) + di*(i0+1) + dj*(j0+1) + dk*(k0)))
-    + conjugate[0]*conjugate[1]*distance[2]
-    * (*(a.ptr(N1,N2) + di*(i0) + dj*(j0) + dk*(k0+1)))
-    + distance[0]*conjugate[1]*distance[2]
-    * (*(a.ptr(N1,N2) + di*(i0+1) + dj*(j0) + dk*(k0+1)))
-    + conjugate[0]*distance[1]*distance[2]
-    * (*(a.ptr(N1,N2) + di*(i0) + dj*(j0+1) + dk*(k0+1)))
-    + distance[0]*distance[1]*distance[2]
-    * (*(a.ptr(N1,N2) + di*(i0+1) + dj*(j0+1) + dk*(k0+1)));
-  }
-  interpolate_Tensor2_symmetric(const Tensor2_symmetric<T*,Dim> &A, const int Di,
-				const int Dj, const int Dk, const int I0,
-				const int J0, const int K0,
-				const double Distance[3],
-				const double Conjugate[3]):
-    a(A), di(Di), dj(Dj), dk(Dk), i0(I0), j0(J0), k0(K0),
-    distance(Distance), conjugate(Conjugate) {}
-};
-
-template<class T, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr
-<const interpolate_Tensor2_symmetric<T,Dim,i,j>,typename promote<T,double>::V,Dim,i,j>
-interpolate(const Tensor2_symmetric<T*,Dim> &a, const Index<i,Dim> index1,
-	    const Index<j,Dim> index2,
-	    const int &di, const int &dj, const int &dk,
-	    const int &i0, const int &j0, const int &k0,
-	    const double distance[3], const double conjugate[3])
-{
-  typedef const interpolate_Tensor2_symmetric<T,Dim,i,j> Tensor_Expr;
-  return Tensor2_symmetric_Expr<Tensor_Expr,typename promote<T,double>::V,Dim,i,j>
-    (Tensor_Expr(a,di,dj,dk,i0,j0,k0,distance,conjugate));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/interpolate_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/interpolate_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,55 @@
+/* Interpolates to (i0+distance[0], j0+distance[1], k0+distance[2])
+   yielding a Tensor2_symmetric.  (i0,j0,k0) are 3D array coordinates,
+   conjugate==1-distance, and (di,dj,dk) are the stride of the array
+   coordinates.  It is assumed that the Tensor2_symmetric<T*,Dim> is zero
+   centered. */
+
+template<class T, int Dim, char i, char j>
+class interpolate_Tensor2_symmetric
+{
+  const Tensor2_symmetric<T*,Dim> &a;
+  const int di,dj,dk,i0,j0,k0;
+  const double *distance, *conjugate;
+public:
+  typename promote<T,double>::V operator()(const int N1, const int N2) const
+  {
+  return 
+    conjugate[0]*conjugate[1]*conjugate[2]
+    * (*(a.ptr(N1,N2) + di*i0 + dj*j0 + dk*k0))
+    + distance[0]*conjugate[1]*conjugate[2]
+    * (*(a.ptr(N1,N2) + di*(i0+1) + dj*(j0) + dk*(k0)))
+    + conjugate[0]*distance[1]*conjugate[2]
+    * (*(a.ptr(N1,N2) + di*(i0) + dj*(j0+1) + dk*(k0)))
+    + distance[0]*distance[1]*conjugate[2]
+    * (*(a.ptr(N1,N2) + di*(i0+1) + dj*(j0+1) + dk*(k0)))
+    + conjugate[0]*conjugate[1]*distance[2]
+    * (*(a.ptr(N1,N2) + di*(i0) + dj*(j0) + dk*(k0+1)))
+    + distance[0]*conjugate[1]*distance[2]
+    * (*(a.ptr(N1,N2) + di*(i0+1) + dj*(j0) + dk*(k0+1)))
+    + conjugate[0]*distance[1]*distance[2]
+    * (*(a.ptr(N1,N2) + di*(i0) + dj*(j0+1) + dk*(k0+1)))
+    + distance[0]*distance[1]*distance[2]
+    * (*(a.ptr(N1,N2) + di*(i0+1) + dj*(j0+1) + dk*(k0+1)));
+  }
+  interpolate_Tensor2_symmetric(const Tensor2_symmetric<T*,Dim> &A, const int Di,
+				const int Dj, const int Dk, const int I0,
+				const int J0, const int K0,
+				const double Distance[3],
+				const double Conjugate[3]):
+    a(A), di(Di), dj(Dj), dk(Dk), i0(I0), j0(J0), k0(K0),
+    distance(Distance), conjugate(Conjugate) {}
+};
+
+template<class T, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr
+<const interpolate_Tensor2_symmetric<T,Dim,i,j>,typename promote<T,double>::V,Dim,i,j>
+interpolate(const Tensor2_symmetric<T*,Dim> &a, const Index<i,Dim> index1,
+	    const Index<j,Dim> index2,
+	    const int &di, const int &dj, const int &dk,
+	    const int &i0, const int &j0, const int &k0,
+	    const double distance[3], const double conjugate[3])
+{
+  typedef const interpolate_Tensor2_symmetric<T,Dim,i,j> Tensor_Expr;
+  return Tensor2_symmetric_Expr<Tensor_Expr,typename promote<T,double>::V,Dim,i,j>
+    (Tensor_Expr(a,di,dj,dk,i0,j0,k0,distance,conjugate));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/minus_Tensor2_symmetric.h
--- a/Tensor2_symmetric/minus_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-/* Unary minus operator. */
-
-template<class A, class T, int Dim, char i, char j>
-class minus_Tensor2_symmetric
-{
-public:
-  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
-public:
-  T operator()(const int N1, const int N2) const
-  {
-    return -iterA(N1,N2);
-  }
-  minus_Tensor2_symmetric(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a):
-    iterA(a) {}
-};
-
-template<class A, class T, int Dim, char i, char j>
-inline const Tensor2_symmetric_Expr<const minus_Tensor2_symmetric<A,T,Dim,i,j>,
-  T,Dim,i,j>
-operator-(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
-{
-  typedef const minus_Tensor2_symmetric<A,T,Dim,i,j> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(TensorExpr(a));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor2_symmetric/minus_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor2_symmetric/minus_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,24 @@
+/* Unary minus operator. */
+
+template<class A, class T, int Dim, char i, char j>
+class minus_Tensor2_symmetric
+{
+public:
+  const Tensor2_symmetric_Expr<A,T,Dim,i,j> iterA;
+public:
+  T operator()(const int N1, const int N2) const
+  {
+    return -iterA(N1,N2);
+  }
+  minus_Tensor2_symmetric(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a):
+    iterA(a) {}
+};
+
+template<class A, class T, int Dim, char i, char j>
+inline const Tensor2_symmetric_Expr<const minus_Tensor2_symmetric<A,T,Dim,i,j>,
+  T,Dim,i,j>
+operator-(const Tensor2_symmetric_Expr<A,T,Dim,i,j> &a)
+{
+  typedef const minus_Tensor2_symmetric<A,T,Dim,i,j> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(TensorExpr(a));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_Expr.h
--- a/Tensor3/Tensor3_Expr.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-/* Declare a wrapper class for generic rank 3 Tensor expressions.
-   There isn't a Tensor3 class yet.  I only use Tensor3_Expr as an
-   intermediate expression which immediately get contracted with
-   something to make a Tensor2 or Tensor1. */
-
-#include "Tensor3_times_generic.h"
-#include "Tensor3_times_Tensor1.h"
-#include "Tensor3_times_Tensor2_symmetric.h"
-#include "Tensor3_times_Tensor2.h"
-#include "Tensor3_times_Tensor3.h"
-#include "Tensor3_times_Tensor3_dg.h"
-#include "Tensor3_plus_Tensor3.h"
-#include "Tensor3_or_Tensor3.h"
-#include "Tensor3_minus_Tensor3_dg.h"
-
-template<class A, class T, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-class Tensor3_Expr
-{
-  A iter;
-public:
-  Tensor3_Expr(A &a): iter(a) {}
-  T operator()(const int N1, const int N2, const int N3) const
-  {
-    return iter(N1,N2,N3);
-  }
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_Expr.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3/Tensor3_Expr.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,27 @@
+/* Declare a wrapper class for generic rank 3 Tensor expressions.
+   There isn't a Tensor3 class yet.  I only use Tensor3_Expr as an
+   intermediate expression which immediately get contracted with
+   something to make a Tensor2 or Tensor1. */
+
+#include "Tensor3_times_generic.hpp"
+#include "Tensor3_times_Tensor1.hpp"
+#include "Tensor3_times_Tensor2_symmetric.hpp"
+#include "Tensor3_times_Tensor2.hpp"
+#include "Tensor3_times_Tensor3.hpp"
+#include "Tensor3_times_Tensor3_dg.hpp"
+#include "Tensor3_plus_Tensor3.hpp"
+#include "Tensor3_or_Tensor3.hpp"
+#include "Tensor3_minus_Tensor3_dg.hpp"
+
+template<class A, class T, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+class Tensor3_Expr
+{
+  A iter;
+public:
+  Tensor3_Expr(A &a): iter(a) {}
+  T operator()(const int N1, const int N2, const int N3) const
+  {
+    return iter(N1,N2,N3);
+  }
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_contracted.h
--- a/Tensor3/Tensor3_contracted.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,77 +0,0 @@
-/* A helper class that automatically returns the internal contraction
-   of a rank 3 tensor. */
-
-/* Contracts second and third indices. */
-
-template<class A, class T, int Dim>
-class Tensor3_contracted_12
-{
-  const A iterA;
-
-  template<int Current_Dim>
-  T eval(const int N, const Number<Current_Dim> &ND) const
-  {
-    return iterA(N,Current_Dim-1,Current_Dim-1)
-      + eval(N,Number<Current_Dim-1>());
-  }
-  T eval(const int N, const Number<1> &ND) const
-  {
-    return iterA(N,0,0);
-  }
-public:
-  T operator()(const int N) const
-  {
-    return eval(N,Number<Dim>());
-  }
-  Tensor3_contracted_12(const A &a): iterA(a) {}
-};
-
-/* Contracts first and third indices. */
-
-template<class A, class T, int Dim>
-class Tensor3_contracted_02
-{
-  const A iterA;
-
-  template<int Current_Dim>
-  T eval(const int N, const Number<Current_Dim> &ND) const
-  {
-    return iterA(Current_Dim-1,N,Current_Dim-1)
-      + eval(N,Number<Current_Dim-1>());
-  }
-  T eval(const int N, const Number<1> &ND) const
-  {
-    return iterA(0,N,0);
-  }
-public:
-  T operator()(const int N) const
-  {
-    return eval(N,Number<Dim>());
-  }
-  Tensor3_contracted_02(const A &a): iterA(a) {}
-};
-
-/* Contracts first and second indices. */
-
-template<class A, class T, int Dim>
-class Tensor3_contracted_01
-{
-  const A iterA;
-
-  template<int Current_Dim>
-  T eval(const int N, const Number<Current_Dim> &ND) const
-  {
-    return iterA(Current_Dim-1,Current_Dim-1,N)
-      + eval(N,Number<Current_Dim-1>());
-  }
-  T eval(const int N, const Number<1> &ND) const
-  {
-    return iterA(0,0,N);
-  }
-public:
-  T operator()(const int N) const
-  {
-    return eval(N,Number<Dim>());
-  }
-  Tensor3_contracted_01(const A &a): iterA(a) {}
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_contracted.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3/Tensor3_contracted.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,77 @@
+/* A helper class that automatically returns the internal contraction
+   of a rank 3 tensor. */
+
+/* Contracts second and third indices. */
+
+template<class A, class T, int Dim>
+class Tensor3_contracted_12
+{
+  const A iterA;
+
+  template<int Current_Dim>
+  T eval(const int N, const Number<Current_Dim> &ND) const
+  {
+    return iterA(N,Current_Dim-1,Current_Dim-1)
+      + eval(N,Number<Current_Dim-1>());
+  }
+  T eval(const int N, const Number<1> &ND) const
+  {
+    return iterA(N,0,0);
+  }
+public:
+  T operator()(const int N) const
+  {
+    return eval(N,Number<Dim>());
+  }
+  Tensor3_contracted_12(const A &a): iterA(a) {}
+};
+
+/* Contracts first and third indices. */
+
+template<class A, class T, int Dim>
+class Tensor3_contracted_02
+{
+  const A iterA;
+
+  template<int Current_Dim>
+  T eval(const int N, const Number<Current_Dim> &ND) const
+  {
+    return iterA(Current_Dim-1,N,Current_Dim-1)
+      + eval(N,Number<Current_Dim-1>());
+  }
+  T eval(const int N, const Number<1> &ND) const
+  {
+    return iterA(0,N,0);
+  }
+public:
+  T operator()(const int N) const
+  {
+    return eval(N,Number<Dim>());
+  }
+  Tensor3_contracted_02(const A &a): iterA(a) {}
+};
+
+/* Contracts first and second indices. */
+
+template<class A, class T, int Dim>
+class Tensor3_contracted_01
+{
+  const A iterA;
+
+  template<int Current_Dim>
+  T eval(const int N, const Number<Current_Dim> &ND) const
+  {
+    return iterA(Current_Dim-1,Current_Dim-1,N)
+      + eval(N,Number<Current_Dim-1>());
+  }
+  T eval(const int N, const Number<1> &ND) const
+  {
+    return iterA(0,0,N);
+  }
+public:
+  T operator()(const int N) const
+  {
+    return eval(N,Number<Dim>());
+  }
+  Tensor3_contracted_01(const A &a): iterA(a) {}
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_minus_Tensor3_dg.h
--- a/Tensor3/Tensor3_minus_Tensor3_dg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,132 +0,0 @@
-/* Subtracts a Tensor3_dg from a Tensor3, yielding a Tensor3. */
-
-/* A(i,j,k)-B(i,j,k)->Tensor3 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-class Tensor3_minus_Tensor3
-{
-  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
-  const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)-iterB(N1,N2,N3);
-  }
-
-  Tensor3_minus_Tensor3(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-		       const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> &b)
-    : iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_Expr
-<const Tensor3_minus_Tensor3<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-operator-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-	  const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> &b)
-{
-  typedef const Tensor3_minus_Tensor3<A,B,T,U,Dim0,Dim1,Dim2,i,j,k> TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)-B(i,k,j)->Tensor3 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-class Tensor3_minus_Tensor3_21
-{
-  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
-  const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)-iterB(N1,N3,N2);
-  }
-
-  Tensor3_minus_Tensor3_21(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-			  const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> &b)
-    :iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_Expr
-<const Tensor3_minus_Tensor3_21<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-operator-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-	  const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> &b)
-{
-  typedef const Tensor3_minus_Tensor3_21<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)-B(j,i,k)->Tensor3 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-class Tensor3_minus_Tensor3_10
-{
-  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
-  const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)-iterB(N2,N1,N3);
-  }
-
-  Tensor3_minus_Tensor3_10(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-			  const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> &b)
-    :iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_Expr
-<const Tensor3_minus_Tensor3_10<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-operator-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-	  const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> &b)
-{
-  typedef const Tensor3_minus_Tensor3_10<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)-B(k,i,j)->Tensor3 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-class Tensor3_minus_Tensor3_120
-{
-  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
-  const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)-iterB(N3,N1,N2);
-  }
-
-  Tensor3_minus_Tensor3_120(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-			   const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> &b)
-    : iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_Expr
-<const Tensor3_minus_Tensor3_120<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-operator-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-	  const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> &b)
-{
-  typedef const Tensor3_minus_Tensor3_120<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_minus_Tensor3_dg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3/Tensor3_minus_Tensor3_dg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,132 @@
+/* Subtracts a Tensor3_dg from a Tensor3, yielding a Tensor3. */
+
+/* A(i,j,k)-B(i,j,k)->Tensor3 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+class Tensor3_minus_Tensor3
+{
+  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
+  const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)-iterB(N1,N2,N3);
+  }
+
+  Tensor3_minus_Tensor3(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+		       const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> &b)
+    : iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_Expr
+<const Tensor3_minus_Tensor3<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+operator-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+	  const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> &b)
+{
+  typedef const Tensor3_minus_Tensor3<A,B,T,U,Dim0,Dim1,Dim2,i,j,k> TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)-B(i,k,j)->Tensor3 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+class Tensor3_minus_Tensor3_21
+{
+  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
+  const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)-iterB(N1,N3,N2);
+  }
+
+  Tensor3_minus_Tensor3_21(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+			  const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> &b)
+    :iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_Expr
+<const Tensor3_minus_Tensor3_21<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+operator-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+	  const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> &b)
+{
+  typedef const Tensor3_minus_Tensor3_21<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)-B(j,i,k)->Tensor3 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+class Tensor3_minus_Tensor3_10
+{
+  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
+  const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)-iterB(N2,N1,N3);
+  }
+
+  Tensor3_minus_Tensor3_10(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+			  const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> &b)
+    :iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_Expr
+<const Tensor3_minus_Tensor3_10<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+operator-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+	  const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> &b)
+{
+  typedef const Tensor3_minus_Tensor3_10<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)-B(k,i,j)->Tensor3 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+class Tensor3_minus_Tensor3_120
+{
+  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
+  const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)-iterB(N3,N1,N2);
+  }
+
+  Tensor3_minus_Tensor3_120(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+			   const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> &b)
+    : iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_Expr
+<const Tensor3_minus_Tensor3_120<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+operator-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+	  const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> &b)
+{
+  typedef const Tensor3_minus_Tensor3_120<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_or_Tensor3.h
--- a/Tensor3/Tensor3_or_Tensor3.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-/* Adds a Tensor3 to a Tensor3, yielding a Tensor3_dg. */
-
-/* A(i,j,k)+B(i,k,j)->Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-class Tensor3_or_Tensor3_12
-{
-  const Tensor3_Expr<A,T,Dim0,Dim12,Dim12,i,j,k> iterA;
-  const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,k,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N3,N1,N2)+iterB(N3,N2,N1);
-  }
-
-  Tensor3_or_Tensor3_12(const Tensor3_Expr<A,T,Dim0,Dim12,Dim12,i,j,k> &a,
-			const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,k,j> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const Tensor3_dg_Expr
-<const Tensor3_or_Tensor3_12<A,B,T,U,Dim0,Dim12,i,j,k>,
-  typename promote<T,U>::V,Dim0,Dim12,j,k,i>
-operator||(const Tensor3_Expr<A,T,Dim0,Dim12,Dim12,i,j,k> &a,
-	   const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,k,j> &b)
-{
-  typedef const Tensor3_or_Tensor3_12<A,B,T,U,Dim0,Dim12,i,j,k> TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim12,j,k,i>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)+B(k,j,i)->Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim02, int Dim1,
-  char i, char j, char k>
-class Tensor3_or_Tensor3_02
-{
-  const Tensor3_Expr<A,T,Dim02,Dim1,Dim02,i,j,k> iterA;
-  const Tensor3_Expr<B,U,Dim02,Dim1,Dim02,k,j,i> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N3,N2)+iterB(N2,N3,N1);
-  }
-
-  Tensor3_or_Tensor3_02(const Tensor3_Expr<A,T,Dim02,Dim1,Dim02,i,j,k> &a,
-			const Tensor3_Expr<B,U,Dim02,Dim1,Dim02,k,j,i> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim02, int Dim1,
-  char i, char j, char k>
-inline const Tensor3_dg_Expr
-<const Tensor3_or_Tensor3_02<A,B,T,U,Dim02,Dim1,i,j,k>,
-  typename promote<T,U>::V,Dim02,Dim1,i,k,j>
-operator||(const Tensor3_Expr<A,T,Dim02,Dim1,Dim02,i,j,k> &a,
-	   const Tensor3_Expr<B,U,Dim02,Dim1,Dim02,k,j,i> &b)
-{
-  typedef const Tensor3_or_Tensor3_02<A,B,T,U,Dim02,Dim1,i,j,k> TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim02,Dim1,i,k,j>
-    (TensorExpr(a,b));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_or_Tensor3.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3/Tensor3_or_Tensor3.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,66 @@
+/* Adds a Tensor3 to a Tensor3, yielding a Tensor3_dg. */
+
+/* A(i,j,k)+B(i,k,j)->Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+class Tensor3_or_Tensor3_12
+{
+  const Tensor3_Expr<A,T,Dim0,Dim12,Dim12,i,j,k> iterA;
+  const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,k,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N3,N1,N2)+iterB(N3,N2,N1);
+  }
+
+  Tensor3_or_Tensor3_12(const Tensor3_Expr<A,T,Dim0,Dim12,Dim12,i,j,k> &a,
+			const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,k,j> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const Tensor3_dg_Expr
+<const Tensor3_or_Tensor3_12<A,B,T,U,Dim0,Dim12,i,j,k>,
+  typename promote<T,U>::V,Dim0,Dim12,j,k,i>
+operator||(const Tensor3_Expr<A,T,Dim0,Dim12,Dim12,i,j,k> &a,
+	   const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,k,j> &b)
+{
+  typedef const Tensor3_or_Tensor3_12<A,B,T,U,Dim0,Dim12,i,j,k> TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim12,j,k,i>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)+B(k,j,i)->Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim02, int Dim1,
+  char i, char j, char k>
+class Tensor3_or_Tensor3_02
+{
+  const Tensor3_Expr<A,T,Dim02,Dim1,Dim02,i,j,k> iterA;
+  const Tensor3_Expr<B,U,Dim02,Dim1,Dim02,k,j,i> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N3,N2)+iterB(N2,N3,N1);
+  }
+
+  Tensor3_or_Tensor3_02(const Tensor3_Expr<A,T,Dim02,Dim1,Dim02,i,j,k> &a,
+			const Tensor3_Expr<B,U,Dim02,Dim1,Dim02,k,j,i> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim02, int Dim1,
+  char i, char j, char k>
+inline const Tensor3_dg_Expr
+<const Tensor3_or_Tensor3_02<A,B,T,U,Dim02,Dim1,i,j,k>,
+  typename promote<T,U>::V,Dim02,Dim1,i,k,j>
+operator||(const Tensor3_Expr<A,T,Dim02,Dim1,Dim02,i,j,k> &a,
+	   const Tensor3_Expr<B,U,Dim02,Dim1,Dim02,k,j,i> &b)
+{
+  typedef const Tensor3_or_Tensor3_02<A,B,T,U,Dim02,Dim1,i,j,k> TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim02,Dim1,i,k,j>
+    (TensorExpr(a,b));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_plus_Tensor3.h
--- a/Tensor3/Tensor3_plus_Tensor3.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,132 +0,0 @@
-/* Adds a Tensor3 to a Tensor3, yielding a Tensor3. */
-
-/* A(i,j,k)+B(i,j,k)->Tensor3 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-class Tensor3_plus_Tensor3
-{
-  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
-  const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)+iterB(N1,N2,N3);
-  }
-
-  Tensor3_plus_Tensor3(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-		       const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> &b)
-    : iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_Expr
-<const Tensor3_plus_Tensor3<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-operator+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-	  const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> &b)
-{
-  typedef const Tensor3_plus_Tensor3<A,B,T,U,Dim0,Dim1,Dim2,i,j,k> TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)+B(i,k,j)->Tensor3 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-class Tensor3_plus_Tensor3_21
-{
-  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
-  const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)+iterB(N1,N3,N2);
-  }
-
-  Tensor3_plus_Tensor3_21(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-			  const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> &b)
-    :iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_Expr
-<const Tensor3_plus_Tensor3_21<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-operator+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-	  const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> &b)
-{
-  typedef const Tensor3_plus_Tensor3_21<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)+B(j,i,k)->Tensor3 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-class Tensor3_plus_Tensor3_10
-{
-  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
-  const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)+iterB(N2,N1,N3);
-  }
-
-  Tensor3_plus_Tensor3_10(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-			  const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> &b)
-    :iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_Expr
-<const Tensor3_plus_Tensor3_10<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-operator+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-	  const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> &b)
-{
-  typedef const Tensor3_plus_Tensor3_10<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)+B(k,i,j)->Tensor3 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-class Tensor3_plus_Tensor3_120
-{
-  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
-  const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)+iterB(N3,N1,N2);
-  }
-
-  Tensor3_plus_Tensor3_120(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-			   const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> &b)
-    : iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_Expr
-<const Tensor3_plus_Tensor3_120<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-operator+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-	  const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> &b)
-{
-  typedef const Tensor3_plus_Tensor3_120<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_plus_Tensor3.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3/Tensor3_plus_Tensor3.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,132 @@
+/* Adds a Tensor3 to a Tensor3, yielding a Tensor3. */
+
+/* A(i,j,k)+B(i,j,k)->Tensor3 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+class Tensor3_plus_Tensor3
+{
+  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
+  const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)+iterB(N1,N2,N3);
+  }
+
+  Tensor3_plus_Tensor3(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+		       const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> &b)
+    : iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_Expr
+<const Tensor3_plus_Tensor3<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+operator+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+	  const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> &b)
+{
+  typedef const Tensor3_plus_Tensor3<A,B,T,U,Dim0,Dim1,Dim2,i,j,k> TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)+B(i,k,j)->Tensor3 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+class Tensor3_plus_Tensor3_21
+{
+  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
+  const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)+iterB(N1,N3,N2);
+  }
+
+  Tensor3_plus_Tensor3_21(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+			  const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> &b)
+    :iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_Expr
+<const Tensor3_plus_Tensor3_21<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+operator+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+	  const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> &b)
+{
+  typedef const Tensor3_plus_Tensor3_21<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)+B(j,i,k)->Tensor3 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+class Tensor3_plus_Tensor3_10
+{
+  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
+  const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)+iterB(N2,N1,N3);
+  }
+
+  Tensor3_plus_Tensor3_10(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+			  const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> &b)
+    :iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_Expr
+<const Tensor3_plus_Tensor3_10<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+operator+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+	  const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> &b)
+{
+  typedef const Tensor3_plus_Tensor3_10<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)+B(k,i,j)->Tensor3 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+class Tensor3_plus_Tensor3_120
+{
+  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
+  const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)+iterB(N3,N1,N2);
+  }
+
+  Tensor3_plus_Tensor3_120(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+			   const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> &b)
+    : iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_Expr
+<const Tensor3_plus_Tensor3_120<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+operator+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+	  const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> &b)
+{
+  typedef const Tensor3_plus_Tensor3_120<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_times_Tensor1.h
--- a/Tensor3/Tensor3_times_Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,123 +0,0 @@
-/* Declarations for expressions like Tensor3*Tensor1 -> Tensor2 */
-
-/* A(i,j,k)*B(j) -> Tensor2 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-class Tensor3_times_Tensor1_1
-{
-  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
-  const Tensor1_Expr<B,U,Dim1,j> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N)  const
-  {
-    return iterA(N1,Current_Dim-1,N2)*iterB(Current_Dim-1)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &N) const
-  {
-    return iterA(N1,0,N2)*iterB(0);
-  }
-public:
-  Tensor3_times_Tensor1_1(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-			const Tensor1_Expr<B,U,Dim1,j> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim1>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor2_Expr
-<const Tensor3_times_Tensor1_1<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim0,Dim2,i,k>
-operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-	  const Tensor1_Expr<B,U,Dim1,j> &b)
-{
-  typedef const Tensor3_times_Tensor1_1<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim2,i,k>
-    (TensorExpr(a,b));
-}
-
-/* B(j)*A(i,j,k) -> Tensor2 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor2_Expr
-<const Tensor3_times_Tensor1_1<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim0,Dim2,i,k>
-operator*(const Tensor1_Expr<B,U,Dim1,j> &b,
-	  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a)
-{
-  typedef const Tensor3_times_Tensor1_1<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim2,i,k>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)*B(i) -> Tensor2 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-class Tensor3_times_Tensor1_0
-{
-  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
-  const Tensor1_Expr<B,U,Dim0,i> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N)  const
-  {
-    return iterA(Current_Dim-1,N1,N2)*iterB(Current_Dim-1)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &N) const
-  {
-    return iterA(0,N1,N2)*iterB(0);
-  }
-public:
-  Tensor3_times_Tensor1_0(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-			  const Tensor1_Expr<B,U,Dim0,i> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim0>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor2_Expr
-<const Tensor3_times_Tensor1_0<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim1,Dim2,j,k>
-operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-	  const Tensor1_Expr<B,U,Dim0,i> &b)
-{
-  typedef const Tensor3_times_Tensor1_0<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,k>
-    (TensorExpr(a,b));
-}
-
-/* B(i)*A(i,j,k) -> Tensor2 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor2_Expr
-<const Tensor3_times_Tensor1_0<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim1,Dim2,j,k>
-operator*(const Tensor1_Expr<B,U,Dim0,i> &b,
-	  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a)
-{
-  typedef const Tensor3_times_Tensor1_0<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,k>
-    (TensorExpr(a,b));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_times_Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3/Tensor3_times_Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,123 @@
+/* Declarations for expressions like Tensor3*Tensor1 -> Tensor2 */
+
+/* A(i,j,k)*B(j) -> Tensor2 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+class Tensor3_times_Tensor1_1
+{
+  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
+  const Tensor1_Expr<B,U,Dim1,j> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N)  const
+  {
+    return iterA(N1,Current_Dim-1,N2)*iterB(Current_Dim-1)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &N) const
+  {
+    return iterA(N1,0,N2)*iterB(0);
+  }
+public:
+  Tensor3_times_Tensor1_1(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+			const Tensor1_Expr<B,U,Dim1,j> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim1>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor2_Expr
+<const Tensor3_times_Tensor1_1<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim0,Dim2,i,k>
+operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+	  const Tensor1_Expr<B,U,Dim1,j> &b)
+{
+  typedef const Tensor3_times_Tensor1_1<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim2,i,k>
+    (TensorExpr(a,b));
+}
+
+/* B(j)*A(i,j,k) -> Tensor2 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor2_Expr
+<const Tensor3_times_Tensor1_1<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim0,Dim2,i,k>
+operator*(const Tensor1_Expr<B,U,Dim1,j> &b,
+	  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a)
+{
+  typedef const Tensor3_times_Tensor1_1<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim2,i,k>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)*B(i) -> Tensor2 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+class Tensor3_times_Tensor1_0
+{
+  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
+  const Tensor1_Expr<B,U,Dim0,i> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N)  const
+  {
+    return iterA(Current_Dim-1,N1,N2)*iterB(Current_Dim-1)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &N) const
+  {
+    return iterA(0,N1,N2)*iterB(0);
+  }
+public:
+  Tensor3_times_Tensor1_0(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+			  const Tensor1_Expr<B,U,Dim0,i> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim0>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor2_Expr
+<const Tensor3_times_Tensor1_0<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim1,Dim2,j,k>
+operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+	  const Tensor1_Expr<B,U,Dim0,i> &b)
+{
+  typedef const Tensor3_times_Tensor1_0<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,k>
+    (TensorExpr(a,b));
+}
+
+/* B(i)*A(i,j,k) -> Tensor2 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor2_Expr
+<const Tensor3_times_Tensor1_0<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim1,Dim2,j,k>
+operator*(const Tensor1_Expr<B,U,Dim0,i> &b,
+	  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a)
+{
+  typedef const Tensor3_times_Tensor1_0<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,k>
+    (TensorExpr(a,b));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_times_Tensor2.h
--- a/Tensor3/Tensor3_times_Tensor2.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,274 +0,0 @@
-/* This file has all of the declarations for expressions like
-   Tensor3*Tensor2 and Tensor2*Tensor3, yielding a
-   Tensor3 or Tensor1. */
-
-/* A(i,j,k)*B(j,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-class Tensor3_times_Tensor2_12
-{
-  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
-  const Tensor2_Expr<B,U,Dim1,Dim2,j,k> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,Current_Dim0-1,Current_Dim1-1)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,0,Current_Dim1-1)*iterB(0,Current_Dim1-1)
-      + eval(N1,Number<Dim1>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(N1,0,0)*iterB(0,0);
-  }
-public:
-  Tensor3_times_Tensor2_12
-  (const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-   const Tensor2_Expr<B,U,Dim1,Dim2,j,k> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim1>(),Number<Dim2>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_times_Tensor2_12<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim0,i>
-operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-	  const Tensor2_Expr<B,U,Dim1,Dim2,j,k> &b)
-{
-  typedef const Tensor3_times_Tensor2_12<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim0,i>(TensorExpr(a,b));
-}
-
-/* B(j,k)*A(i,j,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_times_Tensor2_12<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim0,i>
-operator*(const Tensor2_Expr<B,U,Dim1,Dim2,j,k> &b,
-	  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a)
-{
-  typedef const Tensor3_times_Tensor2_12<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim0,i>(TensorExpr(a,b));
-}
-
-/* A(j,i,k)*B(j,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-class Tensor3_times_Tensor2_02
-{
-  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,j,i,k> iterA;
-  const Tensor2_Expr<B,U,Dim0,Dim2,j,k> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,N1,Current_Dim1-1)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,N1,Current_Dim1-1)*iterB(0,Current_Dim1-1)
-      + eval(N1,Number<Dim0>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,N1,0)*iterB(0,0);
-  }
-public:
-  Tensor3_times_Tensor2_02
-  (const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,j,i,k> &a,
-   const Tensor2_Expr<B,U,Dim0,Dim2,j,k> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim0>(),Number<Dim2>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_times_Tensor2_02<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim1,i>
-operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,j,i,k> &a,
-	  const Tensor2_Expr<B,U,Dim0,Dim2,j,k> &b)
-{
-  typedef const Tensor3_times_Tensor2_02<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim1,i>(TensorExpr(a,b));
-}
-
-/* B(j,k)*A(j,i,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_times_Tensor2_02<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim1,i>
-operator*(const Tensor2_Expr<B,U,Dim0,Dim2,j,k> &b,
-	  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,j,i,k> &a)
-{
-  typedef const Tensor3_times_Tensor2_02<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim1,i>(TensorExpr(a,b));
-}
-
-/* A(j,k,i)*B(j,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-class Tensor3_times_Tensor2_01
-{
-  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,j,k,i> iterA;
-  const Tensor2_Expr<B,U,Dim0,Dim1,j,k> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,Current_Dim1-1,N1)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,Current_Dim1-1,N1)*iterB(0,Current_Dim1-1)
-      + eval(N1,Number<Dim0>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,0,N1)*iterB(0,0);
-  }
-public:
-  Tensor3_times_Tensor2_01
-  (const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,j,k,i> &a,
-   const Tensor2_Expr<B,U,Dim0,Dim1,j,k> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim0>(),Number<Dim1>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_times_Tensor2_01<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim2,i>
-operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,j,k,i> &a,
-	  const Tensor2_Expr<B,U,Dim0,Dim1,j,k> &b)
-{
-  typedef const Tensor3_times_Tensor2_01<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
-}
-
-/* B(j,k)*A(j,k,i)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_times_Tensor2_01<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim2,i>
-operator*(const Tensor2_Expr<B,U,Dim0,Dim1,j,k> &b,
-	  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,j,k,i> &a)
-{
-  typedef const Tensor3_times_Tensor2_01<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
-}
-
-/* A(i,j,k)*B(k,l)->Tensor3 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-class Tensor3_times_Tensor2_0
-{
-  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
-  const Tensor2_Expr<B,U,Dim2,Dim3,k,l> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
-		       const Number<Current_Dim> &N) const
-  {
-    return iterA(N1,N2,Current_Dim-1)*iterB(Current_Dim-1,N3)
-      + eval(N1,N2,N3,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
-		       const Number<1> &N) const
-  {
-    return iterA(N1,N2,0)*iterB(0,N3);
-  }
-public:
-  Tensor3_times_Tensor2_0(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-			  const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return eval(N1,N2,N3,Number<Dim2>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-inline const Tensor3_Expr
-<const Tensor3_times_Tensor2_0<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim0,Dim1,Dim3,i,j,l>
-operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-	  const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b)
-{
-  typedef const Tensor3_times_Tensor2_0<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
-    TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim3,i,j,l>
-    (TensorExpr(a,b));
-}
-
-/* B(k,l)*A(i,j,k)->Tensor3 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-inline const Tensor3_Expr
-<const Tensor3_times_Tensor2_0<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim0,Dim1,Dim3,i,j,l>
-operator*(const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b,
-	  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a)
-{
-  typedef const Tensor3_times_Tensor2_0<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
-    TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim3,i,j,l>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_times_Tensor2.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3/Tensor3_times_Tensor2.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,274 @@
+/* This file has all of the declarations for expressions like
+   Tensor3*Tensor2 and Tensor2*Tensor3, yielding a
+   Tensor3 or Tensor1. */
+
+/* A(i,j,k)*B(j,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+class Tensor3_times_Tensor2_12
+{
+  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
+  const Tensor2_Expr<B,U,Dim1,Dim2,j,k> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,Current_Dim0-1,Current_Dim1-1)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,0,Current_Dim1-1)*iterB(0,Current_Dim1-1)
+      + eval(N1,Number<Dim1>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(N1,0,0)*iterB(0,0);
+  }
+public:
+  Tensor3_times_Tensor2_12
+  (const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+   const Tensor2_Expr<B,U,Dim1,Dim2,j,k> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim1>(),Number<Dim2>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_times_Tensor2_12<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim0,i>
+operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+	  const Tensor2_Expr<B,U,Dim1,Dim2,j,k> &b)
+{
+  typedef const Tensor3_times_Tensor2_12<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim0,i>(TensorExpr(a,b));
+}
+
+/* B(j,k)*A(i,j,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_times_Tensor2_12<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim0,i>
+operator*(const Tensor2_Expr<B,U,Dim1,Dim2,j,k> &b,
+	  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a)
+{
+  typedef const Tensor3_times_Tensor2_12<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim0,i>(TensorExpr(a,b));
+}
+
+/* A(j,i,k)*B(j,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+class Tensor3_times_Tensor2_02
+{
+  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,j,i,k> iterA;
+  const Tensor2_Expr<B,U,Dim0,Dim2,j,k> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,N1,Current_Dim1-1)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,N1,Current_Dim1-1)*iterB(0,Current_Dim1-1)
+      + eval(N1,Number<Dim0>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,N1,0)*iterB(0,0);
+  }
+public:
+  Tensor3_times_Tensor2_02
+  (const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,j,i,k> &a,
+   const Tensor2_Expr<B,U,Dim0,Dim2,j,k> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim0>(),Number<Dim2>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_times_Tensor2_02<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim1,i>
+operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,j,i,k> &a,
+	  const Tensor2_Expr<B,U,Dim0,Dim2,j,k> &b)
+{
+  typedef const Tensor3_times_Tensor2_02<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim1,i>(TensorExpr(a,b));
+}
+
+/* B(j,k)*A(j,i,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_times_Tensor2_02<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim1,i>
+operator*(const Tensor2_Expr<B,U,Dim0,Dim2,j,k> &b,
+	  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,j,i,k> &a)
+{
+  typedef const Tensor3_times_Tensor2_02<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim1,i>(TensorExpr(a,b));
+}
+
+/* A(j,k,i)*B(j,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+class Tensor3_times_Tensor2_01
+{
+  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,j,k,i> iterA;
+  const Tensor2_Expr<B,U,Dim0,Dim1,j,k> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,Current_Dim1-1,N1)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,Current_Dim1-1,N1)*iterB(0,Current_Dim1-1)
+      + eval(N1,Number<Dim0>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,0,N1)*iterB(0,0);
+  }
+public:
+  Tensor3_times_Tensor2_01
+  (const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,j,k,i> &a,
+   const Tensor2_Expr<B,U,Dim0,Dim1,j,k> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim0>(),Number<Dim1>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_times_Tensor2_01<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim2,i>
+operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,j,k,i> &a,
+	  const Tensor2_Expr<B,U,Dim0,Dim1,j,k> &b)
+{
+  typedef const Tensor3_times_Tensor2_01<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
+}
+
+/* B(j,k)*A(j,k,i)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_times_Tensor2_01<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim2,i>
+operator*(const Tensor2_Expr<B,U,Dim0,Dim1,j,k> &b,
+	  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,j,k,i> &a)
+{
+  typedef const Tensor3_times_Tensor2_01<A,B,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
+}
+
+/* A(i,j,k)*B(k,l)->Tensor3 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+class Tensor3_times_Tensor2_0
+{
+  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
+  const Tensor2_Expr<B,U,Dim2,Dim3,k,l> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
+		       const Number<Current_Dim> &N) const
+  {
+    return iterA(N1,N2,Current_Dim-1)*iterB(Current_Dim-1,N3)
+      + eval(N1,N2,N3,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
+		       const Number<1> &N) const
+  {
+    return iterA(N1,N2,0)*iterB(0,N3);
+  }
+public:
+  Tensor3_times_Tensor2_0(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+			  const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return eval(N1,N2,N3,Number<Dim2>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+inline const Tensor3_Expr
+<const Tensor3_times_Tensor2_0<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim0,Dim1,Dim3,i,j,l>
+operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+	  const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b)
+{
+  typedef const Tensor3_times_Tensor2_0<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
+    TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim3,i,j,l>
+    (TensorExpr(a,b));
+}
+
+/* B(k,l)*A(i,j,k)->Tensor3 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+inline const Tensor3_Expr
+<const Tensor3_times_Tensor2_0<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim0,Dim1,Dim3,i,j,l>
+operator*(const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b,
+	  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a)
+{
+  typedef const Tensor3_times_Tensor2_0<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
+    TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim3,i,j,l>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_times_Tensor2_symmetric.h
--- a/Tensor3/Tensor3_times_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,215 +0,0 @@
-/* This file has all of the declarations for expressions like
-   Tensor3*Tensor2_symmetric and Tensor2_symmetric*Tensor3, yielding a
-   Tensor1. */
-
-/* A(i,j,k)*B(j,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim,
-  char i, char j, char k>
-class Tensor3_times_Tensor2_symmetric_12
-{
-  const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,j,k> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,Current_Dim0-1,Current_Dim1-1)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,0,Current_Dim1-1)*iterB(0,Current_Dim1-1)
-      + eval(N1,Number<Dim>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(N1,0,0)*iterB(0,0);
-  }
-public:
-  Tensor3_times_Tensor2_symmetric_12
-  (const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim>(),Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_times_Tensor2_symmetric_12<A,B,T,U,Dim0,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim0,i>
-operator*(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
-{
-  typedef const Tensor3_times_Tensor2_symmetric_12<A,B,T,U,Dim0,Dim,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim0,i>(TensorExpr(a,b));
-}
-
-/* B(j,k)*A(i,j,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_times_Tensor2_symmetric_12<A,B,T,U,Dim0,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim0,i>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b,
-	  const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a)
-{
-  typedef const Tensor3_times_Tensor2_symmetric_12<A,B,T,U,Dim0,Dim,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim0,i>(TensorExpr(a,b));
-}
-
-/* A(j,i,k)*B(j,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim1, int Dim,
-  char i, char j, char k>
-class Tensor3_times_Tensor2_symmetric_02
-{
-  const Tensor3_Expr<A,T,Dim,Dim1,Dim,j,i,k> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,j,k> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,N1,Current_Dim1-1)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,N1,Current_Dim1-1)*iterB(0,Current_Dim1-1)
-      + eval(N1,Number<Dim>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,N1,0)*iterB(0,0);
-  }
-public:
-  Tensor3_times_Tensor2_symmetric_02
-  (const Tensor3_Expr<A,T,Dim,Dim1,Dim,j,i,k> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim>(),Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim1, int Dim,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_times_Tensor2_symmetric_02<A,B,T,U,Dim1,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim1,i>
-operator*(const Tensor3_Expr<A,T,Dim,Dim1,Dim,j,i,k> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
-{
-  typedef const Tensor3_times_Tensor2_symmetric_02<A,B,T,U,Dim1,Dim,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim1,i>(TensorExpr(a,b));
-}
-
-/* B(j,k)*A(j,i,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim1, int Dim,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_times_Tensor2_symmetric_02<A,B,T,U,Dim1,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim1,i>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b,
-	  const Tensor3_Expr<A,T,Dim,Dim1,Dim,j,i,k> &a)
-{
-  typedef const Tensor3_times_Tensor2_symmetric_02<A,B,T,U,Dim1,Dim,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim1,i>(TensorExpr(a,b));
-}
-
-/* A(j,k,i)*B(j,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim2, int Dim,
-  char i, char j, char k>
-class Tensor3_times_Tensor2_symmetric_01
-{
-  const Tensor3_Expr<A,T,Dim,Dim,Dim2,j,k,i> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,j,k> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,Current_Dim1-1,N1)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,Current_Dim1-1,N1)*iterB(0,Current_Dim1-1)
-      + eval(N1,Number<Dim>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,0,N1)*iterB(0,0);
-  }
-public:
-  Tensor3_times_Tensor2_symmetric_01
-  (const Tensor3_Expr<A,T,Dim,Dim,Dim2,j,k,i> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim>(),Number<Dim2>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim2, int Dim,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_times_Tensor2_symmetric_01<A,B,T,U,Dim2,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim2,i>
-operator*(const Tensor3_Expr<A,T,Dim,Dim,Dim2,j,k,i> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
-{
-  typedef const Tensor3_times_Tensor2_symmetric_01<A,B,T,U,Dim2,Dim,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
-}
-
-/* B(j,k)*A(j,k,i)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim2, int Dim,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_times_Tensor2_symmetric_01<A,B,T,U,Dim2,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim2,i>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b,
-	  const Tensor3_Expr<A,T,Dim,Dim,Dim2,j,k,i> &a)
-{
-  typedef const Tensor3_times_Tensor2_symmetric_01<A,B,T,U,Dim2,Dim,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
-}
-
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_times_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3/Tensor3_times_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,215 @@
+/* This file has all of the declarations for expressions like
+   Tensor3*Tensor2_symmetric and Tensor2_symmetric*Tensor3, yielding a
+   Tensor1. */
+
+/* A(i,j,k)*B(j,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim,
+  char i, char j, char k>
+class Tensor3_times_Tensor2_symmetric_12
+{
+  const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,j,k> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,Current_Dim0-1,Current_Dim1-1)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,0,Current_Dim1-1)*iterB(0,Current_Dim1-1)
+      + eval(N1,Number<Dim>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(N1,0,0)*iterB(0,0);
+  }
+public:
+  Tensor3_times_Tensor2_symmetric_12
+  (const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim>(),Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_times_Tensor2_symmetric_12<A,B,T,U,Dim0,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim0,i>
+operator*(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
+{
+  typedef const Tensor3_times_Tensor2_symmetric_12<A,B,T,U,Dim0,Dim,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim0,i>(TensorExpr(a,b));
+}
+
+/* B(j,k)*A(i,j,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_times_Tensor2_symmetric_12<A,B,T,U,Dim0,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim0,i>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b,
+	  const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a)
+{
+  typedef const Tensor3_times_Tensor2_symmetric_12<A,B,T,U,Dim0,Dim,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim0,i>(TensorExpr(a,b));
+}
+
+/* A(j,i,k)*B(j,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim1, int Dim,
+  char i, char j, char k>
+class Tensor3_times_Tensor2_symmetric_02
+{
+  const Tensor3_Expr<A,T,Dim,Dim1,Dim,j,i,k> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,j,k> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,N1,Current_Dim1-1)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,N1,Current_Dim1-1)*iterB(0,Current_Dim1-1)
+      + eval(N1,Number<Dim>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,N1,0)*iterB(0,0);
+  }
+public:
+  Tensor3_times_Tensor2_symmetric_02
+  (const Tensor3_Expr<A,T,Dim,Dim1,Dim,j,i,k> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim>(),Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim1, int Dim,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_times_Tensor2_symmetric_02<A,B,T,U,Dim1,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim1,i>
+operator*(const Tensor3_Expr<A,T,Dim,Dim1,Dim,j,i,k> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
+{
+  typedef const Tensor3_times_Tensor2_symmetric_02<A,B,T,U,Dim1,Dim,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim1,i>(TensorExpr(a,b));
+}
+
+/* B(j,k)*A(j,i,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim1, int Dim,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_times_Tensor2_symmetric_02<A,B,T,U,Dim1,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim1,i>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b,
+	  const Tensor3_Expr<A,T,Dim,Dim1,Dim,j,i,k> &a)
+{
+  typedef const Tensor3_times_Tensor2_symmetric_02<A,B,T,U,Dim1,Dim,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim1,i>(TensorExpr(a,b));
+}
+
+/* A(j,k,i)*B(j,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim2, int Dim,
+  char i, char j, char k>
+class Tensor3_times_Tensor2_symmetric_01
+{
+  const Tensor3_Expr<A,T,Dim,Dim,Dim2,j,k,i> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,j,k> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,Current_Dim1-1,N1)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,Current_Dim1-1,N1)*iterB(0,Current_Dim1-1)
+      + eval(N1,Number<Dim>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,0,N1)*iterB(0,0);
+  }
+public:
+  Tensor3_times_Tensor2_symmetric_01
+  (const Tensor3_Expr<A,T,Dim,Dim,Dim2,j,k,i> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim>(),Number<Dim2>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim2, int Dim,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_times_Tensor2_symmetric_01<A,B,T,U,Dim2,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim2,i>
+operator*(const Tensor3_Expr<A,T,Dim,Dim,Dim2,j,k,i> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
+{
+  typedef const Tensor3_times_Tensor2_symmetric_01<A,B,T,U,Dim2,Dim,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
+}
+
+/* B(j,k)*A(j,k,i)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim2, int Dim,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_times_Tensor2_symmetric_01<A,B,T,U,Dim2,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim2,i>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b,
+	  const Tensor3_Expr<A,T,Dim,Dim,Dim2,j,k,i> &a)
+{
+  typedef const Tensor3_times_Tensor2_symmetric_01<A,B,T,U,Dim2,Dim,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
+}
+
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_times_Tensor3.h
--- a/Tensor3/Tensor3_times_Tensor3.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,362 +0,0 @@
-/* Fully contracts a Tensor3 with a Tensor3, yielding a typename promote<T,U>::V. */
-
-/* A(i,j,k)*B(i,j,k) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3_012
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
-    b(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)
-    + T3_times_T3_012(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim1-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3_012
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim0-1,0,Current_Dim2-1)
-    + T3_times_T3_012(a,b,Number<Current_Dim0>(),
-			Number<Dim1>(),Number<Current_Dim2-1>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k, int Current_Dim0>
-inline const typename promote<T,U>::V T3_times_T3_012
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(Current_Dim0-1,0,0)*b(Current_Dim0-1,0,0)
-    + T3_times_T3_012(a,b,Number<Current_Dim0-1>(),
-			Number<Dim1>(),Number<Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const typename promote<T,U>::V T3_times_T3_012
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> &b,
- const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(0,0,0)*b(0,0,0);
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-	  const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> &b)
-{
-  return T3_times_T3_012(a,b,Number<Dim0>(),Number<Dim1>(),Number<Dim2>());
-}
-
-/* A(i,j,k)*B(k,i,j) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3_201
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
-    b(Current_Dim2-1,Current_Dim0-1,Current_Dim1-1)
-    + T3_times_T3_201(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim1-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3_201
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim2-1,Current_Dim0-1,0)
-    + T3_times_T3_201(a,b,Number<Current_Dim0>(),
-			Number<Dim1>(),Number<Current_Dim2-1>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k, int Current_Dim0>
-inline const typename promote<T,U>::V T3_times_T3_201
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(Current_Dim0-1,0,0)*b(0,Current_Dim0-1,0)
-    + T3_times_T3_201(a,b,Number<Current_Dim0-1>(),
-			Number<Dim1>(),Number<Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const typename promote<T,U>::V T3_times_T3_201
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> &b,
- const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(0,0,0)*b(0,0,0);
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-	  const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> &b)
-{
-  return T3_times_T3_201(a,b,Number<Dim0>(),Number<Dim1>(),Number<Dim2>());
-}
-
-/* A(i,j,k)*B(j,k,i) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3_120
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim1,Dim2,Dim0,j,k,i> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
-    b(Current_Dim1-1,Current_Dim2-1,Current_Dim0-1)
-    + T3_times_T3_120(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim1-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3_120
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim1,Dim2,Dim0,j,k,i> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,0,Current_Dim2-1)*b(0,Current_Dim2-1,Current_Dim0-1)
-    + T3_times_T3_120(a,b,Number<Current_Dim0>(),
-			Number<Dim1>(),Number<Current_Dim2-1>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k, int Current_Dim0>
-inline const typename promote<T,U>::V T3_times_T3_120
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim1,Dim2,Dim0,j,k,i> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(Current_Dim0-1,0,0)*b(0,0,Current_Dim0-1)
-    + T3_times_T3_120(a,b,Number<Current_Dim0-1>(),
-			Number<Dim1>(),Number<Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const typename promote<T,U>::V T3_times_T3_120
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim1,Dim2,Dim0,j,k,i> &b,
- const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(0,0,0)*b(0,0,0);
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-	  const Tensor3_Expr<B,U,Dim1,Dim2,Dim0,j,k,i> &b)
-{
-  return T3_times_T3_120(a,b,Number<Dim0>(),Number<Dim1>(),Number<Dim2>());
-}
-
-/* A(i,j,k)*B(j,i,k) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3_102
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
-    b(Current_Dim1-1,Current_Dim0-1,Current_Dim2-1)
-    + T3_times_T3_102(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim1-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3_102
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,0,Current_Dim2-1)*b(0,Current_Dim0-1,Current_Dim2-1)
-    + T3_times_T3_102(a,b,Number<Current_Dim0>(),
-			Number<Dim1>(),Number<Current_Dim2-1>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k, int Current_Dim0>
-inline const typename promote<T,U>::V T3_times_T3_102
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(Current_Dim0-1,0,0)*b(0,Current_Dim0-1,0)
-    + T3_times_T3_102(a,b,Number<Current_Dim0-1>(),
-			Number<Dim1>(),Number<Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const typename promote<T,U>::V T3_times_T3_102
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> &b,
- const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(0,0,0)*b(0,0,0);
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-	  const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> &b)
-{
-  return T3_times_T3_102(a,b,Number<Dim0>(),Number<Dim1>(),Number<Dim2>());
-}
-
-/* A(i,j,k)*B(k,j,i) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3_210
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim2,Dim1,Dim0,k,j,i> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
-    b(Current_Dim2-1,Current_Dim1-1,Current_Dim0-1)
-    + T3_times_T3_210(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim1-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3_210
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim2,Dim1,Dim0,k,j,i> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim2-1,0,Current_Dim0-1)
-    + T3_times_T3_210(a,b,Number<Current_Dim0>(),
-			Number<Dim1>(),Number<Current_Dim2-1>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k, int Current_Dim0>
-inline const typename promote<T,U>::V T3_times_T3_210
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim2,Dim1,Dim0,k,j,i> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(Current_Dim0-1,0,0)*b(0,0,Current_Dim0-1)
-    + T3_times_T3_210(a,b,Number<Current_Dim0-1>(),
-			Number<Dim1>(),Number<Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const typename promote<T,U>::V T3_times_T3_210
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim2,Dim1,Dim0,k,j,i> &b,
- const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(0,0,0)*b(0,0,0);
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-	  const Tensor3_Expr<B,U,Dim2,Dim1,Dim0,k,j,i> &b)
-{
-  return T3_times_T3_210(a,b,Number<Dim0>(),Number<Dim1>(),Number<Dim2>());
-}
-
-/* A(i,j,k)*B(i,k,j) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3_021
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
-    b(Current_Dim0-1,Current_Dim2-1,Current_Dim1-1)
-    + T3_times_T3_021(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim1-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3_021
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim0-1,Current_Dim2-1,0)
-    + T3_times_T3_021(a,b,Number<Current_Dim0>(),
-			Number<Dim1>(),Number<Current_Dim2-1>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k, int Current_Dim0>
-inline const typename promote<T,U>::V T3_times_T3_021
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(Current_Dim0-1,0,0)*b(Current_Dim0-1,0,0)
-    + T3_times_T3_021(a,b,Number<Current_Dim0-1>(),
-			Number<Dim1>(),Number<Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const typename promote<T,U>::V T3_times_T3_021
-(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> &b,
- const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(0,0,0)*b(0,0,0);
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-	  const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> &b)
-{
-  return T3_times_T3_021(a,b,Number<Dim0>(),Number<Dim1>(),Number<Dim2>());
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_times_Tensor3.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3/Tensor3_times_Tensor3.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,362 @@
+/* Fully contracts a Tensor3 with a Tensor3, yielding a typename promote<T,U>::V. */
+
+/* A(i,j,k)*B(i,j,k) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3_012
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
+    b(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)
+    + T3_times_T3_012(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim1-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3_012
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim0-1,0,Current_Dim2-1)
+    + T3_times_T3_012(a,b,Number<Current_Dim0>(),
+			Number<Dim1>(),Number<Current_Dim2-1>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k, int Current_Dim0>
+inline const typename promote<T,U>::V T3_times_T3_012
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(Current_Dim0-1,0,0)*b(Current_Dim0-1,0,0)
+    + T3_times_T3_012(a,b,Number<Current_Dim0-1>(),
+			Number<Dim1>(),Number<Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const typename promote<T,U>::V T3_times_T3_012
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> &b,
+ const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(0,0,0)*b(0,0,0);
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+	  const Tensor3_Expr<B,U,Dim0,Dim1,Dim2,i,j,k> &b)
+{
+  return T3_times_T3_012(a,b,Number<Dim0>(),Number<Dim1>(),Number<Dim2>());
+}
+
+/* A(i,j,k)*B(k,i,j) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3_201
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
+    b(Current_Dim2-1,Current_Dim0-1,Current_Dim1-1)
+    + T3_times_T3_201(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim1-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3_201
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim2-1,Current_Dim0-1,0)
+    + T3_times_T3_201(a,b,Number<Current_Dim0>(),
+			Number<Dim1>(),Number<Current_Dim2-1>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k, int Current_Dim0>
+inline const typename promote<T,U>::V T3_times_T3_201
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(Current_Dim0-1,0,0)*b(0,Current_Dim0-1,0)
+    + T3_times_T3_201(a,b,Number<Current_Dim0-1>(),
+			Number<Dim1>(),Number<Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const typename promote<T,U>::V T3_times_T3_201
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> &b,
+ const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(0,0,0)*b(0,0,0);
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+	  const Tensor3_Expr<B,U,Dim2,Dim0,Dim1,k,i,j> &b)
+{
+  return T3_times_T3_201(a,b,Number<Dim0>(),Number<Dim1>(),Number<Dim2>());
+}
+
+/* A(i,j,k)*B(j,k,i) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3_120
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim1,Dim2,Dim0,j,k,i> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
+    b(Current_Dim1-1,Current_Dim2-1,Current_Dim0-1)
+    + T3_times_T3_120(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim1-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3_120
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim1,Dim2,Dim0,j,k,i> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,0,Current_Dim2-1)*b(0,Current_Dim2-1,Current_Dim0-1)
+    + T3_times_T3_120(a,b,Number<Current_Dim0>(),
+			Number<Dim1>(),Number<Current_Dim2-1>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k, int Current_Dim0>
+inline const typename promote<T,U>::V T3_times_T3_120
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim1,Dim2,Dim0,j,k,i> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(Current_Dim0-1,0,0)*b(0,0,Current_Dim0-1)
+    + T3_times_T3_120(a,b,Number<Current_Dim0-1>(),
+			Number<Dim1>(),Number<Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const typename promote<T,U>::V T3_times_T3_120
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim1,Dim2,Dim0,j,k,i> &b,
+ const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(0,0,0)*b(0,0,0);
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+	  const Tensor3_Expr<B,U,Dim1,Dim2,Dim0,j,k,i> &b)
+{
+  return T3_times_T3_120(a,b,Number<Dim0>(),Number<Dim1>(),Number<Dim2>());
+}
+
+/* A(i,j,k)*B(j,i,k) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3_102
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
+    b(Current_Dim1-1,Current_Dim0-1,Current_Dim2-1)
+    + T3_times_T3_102(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim1-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3_102
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,0,Current_Dim2-1)*b(0,Current_Dim0-1,Current_Dim2-1)
+    + T3_times_T3_102(a,b,Number<Current_Dim0>(),
+			Number<Dim1>(),Number<Current_Dim2-1>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k, int Current_Dim0>
+inline const typename promote<T,U>::V T3_times_T3_102
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(Current_Dim0-1,0,0)*b(0,Current_Dim0-1,0)
+    + T3_times_T3_102(a,b,Number<Current_Dim0-1>(),
+			Number<Dim1>(),Number<Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const typename promote<T,U>::V T3_times_T3_102
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> &b,
+ const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(0,0,0)*b(0,0,0);
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+	  const Tensor3_Expr<B,U,Dim1,Dim0,Dim2,j,i,k> &b)
+{
+  return T3_times_T3_102(a,b,Number<Dim0>(),Number<Dim1>(),Number<Dim2>());
+}
+
+/* A(i,j,k)*B(k,j,i) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3_210
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim2,Dim1,Dim0,k,j,i> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
+    b(Current_Dim2-1,Current_Dim1-1,Current_Dim0-1)
+    + T3_times_T3_210(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim1-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3_210
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim2,Dim1,Dim0,k,j,i> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim2-1,0,Current_Dim0-1)
+    + T3_times_T3_210(a,b,Number<Current_Dim0>(),
+			Number<Dim1>(),Number<Current_Dim2-1>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k, int Current_Dim0>
+inline const typename promote<T,U>::V T3_times_T3_210
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim2,Dim1,Dim0,k,j,i> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(Current_Dim0-1,0,0)*b(0,0,Current_Dim0-1)
+    + T3_times_T3_210(a,b,Number<Current_Dim0-1>(),
+			Number<Dim1>(),Number<Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const typename promote<T,U>::V T3_times_T3_210
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim2,Dim1,Dim0,k,j,i> &b,
+ const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(0,0,0)*b(0,0,0);
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+	  const Tensor3_Expr<B,U,Dim2,Dim1,Dim0,k,j,i> &b)
+{
+  return T3_times_T3_210(a,b,Number<Dim0>(),Number<Dim1>(),Number<Dim2>());
+}
+
+/* A(i,j,k)*B(i,k,j) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3_021
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
+    b(Current_Dim0-1,Current_Dim2-1,Current_Dim1-1)
+    + T3_times_T3_021(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim1-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3_021
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim0-1,Current_Dim2-1,0)
+    + T3_times_T3_021(a,b,Number<Current_Dim0>(),
+			Number<Dim1>(),Number<Current_Dim2-1>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k, int Current_Dim0>
+inline const typename promote<T,U>::V T3_times_T3_021
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(Current_Dim0-1,0,0)*b(Current_Dim0-1,0,0)
+    + T3_times_T3_021(a,b,Number<Current_Dim0-1>(),
+			Number<Dim1>(),Number<Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const typename promote<T,U>::V T3_times_T3_021
+(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> &b,
+ const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(0,0,0)*b(0,0,0);
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+	  const Tensor3_Expr<B,U,Dim0,Dim2,Dim1,i,k,j> &b)
+{
+  return T3_times_T3_021(a,b,Number<Dim0>(),Number<Dim1>(),Number<Dim2>());
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_times_Tensor3_dg.h
--- a/Tensor3/Tensor3_times_Tensor3_dg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,468 +0,0 @@
-/* Contracts a Tensor3 with a Tensor3_dg, yielding a typename promote<T,U>::V,
-   Tensor2, or Tensor4. */
-
-/* A(i,j,k)*B(i,j,k) */
-
-template<class A, class B, class T, class U, int Dim, int Dim2,
-  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3dg_012
-(const Tensor3_Expr<A,T,Dim,Dim,Dim2,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim2,i,j,k> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
-    b(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)
-    + T3_times_T3dg_012(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim1-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim, int Dim2,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3dg_012
-(const Tensor3_Expr<A,T,Dim,Dim,Dim2,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim2,i,j,k> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim0-1,0,Current_Dim2-1)
-    + T3_times_T3dg_012(a,b,Number<Current_Dim0>(),
-			Number<Dim>(),Number<Current_Dim2-1>());
-}
-
-template<class A, class B, class T, class U, int Dim, int Dim2,
-  char i, char j, char k, int Current_Dim0>
-inline const typename promote<T,U>::V T3_times_T3dg_012
-(const Tensor3_Expr<A,T,Dim,Dim,Dim2,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim2,i,j,k> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(Current_Dim0-1,0,0)*b(Current_Dim0-1,0,0)
-    + T3_times_T3dg_012(a,b,Number<Current_Dim0-1>(),
-			Number<Dim>(),Number<Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim, int Dim2,
-  char i, char j, char k>
-inline const typename promote<T,U>::V T3_times_T3dg_012
-(const Tensor3_Expr<A,T,Dim,Dim,Dim2,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim2,i,j,k> &b,
- const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(0,0,0)*b(0,0,0);
-}
-
-template<class A, class B, class T, class U, int Dim, int Dim2,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_Expr<A,T,Dim,Dim,Dim2,i,j,k> &a,
-	  const Tensor3_dg_Expr<B,U,Dim,Dim2,i,j,k> &b)
-{
-  return T3_times_T3dg_012(a,b,Number<Dim>(),Number<Dim>(),Number<Dim2>());
-}
-
-/* A(i,j,k)*B(k,i,j) */
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3dg_201
-(const Tensor3_Expr<A,T,Dim,Dim1,Dim,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim1,k,i,j> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
-    b(Current_Dim2-1,Current_Dim0-1,Current_Dim1-1)
-    + T3_times_T3dg_201(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim1-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3dg_201
-(const Tensor3_Expr<A,T,Dim,Dim1,Dim,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim1,k,i,j> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim2-1,Current_Dim0-1,0)
-    + T3_times_T3dg_201(a,b,Number<Current_Dim0>(),
-			Number<Dim1>(),Number<Current_Dim2-1>());
-}
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k, int Current_Dim0>
-inline const typename promote<T,U>::V T3_times_T3dg_201
-(const Tensor3_Expr<A,T,Dim,Dim1,Dim,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim1,k,i,j> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(Current_Dim0-1,0,0)*b(0,Current_Dim0-1,0)
-    + T3_times_T3dg_201(a,b,Number<Current_Dim0-1>(),
-			Number<Dim1>(),Number<Dim>());
-}
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-inline const typename promote<T,U>::V T3_times_T3dg_201
-(const Tensor3_Expr<A,T,Dim,Dim1,Dim,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim1,k,i,j> &b,
- const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(0,0,0)*b(0,0,0);
-}
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_Expr<A,T,Dim,Dim1,Dim,i,j,k> &a,
-	  const Tensor3_dg_Expr<B,U,Dim,Dim1,k,i,j> &b)
-{
-  return T3_times_T3dg_201(a,b,Number<Dim>(),Number<Dim1>(),Number<Dim>());
-}
-
-/* A(i,j,k)*B(j,k,i) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim,
-  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3dg_120
-(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim0,j,k,i> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
-    b(Current_Dim1-1,Current_Dim2-1,Current_Dim0-1)
-    + T3_times_T3dg_120(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim1-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3dg_120
-(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim0,j,k,i> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,0,Current_Dim2-1)*b(0,Current_Dim2-1,Current_Dim0-1)
-    + T3_times_T3dg_120(a,b,Number<Current_Dim0>(),
-			Number<Dim>(),Number<Current_Dim2-1>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim,
-  char i, char j, char k, int Current_Dim0>
-inline const typename promote<T,U>::V T3_times_T3dg_120
-(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim0,j,k,i> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(Current_Dim0-1,0,0)*b(0,0,Current_Dim0-1)
-    + T3_times_T3dg_120(a,b,Number<Current_Dim0-1>(),
-			Number<Dim>(),Number<Dim>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim,
-  char i, char j, char k>
-inline const typename promote<T,U>::V T3_times_T3dg_120
-(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim0,j,k,i> &b,
- const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(0,0,0)*b(0,0,0);
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
-	  const Tensor3_dg_Expr<B,U,Dim,Dim0,j,k,i> &b)
-{
-  return T3_times_T3dg_120(a,b,Number<Dim0>(),Number<Dim>(),Number<Dim>());
-}
-
-/* A(i,j,k)*B(j,i,k) */
-
-template<class A, class B, class T, class U, int Dim, int Dim2,
-  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3dg_102
-(const Tensor3_Expr<A,T,Dim,Dim,Dim2,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim2,j,i,k> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
-    b(Current_Dim1-1,Current_Dim0-1,Current_Dim2-1)
-    + T3_times_T3dg_102(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim1-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim, int Dim2,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3dg_102
-(const Tensor3_Expr<A,T,Dim,Dim,Dim2,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim2,j,i,k> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,0,Current_Dim2-1)*b(0,Current_Dim0-1,Current_Dim2-1)
-    + T3_times_T3dg_102(a,b,Number<Current_Dim0>(),
-			Number<Dim>(),Number<Current_Dim2-1>());
-}
-
-template<class A, class B, class T, class U, int Dim, int Dim2,
-  char i, char j, char k, int Current_Dim0>
-inline const typename promote<T,U>::V T3_times_T3dg_102
-(const Tensor3_Expr<A,T,Dim,Dim,Dim2,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim2,j,i,k> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(Current_Dim0-1,0,0)*b(0,Current_Dim0-1,0)
-    + T3_times_T3dg_102(a,b,Number<Current_Dim0-1>(),
-			Number<Dim>(),Number<Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim, int Dim2,
-  char i, char j, char k>
-inline const typename promote<T,U>::V T3_times_T3dg_102
-(const Tensor3_Expr<A,T,Dim,Dim,Dim2,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim2,j,i,k> &b,
- const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(0,0,0)*b(0,0,0);
-}
-
-template<class A, class B, class T, class U, int Dim, int Dim2,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_Expr<A,T,Dim,Dim,Dim2,i,j,k> &a,
-	  const Tensor3_dg_Expr<B,U,Dim,Dim2,j,i,k> &b)
-{
-  return T3_times_T3dg_102(a,b,Number<Dim>(),Number<Dim>(),Number<Dim2>());
-}
-
-/* A(i,j,k)*B(k,j,i) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim,
-  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3dg_210
-(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim0,k,j,i> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
-    b(Current_Dim2-1,Current_Dim1-1,Current_Dim0-1)
-    + T3_times_T3dg_210(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim1-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3dg_210
-(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim0,k,j,i> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim2-1,0,Current_Dim0-1)
-    + T3_times_T3dg_210(a,b,Number<Current_Dim0>(),
-			Number<Dim>(),Number<Current_Dim2-1>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim,
-  char i, char j, char k, int Current_Dim0>
-inline const typename promote<T,U>::V T3_times_T3dg_210
-(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim0,k,j,i> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(Current_Dim0-1,0,0)*b(0,0,Current_Dim0-1)
-    + T3_times_T3dg_210(a,b,Number<Current_Dim0-1>(),
-			Number<Dim>(),Number<Dim>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim,
-  char i, char j, char k>
-inline const typename promote<T,U>::V T3_times_T3dg_210
-(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim0,k,j,i> &b,
- const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(0,0,0)*b(0,0,0);
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
-	  const Tensor3_dg_Expr<B,U,Dim,Dim0,k,j,i> &b)
-{
-  return T3_times_T3dg_210(a,b,Number<Dim0>(),Number<Dim>(),Number<Dim>());
-}
-
-/* A(i,j,k)*B(i,k,j) */
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3dg_021
-(const Tensor3_Expr<A,T,Dim,Dim1,Dim,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim1,i,k,j> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
-    b(Current_Dim0-1,Current_Dim2-1,Current_Dim1-1)
-    + T3_times_T3dg_021(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim1-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3_times_T3dg_021
-(const Tensor3_Expr<A,T,Dim,Dim1,Dim,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim1,i,k,j> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim0-1,Current_Dim2-1,0)
-    + T3_times_T3dg_021(a,b,Number<Current_Dim0>(),
-			Number<Dim1>(),Number<Current_Dim2-1>());
-}
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k, int Current_Dim0>
-inline const typename promote<T,U>::V T3_times_T3dg_021
-(const Tensor3_Expr<A,T,Dim,Dim1,Dim,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim1,i,k,j> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(Current_Dim0-1,0,0)*b(Current_Dim0-1,0,0)
-    + T3_times_T3dg_021(a,b,Number<Current_Dim0-1>(),
-			Number<Dim1>(),Number<Dim>());
-}
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-inline const typename promote<T,U>::V T3_times_T3dg_021
-(const Tensor3_Expr<A,T,Dim,Dim1,Dim,i,j,k> &a,
- const Tensor3_dg_Expr<B,U,Dim,Dim1,i,k,j> &b,
- const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
-{
-  return a(0,0,0)*b(0,0,0);
-}
-
-template<class A, class B, class T, class U, int Dim, int Dim1,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_Expr<A,T,Dim,Dim1,Dim,i,j,k> &a,
-	  const Tensor3_dg_Expr<B,U,Dim,Dim1,i,k,j> &b)
-{
-  return T3_times_T3dg_021(a,b,Number<Dim>(),Number<Dim1>(),Number<Dim>());
-}
-
-
-/* A(j,i,k)*B(k,l,j) */
-
-template<class A, class B, class T, class U, int Dim2, int Dim1, int Dim01,
-  char i, char j, char k, char l>
-class Tensor3_times_Tensor3_dg_02_20
-{
-  const Tensor3_Expr<A,T,Dim2,Dim1,Dim01,j,i,k> iterA;
-  const Tensor3_dg_Expr<B,U,Dim01,Dim2,k,l,j> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1) const
-  {
-    return iterA(Current_Dim0-1,N1,Current_Dim1-1)
-      *iterB(Current_Dim1-1,N2,Current_Dim0-1)
-      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1) const
-  {
-    return iterA(0,N1,Current_Dim1-1)*iterB(Current_Dim1-1,N2,0)
-      + eval(N1,N2,Number<Dim2>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0, const Number<1> &ND1) const
-  {
-    return iterA(0,N1,0)*iterB(0,N2,0);
-  }
-public:
-  Tensor3_times_Tensor3_dg_02_20
-  (const Tensor3_Expr<A,T,Dim2,Dim1,Dim01,j,i,k> &a,
-   const Tensor3_dg_Expr<B,U,Dim01,Dim2,k,l,j> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim2>(),Number<Dim01>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim2, int Dim1, int Dim01,
-  char i, char j, char k, char l>
-inline const Tensor2_Expr
-<const Tensor3_times_Tensor3_dg_02_20<A,B,T,U,Dim2,Dim1,Dim01,i,j,k,l>,
-  typename promote<T,U>::V,Dim1,Dim01,i,l>
-operator*(const Tensor3_Expr<A,T,Dim2,Dim1,Dim01,j,i,k> &a,
-	  const Tensor3_dg_Expr<B,U,Dim01,Dim2,k,l,j> &b)
-{
-  typedef const Tensor3_times_Tensor3_dg_02_20<A,B,T,U,Dim2,Dim1,Dim01,i,j,k,l>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim01,i,l>
-    (TensorExpr(a,b));
-}
-
-/* B(k,l,j)*A(j,i,k) */
-
-
-
-/* A(i,j,k)*B(l,k,m) -> Tensor4 */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim, char i, char j, char k, char l, char m>
-class Tensor3_times_Tensor3_dg
-{
-  const Tensor3_Expr<A,T,Dim0,Dim1,Dim,i,j,k> iterA;
-  const Tensor3_dg_Expr<B,U,Dim,Dim2,l,k,m> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3, const int N4,
-		       const Number<Current_Dim> &ND) const
-  {
-    return iterA(N1,N2,Current_Dim-1)*iterB(N3,Current_Dim-1,N4)
-      + eval(N1,N2,N3,N4,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3, const int N4,
-		       const Number<1> &ND) const
-  {
-    return iterA(N1,N2,0)*iterB(N3,0,N4);
-  }
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-			     const int N4) const
-  {
-    return eval(N1,N2,N3,N4,Number<Dim>());
-  }
-  Tensor3_times_Tensor3_dg(const Tensor3_Expr<A,T,Dim0,Dim1,Dim,i,j,k> &a,
-			   const Tensor3_dg_Expr<B,U,Dim,Dim2,l,k,m> &b)
-    : iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim, char i, char j, char k, char l, char m>
-inline Tensor4_Expr
-<const Tensor3_times_Tensor3_dg<A,B,T,U,Dim0,Dim1,Dim,Dim2,i,j,k,l,m>,
-  typename promote<T,U>::V,Dim0,Dim1,Dim,Dim2,i,j,l,m>
-operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim,i,j,k> &a,
-	  const Tensor3_dg_Expr<B,U,Dim,Dim2,l,k,m> &b)
-{
-  typedef const Tensor3_times_Tensor3_dg
-    <A,B,T,U,Dim0,Dim1,Dim2,Dim,i,j,k,l,m> TensorExpr;
-  return Tensor4_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim,Dim2,i,j,l,m>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_times_Tensor3_dg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3/Tensor3_times_Tensor3_dg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,468 @@
+/* Contracts a Tensor3 with a Tensor3_dg, yielding a typename promote<T,U>::V,
+   Tensor2, or Tensor4. */
+
+/* A(i,j,k)*B(i,j,k) */
+
+template<class A, class B, class T, class U, int Dim, int Dim2,
+  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3dg_012
+(const Tensor3_Expr<A,T,Dim,Dim,Dim2,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim2,i,j,k> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
+    b(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)
+    + T3_times_T3dg_012(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim1-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim, int Dim2,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3dg_012
+(const Tensor3_Expr<A,T,Dim,Dim,Dim2,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim2,i,j,k> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim0-1,0,Current_Dim2-1)
+    + T3_times_T3dg_012(a,b,Number<Current_Dim0>(),
+			Number<Dim>(),Number<Current_Dim2-1>());
+}
+
+template<class A, class B, class T, class U, int Dim, int Dim2,
+  char i, char j, char k, int Current_Dim0>
+inline const typename promote<T,U>::V T3_times_T3dg_012
+(const Tensor3_Expr<A,T,Dim,Dim,Dim2,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim2,i,j,k> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(Current_Dim0-1,0,0)*b(Current_Dim0-1,0,0)
+    + T3_times_T3dg_012(a,b,Number<Current_Dim0-1>(),
+			Number<Dim>(),Number<Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim, int Dim2,
+  char i, char j, char k>
+inline const typename promote<T,U>::V T3_times_T3dg_012
+(const Tensor3_Expr<A,T,Dim,Dim,Dim2,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim2,i,j,k> &b,
+ const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(0,0,0)*b(0,0,0);
+}
+
+template<class A, class B, class T, class U, int Dim, int Dim2,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_Expr<A,T,Dim,Dim,Dim2,i,j,k> &a,
+	  const Tensor3_dg_Expr<B,U,Dim,Dim2,i,j,k> &b)
+{
+  return T3_times_T3dg_012(a,b,Number<Dim>(),Number<Dim>(),Number<Dim2>());
+}
+
+/* A(i,j,k)*B(k,i,j) */
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3dg_201
+(const Tensor3_Expr<A,T,Dim,Dim1,Dim,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim1,k,i,j> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
+    b(Current_Dim2-1,Current_Dim0-1,Current_Dim1-1)
+    + T3_times_T3dg_201(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim1-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3dg_201
+(const Tensor3_Expr<A,T,Dim,Dim1,Dim,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim1,k,i,j> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim2-1,Current_Dim0-1,0)
+    + T3_times_T3dg_201(a,b,Number<Current_Dim0>(),
+			Number<Dim1>(),Number<Current_Dim2-1>());
+}
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k, int Current_Dim0>
+inline const typename promote<T,U>::V T3_times_T3dg_201
+(const Tensor3_Expr<A,T,Dim,Dim1,Dim,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim1,k,i,j> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(Current_Dim0-1,0,0)*b(0,Current_Dim0-1,0)
+    + T3_times_T3dg_201(a,b,Number<Current_Dim0-1>(),
+			Number<Dim1>(),Number<Dim>());
+}
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+inline const typename promote<T,U>::V T3_times_T3dg_201
+(const Tensor3_Expr<A,T,Dim,Dim1,Dim,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim1,k,i,j> &b,
+ const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(0,0,0)*b(0,0,0);
+}
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_Expr<A,T,Dim,Dim1,Dim,i,j,k> &a,
+	  const Tensor3_dg_Expr<B,U,Dim,Dim1,k,i,j> &b)
+{
+  return T3_times_T3dg_201(a,b,Number<Dim>(),Number<Dim1>(),Number<Dim>());
+}
+
+/* A(i,j,k)*B(j,k,i) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim,
+  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3dg_120
+(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim0,j,k,i> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
+    b(Current_Dim1-1,Current_Dim2-1,Current_Dim0-1)
+    + T3_times_T3dg_120(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim1-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3dg_120
+(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim0,j,k,i> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,0,Current_Dim2-1)*b(0,Current_Dim2-1,Current_Dim0-1)
+    + T3_times_T3dg_120(a,b,Number<Current_Dim0>(),
+			Number<Dim>(),Number<Current_Dim2-1>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim,
+  char i, char j, char k, int Current_Dim0>
+inline const typename promote<T,U>::V T3_times_T3dg_120
+(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim0,j,k,i> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(Current_Dim0-1,0,0)*b(0,0,Current_Dim0-1)
+    + T3_times_T3dg_120(a,b,Number<Current_Dim0-1>(),
+			Number<Dim>(),Number<Dim>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim,
+  char i, char j, char k>
+inline const typename promote<T,U>::V T3_times_T3dg_120
+(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim0,j,k,i> &b,
+ const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(0,0,0)*b(0,0,0);
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
+	  const Tensor3_dg_Expr<B,U,Dim,Dim0,j,k,i> &b)
+{
+  return T3_times_T3dg_120(a,b,Number<Dim0>(),Number<Dim>(),Number<Dim>());
+}
+
+/* A(i,j,k)*B(j,i,k) */
+
+template<class A, class B, class T, class U, int Dim, int Dim2,
+  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3dg_102
+(const Tensor3_Expr<A,T,Dim,Dim,Dim2,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim2,j,i,k> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
+    b(Current_Dim1-1,Current_Dim0-1,Current_Dim2-1)
+    + T3_times_T3dg_102(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim1-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim, int Dim2,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3dg_102
+(const Tensor3_Expr<A,T,Dim,Dim,Dim2,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim2,j,i,k> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,0,Current_Dim2-1)*b(0,Current_Dim0-1,Current_Dim2-1)
+    + T3_times_T3dg_102(a,b,Number<Current_Dim0>(),
+			Number<Dim>(),Number<Current_Dim2-1>());
+}
+
+template<class A, class B, class T, class U, int Dim, int Dim2,
+  char i, char j, char k, int Current_Dim0>
+inline const typename promote<T,U>::V T3_times_T3dg_102
+(const Tensor3_Expr<A,T,Dim,Dim,Dim2,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim2,j,i,k> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(Current_Dim0-1,0,0)*b(0,Current_Dim0-1,0)
+    + T3_times_T3dg_102(a,b,Number<Current_Dim0-1>(),
+			Number<Dim>(),Number<Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim, int Dim2,
+  char i, char j, char k>
+inline const typename promote<T,U>::V T3_times_T3dg_102
+(const Tensor3_Expr<A,T,Dim,Dim,Dim2,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim2,j,i,k> &b,
+ const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(0,0,0)*b(0,0,0);
+}
+
+template<class A, class B, class T, class U, int Dim, int Dim2,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_Expr<A,T,Dim,Dim,Dim2,i,j,k> &a,
+	  const Tensor3_dg_Expr<B,U,Dim,Dim2,j,i,k> &b)
+{
+  return T3_times_T3dg_102(a,b,Number<Dim>(),Number<Dim>(),Number<Dim2>());
+}
+
+/* A(i,j,k)*B(k,j,i) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim,
+  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3dg_210
+(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim0,k,j,i> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
+    b(Current_Dim2-1,Current_Dim1-1,Current_Dim0-1)
+    + T3_times_T3dg_210(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim1-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3dg_210
+(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim0,k,j,i> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim2-1,0,Current_Dim0-1)
+    + T3_times_T3dg_210(a,b,Number<Current_Dim0>(),
+			Number<Dim>(),Number<Current_Dim2-1>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim,
+  char i, char j, char k, int Current_Dim0>
+inline const typename promote<T,U>::V T3_times_T3dg_210
+(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim0,k,j,i> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(Current_Dim0-1,0,0)*b(0,0,Current_Dim0-1)
+    + T3_times_T3dg_210(a,b,Number<Current_Dim0-1>(),
+			Number<Dim>(),Number<Dim>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim,
+  char i, char j, char k>
+inline const typename promote<T,U>::V T3_times_T3dg_210
+(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim0,k,j,i> &b,
+ const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(0,0,0)*b(0,0,0);
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_Expr<A,T,Dim0,Dim,Dim,i,j,k> &a,
+	  const Tensor3_dg_Expr<B,U,Dim,Dim0,k,j,i> &b)
+{
+  return T3_times_T3dg_210(a,b,Number<Dim0>(),Number<Dim>(),Number<Dim>());
+}
+
+/* A(i,j,k)*B(i,k,j) */
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3dg_021
+(const Tensor3_Expr<A,T,Dim,Dim1,Dim,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim1,i,k,j> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
+    b(Current_Dim0-1,Current_Dim2-1,Current_Dim1-1)
+    + T3_times_T3dg_021(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim1-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3_times_T3dg_021
+(const Tensor3_Expr<A,T,Dim,Dim1,Dim,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim1,i,k,j> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim0-1,Current_Dim2-1,0)
+    + T3_times_T3dg_021(a,b,Number<Current_Dim0>(),
+			Number<Dim1>(),Number<Current_Dim2-1>());
+}
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k, int Current_Dim0>
+inline const typename promote<T,U>::V T3_times_T3dg_021
+(const Tensor3_Expr<A,T,Dim,Dim1,Dim,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim1,i,k,j> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(Current_Dim0-1,0,0)*b(Current_Dim0-1,0,0)
+    + T3_times_T3dg_021(a,b,Number<Current_Dim0-1>(),
+			Number<Dim1>(),Number<Dim>());
+}
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+inline const typename promote<T,U>::V T3_times_T3dg_021
+(const Tensor3_Expr<A,T,Dim,Dim1,Dim,i,j,k> &a,
+ const Tensor3_dg_Expr<B,U,Dim,Dim1,i,k,j> &b,
+ const Number<1> &ND0, const Number<1> &ND1, const Number<1> &ND2)
+{
+  return a(0,0,0)*b(0,0,0);
+}
+
+template<class A, class B, class T, class U, int Dim, int Dim1,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_Expr<A,T,Dim,Dim1,Dim,i,j,k> &a,
+	  const Tensor3_dg_Expr<B,U,Dim,Dim1,i,k,j> &b)
+{
+  return T3_times_T3dg_021(a,b,Number<Dim>(),Number<Dim1>(),Number<Dim>());
+}
+
+
+/* A(j,i,k)*B(k,l,j) */
+
+template<class A, class B, class T, class U, int Dim2, int Dim1, int Dim01,
+  char i, char j, char k, char l>
+class Tensor3_times_Tensor3_dg_02_20
+{
+  const Tensor3_Expr<A,T,Dim2,Dim1,Dim01,j,i,k> iterA;
+  const Tensor3_dg_Expr<B,U,Dim01,Dim2,k,l,j> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1) const
+  {
+    return iterA(Current_Dim0-1,N1,Current_Dim1-1)
+      *iterB(Current_Dim1-1,N2,Current_Dim0-1)
+      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1) const
+  {
+    return iterA(0,N1,Current_Dim1-1)*iterB(Current_Dim1-1,N2,0)
+      + eval(N1,N2,Number<Dim2>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0, const Number<1> &ND1) const
+  {
+    return iterA(0,N1,0)*iterB(0,N2,0);
+  }
+public:
+  Tensor3_times_Tensor3_dg_02_20
+  (const Tensor3_Expr<A,T,Dim2,Dim1,Dim01,j,i,k> &a,
+   const Tensor3_dg_Expr<B,U,Dim01,Dim2,k,l,j> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim2>(),Number<Dim01>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim2, int Dim1, int Dim01,
+  char i, char j, char k, char l>
+inline const Tensor2_Expr
+<const Tensor3_times_Tensor3_dg_02_20<A,B,T,U,Dim2,Dim1,Dim01,i,j,k,l>,
+  typename promote<T,U>::V,Dim1,Dim01,i,l>
+operator*(const Tensor3_Expr<A,T,Dim2,Dim1,Dim01,j,i,k> &a,
+	  const Tensor3_dg_Expr<B,U,Dim01,Dim2,k,l,j> &b)
+{
+  typedef const Tensor3_times_Tensor3_dg_02_20<A,B,T,U,Dim2,Dim1,Dim01,i,j,k,l>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim01,i,l>
+    (TensorExpr(a,b));
+}
+
+/* B(k,l,j)*A(j,i,k) */
+
+
+
+/* A(i,j,k)*B(l,k,m) -> Tensor4 */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim, char i, char j, char k, char l, char m>
+class Tensor3_times_Tensor3_dg
+{
+  const Tensor3_Expr<A,T,Dim0,Dim1,Dim,i,j,k> iterA;
+  const Tensor3_dg_Expr<B,U,Dim,Dim2,l,k,m> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3, const int N4,
+		       const Number<Current_Dim> &ND) const
+  {
+    return iterA(N1,N2,Current_Dim-1)*iterB(N3,Current_Dim-1,N4)
+      + eval(N1,N2,N3,N4,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3, const int N4,
+		       const Number<1> &ND) const
+  {
+    return iterA(N1,N2,0)*iterB(N3,0,N4);
+  }
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+			     const int N4) const
+  {
+    return eval(N1,N2,N3,N4,Number<Dim>());
+  }
+  Tensor3_times_Tensor3_dg(const Tensor3_Expr<A,T,Dim0,Dim1,Dim,i,j,k> &a,
+			   const Tensor3_dg_Expr<B,U,Dim,Dim2,l,k,m> &b)
+    : iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim, char i, char j, char k, char l, char m>
+inline Tensor4_Expr
+<const Tensor3_times_Tensor3_dg<A,B,T,U,Dim0,Dim1,Dim,Dim2,i,j,k,l,m>,
+  typename promote<T,U>::V,Dim0,Dim1,Dim,Dim2,i,j,l,m>
+operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim,i,j,k> &a,
+	  const Tensor3_dg_Expr<B,U,Dim,Dim2,l,k,m> &b)
+{
+  typedef const Tensor3_times_Tensor3_dg
+    <A,B,T,U,Dim0,Dim1,Dim2,Dim,i,j,k,l,m> TensorExpr;
+  return Tensor4_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim,Dim2,i,j,l,m>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_times_generic.h
--- a/Tensor3/Tensor3_times_generic.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/* Multiplies a Tensor3 with a generic, yielding a Tensor3. */
-
-/* A(i,j,k)*generic */
-
-template<class A, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-class Tensor3_times_generic
-{
-  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
-  const U d;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)*d;
-  }
-
-  Tensor3_times_generic(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
-			const U &d0): iterA(a), d(d0) {}
-};
-
-template<class A, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_Expr<const Tensor3_times_generic<A,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a, const U &d0)
-{
-  typedef const Tensor3_times_generic<A,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-    (TensorExpr(a,d0));
-}
-
-/* generic*A(i,j,k) */
-
-template<class A, class T, class U, int Dim0, int Dim1, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_Expr<const Tensor3_times_generic<A,T,U,Dim0,Dim1,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-operator*(const U &d0, const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a)
-{
-  typedef const Tensor3_times_generic<A,T,U,Dim0,Dim1,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
-    (TensorExpr(a,d0));
-}
-
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor3/Tensor3_times_generic.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3/Tensor3_times_generic.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,47 @@
+/* Multiplies a Tensor3 with a generic, yielding a Tensor3. */
+
+/* A(i,j,k)*generic */
+
+template<class A, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+class Tensor3_times_generic
+{
+  const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> iterA;
+  const U d;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)*d;
+  }
+
+  Tensor3_times_generic(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a,
+			const U &d0): iterA(a), d(d0) {}
+};
+
+template<class A, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_Expr<const Tensor3_times_generic<A,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+operator*(const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a, const U &d0)
+{
+  typedef const Tensor3_times_generic<A,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+    (TensorExpr(a,d0));
+}
+
+/* generic*A(i,j,k) */
+
+template<class A, class T, class U, int Dim0, int Dim1, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_Expr<const Tensor3_times_generic<A,T,U,Dim0,Dim1,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+operator*(const U &d0, const Tensor3_Expr<A,T,Dim0,Dim1,Dim2,i,j,k> &a)
+{
+  typedef const Tensor3_times_generic<A,T,U,Dim0,Dim1,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,i,j,k>
+    (TensorExpr(a,d0));
+}
+
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric.h
--- a/Tensor3_antisymmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-/* Declaration for a Tensor3_antisymmetric.  This is antisymmetric on
-   the last two indices, so in 3 dimensions it only has 9 elements.
-   The first declaration is for T's (int, double, etc.) while the
-   second is for pointers to T's, so it is useful for previously
-   contructed arrays. */
-
-#include "Tensor3_antisymmetric/Tensor3_antisymmetric_constructor.h"
-#include "Tensor3_antisymmetric/Tensor3_antisymmetric_value.h"
-#include "Tensor3_antisymmetric/Tensor3_antisymmetric_pointer.h"
-
-#include "Tensor3_antisymmetric/Tensor3_antisymmetric_Expr.h"
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_antisymmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,11 @@
+/* Declaration for a Tensor3_antisymmetric.  This is antisymmetric on
+   the last two indices, so in 3 dimensions it only has 9 elements.
+   The first declaration is for T's (int, double, etc.) while the
+   second is for pointers to T's, so it is useful for previously
+   contructed arrays. */
+
+#include "Tensor3_antisymmetric/Tensor3_antisymmetric_constructor.hpp"
+#include "Tensor3_antisymmetric/Tensor3_antisymmetric_value.hpp"
+#include "Tensor3_antisymmetric/Tensor3_antisymmetric_pointer.hpp"
+
+#include "Tensor3_antisymmetric/Tensor3_antisymmetric_Expr.hpp"
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric/Tensor3_antisymmetric_Expr.h
--- a/Tensor3_antisymmetric/Tensor3_antisymmetric_Expr.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-/* Declare a wrapper class for rank 3 Tensor expressions,
-   antisymmetric in the last two indices.  I specialize it for when I
-   wrap a simple Tensor3_antisymmetric(_ptr) so that it has a
-   reference to the Tensor3_antisymmetric(_ptr) and not a copy.
-   Otherwise assignment wouldn't work. */
-
-#include "Tensor3_antisymmetric_plus_Tensor3_antisymmetric.h"
-#include "Tensor3_antisymmetric_or_Tensor3_antisymmetric.h"
-#include "Tensor3_antisymmetric_times_Tensor3.h"
-//  #include "Tensor3_antisymmetric_mod_Tensor1.h"
-#include "Tensor3_antisymmetric_times_generic.h"
-
-template<class A, class T, int Dim0, int Dim12, char i, char j, char k>
-class Tensor3_antisymmetric_Expr
-{
-  A iter;
-public:
-  Tensor3_antisymmetric_Expr(A &a): iter(a) {}
-  T operator()(const int N1, const int N2, const int N3) const
-  {
-    return iter(N1,N2,N3);
-  }
-};
-
-template<class A, class T, int Dim0, int Dim12, char i, char j, char k>
-class Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<A,Dim0,Dim12>,
-  T,Dim0,Dim12,i,j,k>
-{
-  Tensor3_antisymmetric<A,Dim0,Dim12> &iter;
-public:
-  Tensor3_antisymmetric_Expr(Tensor3_antisymmetric<A,Dim0,Dim12> &a)
-    : iter(a) {}
-  T operator()(const int N1, const int N2, const int N3) const
-  {
-    return iter(N1,N2,N3);
-  }
-
-  /* Various assignment operators.  I have to explicitly declare the
-     second operator= because otherwise the compiler will generate its
-     own and not use the template code. */
-
-  template<class B, class U>
-  const Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<A,Dim0,Dim12>,
-    T,Dim0,Dim12,i,j,k> &
-  operator=(const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,j,k> &result);
-
-  const Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<A,Dim0,Dim12>,
-    T,Dim0,Dim12,i,j,k> &
-  operator=(const Tensor3_antisymmetric_Expr<Tensor3_antisymmetric
-	    <A,Dim0,Dim12>,T,Dim0,Dim12,i,j,k> &result);
-
-  /* This is for when the indices are switched (i,j,k) -> (i,k,j). */
-
-  template<class B, class U>
-  const Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<A,Dim0,Dim12>,
-    T,Dim0,Dim12,i,j,k> &
-  operator=(const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,k,j> &result);
-};
-
-#include "Tensor3_antisymmetric_Expr_equals.h"
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric/Tensor3_antisymmetric_Expr.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_antisymmetric/Tensor3_antisymmetric_Expr.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,60 @@
+/* Declare a wrapper class for rank 3 Tensor expressions,
+   antisymmetric in the last two indices.  I specialize it for when I
+   wrap a simple Tensor3_antisymmetric(_ptr) so that it has a
+   reference to the Tensor3_antisymmetric(_ptr) and not a copy.
+   Otherwise assignment wouldn't work. */
+
+#include "Tensor3_antisymmetric_plus_Tensor3_antisymmetric.hpp"
+#include "Tensor3_antisymmetric_or_Tensor3_antisymmetric.hpp"
+#include "Tensor3_antisymmetric_times_Tensor3.hpp"
+//  #include "Tensor3_antisymmetric_mod_Tensor1.hpp"
+#include "Tensor3_antisymmetric_times_generic.hpp"
+
+template<class A, class T, int Dim0, int Dim12, char i, char j, char k>
+class Tensor3_antisymmetric_Expr
+{
+  A iter;
+public:
+  Tensor3_antisymmetric_Expr(A &a): iter(a) {}
+  T operator()(const int N1, const int N2, const int N3) const
+  {
+    return iter(N1,N2,N3);
+  }
+};
+
+template<class A, class T, int Dim0, int Dim12, char i, char j, char k>
+class Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<A,Dim0,Dim12>,
+  T,Dim0,Dim12,i,j,k>
+{
+  Tensor3_antisymmetric<A,Dim0,Dim12> &iter;
+public:
+  Tensor3_antisymmetric_Expr(Tensor3_antisymmetric<A,Dim0,Dim12> &a)
+    : iter(a) {}
+  T operator()(const int N1, const int N2, const int N3) const
+  {
+    return iter(N1,N2,N3);
+  }
+
+  /* Various assignment operators.  I have to explicitly declare the
+     second operator= because otherwise the compiler will generate its
+     own and not use the template code. */
+
+  template<class B, class U>
+  const Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<A,Dim0,Dim12>,
+    T,Dim0,Dim12,i,j,k> &
+  operator=(const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,j,k> &result);
+
+  const Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<A,Dim0,Dim12>,
+    T,Dim0,Dim12,i,j,k> &
+  operator=(const Tensor3_antisymmetric_Expr<Tensor3_antisymmetric
+	    <A,Dim0,Dim12>,T,Dim0,Dim12,i,j,k> &result);
+
+  /* This is for when the indices are switched (i,j,k) -> (i,k,j). */
+
+  template<class B, class U>
+  const Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<A,Dim0,Dim12>,
+    T,Dim0,Dim12,i,j,k> &
+  operator=(const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,k,j> &result);
+};
+
+#include "Tensor3_antisymmetric_Expr_equals.hpp"
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric/Tensor3_antisymmetric_Expr_equals.h
--- a/Tensor3_antisymmetric/Tensor3_antisymmetric_Expr_equals.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,157 +0,0 @@
-  /* Various assignment operators.  I have to explicitly declare the
-     second operator= because otherwise the compiler will generate its
-     own and not use the template code. */
-
-/* T3as=T3as */
-
-template<class A, class B, class U, int Dim0, int Dim12, char i, char j,
-  char k, int Current_Dim0, int Current_Dim1, int Current_Dim2> inline
-void T3as_equals_T3as(A &iter,
-		      const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,j,k>
-		      &result,
-		      const Number<Current_Dim0> &ND0,
-		      const Number<Current_Dim1> &ND1,
-		      const Number<Current_Dim2> &ND2)
-{
-  iter.unsafe(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)=
-    result(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1);
-  T3as_equals_T3as(iter,result,Number<Current_Dim0>(),Number<Current_Dim1-1>(),
-		   Number<Current_Dim2>());
-}
-
-template<class A, class B, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2> inline
-void T3as_equals_T3as(A &iter,
-		      const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,j,k>
-		      &result,
-		      const Number<Current_Dim0> &ND0,
-		      const Number<1> &ND1,
-		      const Number<Current_Dim2> &ND2)
-{
-  iter.unsafe(Current_Dim0-1,0,Current_Dim2-1)=
-    result(Current_Dim0-1,0,Current_Dim2-1);
-  T3as_equals_T3as(iter,result,Number<Current_Dim0>(),Number<Current_Dim2-2>(),
-		   Number<Current_Dim2-1>());
-}
-
-template<class A, class B, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0> inline
-void T3as_equals_T3as(A &iter,
-		      const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,j,k>
-		      &result,
-		      const Number<Current_Dim0> &ND0,
-		      const Number<1> &ND1,
-		      const Number<2> &ND2)
-{
-  iter.unsafe(Current_Dim0-1,0,1)=result(Current_Dim0-1,0,1);
-  T3as_equals_T3as(iter,result,Number<Current_Dim0-1>(),
-		   Number<Dim12-1>(),Number<Dim12>());
-}
-
-template<class A, class B, class U, int Dim0, int Dim12,
-  char i, char j, char k> inline
-void T3as_equals_T3as(A &iter,
-		      const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,j,k>
-		      &result,
-		      const Number<1> &ND0,
-		      const Number<1> &ND1,
-		      const Number<2> &ND2)
-{
-  iter.unsafe(0,0,1)=result(0,0,1);
-}
-
-
-template<class A, class T, int Dim0, int Dim12, char i, char j, char k>
-template<class B, class U> inline
-const Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<A,Dim0,Dim12>,
-  T,Dim0,Dim12,i,j,k> &
-Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<A,Dim0,Dim12>,
-  T,Dim0,Dim12,i,j,k>::
-operator=(const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,j,k> &result)
-{
-  T3as_equals_T3as(iter,result,Number<Dim0>(),Number<Dim12-1>(),
-		   Number<Dim12>());
-  return *this;
-}
-
-/* T3as=T3as_Expr(T3as) */
-
-template<class A, class T, int Dim0, int Dim12, char i, char j, char k> inline
-const Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<A,Dim0,Dim12>,
-  T,Dim0,Dim12,i,j,k> &
-Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<A,Dim0,Dim12>,
-  T,Dim0,Dim12,i,j,k>::
-operator=(const Tensor3_antisymmetric_Expr<Tensor3_antisymmetric
-	  <A,Dim0,Dim12>,T,Dim0,Dim12,i,j,k> &result)
-{
-  return operator=<Tensor3_antisymmetric<A,Dim0,Dim12>,T>(result);
-}
-
-/* This is for when the indices are switched (i,j,k) -> (i,k,j). */
-
-template<class A, class B, class U, int Dim0, int Dim12, char i, char j,
-  char k, int Current_Dim0, int Current_Dim1, int Current_Dim2> inline
-void T3as_switched_equals_T3as(A &iter, const Tensor3_antisymmetric_Expr
-			       <B,U,Dim0,Dim12,i,k,j> &result,
-			       const Number<Current_Dim0> &ND0,
-			       const Number<Current_Dim1> &ND1,
-			       const Number<Current_Dim2> &ND2)
-{
-  iter.unsafe(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)=
-    -result(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1);
-  T3as_switched_equals_T3as(iter,result,Number<Current_Dim0>(),
-			    Number<Current_Dim1-1>(),
-			    Number<Current_Dim2>());
-}
-
-template<class A, class B, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2> inline
-void T3as_switched_equals_T3as(A &iter, const Tensor3_antisymmetric_Expr
-			       <B,U,Dim0,Dim12,i,k,j> &result,
-			       const Number<Current_Dim0> &ND0,
-			       const Number<1> &ND1,
-			       const Number<Current_Dim2> &ND2)
-{
-  iter.unsafe(Current_Dim0-1,0,Current_Dim2-1)=
-    -result(Current_Dim0-1,0,Current_Dim2-1);
-  T3as_switched_equals_T3as(iter,result,Number<Current_Dim0>(),
-			    Number<Current_Dim2-2>(),
-			    Number<Current_Dim2-1>());
-}
-
-template<class A, class B, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0> inline
-void T3as_switched_equals_T3as(A &iter, const Tensor3_antisymmetric_Expr
-			       <B,U,Dim0,Dim12,i,k,j> &result,
-			       const Number<Current_Dim0> &ND0,
-			       const Number<1> &ND1,
-			       const Number<2> &ND2)
-{
-  iter.unsafe(Current_Dim0-1,0,1)=-result(Current_Dim0-1,0,1);
-  T3as_switched_equals_T3as(iter,result,Number<Current_Dim0-1>(),
-			    Number<Dim12-1>(),Number<Dim12>());
-}
-
-template<class A, class B, class U, int Dim0, int Dim12,
-  char i, char j, char k> inline
-void T3as_switched_equals_T3as(A &iter, const Tensor3_antisymmetric_Expr
-			       <B,U,Dim0,Dim12,i,k,j> &result,
-			       const Number<1> &ND0,
-			       const Number<1> &ND1,
-			       const Number<2> &ND2)
-{
-  iter.unsafe(0,0,1)=-result(0,0,1);
-}
-
-template<class A, class T, int Dim0, int Dim12, char i, char j, char k>
-template<class B, class U> inline
-const Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<A,Dim0,Dim12>,
-  T,Dim0,Dim12,i,j,k> &
-Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<A,Dim0,Dim12>,
-  T,Dim0,Dim12,i,j,k>::
-operator=(const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,k,j> &result)
-{
-  T3as_switched_equals_T3as(iter,result,Number<Dim0>(),Number<Dim12-1>(),
-			    Number<Dim12>());
-  return *this;
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric/Tensor3_antisymmetric_Expr_equals.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_antisymmetric/Tensor3_antisymmetric_Expr_equals.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,157 @@
+  /* Various assignment operators.  I have to explicitly declare the
+     second operator= because otherwise the compiler will generate its
+     own and not use the template code. */
+
+/* T3as=T3as */
+
+template<class A, class B, class U, int Dim0, int Dim12, char i, char j,
+  char k, int Current_Dim0, int Current_Dim1, int Current_Dim2> inline
+void T3as_equals_T3as(A &iter,
+		      const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,j,k>
+		      &result,
+		      const Number<Current_Dim0> &ND0,
+		      const Number<Current_Dim1> &ND1,
+		      const Number<Current_Dim2> &ND2)
+{
+  iter.unsafe(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)=
+    result(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1);
+  T3as_equals_T3as(iter,result,Number<Current_Dim0>(),Number<Current_Dim1-1>(),
+		   Number<Current_Dim2>());
+}
+
+template<class A, class B, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2> inline
+void T3as_equals_T3as(A &iter,
+		      const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,j,k>
+		      &result,
+		      const Number<Current_Dim0> &ND0,
+		      const Number<1> &ND1,
+		      const Number<Current_Dim2> &ND2)
+{
+  iter.unsafe(Current_Dim0-1,0,Current_Dim2-1)=
+    result(Current_Dim0-1,0,Current_Dim2-1);
+  T3as_equals_T3as(iter,result,Number<Current_Dim0>(),Number<Current_Dim2-2>(),
+		   Number<Current_Dim2-1>());
+}
+
+template<class A, class B, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0> inline
+void T3as_equals_T3as(A &iter,
+		      const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,j,k>
+		      &result,
+		      const Number<Current_Dim0> &ND0,
+		      const Number<1> &ND1,
+		      const Number<2> &ND2)
+{
+  iter.unsafe(Current_Dim0-1,0,1)=result(Current_Dim0-1,0,1);
+  T3as_equals_T3as(iter,result,Number<Current_Dim0-1>(),
+		   Number<Dim12-1>(),Number<Dim12>());
+}
+
+template<class A, class B, class U, int Dim0, int Dim12,
+  char i, char j, char k> inline
+void T3as_equals_T3as(A &iter,
+		      const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,j,k>
+		      &result,
+		      const Number<1> &ND0,
+		      const Number<1> &ND1,
+		      const Number<2> &ND2)
+{
+  iter.unsafe(0,0,1)=result(0,0,1);
+}
+
+
+template<class A, class T, int Dim0, int Dim12, char i, char j, char k>
+template<class B, class U> inline
+const Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<A,Dim0,Dim12>,
+  T,Dim0,Dim12,i,j,k> &
+Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<A,Dim0,Dim12>,
+  T,Dim0,Dim12,i,j,k>::
+operator=(const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,j,k> &result)
+{
+  T3as_equals_T3as(iter,result,Number<Dim0>(),Number<Dim12-1>(),
+		   Number<Dim12>());
+  return *this;
+}
+
+/* T3as=T3as_Expr(T3as) */
+
+template<class A, class T, int Dim0, int Dim12, char i, char j, char k> inline
+const Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<A,Dim0,Dim12>,
+  T,Dim0,Dim12,i,j,k> &
+Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<A,Dim0,Dim12>,
+  T,Dim0,Dim12,i,j,k>::
+operator=(const Tensor3_antisymmetric_Expr<Tensor3_antisymmetric
+	  <A,Dim0,Dim12>,T,Dim0,Dim12,i,j,k> &result)
+{
+  return operator=<Tensor3_antisymmetric<A,Dim0,Dim12>,T>(result);
+}
+
+/* This is for when the indices are switched (i,j,k) -> (i,k,j). */
+
+template<class A, class B, class U, int Dim0, int Dim12, char i, char j,
+  char k, int Current_Dim0, int Current_Dim1, int Current_Dim2> inline
+void T3as_switched_equals_T3as(A &iter, const Tensor3_antisymmetric_Expr
+			       <B,U,Dim0,Dim12,i,k,j> &result,
+			       const Number<Current_Dim0> &ND0,
+			       const Number<Current_Dim1> &ND1,
+			       const Number<Current_Dim2> &ND2)
+{
+  iter.unsafe(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)=
+    -result(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1);
+  T3as_switched_equals_T3as(iter,result,Number<Current_Dim0>(),
+			    Number<Current_Dim1-1>(),
+			    Number<Current_Dim2>());
+}
+
+template<class A, class B, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2> inline
+void T3as_switched_equals_T3as(A &iter, const Tensor3_antisymmetric_Expr
+			       <B,U,Dim0,Dim12,i,k,j> &result,
+			       const Number<Current_Dim0> &ND0,
+			       const Number<1> &ND1,
+			       const Number<Current_Dim2> &ND2)
+{
+  iter.unsafe(Current_Dim0-1,0,Current_Dim2-1)=
+    -result(Current_Dim0-1,0,Current_Dim2-1);
+  T3as_switched_equals_T3as(iter,result,Number<Current_Dim0>(),
+			    Number<Current_Dim2-2>(),
+			    Number<Current_Dim2-1>());
+}
+
+template<class A, class B, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0> inline
+void T3as_switched_equals_T3as(A &iter, const Tensor3_antisymmetric_Expr
+			       <B,U,Dim0,Dim12,i,k,j> &result,
+			       const Number<Current_Dim0> &ND0,
+			       const Number<1> &ND1,
+			       const Number<2> &ND2)
+{
+  iter.unsafe(Current_Dim0-1,0,1)=-result(Current_Dim0-1,0,1);
+  T3as_switched_equals_T3as(iter,result,Number<Current_Dim0-1>(),
+			    Number<Dim12-1>(),Number<Dim12>());
+}
+
+template<class A, class B, class U, int Dim0, int Dim12,
+  char i, char j, char k> inline
+void T3as_switched_equals_T3as(A &iter, const Tensor3_antisymmetric_Expr
+			       <B,U,Dim0,Dim12,i,k,j> &result,
+			       const Number<1> &ND0,
+			       const Number<1> &ND1,
+			       const Number<2> &ND2)
+{
+  iter.unsafe(0,0,1)=-result(0,0,1);
+}
+
+template<class A, class T, int Dim0, int Dim12, char i, char j, char k>
+template<class B, class U> inline
+const Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<A,Dim0,Dim12>,
+  T,Dim0,Dim12,i,j,k> &
+Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<A,Dim0,Dim12>,
+  T,Dim0,Dim12,i,j,k>::
+operator=(const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,k,j> &result)
+{
+  T3as_switched_equals_T3as(iter,result,Number<Dim0>(),Number<Dim12-1>(),
+			    Number<Dim12>());
+  return *this;
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric/Tensor3_antisymmetric_constructor.h
--- a/Tensor3_antisymmetric/Tensor3_antisymmetric_constructor.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-/* A helper class that allows simple initialization of the
-   Tensor3_antisymmetric, but only if it has the correct number of
-   elements. */
-
-template<class T, int Tensor_Dim0, int Tensor_Dim12>
-class Tensor3_antisymmetric_constructor;
-
-template<class T>
-class Tensor3_antisymmetric_constructor<T,2,2>
-{
-public:
-  Tensor3_antisymmetric_constructor(T data[2][1], T d001, T d101)
-  {
-    data[0][0]=d001;
-    data[1][0]=d101;
-  }
-};
-
-template<class T>
-class Tensor3_antisymmetric_constructor<T,3,3>
-{
-public:
-  Tensor3_antisymmetric_constructor(T data[3][3], T d001, T d002, T d012,
-				    T d101, T d102, T d112,
-				    T d201, T d202, T d212)
-  {
-    data[0][0]=d001;
-    data[1][0]=d101;
-    data[2][0]=d201;
-
-    data[0][1]=d002;
-    data[1][1]=d102;
-    data[2][1]=d202;
-
-    data[0][2]=d012;
-    data[1][2]=d112;
-    data[2][2]=d212;
-  }
-};
-
-template<class T>
-class Tensor3_antisymmetric_constructor<T,4,4>
-{
-public:
-  Tensor3_antisymmetric_constructor
-  (T data[10][4], T d001, T d002, T d003, T d012, T d013, T d023,
-   T d101, T d102, T d103, T d112, T d113, T d123,
-   T d201, T d202, T d203, T d212, T d213, T d223)
-  {
-    data[0][0]=d001;
-    data[0][1]=d002;
-    data[0][2]=d003;
-    data[0][3]=d012;
-    data[0][4]=d013;
-    data[0][5]=d023;
-
-    data[1][0]=d001;
-    data[1][1]=d002;
-    data[1][2]=d003;
-    data[1][3]=d012;
-    data[1][4]=d013;
-    data[1][5]=d023;
-
-    data[2][0]=d001;
-    data[2][1]=d002;
-    data[2][2]=d003;
-    data[2][3]=d012;
-    data[2][4]=d013;
-    data[2][5]=d023;
-
-    data[3][0]=d001;
-    data[3][1]=d002;
-    data[3][2]=d003;
-    data[3][3]=d012;
-    data[3][4]=d013;
-    data[3][5]=d023;
-  }
-};
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric/Tensor3_antisymmetric_constructor.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_antisymmetric/Tensor3_antisymmetric_constructor.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,79 @@
+/* A helper class that allows simple initialization of the
+   Tensor3_antisymmetric, but only if it has the correct number of
+   elements. */
+
+template<class T, int Tensor_Dim0, int Tensor_Dim12>
+class Tensor3_antisymmetric_constructor;
+
+template<class T>
+class Tensor3_antisymmetric_constructor<T,2,2>
+{
+public:
+  Tensor3_antisymmetric_constructor(T data[2][1], T d001, T d101)
+  {
+    data[0][0]=d001;
+    data[1][0]=d101;
+  }
+};
+
+template<class T>
+class Tensor3_antisymmetric_constructor<T,3,3>
+{
+public:
+  Tensor3_antisymmetric_constructor(T data[3][3], T d001, T d002, T d012,
+				    T d101, T d102, T d112,
+				    T d201, T d202, T d212)
+  {
+    data[0][0]=d001;
+    data[1][0]=d101;
+    data[2][0]=d201;
+
+    data[0][1]=d002;
+    data[1][1]=d102;
+    data[2][1]=d202;
+
+    data[0][2]=d012;
+    data[1][2]=d112;
+    data[2][2]=d212;
+  }
+};
+
+template<class T>
+class Tensor3_antisymmetric_constructor<T,4,4>
+{
+public:
+  Tensor3_antisymmetric_constructor
+  (T data[10][4], T d001, T d002, T d003, T d012, T d013, T d023,
+   T d101, T d102, T d103, T d112, T d113, T d123,
+   T d201, T d202, T d203, T d212, T d213, T d223)
+  {
+    data[0][0]=d001;
+    data[0][1]=d002;
+    data[0][2]=d003;
+    data[0][3]=d012;
+    data[0][4]=d013;
+    data[0][5]=d023;
+
+    data[1][0]=d001;
+    data[1][1]=d002;
+    data[1][2]=d003;
+    data[1][3]=d012;
+    data[1][4]=d013;
+    data[1][5]=d023;
+
+    data[2][0]=d001;
+    data[2][1]=d002;
+    data[2][2]=d003;
+    data[2][3]=d012;
+    data[2][4]=d013;
+    data[2][5]=d023;
+
+    data[3][0]=d001;
+    data[3][1]=d002;
+    data[3][2]=d003;
+    data[3][3]=d012;
+    data[3][4]=d013;
+    data[3][5]=d023;
+  }
+};
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric/Tensor3_antisymmetric_mod_Tensor1.h
--- a/Tensor3_antisymmetric/Tensor3_antisymmetric_mod_Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-/* Multiplies a Tensor3_antisymmetric and a Tensor1, yielding a
-   Tensor4_Riemann. */
-
-/* A(j,k,l)*B(i) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-class Tensor3_antisymmetric_mod_Tensor1
-{
-  const Tensor3_antisymmetric_Expr<A,T,Dim,Dim,j,k,l> iterA;
-  const Tensor1_Expr<B,U,Dim,i> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-			     const int N4) const
-  {
-    return iterA(N2,N3,N4)*iterB(N1);
-  }
-
-  Tensor3_antisymmetric_mod_Tensor1
-  (const Tensor3_antisymmetric_Expr<A,T,Dim,Dim,j,k,l> &a,
-   const Tensor1_Expr<B,U,Dim,i> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const Tensor4_Riemann_Expr
-<const Tensor3_antisymmetric_mod_Tensor1<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,i,j,k,l>
-operator%(const Tensor3_antisymmetric_Expr<A,T,Dim,Dim,j,k,l> &a,
-	  const Tensor1_Expr<B,U,Dim,i> &b)
-{
-  typedef const Tensor3_antisymmetric_mod_Tensor1<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor4_Riemann_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j,k,l>
-    (TensorExpr(a,b));
-}
-
-/* B(i)*A(j,k,l) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const Tensor4_Riemann_Expr
-<const Tensor3_antisymmetric_mod_Tensor1<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,i,j,k,l>
-operator%(const Tensor1_Expr<B,U,Dim,i> &b,
-	  const Tensor3_antisymmetric_Expr<A,T,Dim,Dim,j,k,l> &a)
-{
-  typedef const Tensor3_antisymmetric_mod_Tensor1<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor4_Riemann_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j,k,l>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric/Tensor3_antisymmetric_mod_Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_antisymmetric/Tensor3_antisymmetric_mod_Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,52 @@
+/* Multiplies a Tensor3_antisymmetric and a Tensor1, yielding a
+   Tensor4_Riemann. */
+
+/* A(j,k,l)*B(i) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+class Tensor3_antisymmetric_mod_Tensor1
+{
+  const Tensor3_antisymmetric_Expr<A,T,Dim,Dim,j,k,l> iterA;
+  const Tensor1_Expr<B,U,Dim,i> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+			     const int N4) const
+  {
+    return iterA(N2,N3,N4)*iterB(N1);
+  }
+
+  Tensor3_antisymmetric_mod_Tensor1
+  (const Tensor3_antisymmetric_Expr<A,T,Dim,Dim,j,k,l> &a,
+   const Tensor1_Expr<B,U,Dim,i> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const Tensor4_Riemann_Expr
+<const Tensor3_antisymmetric_mod_Tensor1<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,i,j,k,l>
+operator%(const Tensor3_antisymmetric_Expr<A,T,Dim,Dim,j,k,l> &a,
+	  const Tensor1_Expr<B,U,Dim,i> &b)
+{
+  typedef const Tensor3_antisymmetric_mod_Tensor1<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor4_Riemann_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j,k,l>
+    (TensorExpr(a,b));
+}
+
+/* B(i)*A(j,k,l) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const Tensor4_Riemann_Expr
+<const Tensor3_antisymmetric_mod_Tensor1<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,i,j,k,l>
+operator%(const Tensor1_Expr<B,U,Dim,i> &b,
+	  const Tensor3_antisymmetric_Expr<A,T,Dim,Dim,j,k,l> &a)
+{
+  typedef const Tensor3_antisymmetric_mod_Tensor1<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor4_Riemann_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j,k,l>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric/Tensor3_antisymmetric_or_Tensor3_antisymmetric.h
--- a/Tensor3_antisymmetric/Tensor3_antisymmetric_or_Tensor3_antisymmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-/* Adds two Tensor3_antisymmetrics together to make a Tensor3_dg. */
-
-/* A(i,j,k) + B(k,j,i) */
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-class Tensor3_antisymmetric_or_Tensor3_antisymmetric
-{
-  const Tensor3_antisymmetric_Expr<A,T,Dim,Dim,i,j,k> iterA;
-  const Tensor3_antisymmetric_Expr<B,U,Dim,Dim,k,j,i> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N3,N2)+iterB(N2,N3,N1);
-  }
-
-  Tensor3_antisymmetric_or_Tensor3_antisymmetric
-  (const Tensor3_antisymmetric_Expr<A,T,Dim,Dim,i,j,k> &a,
-   const Tensor3_antisymmetric_Expr<B,U,Dim,Dim,k,j,i> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-inline const Tensor3_dg_Expr<const Tensor3_antisymmetric_or_Tensor3_antisymmetric
-<A,B,T,U,Dim,i,j,k>,typename promote<T,U>::V,Dim,Dim,i,k,j>
-operator||(const Tensor3_antisymmetric_Expr<A,T,Dim,Dim,i,j,k> &a,
-	   const Tensor3_antisymmetric_Expr<B,U,Dim,Dim,k,j,i> &b)
-{
-  typedef const Tensor3_antisymmetric_or_Tensor3_antisymmetric
-    <A,B,T,U,Dim,i,j,k> TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,k,j>
-    (TensorExpr(a,b));
-}
-
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric/Tensor3_antisymmetric_or_Tensor3_antisymmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_antisymmetric/Tensor3_antisymmetric_or_Tensor3_antisymmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,34 @@
+/* Adds two Tensor3_antisymmetrics together to make a Tensor3_dg. */
+
+/* A(i,j,k) + B(k,j,i) */
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+class Tensor3_antisymmetric_or_Tensor3_antisymmetric
+{
+  const Tensor3_antisymmetric_Expr<A,T,Dim,Dim,i,j,k> iterA;
+  const Tensor3_antisymmetric_Expr<B,U,Dim,Dim,k,j,i> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N3,N2)+iterB(N2,N3,N1);
+  }
+
+  Tensor3_antisymmetric_or_Tensor3_antisymmetric
+  (const Tensor3_antisymmetric_Expr<A,T,Dim,Dim,i,j,k> &a,
+   const Tensor3_antisymmetric_Expr<B,U,Dim,Dim,k,j,i> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+inline const Tensor3_dg_Expr<const Tensor3_antisymmetric_or_Tensor3_antisymmetric
+<A,B,T,U,Dim,i,j,k>,typename promote<T,U>::V,Dim,Dim,i,k,j>
+operator||(const Tensor3_antisymmetric_Expr<A,T,Dim,Dim,i,j,k> &a,
+	   const Tensor3_antisymmetric_Expr<B,U,Dim,Dim,k,j,i> &b)
+{
+  typedef const Tensor3_antisymmetric_or_Tensor3_antisymmetric
+    <A,B,T,U,Dim,i,j,k> TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,k,j>
+    (TensorExpr(a,b));
+}
+
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric/Tensor3_antisymmetric_plus_Tensor3_antisymmetric.h
--- a/Tensor3_antisymmetric/Tensor3_antisymmetric_plus_Tensor3_antisymmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-/* Adds two Tensor3_antisymmetric's together, yielding a
-   Tensor3_antisymmetric. */
-
-/* A(i,j,k) + B(i,j,k) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-class Tensor3_antisymmetric_plus_Tensor3_antisymmetric
-{
-  const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> iterA;
-  const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,j,k> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)+iterB(N1,N2,N3);
-  }
-
-  Tensor3_antisymmetric_plus_Tensor3_antisymmetric
-  (const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
-   const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,j,k> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const Tensor3_antisymmetric_Expr
-<const Tensor3_antisymmetric_plus_Tensor3_antisymmetric
-<A,B,T,U,Dim0,Dim12,i,j,k>,typename promote<T,U>::V,Dim0,Dim12,i,j,k>
-operator+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
-	  const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,j,k> &b)
-{
-  typedef const Tensor3_antisymmetric_plus_Tensor3_antisymmetric
-    <A,B,T,U,Dim0,Dim12,i,j,k> TensorExpr;
-  return Tensor3_antisymmetric_Expr
-    <TensorExpr,typename promote<T,U>::V,Dim0,Dim12,i,j,k>(TensorExpr(a,b));
-}
-
-/* A(i,j,k) + B(i,k,j) (which simplifies to A(i,j,k) - B(i,j,k)) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-class Tensor3_antisymmetric_plus_Tensor3_antisymmetric_12
-{
-  const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> iterA;
-  const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,k,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)-iterB(N1,N2,N3);
-  }
-
-  Tensor3_antisymmetric_plus_Tensor3_antisymmetric_12
-  (const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
-   const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,k,j> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const Tensor3_antisymmetric_Expr
-<const Tensor3_antisymmetric_plus_Tensor3_antisymmetric_12
-<A,B,T,U,Dim0,Dim12,i,j,k>,typename promote<T,U>::V,Dim0,Dim12,i,j,k>
-operator+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
-	  const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,k,j> &b)
-{
-  typedef const Tensor3_antisymmetric_plus_Tensor3_antisymmetric_12
-    <A,B,T,U,Dim0,Dim12,i,j,k> TensorExpr;
-  return Tensor3_antisymmetric_Expr
-    <TensorExpr,typename promote<T,U>::V,Dim0,Dim12,i,j,k>(TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric/Tensor3_antisymmetric_plus_Tensor3_antisymmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_antisymmetric/Tensor3_antisymmetric_plus_Tensor3_antisymmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,70 @@
+/* Adds two Tensor3_antisymmetric's together, yielding a
+   Tensor3_antisymmetric. */
+
+/* A(i,j,k) + B(i,j,k) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+class Tensor3_antisymmetric_plus_Tensor3_antisymmetric
+{
+  const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> iterA;
+  const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,j,k> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)+iterB(N1,N2,N3);
+  }
+
+  Tensor3_antisymmetric_plus_Tensor3_antisymmetric
+  (const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+   const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,j,k> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const Tensor3_antisymmetric_Expr
+<const Tensor3_antisymmetric_plus_Tensor3_antisymmetric
+<A,B,T,U,Dim0,Dim12,i,j,k>,typename promote<T,U>::V,Dim0,Dim12,i,j,k>
+operator+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+	  const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,j,k> &b)
+{
+  typedef const Tensor3_antisymmetric_plus_Tensor3_antisymmetric
+    <A,B,T,U,Dim0,Dim12,i,j,k> TensorExpr;
+  return Tensor3_antisymmetric_Expr
+    <TensorExpr,typename promote<T,U>::V,Dim0,Dim12,i,j,k>(TensorExpr(a,b));
+}
+
+/* A(i,j,k) + B(i,k,j) (which simplifies to A(i,j,k) - B(i,j,k)) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+class Tensor3_antisymmetric_plus_Tensor3_antisymmetric_12
+{
+  const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> iterA;
+  const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,k,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)-iterB(N1,N2,N3);
+  }
+
+  Tensor3_antisymmetric_plus_Tensor3_antisymmetric_12
+  (const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+   const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,k,j> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const Tensor3_antisymmetric_Expr
+<const Tensor3_antisymmetric_plus_Tensor3_antisymmetric_12
+<A,B,T,U,Dim0,Dim12,i,j,k>,typename promote<T,U>::V,Dim0,Dim12,i,j,k>
+operator+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+	  const Tensor3_antisymmetric_Expr<B,U,Dim0,Dim12,i,k,j> &b)
+{
+  typedef const Tensor3_antisymmetric_plus_Tensor3_antisymmetric_12
+    <A,B,T,U,Dim0,Dim12,i,j,k> TensorExpr;
+  return Tensor3_antisymmetric_Expr
+    <TensorExpr,typename promote<T,U>::V,Dim0,Dim12,i,j,k>(TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric/Tensor3_antisymmetric_pointer.h
--- a/Tensor3_antisymmetric/Tensor3_antisymmetric_pointer.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,130 +0,0 @@
-/* A version for pointers. */
-
-template <class T, int Tensor_Dim0, int Tensor_Dim12>
-class Tensor3_antisymmetric<T*,Tensor_Dim0,Tensor_Dim12>
-{
-  mutable T * restrict data[Tensor_Dim0][(Tensor_Dim12*(Tensor_Dim12-1))/2];
-public:
-  Tensor3_antisymmetric() {}
-
-  /* Tensor_Dim0=2, Tensor_Dim12=2 */
-  Tensor3_antisymmetric(T* d001, T* d101)
-  {
-    Tensor3_antisymmetric_constructor<T* restrict,2,2>(data,d001,d101);
-  }
-
-  /* Tensor_Dim0=3, Tensor_Dim12=3 */
-  Tensor3_antisymmetric(T* d001, T* d002, T* d012, T* d101, T* d102, T* d112,
-			T* d201, T* d202, T* d212)
-  {
-    Tensor3_antisymmetric_constructor<T* restrict,3,3>
-      (data,d001,d002,d012,d101,d102,d112,d201,d202,d212);
-  }
-
-  /* Tensor_Dim0=4, Tensor_Dim12=4 */
-  Tensor3_antisymmetric(T* d001, T* d002, T* d003, T* d012, T* d013, T* d023,
-			T* d101, T* d102, T* d103, T* d112, T* d113, T* d123,
-			T* d201, T* d202, T* d203, T* d212, T* d213, T* d223)
-  {
-    Tensor3_antisymmetric_constructor<T* restrict,4,4>
-      (data,d001,d002,d003,d012,d013,d023,d101,d102,d103,d112,d113,d123,
-       d201,d202,d203,d212,d213,d223);
-  }
-
-  /* There are two ways of accessing the values inside,
-     unsafe(int,int,int) and operator(int,int,int).
-     unsafe(int,int,int) will give you a wrong answer if you aren't
-     careful.  The problem is that we only store the minimal set of
-     components, but some have different signs.  We can't return the
-     negative of a component, and assign something to it, because that
-     would assign something to a temporary.  To get the correct answer
-     if you don't want to change the value, just use
-     operator(int,int,int). */
-
-  T & unsafe(const int N1, const int N2, const int N3)
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim0 || N1<0
-       || N2>=Tensor_Dim12 || N2<0 || N3>=Tensor_Dim12 || N3<0
-       || N2>=N3)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor3_antisymmetric<T*,"
-          << Tensor_Dim0 << "," << Tensor_Dim12 << ">.unsafe("
-          << N1 << "," << N2 << "," << N3 << ")" << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return *data[N1][N3-1+(N2*(2*(Tensor_Dim12-1)-N2-1))/2];
-  }
-
-  T operator()(const int N1, const int N2, const int N3) const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim0 || N1<0
-       || N2>=Tensor_Dim12 || N2<0 || N3>=Tensor_Dim12 || N3<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor3_antisymmetric<T*,"
-          << Tensor_Dim0 << "," << Tensor_Dim12
-          << ">.operator("
-          << N1 << "," << N2 << "," << N3 << ") const"
-          << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N2<N3 ? *data[N1][N3-1+(N2*(2*(Tensor_Dim12-1)-N2-1))/2]
-      : (N2>N3 ? -*data[N1][N2-1+(N3*(2*(Tensor_Dim12-1)-N3-1))/2] : 0.0);
-  }
-
-  T* ptr(const int N1, const int N2, const int N3) const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim0 || N1<0
-       || N2>=Tensor_Dim12 || N2<0 || N3>=Tensor_Dim12 || N3<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor3_antisymmetric<T*,"
-          << Tensor_Dim0 << "," << Tensor_Dim12 << ">.ptr("
-          << N1 << "," << N2 << "," << N3 << ")" << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N2<N3 ? data[N1][N3-1+(N2*(2*(Tensor_Dim12-1)-N2-1))/2]
-      : (N2>N3 ? -data[N1][N2-1+(N3*(2*(Tensor_Dim12-1)-N3-1))/2] : 0);
-  }
-
-  /* These operator()'s are the first part in constructing template
-     expressions. */
-  
-  template<char i, char j, char k, int Dim0, int Dim12>
-  Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<T*,Tensor_Dim0,Tensor_Dim12>,
-    T,Dim0,Dim12,i,j,k>
-  operator()(const Index<i,Dim0> index1, const Index<j,Dim12> index2,
-	     const Index<k,Dim12> index3)
-  {
-    return Tensor3_antisymmetric_Expr<Tensor3_antisymmetric
-      <T*,Tensor_Dim0,Tensor_Dim12>,T,Dim0,Dim12,i,j,k>(*this);
-  }
-
-  template<char i, char j, char k, int Dim0, int Dim12>
-  Tensor3_antisymmetric_Expr<const Tensor3_antisymmetric
-  <T*,Tensor_Dim0,Tensor_Dim12>,T,Dim0,Dim12,i,j,k>
-  operator()(const Index<i,Dim0> index1, const Index<j,Dim12> index2,
-	     const Index<k,Dim12> index3) const
-  {
-    return Tensor3_antisymmetric_Expr<const Tensor3_antisymmetric
-      <T*,Tensor_Dim0,Tensor_Dim12>,T,Dim0,Dim12,i,j,k>(*this);
-  }
-
-  /* The ++ operator increments the pointer, not the number that the
-     pointer points to.  This allows iterating over a grid. */
-
-  const Tensor3_antisymmetric<T*,Tensor_Dim0,Tensor_Dim12> & operator++() const
-  {
-    for(int i=0;i<Tensor_Dim0;++i)
-      for(int j=0;j<(Tensor_Dim12*(Tensor_Dim12-1))/2;++j)
-	++data[i][j];
-    return *this;
-  }
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric/Tensor3_antisymmetric_pointer.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_antisymmetric/Tensor3_antisymmetric_pointer.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,130 @@
+/* A version for pointers. */
+
+template <class T, int Tensor_Dim0, int Tensor_Dim12>
+class Tensor3_antisymmetric<T*,Tensor_Dim0,Tensor_Dim12>
+{
+  mutable T * restrict data[Tensor_Dim0][(Tensor_Dim12*(Tensor_Dim12-1))/2];
+public:
+  Tensor3_antisymmetric() {}
+
+  /* Tensor_Dim0=2, Tensor_Dim12=2 */
+  Tensor3_antisymmetric(T* d001, T* d101)
+  {
+    Tensor3_antisymmetric_constructor<T* restrict,2,2>(data,d001,d101);
+  }
+
+  /* Tensor_Dim0=3, Tensor_Dim12=3 */
+  Tensor3_antisymmetric(T* d001, T* d002, T* d012, T* d101, T* d102, T* d112,
+			T* d201, T* d202, T* d212)
+  {
+    Tensor3_antisymmetric_constructor<T* restrict,3,3>
+      (data,d001,d002,d012,d101,d102,d112,d201,d202,d212);
+  }
+
+  /* Tensor_Dim0=4, Tensor_Dim12=4 */
+  Tensor3_antisymmetric(T* d001, T* d002, T* d003, T* d012, T* d013, T* d023,
+			T* d101, T* d102, T* d103, T* d112, T* d113, T* d123,
+			T* d201, T* d202, T* d203, T* d212, T* d213, T* d223)
+  {
+    Tensor3_antisymmetric_constructor<T* restrict,4,4>
+      (data,d001,d002,d003,d012,d013,d023,d101,d102,d103,d112,d113,d123,
+       d201,d202,d203,d212,d213,d223);
+  }
+
+  /* There are two ways of accessing the values inside,
+     unsafe(int,int,int) and operator(int,int,int).
+     unsafe(int,int,int) will give you a wrong answer if you aren't
+     careful.  The problem is that we only store the minimal set of
+     components, but some have different signs.  We can't return the
+     negative of a component, and assign something to it, because that
+     would assign something to a temporary.  To get the correct answer
+     if you don't want to change the value, just use
+     operator(int,int,int). */
+
+  T & unsafe(const int N1, const int N2, const int N3)
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim0 || N1<0
+       || N2>=Tensor_Dim12 || N2<0 || N3>=Tensor_Dim12 || N3<0
+       || N2>=N3)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor3_antisymmetric<T*,"
+          << Tensor_Dim0 << "," << Tensor_Dim12 << ">.unsafe("
+          << N1 << "," << N2 << "," << N3 << ")" << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return *data[N1][N3-1+(N2*(2*(Tensor_Dim12-1)-N2-1))/2];
+  }
+
+  T operator()(const int N1, const int N2, const int N3) const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim0 || N1<0
+       || N2>=Tensor_Dim12 || N2<0 || N3>=Tensor_Dim12 || N3<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor3_antisymmetric<T*,"
+          << Tensor_Dim0 << "," << Tensor_Dim12
+          << ">.operator("
+          << N1 << "," << N2 << "," << N3 << ") const"
+          << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N2<N3 ? *data[N1][N3-1+(N2*(2*(Tensor_Dim12-1)-N2-1))/2]
+      : (N2>N3 ? -*data[N1][N2-1+(N3*(2*(Tensor_Dim12-1)-N3-1))/2] : 0.0);
+  }
+
+  T* ptr(const int N1, const int N2, const int N3) const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim0 || N1<0
+       || N2>=Tensor_Dim12 || N2<0 || N3>=Tensor_Dim12 || N3<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor3_antisymmetric<T*,"
+          << Tensor_Dim0 << "," << Tensor_Dim12 << ">.ptr("
+          << N1 << "," << N2 << "," << N3 << ")" << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N2<N3 ? data[N1][N3-1+(N2*(2*(Tensor_Dim12-1)-N2-1))/2]
+      : (N2>N3 ? -data[N1][N2-1+(N3*(2*(Tensor_Dim12-1)-N3-1))/2] : 0);
+  }
+
+  /* These operator()'s are the first part in constructing template
+     expressions. */
+  
+  template<char i, char j, char k, int Dim0, int Dim12>
+  Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<T*,Tensor_Dim0,Tensor_Dim12>,
+    T,Dim0,Dim12,i,j,k>
+  operator()(const Index<i,Dim0> index1, const Index<j,Dim12> index2,
+	     const Index<k,Dim12> index3)
+  {
+    return Tensor3_antisymmetric_Expr<Tensor3_antisymmetric
+      <T*,Tensor_Dim0,Tensor_Dim12>,T,Dim0,Dim12,i,j,k>(*this);
+  }
+
+  template<char i, char j, char k, int Dim0, int Dim12>
+  Tensor3_antisymmetric_Expr<const Tensor3_antisymmetric
+  <T*,Tensor_Dim0,Tensor_Dim12>,T,Dim0,Dim12,i,j,k>
+  operator()(const Index<i,Dim0> index1, const Index<j,Dim12> index2,
+	     const Index<k,Dim12> index3) const
+  {
+    return Tensor3_antisymmetric_Expr<const Tensor3_antisymmetric
+      <T*,Tensor_Dim0,Tensor_Dim12>,T,Dim0,Dim12,i,j,k>(*this);
+  }
+
+  /* The ++ operator increments the pointer, not the number that the
+     pointer points to.  This allows iterating over a grid. */
+
+  const Tensor3_antisymmetric<T*,Tensor_Dim0,Tensor_Dim12> & operator++() const
+  {
+    for(int i=0;i<Tensor_Dim0;++i)
+      for(int j=0;j<(Tensor_Dim12*(Tensor_Dim12-1))/2;++j)
+	++data[i][j];
+    return *this;
+  }
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric/Tensor3_antisymmetric_times_Tensor3.h
--- a/Tensor3_antisymmetric/Tensor3_antisymmetric_times_Tensor3.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,507 +0,0 @@
-/* Fully contracts a Tensor3_antisymmetric with a Tensor3, yielding a
-   typename promote<T,U>::V.  I removed the identically zero components of
-   Tensor3_antisymmetric.*/
-
-/* A(i,j,k)*B(i,j,k) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline const typename promote<T,U>::V T3as_times_T3_012
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,j,k> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
-    b(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)
-    + T3as_times_T3_012(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim1-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3as_times_T3_012
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,j,k> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim0-1,0,Current_Dim2-1)
-    + T3as_times_T3_012(a,b,Number<Current_Dim0>(),
-			Number<Dim12>(),Number<Current_Dim2-1>());
-}
-
-/* A special case for when the last two indices are equal. */
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3as_times_T3_012
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,j,k> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim2> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return T3as_times_T3_012(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim2-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0>
-inline const typename promote<T,U>::V T3as_times_T3_012
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,j,k> &b,
- const Number<Current_Dim0> &ND0, const Number<2> &ND1, const Number<1> &ND2)
-{
-  return a(Current_Dim0-1,1,0)*b(Current_Dim0-1,1,0)
-    + T3as_times_T3_012(a,b,Number<Current_Dim0-1>(),
-			Number<Dim12-1>(),Number<Dim12>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const typename promote<T,U>::V T3as_times_T3_012
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,j,k> &b,
- const Number<1> &ND0, const Number<2> &ND1, const Number<1> &ND2)
-{
-  return a(0,1,0)*b(0,1,0);
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
-	  const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,j,k> &b)
-{
-  return T3as_times_T3_012(a,b,Number<Dim0>(),Number<Dim12-1>(),
-			   Number<Dim12>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,j,k> &b,
-	  const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a)
-{
-  return a*b;
-}
-
-/* A(i,j,k)*B(k,i,j) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline const typename promote<T,U>::V T3as_times_T3_201
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,i,j> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
-    b(Current_Dim2-1,Current_Dim0-1,Current_Dim1-1)
-    + T3as_times_T3_201(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim1-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3as_times_T3_201
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,i,j> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim2-1,Current_Dim0-1,0)
-    + T3as_times_T3_201(a,b,Number<Current_Dim0>(),
-			Number<Dim12>(),Number<Current_Dim2-1>());
-}
-
-/* A special case for when the last two indices are equal. */
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3as_times_T3_201
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,i,j> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim2> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return T3as_times_T3_201(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim2-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0>
-inline const typename promote<T,U>::V T3as_times_T3_201
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,i,j> &b,
- const Number<Current_Dim0> &ND0, const Number<2> &ND1, const Number<1> &ND2)
-{
-  return a(Current_Dim0-1,1,0)*b(0,Current_Dim0-1,1)
-    + T3as_times_T3_201(a,b,Number<Current_Dim0-1>(),
-			Number<Dim12-1>(),Number<Dim12>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const typename promote<T,U>::V T3as_times_T3_201
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,i,j> &b,
- const Number<1> &ND0, const Number<2> &ND1, const Number<1> &ND2)
-{
-  return a(0,1,0)*b(0,0,1);
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
-	  const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,i,j> &b)
-{
-  return T3as_times_T3_201(a,b,Number<Dim0>(),Number<Dim12-1>(),
-			   Number<Dim12>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_Expr<B,U,Dim12,Dim0,Dim12,k,i,j> &b,
-	  const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a)
-{
-  return a*b;
-}
-
-/* A(i,j,k)*B(j,k,i) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline const typename promote<T,U>::V T3as_times_T3_120
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,k,i> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
-    b(Current_Dim1-1,Current_Dim2-1,Current_Dim0-1)
-    + T3as_times_T3_120(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim1-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3as_times_T3_120
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,k,i> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,0,Current_Dim2-1)*b(0,Current_Dim2-1,Current_Dim0-1)
-    + T3as_times_T3_120(a,b,Number<Current_Dim0>(),
-			Number<Dim12>(),Number<Current_Dim2-1>());
-}
-
-/* A special case for when the last two indices are equal. */
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3as_times_T3_120
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,k,i> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim2> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return T3as_times_T3_120(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim2-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0>
-inline const typename promote<T,U>::V T3as_times_T3_120
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,k,i> &b,
- const Number<Current_Dim0> &ND0, const Number<2> &ND1, const Number<1> &ND2)
-{
-  return a(Current_Dim0-1,1,0)*b(1,0,Current_Dim0-1)
-    + T3as_times_T3_120(a,b,Number<Current_Dim0-1>(),
-			Number<Dim12-1>(),Number<Dim12>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const typename promote<T,U>::V T3as_times_T3_120
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,k,i> &b,
- const Number<1> &ND0, const Number<2> &ND1, const Number<1> &ND2)
-{
-  return a(0,1,0)*b(1,0,0);
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
-	  const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,k,i> &b)
-{
-  return T3as_times_T3_120(a,b,Number<Dim0>(),Number<Dim12-1>(),
-			   Number<Dim12>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_Expr<B,U,Dim12,Dim12,Dim0,j,k,i> &b,
-	  const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a)
-{
-  return a*b;
-}
-
-/* A(i,j,k)*B(j,i,k) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline const typename promote<T,U>::V T3as_times_T3_102
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,i,k> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
-    b(Current_Dim1-1,Current_Dim0-1,Current_Dim2-1)
-    + T3as_times_T3_102(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim1-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3as_times_T3_102
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,i,k> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,0,Current_Dim2-1)*b(0,Current_Dim0-1,Current_Dim2-1)
-    + T3as_times_T3_102(a,b,Number<Current_Dim0>(),
-			Number<Dim12>(),Number<Current_Dim2-1>());
-}
-
-/* A special case for when the last two indices are equal. */
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3as_times_T3_102
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,i,k> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim2> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return T3as_times_T3_102(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim2-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0>
-inline const typename promote<T,U>::V T3as_times_T3_102
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,i,k> &b,
- const Number<Current_Dim0> &ND0, const Number<2> &ND1, const Number<1> &ND2)
-{
-  return a(Current_Dim0-1,1,0)*b(1,Current_Dim0-1,0)
-    + T3as_times_T3_102(a,b,Number<Current_Dim0-1>(),
-			Number<Dim12-1>(),Number<Dim12>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const typename promote<T,U>::V T3as_times_T3_102
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,i,k> &b,
- const Number<1> &ND0, const Number<2> &ND1, const Number<1> &ND2)
-{
-  return a(0,1,0)*b(1,0,0);
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
-	  const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,i,k> &b)
-{
-  return T3as_times_T3_102(a,b,Number<Dim0>(),Number<Dim12-1>(),
-			   Number<Dim12>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_Expr<B,U,Dim12,Dim0,Dim12,j,i,k> &b,
-	  const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a)
-{
-  return a*b;
-}
-
-/* A(i,j,k)*B(k,j,i) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline const typename promote<T,U>::V T3as_times_T3_210
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,j,i> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
-    b(Current_Dim2-1,Current_Dim1-1,Current_Dim0-1)
-    + T3as_times_T3_210(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim1-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3as_times_T3_210
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,j,i> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim2-1,0,Current_Dim0-1)
-    + T3as_times_T3_210(a,b,Number<Current_Dim0>(),
-			Number<Dim12>(),Number<Current_Dim2-1>());
-}
-
-/* A special case for when the last two indices are equal. */
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3as_times_T3_210
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,j,i> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim2> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return T3as_times_T3_210(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim2-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0>
-inline const typename promote<T,U>::V T3as_times_T3_210
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,j,i> &b,
- const Number<Current_Dim0> &ND0, const Number<2> &ND1, const Number<1> &ND2)
-{
-  return a(Current_Dim0-1,1,0)*b(0,1,Current_Dim0-1)
-    + T3as_times_T3_210(a,b,Number<Current_Dim0-1>(),
-			Number<Dim12-1>(),Number<Dim12>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const typename promote<T,U>::V T3as_times_T3_210
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,j,i> &b,
- const Number<1> &ND0, const Number<2> &ND1, const Number<1> &ND2)
-{
-  return a(0,1,0)*b(0,1,0);
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
-	  const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,j,i> &b)
-{
-  return T3as_times_T3_210(a,b,Number<Dim0>(),Number<Dim12-1>(),
-			   Number<Dim12>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_Expr<B,U,Dim12,Dim12,Dim0,k,j,i> &b,
-	  const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a)
-{
-  return a*b;
-}
-
-/* A(i,j,k)*B(i,k,j) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline const typename promote<T,U>::V T3as_times_T3_012
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,k,j> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
-    b(Current_Dim0-1,Current_Dim2-1,Current_Dim1-1)
-    + T3as_times_T3_012(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim1-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3as_times_T3_012
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,k,j> &b,
- const Number<Current_Dim0> &ND0, const Number<1> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim0-1,Current_Dim2-1,0)
-    + T3as_times_T3_012(a,b,Number<Current_Dim0>(),
-			Number<Dim12>(),Number<Current_Dim2-1>());
-}
-
-/* A special case for when the last two indices are equal. */
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0, int Current_Dim2>
-inline const typename promote<T,U>::V T3as_times_T3_012
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,k,j> &b,
- const Number<Current_Dim0> &ND0, const Number<Current_Dim2> &ND1,
- const Number<Current_Dim2> &ND2)
-{
-  return T3as_times_T3_012(a,b,Number<Current_Dim0>(),
-			Number<Current_Dim2-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k, int Current_Dim0>
-inline const typename promote<T,U>::V T3as_times_T3_012
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,k,j> &b,
- const Number<Current_Dim0> &ND0, const Number<2> &ND1, const Number<1> &ND2)
-{
-  return a(Current_Dim0-1,1,0)*b(Current_Dim0-1,0,1)
-    + T3as_times_T3_012(a,b,Number<Current_Dim0-1>(),
-			Number<Dim12-1>(),Number<Dim12>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const typename promote<T,U>::V T3as_times_T3_012
-(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
- const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,k,j> &b,
- const Number<1> &ND0, const Number<2> &ND1, const Number<1> &ND2)
-{
-  return a(0,1,0)*b(0,0,1);
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
-	  const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,k,j> &b)
-{
-  return T3as_times_T3_012(a,b,Number<Dim0>(),Number<Dim12-1>(),
-			   Number<Dim12>());
-}
-
-template<class A, class B, class T, class U, int Dim0, int Dim12,
-  char i, char j, char k>
-inline const typename promote<T,U>::V
-operator*(const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,k,j> &b,
-	  const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a)
-{
-  return a*b;
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric/Tensor3_antisymmetric_times_Tensor3.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_antisymmetric/Tensor3_antisymmetric_times_Tensor3.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,507 @@
+/* Fully contracts a Tensor3_antisymmetric with a Tensor3, yielding a
+   typename promote<T,U>::V.  I removed the identically zero components of
+   Tensor3_antisymmetric.*/
+
+/* A(i,j,k)*B(i,j,k) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline const typename promote<T,U>::V T3as_times_T3_012
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,j,k> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
+    b(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)
+    + T3as_times_T3_012(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim1-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3as_times_T3_012
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,j,k> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim0-1,0,Current_Dim2-1)
+    + T3as_times_T3_012(a,b,Number<Current_Dim0>(),
+			Number<Dim12>(),Number<Current_Dim2-1>());
+}
+
+/* A special case for when the last two indices are equal. */
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3as_times_T3_012
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,j,k> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim2> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return T3as_times_T3_012(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim2-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0>
+inline const typename promote<T,U>::V T3as_times_T3_012
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,j,k> &b,
+ const Number<Current_Dim0> &ND0, const Number<2> &ND1, const Number<1> &ND2)
+{
+  return a(Current_Dim0-1,1,0)*b(Current_Dim0-1,1,0)
+    + T3as_times_T3_012(a,b,Number<Current_Dim0-1>(),
+			Number<Dim12-1>(),Number<Dim12>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const typename promote<T,U>::V T3as_times_T3_012
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,j,k> &b,
+ const Number<1> &ND0, const Number<2> &ND1, const Number<1> &ND2)
+{
+  return a(0,1,0)*b(0,1,0);
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+	  const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,j,k> &b)
+{
+  return T3as_times_T3_012(a,b,Number<Dim0>(),Number<Dim12-1>(),
+			   Number<Dim12>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,j,k> &b,
+	  const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a)
+{
+  return a*b;
+}
+
+/* A(i,j,k)*B(k,i,j) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline const typename promote<T,U>::V T3as_times_T3_201
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,i,j> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
+    b(Current_Dim2-1,Current_Dim0-1,Current_Dim1-1)
+    + T3as_times_T3_201(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim1-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3as_times_T3_201
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,i,j> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim2-1,Current_Dim0-1,0)
+    + T3as_times_T3_201(a,b,Number<Current_Dim0>(),
+			Number<Dim12>(),Number<Current_Dim2-1>());
+}
+
+/* A special case for when the last two indices are equal. */
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3as_times_T3_201
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,i,j> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim2> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return T3as_times_T3_201(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim2-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0>
+inline const typename promote<T,U>::V T3as_times_T3_201
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,i,j> &b,
+ const Number<Current_Dim0> &ND0, const Number<2> &ND1, const Number<1> &ND2)
+{
+  return a(Current_Dim0-1,1,0)*b(0,Current_Dim0-1,1)
+    + T3as_times_T3_201(a,b,Number<Current_Dim0-1>(),
+			Number<Dim12-1>(),Number<Dim12>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const typename promote<T,U>::V T3as_times_T3_201
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,i,j> &b,
+ const Number<1> &ND0, const Number<2> &ND1, const Number<1> &ND2)
+{
+  return a(0,1,0)*b(0,0,1);
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+	  const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,i,j> &b)
+{
+  return T3as_times_T3_201(a,b,Number<Dim0>(),Number<Dim12-1>(),
+			   Number<Dim12>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_Expr<B,U,Dim12,Dim0,Dim12,k,i,j> &b,
+	  const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a)
+{
+  return a*b;
+}
+
+/* A(i,j,k)*B(j,k,i) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline const typename promote<T,U>::V T3as_times_T3_120
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,k,i> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
+    b(Current_Dim1-1,Current_Dim2-1,Current_Dim0-1)
+    + T3as_times_T3_120(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim1-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3as_times_T3_120
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,k,i> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,0,Current_Dim2-1)*b(0,Current_Dim2-1,Current_Dim0-1)
+    + T3as_times_T3_120(a,b,Number<Current_Dim0>(),
+			Number<Dim12>(),Number<Current_Dim2-1>());
+}
+
+/* A special case for when the last two indices are equal. */
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3as_times_T3_120
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,k,i> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim2> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return T3as_times_T3_120(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim2-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0>
+inline const typename promote<T,U>::V T3as_times_T3_120
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,k,i> &b,
+ const Number<Current_Dim0> &ND0, const Number<2> &ND1, const Number<1> &ND2)
+{
+  return a(Current_Dim0-1,1,0)*b(1,0,Current_Dim0-1)
+    + T3as_times_T3_120(a,b,Number<Current_Dim0-1>(),
+			Number<Dim12-1>(),Number<Dim12>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const typename promote<T,U>::V T3as_times_T3_120
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,k,i> &b,
+ const Number<1> &ND0, const Number<2> &ND1, const Number<1> &ND2)
+{
+  return a(0,1,0)*b(1,0,0);
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+	  const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,k,i> &b)
+{
+  return T3as_times_T3_120(a,b,Number<Dim0>(),Number<Dim12-1>(),
+			   Number<Dim12>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_Expr<B,U,Dim12,Dim12,Dim0,j,k,i> &b,
+	  const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a)
+{
+  return a*b;
+}
+
+/* A(i,j,k)*B(j,i,k) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline const typename promote<T,U>::V T3as_times_T3_102
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,i,k> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
+    b(Current_Dim1-1,Current_Dim0-1,Current_Dim2-1)
+    + T3as_times_T3_102(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim1-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3as_times_T3_102
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,i,k> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,0,Current_Dim2-1)*b(0,Current_Dim0-1,Current_Dim2-1)
+    + T3as_times_T3_102(a,b,Number<Current_Dim0>(),
+			Number<Dim12>(),Number<Current_Dim2-1>());
+}
+
+/* A special case for when the last two indices are equal. */
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3as_times_T3_102
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,i,k> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim2> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return T3as_times_T3_102(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim2-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0>
+inline const typename promote<T,U>::V T3as_times_T3_102
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,i,k> &b,
+ const Number<Current_Dim0> &ND0, const Number<2> &ND1, const Number<1> &ND2)
+{
+  return a(Current_Dim0-1,1,0)*b(1,Current_Dim0-1,0)
+    + T3as_times_T3_102(a,b,Number<Current_Dim0-1>(),
+			Number<Dim12-1>(),Number<Dim12>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const typename promote<T,U>::V T3as_times_T3_102
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,i,k> &b,
+ const Number<1> &ND0, const Number<2> &ND1, const Number<1> &ND2)
+{
+  return a(0,1,0)*b(1,0,0);
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+	  const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,j,i,k> &b)
+{
+  return T3as_times_T3_102(a,b,Number<Dim0>(),Number<Dim12-1>(),
+			   Number<Dim12>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_Expr<B,U,Dim12,Dim0,Dim12,j,i,k> &b,
+	  const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a)
+{
+  return a*b;
+}
+
+/* A(i,j,k)*B(k,j,i) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline const typename promote<T,U>::V T3as_times_T3_210
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,j,i> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
+    b(Current_Dim2-1,Current_Dim1-1,Current_Dim0-1)
+    + T3as_times_T3_210(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim1-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3as_times_T3_210
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,j,i> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim2-1,0,Current_Dim0-1)
+    + T3as_times_T3_210(a,b,Number<Current_Dim0>(),
+			Number<Dim12>(),Number<Current_Dim2-1>());
+}
+
+/* A special case for when the last two indices are equal. */
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3as_times_T3_210
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,j,i> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim2> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return T3as_times_T3_210(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim2-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0>
+inline const typename promote<T,U>::V T3as_times_T3_210
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,j,i> &b,
+ const Number<Current_Dim0> &ND0, const Number<2> &ND1, const Number<1> &ND2)
+{
+  return a(Current_Dim0-1,1,0)*b(0,1,Current_Dim0-1)
+    + T3as_times_T3_210(a,b,Number<Current_Dim0-1>(),
+			Number<Dim12-1>(),Number<Dim12>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const typename promote<T,U>::V T3as_times_T3_210
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,j,i> &b,
+ const Number<1> &ND0, const Number<2> &ND1, const Number<1> &ND2)
+{
+  return a(0,1,0)*b(0,1,0);
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+	  const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,k,j,i> &b)
+{
+  return T3as_times_T3_210(a,b,Number<Dim0>(),Number<Dim12-1>(),
+			   Number<Dim12>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_Expr<B,U,Dim12,Dim12,Dim0,k,j,i> &b,
+	  const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a)
+{
+  return a*b;
+}
+
+/* A(i,j,k)*B(i,k,j) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline const typename promote<T,U>::V T3as_times_T3_012
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,k,j> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)*
+    b(Current_Dim0-1,Current_Dim2-1,Current_Dim1-1)
+    + T3as_times_T3_012(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim1-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3as_times_T3_012
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,k,j> &b,
+ const Number<Current_Dim0> &ND0, const Number<1> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return a(Current_Dim0-1,0,Current_Dim2-1)*b(Current_Dim0-1,Current_Dim2-1,0)
+    + T3as_times_T3_012(a,b,Number<Current_Dim0>(),
+			Number<Dim12>(),Number<Current_Dim2-1>());
+}
+
+/* A special case for when the last two indices are equal. */
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0, int Current_Dim2>
+inline const typename promote<T,U>::V T3as_times_T3_012
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,k,j> &b,
+ const Number<Current_Dim0> &ND0, const Number<Current_Dim2> &ND1,
+ const Number<Current_Dim2> &ND2)
+{
+  return T3as_times_T3_012(a,b,Number<Current_Dim0>(),
+			Number<Current_Dim2-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k, int Current_Dim0>
+inline const typename promote<T,U>::V T3as_times_T3_012
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,k,j> &b,
+ const Number<Current_Dim0> &ND0, const Number<2> &ND1, const Number<1> &ND2)
+{
+  return a(Current_Dim0-1,1,0)*b(Current_Dim0-1,0,1)
+    + T3as_times_T3_012(a,b,Number<Current_Dim0-1>(),
+			Number<Dim12-1>(),Number<Dim12>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const typename promote<T,U>::V T3as_times_T3_012
+(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+ const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,k,j> &b,
+ const Number<1> &ND0, const Number<2> &ND1, const Number<1> &ND2)
+{
+  return a(0,1,0)*b(0,0,1);
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+	  const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,k,j> &b)
+{
+  return T3as_times_T3_012(a,b,Number<Dim0>(),Number<Dim12-1>(),
+			   Number<Dim12>());
+}
+
+template<class A, class B, class T, class U, int Dim0, int Dim12,
+  char i, char j, char k>
+inline const typename promote<T,U>::V
+operator*(const Tensor3_Expr<B,U,Dim0,Dim12,Dim12,i,k,j> &b,
+	  const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a)
+{
+  return a*b;
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric/Tensor3_antisymmetric_times_generic.h
--- a/Tensor3_antisymmetric/Tensor3_antisymmetric_times_generic.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-/* Multiplies a Tensor3_antisymmetric with a generic, yielding a
-   Tensor3_antisymmetric. */
-
-/* A(i,j,k)*generic */
-
-template<class A, class T, class U, int Dim0, int Dim12, char i, char j,char k>
-class Tensor3_antisymmetric_times_generic
-{
-  const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> iterA;
-  const U d;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)*d;
-  }
-
-  Tensor3_antisymmetric_times_generic
-  (const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a, const U &d0):
-    iterA(a), d(d0) {}
-};
-
-template<class A, class T, class U, int Dim0, int Dim12, char i, char j,char k>
-inline const Tensor3_antisymmetric_Expr<const Tensor3_antisymmetric_times_generic
-<A,T,U,Dim0,Dim12,i,j,k>,typename promote<T,U>::V,Dim0,Dim12,i,j,k>
-operator*(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
-	  const U &d0)
-{
-  typedef const Tensor3_antisymmetric_times_generic<A,T,U,Dim0,Dim12,i,j,k>
-    TensorExpr;
-  return Tensor3_antisymmetric_Expr
-    <TensorExpr,typename promote<T,U>::V,Dim0,Dim12,i,j,k>(TensorExpr(a,d0));
-}
-
-/* generic*A(i,j,k) */
-
-template<class A, class T, class U, int Dim0, int Dim12, char i, char j,char k>
-inline const Tensor3_antisymmetric_Expr<const Tensor3_antisymmetric_times_generic
-<A,T,U,Dim0,Dim12,i,j,k>,typename promote<T,U>::V,Dim0,Dim12,i,j,k>
-operator*(const U &d0,
-	  const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a)
-{
-  typedef const Tensor3_antisymmetric_times_generic<A,T,U,Dim0,Dim12,i,j,k>
-    TensorExpr;
-  return Tensor3_antisymmetric_Expr
-    <TensorExpr,typename promote<T,U>::V,Dim0,Dim12,i,j,k>(TensorExpr(a,d0));
-}
-
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric/Tensor3_antisymmetric_times_generic.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_antisymmetric/Tensor3_antisymmetric_times_generic.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,48 @@
+/* Multiplies a Tensor3_antisymmetric with a generic, yielding a
+   Tensor3_antisymmetric. */
+
+/* A(i,j,k)*generic */
+
+template<class A, class T, class U, int Dim0, int Dim12, char i, char j,char k>
+class Tensor3_antisymmetric_times_generic
+{
+  const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> iterA;
+  const U d;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)*d;
+  }
+
+  Tensor3_antisymmetric_times_generic
+  (const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a, const U &d0):
+    iterA(a), d(d0) {}
+};
+
+template<class A, class T, class U, int Dim0, int Dim12, char i, char j,char k>
+inline const Tensor3_antisymmetric_Expr<const Tensor3_antisymmetric_times_generic
+<A,T,U,Dim0,Dim12,i,j,k>,typename promote<T,U>::V,Dim0,Dim12,i,j,k>
+operator*(const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a,
+	  const U &d0)
+{
+  typedef const Tensor3_antisymmetric_times_generic<A,T,U,Dim0,Dim12,i,j,k>
+    TensorExpr;
+  return Tensor3_antisymmetric_Expr
+    <TensorExpr,typename promote<T,U>::V,Dim0,Dim12,i,j,k>(TensorExpr(a,d0));
+}
+
+/* generic*A(i,j,k) */
+
+template<class A, class T, class U, int Dim0, int Dim12, char i, char j,char k>
+inline const Tensor3_antisymmetric_Expr<const Tensor3_antisymmetric_times_generic
+<A,T,U,Dim0,Dim12,i,j,k>,typename promote<T,U>::V,Dim0,Dim12,i,j,k>
+operator*(const U &d0,
+	  const Tensor3_antisymmetric_Expr<A,T,Dim0,Dim12,i,j,k> &a)
+{
+  typedef const Tensor3_antisymmetric_times_generic<A,T,U,Dim0,Dim12,i,j,k>
+    TensorExpr;
+  return Tensor3_antisymmetric_Expr
+    <TensorExpr,typename promote<T,U>::V,Dim0,Dim12,i,j,k>(TensorExpr(a,d0));
+}
+
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric/Tensor3_antisymmetric_value.h
--- a/Tensor3_antisymmetric/Tensor3_antisymmetric_value.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,103 +0,0 @@
-/* A general version, not for pointers. */
-
-template <class T, int Tensor_Dim0, int Tensor_Dim12>
-class Tensor3_antisymmetric
-{
-  T data[Tensor_Dim0][(Tensor_Dim12*(Tensor_Dim12-1))/2];
-public:
-  Tensor3_antisymmetric() {}
-
-  /* Tensor_Dim0=2, Tensor_Dim12=2 */
-  Tensor3_antisymmetric(T d001, T d101)
-  {
-    Tensor3_antisymmetric_constructor<T,2,2>(data,d001,d101);
-  }
-
-  /* Tensor_Dim0=3, Tensor_Dim12=3 */
-  Tensor3_antisymmetric(T d001, T d002, T d012,	T d101, T d102, T d112,
-			T d201, T d202, T d212)
-  {
-    Tensor3_antisymmetric_constructor<T,3,3>
-      (data,d001,d002,d012,d101,d102,d112,d201,d202,d212);
-  }
-
-  /* Tensor_Dim0=4, Tensor_Dim12=4 */
-  Tensor3_antisymmetric(T d001, T d002, T d003, T d012, T d013, T d023,
-			T d101, T d102, T d103, T d112, T d113, T d123,
-			T d201, T d202, T d203, T d212, T d213, T d223)
-  {
-    Tensor3_antisymmetric_constructor<T,4,4>
-      (data,d001,d002,d003,d012,d013,d023,d101,d102,d103,d112,d113,d123,
-       d201,d202,d203,d212,d213,d223);
-  }
-
-  /* There are two ways of accessing the values inside,
-     unsafe(int,int,int) and operator(int,int,int).
-     unsafe(int,int,int) will give you a wrong answer if you aren't
-     careful.  The problem is that we only store the minimal set of
-     components, but some have different signs.  We can't return the
-     negative of a component, and assign something to it, because that
-     would assign something to a temporary.  To get the correct answer
-     if you don't want to change the value, just use
-     operator(int,int,int). */
-
-  T & unsafe(const int N1, const int N2, const int N3)
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim0 || N1<0
-       || N2>=Tensor_Dim12 || N2<0 || N3>=Tensor_Dim12 || N3<0
-       || N2>=N3)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor3_antisymmetric<T,"
-          << Tensor_Dim0 << "," << Tensor_Dim12
-          << ">.operator("
-          << N1 << "," << N2 << "," << N3 << ")" << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return data[N1][N3-1+(N2*(2*(Tensor_Dim12-1)-N2-1))/2];
-  }
-
-  T operator()(const int N1, const int N2, const int N3) const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim0 || N1<0
-       || N2>=Tensor_Dim12 || N2<0 || N3>=Tensor_Dim12 || N3<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor3_antisymmetric<T,"
-          << Tensor_Dim0 << "," << Tensor_Dim12
-          << ">.operator("
-          << N1 << "," << N2 << "," << N3 << ") const"
-          << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N2<N3 ? data[N1][N3-1+(N2*(2*(Tensor_Dim12-1)-N2-1))/2]
-      : (N2>N3 ? -data[N1][N2-1+(N3*(2*(Tensor_Dim12-1)-N3-1))/2] : 0.0);
-  }
-
-  /* These operator()'s are the first part in constructing template
-     expressions. */
-  
-  template<char i, char j, char k, int Dim0, int Dim12>
-  Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<T,Tensor_Dim0,Tensor_Dim12>,
-    T,Dim0,Dim12,i,j,k>
-  operator()(const Index<i,Dim0> index1, const Index<j,Dim12> index2,
-	     const Index<k,Dim12> index3)
-  {
-    return Tensor3_antisymmetric_Expr<Tensor3_antisymmetric
-      <T,Tensor_Dim0,Tensor_Dim12>,T,Dim0,Dim12,i,j,k>(*this);
-  }
-
-  template<char i, char j, char k, int Dim0, int Dim12>
-  Tensor3_antisymmetric_Expr<const Tensor3_antisymmetric
-  <T,Tensor_Dim0,Tensor_Dim12>,T,Dim0,Dim12,i,j,k>
-  operator()(const Index<i,Dim0> index1, const Index<j,Dim12> index2,
-	     const Index<k,Dim12> index3) const
-  {
-    return Tensor3_antisymmetric_Expr<const Tensor3_antisymmetric
-      <T,Tensor_Dim0,Tensor_Dim12>,T,Dim0,Dim12,i,j,k>(*this);
-  }
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_antisymmetric/Tensor3_antisymmetric_value.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_antisymmetric/Tensor3_antisymmetric_value.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,103 @@
+/* A general version, not for pointers. */
+
+template <class T, int Tensor_Dim0, int Tensor_Dim12>
+class Tensor3_antisymmetric
+{
+  T data[Tensor_Dim0][(Tensor_Dim12*(Tensor_Dim12-1))/2];
+public:
+  Tensor3_antisymmetric() {}
+
+  /* Tensor_Dim0=2, Tensor_Dim12=2 */
+  Tensor3_antisymmetric(T d001, T d101)
+  {
+    Tensor3_antisymmetric_constructor<T,2,2>(data,d001,d101);
+  }
+
+  /* Tensor_Dim0=3, Tensor_Dim12=3 */
+  Tensor3_antisymmetric(T d001, T d002, T d012,	T d101, T d102, T d112,
+			T d201, T d202, T d212)
+  {
+    Tensor3_antisymmetric_constructor<T,3,3>
+      (data,d001,d002,d012,d101,d102,d112,d201,d202,d212);
+  }
+
+  /* Tensor_Dim0=4, Tensor_Dim12=4 */
+  Tensor3_antisymmetric(T d001, T d002, T d003, T d012, T d013, T d023,
+			T d101, T d102, T d103, T d112, T d113, T d123,
+			T d201, T d202, T d203, T d212, T d213, T d223)
+  {
+    Tensor3_antisymmetric_constructor<T,4,4>
+      (data,d001,d002,d003,d012,d013,d023,d101,d102,d103,d112,d113,d123,
+       d201,d202,d203,d212,d213,d223);
+  }
+
+  /* There are two ways of accessing the values inside,
+     unsafe(int,int,int) and operator(int,int,int).
+     unsafe(int,int,int) will give you a wrong answer if you aren't
+     careful.  The problem is that we only store the minimal set of
+     components, but some have different signs.  We can't return the
+     negative of a component, and assign something to it, because that
+     would assign something to a temporary.  To get the correct answer
+     if you don't want to change the value, just use
+     operator(int,int,int). */
+
+  T & unsafe(const int N1, const int N2, const int N3)
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim0 || N1<0
+       || N2>=Tensor_Dim12 || N2<0 || N3>=Tensor_Dim12 || N3<0
+       || N2>=N3)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor3_antisymmetric<T,"
+          << Tensor_Dim0 << "," << Tensor_Dim12
+          << ">.operator("
+          << N1 << "," << N2 << "," << N3 << ")" << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return data[N1][N3-1+(N2*(2*(Tensor_Dim12-1)-N2-1))/2];
+  }
+
+  T operator()(const int N1, const int N2, const int N3) const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim0 || N1<0
+       || N2>=Tensor_Dim12 || N2<0 || N3>=Tensor_Dim12 || N3<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor3_antisymmetric<T,"
+          << Tensor_Dim0 << "," << Tensor_Dim12
+          << ">.operator("
+          << N1 << "," << N2 << "," << N3 << ") const"
+          << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N2<N3 ? data[N1][N3-1+(N2*(2*(Tensor_Dim12-1)-N2-1))/2]
+      : (N2>N3 ? -data[N1][N2-1+(N3*(2*(Tensor_Dim12-1)-N3-1))/2] : 0.0);
+  }
+
+  /* These operator()'s are the first part in constructing template
+     expressions. */
+  
+  template<char i, char j, char k, int Dim0, int Dim12>
+  Tensor3_antisymmetric_Expr<Tensor3_antisymmetric<T,Tensor_Dim0,Tensor_Dim12>,
+    T,Dim0,Dim12,i,j,k>
+  operator()(const Index<i,Dim0> index1, const Index<j,Dim12> index2,
+	     const Index<k,Dim12> index3)
+  {
+    return Tensor3_antisymmetric_Expr<Tensor3_antisymmetric
+      <T,Tensor_Dim0,Tensor_Dim12>,T,Dim0,Dim12,i,j,k>(*this);
+  }
+
+  template<char i, char j, char k, int Dim0, int Dim12>
+  Tensor3_antisymmetric_Expr<const Tensor3_antisymmetric
+  <T,Tensor_Dim0,Tensor_Dim12>,T,Dim0,Dim12,i,j,k>
+  operator()(const Index<i,Dim0> index1, const Index<j,Dim12> index2,
+	     const Index<k,Dim12> index3) const
+  {
+    return Tensor3_antisymmetric_Expr<const Tensor3_antisymmetric
+      <T,Tensor_Dim0,Tensor_Dim12>,T,Dim0,Dim12,i,j,k>(*this);
+  }
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_christof.h
--- a/Tensor3_christof.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-/* Declarations for a Tensor3_christof.  This is symmetric on the last
-   two indices. */
-
-#include "Tensor3_christof/Tensor3_christof_number.h"
-#include "Tensor3_christof/Tensor3_christof_numeral.h"
-
-#include "Tensor3_christof/Tensor3_christof_constructor.h"
-#include "Tensor3_christof/Tensor3_christof_value.h"
-#include "Tensor3_christof/Tensor3_christof_pointer.h"
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_christof.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_christof.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,9 @@
+/* Declarations for a Tensor3_christof.  This is symmetric on the last
+   two indices. */
+
+#include "Tensor3_christof/Tensor3_christof_number.hpp"
+#include "Tensor3_christof/Tensor3_christof_numeral.hpp"
+
+#include "Tensor3_christof/Tensor3_christof_constructor.hpp"
+#include "Tensor3_christof/Tensor3_christof_value.hpp"
+#include "Tensor3_christof/Tensor3_christof_pointer.hpp"
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_christof/Tensor3_christof_constructor.h
--- a/Tensor3_christof/Tensor3_christof_constructor.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,164 +0,0 @@
-/* A helper class that allows simple initialization of the Tensor3_christof,
-   but only if it has the correct number of elements. */
-
-template<class T, int Tensor_Dim0, int Tensor_Dim12>
-class Tensor3_christof_constructor;
-
-template<class T>
-class Tensor3_christof_constructor<T,2,2>
-{
-public:
-  Tensor3_christof_constructor(T data[2][3], T d000, T d100, T d001, T d101,
-			       T d011, T d111)
-  {
-    data[0][0]=d000;
-    data[1][0]=d100;
-    data[0][1]=d001;
-    data[1][1]=d101;
-    data[0][2]=d011;
-    data[1][2]=d111;
-  }
-};
-
-template<class T>
-class Tensor3_christof_constructor<T,3,3>
-{
-public:
-  Tensor3_christof_constructor(T data[3][6], T d000, T d100, T d200, T d001, T d101,
-			 T d201, T d002, T d102, T d202, T d011, T d111,
-			 T d211, T d012, T d112, T d212, T d022, T d122,
-			 T d222)
-  {
-    data[0][0]=d000;
-    data[0][1]=d001;
-    data[0][2]=d002;
-    data[0][3]=d011;
-    data[0][4]=d012;
-    data[0][5]=d022;
-
-    data[1][0]=d100;
-    data[1][1]=d101;
-    data[1][2]=d102;
-    data[1][3]=d111;
-    data[1][4]=d112;
-    data[1][5]=d122;
-
-    data[2][0]=d200;
-    data[2][1]=d201;
-    data[2][2]=d202;
-    data[2][3]=d211;
-    data[2][4]=d212;
-    data[2][5]=d222;
-  }
-};
-
-template<class T>
-class Tensor3_christof_constructor<T,4,4>
-{
-public:
-  Tensor3_christof_constructor(T data[4][10], T d000, T d100, T d200, T d300,
-			 T d001, T d101, T d201, T d301,
-			 T d002, T d102, T d202, T d302,
-			 T d003, T d103, T d203, T d303,
-			 T d011, T d111, T d211, T d311,
-			 T d012, T d112, T d212, T d312,
-			 T d013, T d113, T d213, T d313,
-			 T d022, T d122, T d222, T d322,
-			 T d023, T d123, T d223, T d323,
-			 T d033, T d133, T d233, T d333)
-  {
-    data[0][0]=d000;
-    data[0][1]=d001;
-    data[0][2]=d002;
-    data[0][3]=d003;
-    data[0][4]=d011;
-    data[0][5]=d012;
-    data[0][6]=d013;
-    data[0][7]=d022;
-    data[0][8]=d023;
-    data[0][9]=d033;
-
-    data[1][0]=d100;
-    data[1][1]=d101;
-    data[1][2]=d102;
-    data[1][3]=d103;
-    data[1][4]=d111;
-    data[1][5]=d112;
-    data[1][6]=d113;
-    data[1][7]=d122;
-    data[1][8]=d123;
-    data[1][9]=d133;
-
-    data[2][0]=d200;
-    data[2][1]=d201;
-    data[2][2]=d202;
-    data[2][3]=d203;
-    data[2][4]=d211;
-    data[2][5]=d212;
-    data[2][6]=d213;
-    data[2][7]=d222;
-    data[2][8]=d223;
-    data[2][9]=d233;
-
-    data[3][0]=d300;
-    data[3][1]=d301;
-    data[3][2]=d302;
-    data[3][3]=d303;
-    data[3][4]=d311;
-    data[3][5]=d312;
-    data[3][6]=d313;
-    data[3][7]=d322;
-    data[3][8]=d323;
-    data[3][9]=d333;
-  }
-};
-
-template<class T>
-class Tensor3_christof_constructor<T,3,4>
-{
-public:
-  Tensor3_christof_constructor(T data[3][10], T d000, T d100, T d200,
-			 T d001, T d101, T d201,
-			 T d002, T d102, T d202,
-			 T d003, T d103, T d203,
-			 T d011, T d111, T d211,
-			 T d012, T d112, T d212,
-			 T d013, T d113, T d213,
-			 T d022, T d122, T d222,
-			 T d023, T d123, T d223,
-			 T d033, T d133, T d233)
-  {
-    data[0][0]=d000;
-    data[0][1]=d001;
-    data[0][2]=d002;
-    data[0][3]=d003;
-    data[0][4]=d011;
-    data[0][5]=d012;
-    data[0][6]=d013;
-    data[0][7]=d022;
-    data[0][8]=d023;
-    data[0][9]=d033;
-
-    data[1][0]=d100;
-    data[1][1]=d101;
-    data[1][2]=d102;
-    data[1][3]=d103;
-    data[1][4]=d111;
-    data[1][5]=d112;
-    data[1][6]=d113;
-    data[1][7]=d122;
-    data[1][8]=d123;
-    data[1][9]=d133;
-
-    data[2][0]=d200;
-    data[2][1]=d201;
-    data[2][2]=d202;
-    data[2][3]=d203;
-    data[2][4]=d211;
-    data[2][5]=d212;
-    data[2][6]=d213;
-    data[2][7]=d222;
-    data[2][8]=d223;
-    data[2][9]=d233;
-  }
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_christof/Tensor3_christof_constructor.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_christof/Tensor3_christof_constructor.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,164 @@
+/* A helper class that allows simple initialization of the Tensor3_christof,
+   but only if it has the correct number of elements. */
+
+template<class T, int Tensor_Dim0, int Tensor_Dim12>
+class Tensor3_christof_constructor;
+
+template<class T>
+class Tensor3_christof_constructor<T,2,2>
+{
+public:
+  Tensor3_christof_constructor(T data[2][3], T d000, T d100, T d001, T d101,
+			       T d011, T d111)
+  {
+    data[0][0]=d000;
+    data[1][0]=d100;
+    data[0][1]=d001;
+    data[1][1]=d101;
+    data[0][2]=d011;
+    data[1][2]=d111;
+  }
+};
+
+template<class T>
+class Tensor3_christof_constructor<T,3,3>
+{
+public:
+  Tensor3_christof_constructor(T data[3][6], T d000, T d100, T d200, T d001, T d101,
+			 T d201, T d002, T d102, T d202, T d011, T d111,
+			 T d211, T d012, T d112, T d212, T d022, T d122,
+			 T d222)
+  {
+    data[0][0]=d000;
+    data[0][1]=d001;
+    data[0][2]=d002;
+    data[0][3]=d011;
+    data[0][4]=d012;
+    data[0][5]=d022;
+
+    data[1][0]=d100;
+    data[1][1]=d101;
+    data[1][2]=d102;
+    data[1][3]=d111;
+    data[1][4]=d112;
+    data[1][5]=d122;
+
+    data[2][0]=d200;
+    data[2][1]=d201;
+    data[2][2]=d202;
+    data[2][3]=d211;
+    data[2][4]=d212;
+    data[2][5]=d222;
+  }
+};
+
+template<class T>
+class Tensor3_christof_constructor<T,4,4>
+{
+public:
+  Tensor3_christof_constructor(T data[4][10], T d000, T d100, T d200, T d300,
+			 T d001, T d101, T d201, T d301,
+			 T d002, T d102, T d202, T d302,
+			 T d003, T d103, T d203, T d303,
+			 T d011, T d111, T d211, T d311,
+			 T d012, T d112, T d212, T d312,
+			 T d013, T d113, T d213, T d313,
+			 T d022, T d122, T d222, T d322,
+			 T d023, T d123, T d223, T d323,
+			 T d033, T d133, T d233, T d333)
+  {
+    data[0][0]=d000;
+    data[0][1]=d001;
+    data[0][2]=d002;
+    data[0][3]=d003;
+    data[0][4]=d011;
+    data[0][5]=d012;
+    data[0][6]=d013;
+    data[0][7]=d022;
+    data[0][8]=d023;
+    data[0][9]=d033;
+
+    data[1][0]=d100;
+    data[1][1]=d101;
+    data[1][2]=d102;
+    data[1][3]=d103;
+    data[1][4]=d111;
+    data[1][5]=d112;
+    data[1][6]=d113;
+    data[1][7]=d122;
+    data[1][8]=d123;
+    data[1][9]=d133;
+
+    data[2][0]=d200;
+    data[2][1]=d201;
+    data[2][2]=d202;
+    data[2][3]=d203;
+    data[2][4]=d211;
+    data[2][5]=d212;
+    data[2][6]=d213;
+    data[2][7]=d222;
+    data[2][8]=d223;
+    data[2][9]=d233;
+
+    data[3][0]=d300;
+    data[3][1]=d301;
+    data[3][2]=d302;
+    data[3][3]=d303;
+    data[3][4]=d311;
+    data[3][5]=d312;
+    data[3][6]=d313;
+    data[3][7]=d322;
+    data[3][8]=d323;
+    data[3][9]=d333;
+  }
+};
+
+template<class T>
+class Tensor3_christof_constructor<T,3,4>
+{
+public:
+  Tensor3_christof_constructor(T data[3][10], T d000, T d100, T d200,
+			 T d001, T d101, T d201,
+			 T d002, T d102, T d202,
+			 T d003, T d103, T d203,
+			 T d011, T d111, T d211,
+			 T d012, T d112, T d212,
+			 T d013, T d113, T d213,
+			 T d022, T d122, T d222,
+			 T d023, T d123, T d223,
+			 T d033, T d133, T d233)
+  {
+    data[0][0]=d000;
+    data[0][1]=d001;
+    data[0][2]=d002;
+    data[0][3]=d003;
+    data[0][4]=d011;
+    data[0][5]=d012;
+    data[0][6]=d013;
+    data[0][7]=d022;
+    data[0][8]=d023;
+    data[0][9]=d033;
+
+    data[1][0]=d100;
+    data[1][1]=d101;
+    data[1][2]=d102;
+    data[1][3]=d103;
+    data[1][4]=d111;
+    data[1][5]=d112;
+    data[1][6]=d113;
+    data[1][7]=d122;
+    data[1][8]=d123;
+    data[1][9]=d133;
+
+    data[2][0]=d200;
+    data[2][1]=d201;
+    data[2][2]=d202;
+    data[2][3]=d203;
+    data[2][4]=d211;
+    data[2][5]=d212;
+    data[2][6]=d213;
+    data[2][7]=d222;
+    data[2][8]=d223;
+    data[2][9]=d233;
+  }
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_christof/Tensor3_christof_number.h
--- a/Tensor3_christof/Tensor3_christof_number.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-/* This is for expressions where a number is used for one slot, and
-   an index for the other, yielding a Tensor2_symmetric_Expr. */
-
-template<class A, class T, int N>
-class Tensor3_christof_number_0
-{
-  const A iterA;
-public:
-  T operator()(const int N1, const int N2) const
-  {
-    return iterA(N,N1,N2);
-  }
-  Tensor3_christof_number_0(const A &a): iterA(a) {}
-};
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_christof/Tensor3_christof_number.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_christof/Tensor3_christof_number.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,15 @@
+/* This is for expressions where a number is used for one slot, and
+   an index for the other, yielding a Tensor2_symmetric_Expr. */
+
+template<class A, class T, int N>
+class Tensor3_christof_number_0
+{
+  const A iterA;
+public:
+  T operator()(const int N1, const int N2) const
+  {
+    return iterA(N,N1,N2);
+  }
+  Tensor3_christof_number_0(const A &a): iterA(a) {}
+};
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_christof/Tensor3_christof_numeral.h
--- a/Tensor3_christof/Tensor3_christof_numeral.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/* This is for expressions where an int is used for one slot, and an
-   Index for the others, yielding a Tensor2_symmetric_Expr or
-   Tensor2_Expr. */
-
-template<class A, class T>
-class Tensor3_christof_numeral_0
-{
-  const A iterA;
-  const int N;
-public:
-  T operator()(const int N1, const int N2) const
-  {
-    return iterA(N,N1,N2);
-  }
-  Tensor3_christof_numeral_0(const A &a, const int NN): iterA(a), N(NN) {}
-};
-
-/* We can use this version for when there is an int in either of the
-   last slots, because Tensor3_christof is symmetric. */
-
-template<class A, class T>
-class Tensor3_christof_numeral_1
-{
-  const A iterA;
-  const int N;
-public:
-  T operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N,N2);
-  }
-  Tensor3_christof_numeral_1(const A &a, const int NN): iterA(a), N(NN) {}
-};
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_christof/Tensor3_christof_numeral.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_christof/Tensor3_christof_numeral.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,33 @@
+/* This is for expressions where an int is used for one slot, and an
+   Index for the others, yielding a Tensor2_symmetric_Expr or
+   Tensor2_Expr. */
+
+template<class A, class T>
+class Tensor3_christof_numeral_0
+{
+  const A iterA;
+  const int N;
+public:
+  T operator()(const int N1, const int N2) const
+  {
+    return iterA(N,N1,N2);
+  }
+  Tensor3_christof_numeral_0(const A &a, const int NN): iterA(a), N(NN) {}
+};
+
+/* We can use this version for when there is an int in either of the
+   last slots, because Tensor3_christof is symmetric. */
+
+template<class A, class T>
+class Tensor3_christof_numeral_1
+{
+  const A iterA;
+  const int N;
+public:
+  T operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N,N2);
+  }
+  Tensor3_christof_numeral_1(const A &a, const int NN): iterA(a), N(NN) {}
+};
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_christof/Tensor3_christof_pointer.h
--- a/Tensor3_christof/Tensor3_christof_pointer.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,257 +0,0 @@
-/* A version for pointers */
-
-template <class T, int Tensor_Dim0, int Tensor_Dim12>
-class Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>
-{
-  mutable T * restrict  data[Tensor_Dim0][(Tensor_Dim12*(Tensor_Dim12+1))/2];
-public:
-  Tensor3_christof() {}
-
-  /* Tensor_Dim0=Tensor_Dim12=2 */
-  Tensor3_christof(T *d000, T *d100, T *d001, T *d101, T *d011, T *d111)
-  {
-    Tensor3_christof_constructor<T* restrict,Tensor_Dim0,Tensor_Dim12>
-      (data,d000,d100,d001,d101,d011,d111);
-  }
-
-  /* Tensor_Dim0=Tensor_Dim12=3 */
-  Tensor3_christof(T *d000, T *d100, T *d200, T *d001, T *d101, T *d201,
-		   T *d002, T *d102, T *d202, T *d011, T *d111, T *d211,
-		   T *d012, T *d112, T *d212, T *d022, T *d122, T *d222)
-  {
-    Tensor3_christof_constructor<T* restrict,Tensor_Dim0,Tensor_Dim12>
-      (data,d000,d100,d200,d001,d101,d201,d002,d102,d202,d011,d111,d211,
-       d012,d112,d212,d022,d122,d222);
-  }
-
-  /* Tensor_Dim0=Tensor_Dim12=4 */
-  Tensor3_christof(T *d000, T *d100, T *d200, T *d300,
-		   T *d001, T *d101, T *d201, T *d301,
-		   T *d002, T *d102, T *d202, T *d302,
-		   T *d003, T *d103, T *d203, T *d303,
-		   T *d011, T *d111, T *d211, T *d311,
-		   T *d012, T *d112, T *d212, T *d312,
-		   T *d013, T *d113, T *d213, T *d313,
-		   T *d022, T *d122, T *d222, T *d322,
-		   T *d023, T *d123, T *d223, T *d323,
-		   T *d033, T *d133, T *d233, T *d333)
-  {
-    Tensor3_christof_constructor<T* restrict,Tensor_Dim0,Tensor_Dim12>
-      (data,d000,d100,d200,d300,d001,d101,d201,d301,
-       d002,d102,d202,d302,d003,d103,d203,d303,
-       d011,d111,d211,d311,d012,d112,d212,d312,
-       d013,d113,d213,d313,d022,d122,d222,d322,
-       d023,d123,d223,d323,d033,d133,d233,d333);
-  }
-
-  /* There are two operator(int,int,int)'s, one for non-consts that lets you
-     change the value, and one for consts that doesn't. */
-
-  T & operator()(const int N1, const int N2, const int N3)
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim0 || N1<0
-       || N2>=Tensor_Dim12 || N2<0 || N3>=Tensor_Dim12 || N3<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor3_christof<T*,"
-          << Tensor_Dim0 << "," << Tensor_Dim12
-          << ">.operator("
-          << N1 << "," << N2 << "," << N3 << ")" << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N2>N3 ? *data[N1][N2+(N3*(2*Tensor_Dim12-N3-1))/2]
-      : *data[N1][N3+(N2*(2*Tensor_Dim12-N2-1))/2];
-  }
-
-  T operator()(const int N1, const int N2, const int N3) const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim0 || N1<0
-       || N2>=Tensor_Dim12 || N2<0 || N3>=Tensor_Dim12 || N3<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor3_christof<T*,"
-          << Tensor_Dim0 << "," << Tensor_Dim12
-          << ">.operator("
-          << N1 << "," << N2 << "," << N3 << ") const"
-          << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N2>N3 ? *data[N1][N2+(N3*(2*Tensor_Dim12-N3-1))/2]
-      : *data[N1][N3+(N2*(2*Tensor_Dim12-N2-1))/2];
-  }
-
-  T* ptr(const int N1, const int N2, const int N3) const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim0 || N1<0
-       || N2>=Tensor_Dim12 || N2<0 || N3>=Tensor_Dim12 || N3<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor3_christof<T*,"
-          << Tensor_Dim0 << "," << Tensor_Dim12 << ">.ptr("
-          << N1 << "," << N2 << "," << N3 << ")" << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N2>N3 ? data[N1][N2+(N3*(2*Tensor_Dim12-N3-1))/2]
-      : data[N1][N3+(N2*(2*Tensor_Dim12-N2-1))/2];
-  }
-
-  /* These operator()'s are the first part in constructing template
-     expressions.  I mix up the indices here so that it behaves like a
-     Tensor3_dg.  That way I don't have to have a separate wrapper
-     class Tensor3_christof_Expr, which simplifies things. */
-
-  template<char i, char j, char k, int Dim0, int Dim12>
-  Tensor3_dg_Expr<Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,
-    T,Dim12,Dim0,i,j,k> operator()
-    (const Index<k,Dim0> index1, const Index<i,Dim12> index2,
-     const Index<j,Dim12> index3)
-  {
-    return Tensor3_dg_Expr<Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,
-      T,Dim12,Dim0,i,j,k>(*this);
-  }
-
-  template<char i, char j, char k, int Dim0, int Dim12>
-  Tensor3_dg_Expr<const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,
-    T,Dim12,Dim0,i,j,k>
-  operator()(const Index<k,Dim0> index1, const Index<i,Dim12> index2,
-	     const Index<j,Dim12> index3) const
-  {
-    return Tensor3_dg_Expr<const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,
-      T,Dim12,Dim0,i,j,k>(*this);
-  }
-
-  /* These operators are for internal contractions. */
-
-  /* const versions */
-
-  template<char i, char j, int Dim0, int Dim12>
-  inline Tensor1_Expr<const Tensor3_contracted_12
-  <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim12>,T,Dim0,i>
-  operator()(const Index<i,Dim0> index1, const Index<j,Dim12> index2,
-	     const Index<j,Dim12> index3) const
-  {
-    typedef const Tensor3_contracted_12
-      <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim12>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim0,i>(TensorExpr(*this));
-  }
-
-  template<char i, char j, int Dim02, int Dim1>
-  inline Tensor1_Expr<const Tensor3_contracted_02
-  <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim02>,T,Dim1,i>
-  operator()(const Index<j,Dim02> index1, const Index<i,Dim1> index2,
-	     const Index<j,Dim02> index3) const
-  {
-    typedef const Tensor3_contracted_02
-      <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim02>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim1,i>(TensorExpr(*this));
-  }
-
-  template<char i, char j, int Dim01, int Dim2>
-  inline Tensor1_Expr<const Tensor3_contracted_01
-  <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim01>,T,Dim2,i>
-  operator()(const Index<j,Dim01> index1, const Index<j,Dim01> index2,
-	     const Index<i,Dim2> index3) const
-  {
-    typedef const Tensor3_contracted_01
-      <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim01>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim2,i>(TensorExpr(*this));
-  }
-
-  /* non-const versions */
-
-  template<char i, char j, int Dim0, int Dim12>
-  inline Tensor1_Expr<const Tensor3_contracted_12
-  <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim12>,T,Dim0,i>
-  operator()(const Index<i,Dim0> index1, const Index<j,Dim12> index2,
-	     const Index<j,Dim12> index3)
-  {
-    typedef const Tensor3_contracted_12
-      <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim12>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim0,i>(TensorExpr(*this));
-  }
-
-  template<char i, char j, int Dim02, int Dim1>
-  inline Tensor1_Expr<const Tensor3_contracted_02
-  <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim02>,T,Dim1,i>
-  operator()(const Index<j,Dim02> index1, const Index<i,Dim1> index2,
-	     const Index<j,Dim02> index3)
-  {
-    typedef const Tensor3_contracted_02
-      <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim02>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim1,i>(TensorExpr(*this));
-  }
-
-  template<char i, char j, int Dim01, int Dim2>
-  inline Tensor1_Expr<const Tensor3_contracted_01
-  <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim01>,T,Dim2,i>
-  operator()(const Index<j,Dim01> index1, const Index<j,Dim01> index2,
-	     const Index<i,Dim2> index3)
-  {
-    typedef const Tensor3_contracted_01
-      <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim01>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim2,i>(TensorExpr(*this));
-  }
-
-  /* This is for expressions where a number is used for one slot, and
-     an index for the others, yielding a Tensor2_symmetric_Expr. */
-
-  template<char i, char j, int N, int Dim12>
-  Tensor2_symmetric_Expr<const Tensor3_christof_number_0
-  <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,N>,T,Dim12,i,j>
-  operator()(const Number<N> n1, const Index<i,Dim12> index1,
-	     const Index<j,Dim12> index2) const
-  {
-    typedef const Tensor3_christof_number_0
-      <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,N> TensorExpr;
-    return Tensor2_symmetric_Expr<TensorExpr,T,Dim12,i,j>(TensorExpr(*this));
-  }
-  
-  /* An int in one spot, Index for the others, yielding a Tensor2.  I
-     can use the same structure for both, since Tensor3_christof is
-     symmetric on the last two indices. */
-
-  template<char i, char j, int Dim0, int Dim2>
-  Tensor2_Expr<const Tensor3_christof_numeral_1
-  <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T>,T,Dim0,Dim2,i,j>
-  operator()(const Index<i,Dim0> index1, const int N,
-	     const Index<j,Dim2> index2) const
-  {
-    typedef const Tensor3_christof_numeral_1
-      <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T> TensorExpr;
-    return Tensor2_Expr<TensorExpr,T,Dim0,Dim2,i,j>(TensorExpr(*this,N));
-  }
-
-  template<char i, char j, int Dim0, int Dim2>
-  Tensor2_Expr<const Tensor3_christof_numeral_1
-  <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T>,T,Dim0,Dim2,i,j>
-  operator()(const Index<i,Dim0> index1, const Index<j,Dim2> index2,
-	     const int N) const
-  {
-    typedef const Tensor3_christof_numeral_1
-      <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T> TensorExpr;
-    return Tensor2_Expr<TensorExpr,T,Dim0,Dim2,i,j>(TensorExpr(*this,N));
-  }
-  
-  /* The ++ operator increments the pointer, not the number that the
-     pointer points to.  This allows iterating over a grid. */
-
-  const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12> & operator++() const
-  {
-    for(int i=0;i<Tensor_Dim0;++i)
-      for(int j=0;j<(Tensor_Dim12*(Tensor_Dim12+1))/2;++j)
-	++data[i][j];
-    return *this;
-  }
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_christof/Tensor3_christof_pointer.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_christof/Tensor3_christof_pointer.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,257 @@
+/* A version for pointers */
+
+template <class T, int Tensor_Dim0, int Tensor_Dim12>
+class Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>
+{
+  mutable T * restrict  data[Tensor_Dim0][(Tensor_Dim12*(Tensor_Dim12+1))/2];
+public:
+  Tensor3_christof() {}
+
+  /* Tensor_Dim0=Tensor_Dim12=2 */
+  Tensor3_christof(T *d000, T *d100, T *d001, T *d101, T *d011, T *d111)
+  {
+    Tensor3_christof_constructor<T* restrict,Tensor_Dim0,Tensor_Dim12>
+      (data,d000,d100,d001,d101,d011,d111);
+  }
+
+  /* Tensor_Dim0=Tensor_Dim12=3 */
+  Tensor3_christof(T *d000, T *d100, T *d200, T *d001, T *d101, T *d201,
+		   T *d002, T *d102, T *d202, T *d011, T *d111, T *d211,
+		   T *d012, T *d112, T *d212, T *d022, T *d122, T *d222)
+  {
+    Tensor3_christof_constructor<T* restrict,Tensor_Dim0,Tensor_Dim12>
+      (data,d000,d100,d200,d001,d101,d201,d002,d102,d202,d011,d111,d211,
+       d012,d112,d212,d022,d122,d222);
+  }
+
+  /* Tensor_Dim0=Tensor_Dim12=4 */
+  Tensor3_christof(T *d000, T *d100, T *d200, T *d300,
+		   T *d001, T *d101, T *d201, T *d301,
+		   T *d002, T *d102, T *d202, T *d302,
+		   T *d003, T *d103, T *d203, T *d303,
+		   T *d011, T *d111, T *d211, T *d311,
+		   T *d012, T *d112, T *d212, T *d312,
+		   T *d013, T *d113, T *d213, T *d313,
+		   T *d022, T *d122, T *d222, T *d322,
+		   T *d023, T *d123, T *d223, T *d323,
+		   T *d033, T *d133, T *d233, T *d333)
+  {
+    Tensor3_christof_constructor<T* restrict,Tensor_Dim0,Tensor_Dim12>
+      (data,d000,d100,d200,d300,d001,d101,d201,d301,
+       d002,d102,d202,d302,d003,d103,d203,d303,
+       d011,d111,d211,d311,d012,d112,d212,d312,
+       d013,d113,d213,d313,d022,d122,d222,d322,
+       d023,d123,d223,d323,d033,d133,d233,d333);
+  }
+
+  /* There are two operator(int,int,int)'s, one for non-consts that lets you
+     change the value, and one for consts that doesn't. */
+
+  T & operator()(const int N1, const int N2, const int N3)
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim0 || N1<0
+       || N2>=Tensor_Dim12 || N2<0 || N3>=Tensor_Dim12 || N3<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor3_christof<T*,"
+          << Tensor_Dim0 << "," << Tensor_Dim12
+          << ">.operator("
+          << N1 << "," << N2 << "," << N3 << ")" << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N2>N3 ? *data[N1][N2+(N3*(2*Tensor_Dim12-N3-1))/2]
+      : *data[N1][N3+(N2*(2*Tensor_Dim12-N2-1))/2];
+  }
+
+  T operator()(const int N1, const int N2, const int N3) const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim0 || N1<0
+       || N2>=Tensor_Dim12 || N2<0 || N3>=Tensor_Dim12 || N3<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor3_christof<T*,"
+          << Tensor_Dim0 << "," << Tensor_Dim12
+          << ">.operator("
+          << N1 << "," << N2 << "," << N3 << ") const"
+          << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N2>N3 ? *data[N1][N2+(N3*(2*Tensor_Dim12-N3-1))/2]
+      : *data[N1][N3+(N2*(2*Tensor_Dim12-N2-1))/2];
+  }
+
+  T* ptr(const int N1, const int N2, const int N3) const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim0 || N1<0
+       || N2>=Tensor_Dim12 || N2<0 || N3>=Tensor_Dim12 || N3<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor3_christof<T*,"
+          << Tensor_Dim0 << "," << Tensor_Dim12 << ">.ptr("
+          << N1 << "," << N2 << "," << N3 << ")" << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N2>N3 ? data[N1][N2+(N3*(2*Tensor_Dim12-N3-1))/2]
+      : data[N1][N3+(N2*(2*Tensor_Dim12-N2-1))/2];
+  }
+
+  /* These operator()'s are the first part in constructing template
+     expressions.  I mix up the indices here so that it behaves like a
+     Tensor3_dg.  That way I don't have to have a separate wrapper
+     class Tensor3_christof_Expr, which simplifies things. */
+
+  template<char i, char j, char k, int Dim0, int Dim12>
+  Tensor3_dg_Expr<Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,
+    T,Dim12,Dim0,i,j,k> operator()
+    (const Index<k,Dim0> index1, const Index<i,Dim12> index2,
+     const Index<j,Dim12> index3)
+  {
+    return Tensor3_dg_Expr<Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,
+      T,Dim12,Dim0,i,j,k>(*this);
+  }
+
+  template<char i, char j, char k, int Dim0, int Dim12>
+  Tensor3_dg_Expr<const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,
+    T,Dim12,Dim0,i,j,k>
+  operator()(const Index<k,Dim0> index1, const Index<i,Dim12> index2,
+	     const Index<j,Dim12> index3) const
+  {
+    return Tensor3_dg_Expr<const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,
+      T,Dim12,Dim0,i,j,k>(*this);
+  }
+
+  /* These operators are for internal contractions. */
+
+  /* const versions */
+
+  template<char i, char j, int Dim0, int Dim12>
+  inline Tensor1_Expr<const Tensor3_contracted_12
+  <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim12>,T,Dim0,i>
+  operator()(const Index<i,Dim0> index1, const Index<j,Dim12> index2,
+	     const Index<j,Dim12> index3) const
+  {
+    typedef const Tensor3_contracted_12
+      <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim12>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim0,i>(TensorExpr(*this));
+  }
+
+  template<char i, char j, int Dim02, int Dim1>
+  inline Tensor1_Expr<const Tensor3_contracted_02
+  <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim02>,T,Dim1,i>
+  operator()(const Index<j,Dim02> index1, const Index<i,Dim1> index2,
+	     const Index<j,Dim02> index3) const
+  {
+    typedef const Tensor3_contracted_02
+      <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim02>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim1,i>(TensorExpr(*this));
+  }
+
+  template<char i, char j, int Dim01, int Dim2>
+  inline Tensor1_Expr<const Tensor3_contracted_01
+  <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim01>,T,Dim2,i>
+  operator()(const Index<j,Dim01> index1, const Index<j,Dim01> index2,
+	     const Index<i,Dim2> index3) const
+  {
+    typedef const Tensor3_contracted_01
+      <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim01>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim2,i>(TensorExpr(*this));
+  }
+
+  /* non-const versions */
+
+  template<char i, char j, int Dim0, int Dim12>
+  inline Tensor1_Expr<const Tensor3_contracted_12
+  <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim12>,T,Dim0,i>
+  operator()(const Index<i,Dim0> index1, const Index<j,Dim12> index2,
+	     const Index<j,Dim12> index3)
+  {
+    typedef const Tensor3_contracted_12
+      <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim12>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim0,i>(TensorExpr(*this));
+  }
+
+  template<char i, char j, int Dim02, int Dim1>
+  inline Tensor1_Expr<const Tensor3_contracted_02
+  <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim02>,T,Dim1,i>
+  operator()(const Index<j,Dim02> index1, const Index<i,Dim1> index2,
+	     const Index<j,Dim02> index3)
+  {
+    typedef const Tensor3_contracted_02
+      <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim02>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim1,i>(TensorExpr(*this));
+  }
+
+  template<char i, char j, int Dim01, int Dim2>
+  inline Tensor1_Expr<const Tensor3_contracted_01
+  <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim01>,T,Dim2,i>
+  operator()(const Index<j,Dim01> index1, const Index<j,Dim01> index2,
+	     const Index<i,Dim2> index3)
+  {
+    typedef const Tensor3_contracted_01
+      <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,Dim01>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim2,i>(TensorExpr(*this));
+  }
+
+  /* This is for expressions where a number is used for one slot, and
+     an index for the others, yielding a Tensor2_symmetric_Expr. */
+
+  template<char i, char j, int N, int Dim12>
+  Tensor2_symmetric_Expr<const Tensor3_christof_number_0
+  <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,N>,T,Dim12,i,j>
+  operator()(const Number<N> n1, const Index<i,Dim12> index1,
+	     const Index<j,Dim12> index2) const
+  {
+    typedef const Tensor3_christof_number_0
+      <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T,N> TensorExpr;
+    return Tensor2_symmetric_Expr<TensorExpr,T,Dim12,i,j>(TensorExpr(*this));
+  }
+  
+  /* An int in one spot, Index for the others, yielding a Tensor2.  I
+     can use the same structure for both, since Tensor3_christof is
+     symmetric on the last two indices. */
+
+  template<char i, char j, int Dim0, int Dim2>
+  Tensor2_Expr<const Tensor3_christof_numeral_1
+  <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T>,T,Dim0,Dim2,i,j>
+  operator()(const Index<i,Dim0> index1, const int N,
+	     const Index<j,Dim2> index2) const
+  {
+    typedef const Tensor3_christof_numeral_1
+      <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T> TensorExpr;
+    return Tensor2_Expr<TensorExpr,T,Dim0,Dim2,i,j>(TensorExpr(*this,N));
+  }
+
+  template<char i, char j, int Dim0, int Dim2>
+  Tensor2_Expr<const Tensor3_christof_numeral_1
+  <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T>,T,Dim0,Dim2,i,j>
+  operator()(const Index<i,Dim0> index1, const Index<j,Dim2> index2,
+	     const int N) const
+  {
+    typedef const Tensor3_christof_numeral_1
+      <const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12>,T> TensorExpr;
+    return Tensor2_Expr<TensorExpr,T,Dim0,Dim2,i,j>(TensorExpr(*this,N));
+  }
+  
+  /* The ++ operator increments the pointer, not the number that the
+     pointer points to.  This allows iterating over a grid. */
+
+  const Tensor3_christof<T*,Tensor_Dim0,Tensor_Dim12> & operator++() const
+  {
+    for(int i=0;i<Tensor_Dim0;++i)
+      for(int j=0;j<(Tensor_Dim12*(Tensor_Dim12+1))/2;++j)
+	++data[i][j];
+    return *this;
+  }
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_christof/Tensor3_christof_value.h
--- a/Tensor3_christof/Tensor3_christof_value.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,291 +0,0 @@
-/* A general version, not for pointers */
-
-template <class T, int Tensor_Dim0, int Tensor_Dim12>
-class Tensor3_christof
-{
-  T data[Tensor_Dim0][(Tensor_Dim12*(Tensor_Dim12+1))/2];
-public:
-  Tensor3_christof() {}
-
-  /* Tensor_Dim0=Tensor_Dim12=2 */
-  Tensor3_christof(T d000, T d100, T d001, T d101, T d011, T d111)
-  {
-    Tensor3_christof_constructor<T,Tensor_Dim0,Tensor_Dim12>
-      (data,d000,d100,d001,d101,d011,d111);
-  }
-
-  /* Tensor_Dim0=Tensor_Dim12=3 */
-  Tensor3_christof(T d000, T d100, T d200, T d001, T d101, T d201,
-		   T d002, T d102, T d202, T d011, T d111, T d211,
-		   T d012, T d112, T d212, T d022, T d122, T d222)
-  {
-    Tensor3_christof_constructor<T,Tensor_Dim0,Tensor_Dim12>
-      (data,d000,d100,d200,d001,d101,d201,d002,d102,d202,d011,d111,d211,
-       d012,d112,d212,d022,d122,d222);
-  }
-
-  /* Tensor_Dim0=Tensor_Dim12=4 */
-  Tensor3_christof(T d000, T d100, T d200, T d300,
-		   T d001, T d101, T d201, T d301,
-		   T d002, T d102, T d202, T d302,
-		   T d003, T d103, T d203, T d303,
-		   T d011, T d111, T d211, T d311,
-		   T d012, T d112, T d212, T d312,
-		   T d013, T d113, T d213, T d313,
-		   T d022, T d122, T d222, T d322,
-		   T d023, T d123, T d223, T d323,
-		   T d033, T d133, T d233, T d333)
-  {
-    Tensor3_christof_constructor<T,Tensor_Dim0,Tensor_Dim12>
-      (data,d000,d100,d200,d300,d001,d101,d201,d301,
-       d002,d102,d202,d302,d003,d103,d203,d303,
-       d011,d111,d211,d311,d012,d112,d212,d312,
-       d013,d113,d213,d313,d022,d122,d222,d322,
-       d023,d123,d223,d323,d033,d133,d233,d333);
-  }
-
-  /* There are two operator(int,int,int)'s, one for non-consts that lets you
-     change the value, and one for consts that doesn't. */
-
-  T & operator()(const int N1, const int N2, const int N3)
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim0 || N1<0
-       || N2>=Tensor_Dim12 || N2<0 || N3>=Tensor_Dim12 || N3<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor3_christof<T,"
-          << Tensor_Dim0 << "," << Tensor_Dim12
-          << ">.operator("
-          << N1 << "," << N2 << "," << N3 << ")" << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N2>N3 ? data[N1][N2+(N3*(2*Tensor_Dim12-N3-1))/2]
-      : data[N1][N3+(N2*(2*Tensor_Dim12-N2-1))/2];
-  }
-
-  T operator()(const int N1, const int N2, const int N3) const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim0 || N1<0
-       || N2>=Tensor_Dim12 || N2<0 || N3>=Tensor_Dim12 || N3<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor3_christof<T,"
-          << Tensor_Dim0 << "," << Tensor_Dim12
-          << ">.operator("
-          << N1 << "," << N2 << "," << N3 << ") const"
-          << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N2>N3 ? data[N1][N2+(N3*(2*Tensor_Dim12-N3-1))/2]
-      : data[N1][N3+(N2*(2*Tensor_Dim12-N2-1))/2];
-  }
-
-  /* These operator()'s are the first part in constructing template
-     expressions.  I mix up the indices here so that it behaves like a
-     Tensor3_dg.  That way I don't have to have a separate wrapper
-     class Tensor3_christof_Expr, which simplifies things. */
-
-  template<char i, char j, char k, int Dim0, int Dim12>
-  Tensor3_dg_Expr<Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k> operator()
-    (const Index<k,Dim0> index1, const Index<i,Dim12> index2,
-     const Index<j,Dim12> index3)
-  {
-    return Tensor3_dg_Expr<Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k>(*this);
-  }
-
-  template<char i, char j, char k, int Dim0, int Dim12>
-  Tensor3_dg_Expr<const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k>
-  operator()(const Index<k,Dim0> index1, const Index<i,Dim12> index2,
-	     const Index<j,Dim12> index3) const
-  {
-    return Tensor3_dg_Expr<const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,
-      T,Dim12,Dim0,i,j,k>(*this);
-  }
-
-  /* These operators are for internal contractions.  Some of them are
-     less general, because, for example, A(j,i,j) with i and j having
-     different dimensions is ambiguous. */
-
-  /* const versions */
-
-  template<char i, char j, int Dim0, int Dim12>
-  inline Tensor1_Expr<const Tensor3_contracted_12
-  <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim12>,T,Dim0,i>
-  operator()(const Index<i,Dim0> index1, const Index<j,Dim12> index2,
-	     const Index<j,Dim12> index3) const
-  {
-    typedef const Tensor3_contracted_12
-      <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim12>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim0,i>(TensorExpr(*this));
-  }
-
-  template<char i, char j, int Dim>
-  inline Tensor1_Expr<const Tensor3_contracted_02
-  <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim>,T,Dim,i>
-  operator()(const Index<j,Dim> index1, const Index<i,Dim> index2,
-	     const Index<j,Dim> index3) const
-  {
-    typedef const Tensor3_contracted_02
-      <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-//    template<char i, char j, int Dim02, int Dim1>
-//    inline Tensor1_Expr<const Tensor3_contracted_02
-//    <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim02>,T,Dim1,i>
-//    operator()(const Index<j,Dim02> index1, const Index<i,Dim1> index2,
-//  	     const Index<j,Dim02> index3) const
-//    {
-//      typedef const Tensor3_contracted_02
-//        <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim02>
-//        TensorExpr;
-//      return Tensor1_Expr<TensorExpr,T,Dim1,i>(TensorExpr(*this));
-//    }
-
-  template<char i, char j, int Dim>
-  inline Tensor1_Expr<const Tensor3_contracted_01
-  <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim>,T,Dim,i>
-  operator()(const Index<j,Dim> index1, const Index<j,Dim> index2,
-	     const Index<i,Dim> index3) const
-  {
-    typedef const Tensor3_contracted_01
-      <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-//    template<char i, char j, int Dim01, int Dim2>
-//    inline Tensor1_Expr<const Tensor3_contracted_01
-//    <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim01>,T,Dim2,i>
-//    operator()(const Index<j,Dim01> index1, const Index<j,Dim01> index2,
-//  	     const Index<i,Dim2> index3) const
-//    {
-//      typedef const Tensor3_contracted_01
-//        <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim01>
-//        TensorExpr;
-//      return Tensor1_Expr<TensorExpr,T,Dim2,i>(TensorExpr(*this));
-//    }
-
-  /* non-const versions, needed so that overload resolution doesn't
-     pick the more general indexing operator. */
-
-  template<char i, char j, int Dim0, int Dim12>
-  inline Tensor1_Expr<const Tensor3_contracted_12
-  <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim12>,T,Dim0,i>
-  operator()(const Index<i,Dim0> index1, const Index<j,Dim12> index2,
-	     const Index<j,Dim12> index3)
-  {
-    typedef const Tensor3_contracted_12
-      <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim12>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim0,i>(TensorExpr(*this));
-  }
-
-  template<char i, char j, int Dim>
-  inline Tensor1_Expr<const Tensor3_contracted_02
-  <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim>,T,Dim,i>
-  operator()(const Index<j,Dim> index1, const Index<i,Dim> index2,
-	     const Index<j,Dim> index3)
-  {
-    typedef const Tensor3_contracted_02
-      <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-//    template<char i, char j, int Dim02, int Dim1>
-//    inline Tensor1_Expr<const Tensor3_contracted_02
-//    <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim02>,T,Dim1,i>
-//    operator()(const Index<j,Dim02> index1, const Index<i,Dim1> index2,
-//  	     const Index<j,Dim02> index3)
-//    {
-//      typedef const Tensor3_contracted_02
-//        <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim02>
-//        TensorExpr;
-//      return Tensor1_Expr<TensorExpr,T,Dim1,i>(TensorExpr(*this));
-//    }
-
-  template<char i, char j, int Dim>
-  inline Tensor1_Expr<const Tensor3_contracted_01
-  <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim>,T,Dim,i>
-  operator()(const Index<j,Dim> index1, const Index<j,Dim> index2,
-	     const Index<i,Dim> index3)
-  {
-    typedef const Tensor3_contracted_01
-      <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim>
-      TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-//    template<char i, char j, int Dim01, int Dim2>
-//    inline Tensor1_Expr<const Tensor3_contracted_01
-//    <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim01>,T,Dim2,i>
-//    operator()(const Index<j,Dim01> index1, const Index<j,Dim01> index2,
-//  	     const Index<i,Dim2> index3)
-//    {
-//      typedef const Tensor3_contracted_01
-//        <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim01>
-//        TensorExpr;
-//      return Tensor1_Expr<TensorExpr,T,Dim2,i>(TensorExpr(*this));
-//    }
-
-  /* This is for expressions where a Number<> is used for one slot, and
-     an index for the others, yielding a Tensor2_symmetric_Expr. */
-
-  template<char i, char j, int N, int Dim12>
-  Tensor2_symmetric_Expr<const Tensor3_christof_number_0
-  <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,N>,T,Dim12,i,j>
-  operator()(const Number<N> n1, const Index<i,Dim12> index1,
-	     const Index<j,Dim12> index2) const
-  {
-    typedef const Tensor3_christof_number_0
-      <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,N> TensorExpr;
-    return Tensor2_symmetric_Expr<TensorExpr,T,Dim12,i,j>(TensorExpr(*this));
-  }
-
-  /* This is for expressions where an int is used for one slot, and
-     an index for the others, yielding a Tensor2_symmetric_Expr. */
-
-  template<char i, char j, int Dim12>
-  Tensor2_symmetric_Expr<const Tensor3_christof_numeral_0
-  <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T>,T,Dim12,i,j>
-  operator()(const int N, const Index<i,Dim12> index1,
-	     const Index<j,Dim12> index2) const
-  {
-    typedef const Tensor3_christof_numeral_0
-      <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T> TensorExpr;
-    return Tensor2_symmetric_Expr<TensorExpr,T,Dim12,i,j>(TensorExpr(*this,N));
-  }
-  
-  /* An int in one spot, Index for the others, yielding a Tensor2.  I
-     can use the same structure for both, since Tensor3_christof is
-     symmetric on the last two indices. */
-
-  template<char i, char j, int Dim0, int Dim2>
-  Tensor2_Expr<const Tensor3_christof_numeral_1
-  <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T>,T,Dim0,Dim2,i,j>
-  operator()(const Index<i,Dim0> index1, const int N,
-	     const Index<j,Dim2> index2) const
-  {
-    typedef const Tensor3_christof_numeral_1
-      <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T> TensorExpr;
-    return Tensor2_Expr<TensorExpr,T,Dim0,Dim2,i,j>(TensorExpr(*this,N));
-  }
-
-  template<char i, char j, int Dim0, int Dim2>
-  Tensor2_Expr<const Tensor3_christof_numeral_1
-  <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T>,T,Dim0,Dim2,i,j>
-  operator()(const Index<i,Dim0> index1, const Index<j,Dim2> index2,
-	     const int N) const
-  {
-    typedef const Tensor3_christof_numeral_1
-      <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T> TensorExpr;
-    return Tensor2_Expr<TensorExpr,T,Dim0,Dim2,i,j>(TensorExpr(*this,N));
-  }
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_christof/Tensor3_christof_value.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_christof/Tensor3_christof_value.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,291 @@
+/* A general version, not for pointers */
+
+template <class T, int Tensor_Dim0, int Tensor_Dim12>
+class Tensor3_christof
+{
+  T data[Tensor_Dim0][(Tensor_Dim12*(Tensor_Dim12+1))/2];
+public:
+  Tensor3_christof() {}
+
+  /* Tensor_Dim0=Tensor_Dim12=2 */
+  Tensor3_christof(T d000, T d100, T d001, T d101, T d011, T d111)
+  {
+    Tensor3_christof_constructor<T,Tensor_Dim0,Tensor_Dim12>
+      (data,d000,d100,d001,d101,d011,d111);
+  }
+
+  /* Tensor_Dim0=Tensor_Dim12=3 */
+  Tensor3_christof(T d000, T d100, T d200, T d001, T d101, T d201,
+		   T d002, T d102, T d202, T d011, T d111, T d211,
+		   T d012, T d112, T d212, T d022, T d122, T d222)
+  {
+    Tensor3_christof_constructor<T,Tensor_Dim0,Tensor_Dim12>
+      (data,d000,d100,d200,d001,d101,d201,d002,d102,d202,d011,d111,d211,
+       d012,d112,d212,d022,d122,d222);
+  }
+
+  /* Tensor_Dim0=Tensor_Dim12=4 */
+  Tensor3_christof(T d000, T d100, T d200, T d300,
+		   T d001, T d101, T d201, T d301,
+		   T d002, T d102, T d202, T d302,
+		   T d003, T d103, T d203, T d303,
+		   T d011, T d111, T d211, T d311,
+		   T d012, T d112, T d212, T d312,
+		   T d013, T d113, T d213, T d313,
+		   T d022, T d122, T d222, T d322,
+		   T d023, T d123, T d223, T d323,
+		   T d033, T d133, T d233, T d333)
+  {
+    Tensor3_christof_constructor<T,Tensor_Dim0,Tensor_Dim12>
+      (data,d000,d100,d200,d300,d001,d101,d201,d301,
+       d002,d102,d202,d302,d003,d103,d203,d303,
+       d011,d111,d211,d311,d012,d112,d212,d312,
+       d013,d113,d213,d313,d022,d122,d222,d322,
+       d023,d123,d223,d323,d033,d133,d233,d333);
+  }
+
+  /* There are two operator(int,int,int)'s, one for non-consts that lets you
+     change the value, and one for consts that doesn't. */
+
+  T & operator()(const int N1, const int N2, const int N3)
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim0 || N1<0
+       || N2>=Tensor_Dim12 || N2<0 || N3>=Tensor_Dim12 || N3<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor3_christof<T,"
+          << Tensor_Dim0 << "," << Tensor_Dim12
+          << ">.operator("
+          << N1 << "," << N2 << "," << N3 << ")" << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N2>N3 ? data[N1][N2+(N3*(2*Tensor_Dim12-N3-1))/2]
+      : data[N1][N3+(N2*(2*Tensor_Dim12-N2-1))/2];
+  }
+
+  T operator()(const int N1, const int N2, const int N3) const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim0 || N1<0
+       || N2>=Tensor_Dim12 || N2<0 || N3>=Tensor_Dim12 || N3<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor3_christof<T,"
+          << Tensor_Dim0 << "," << Tensor_Dim12
+          << ">.operator("
+          << N1 << "," << N2 << "," << N3 << ") const"
+          << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N2>N3 ? data[N1][N2+(N3*(2*Tensor_Dim12-N3-1))/2]
+      : data[N1][N3+(N2*(2*Tensor_Dim12-N2-1))/2];
+  }
+
+  /* These operator()'s are the first part in constructing template
+     expressions.  I mix up the indices here so that it behaves like a
+     Tensor3_dg.  That way I don't have to have a separate wrapper
+     class Tensor3_christof_Expr, which simplifies things. */
+
+  template<char i, char j, char k, int Dim0, int Dim12>
+  Tensor3_dg_Expr<Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k> operator()
+    (const Index<k,Dim0> index1, const Index<i,Dim12> index2,
+     const Index<j,Dim12> index3)
+  {
+    return Tensor3_dg_Expr<Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k>(*this);
+  }
+
+  template<char i, char j, char k, int Dim0, int Dim12>
+  Tensor3_dg_Expr<const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k>
+  operator()(const Index<k,Dim0> index1, const Index<i,Dim12> index2,
+	     const Index<j,Dim12> index3) const
+  {
+    return Tensor3_dg_Expr<const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,
+      T,Dim12,Dim0,i,j,k>(*this);
+  }
+
+  /* These operators are for internal contractions.  Some of them are
+     less general, because, for example, A(j,i,j) with i and j having
+     different dimensions is ambiguous. */
+
+  /* const versions */
+
+  template<char i, char j, int Dim0, int Dim12>
+  inline Tensor1_Expr<const Tensor3_contracted_12
+  <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim12>,T,Dim0,i>
+  operator()(const Index<i,Dim0> index1, const Index<j,Dim12> index2,
+	     const Index<j,Dim12> index3) const
+  {
+    typedef const Tensor3_contracted_12
+      <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim12>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim0,i>(TensorExpr(*this));
+  }
+
+  template<char i, char j, int Dim>
+  inline Tensor1_Expr<const Tensor3_contracted_02
+  <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim>,T,Dim,i>
+  operator()(const Index<j,Dim> index1, const Index<i,Dim> index2,
+	     const Index<j,Dim> index3) const
+  {
+    typedef const Tensor3_contracted_02
+      <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+//    template<char i, char j, int Dim02, int Dim1>
+//    inline Tensor1_Expr<const Tensor3_contracted_02
+//    <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim02>,T,Dim1,i>
+//    operator()(const Index<j,Dim02> index1, const Index<i,Dim1> index2,
+//  	     const Index<j,Dim02> index3) const
+//    {
+//      typedef const Tensor3_contracted_02
+//        <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim02>
+//        TensorExpr;
+//      return Tensor1_Expr<TensorExpr,T,Dim1,i>(TensorExpr(*this));
+//    }
+
+  template<char i, char j, int Dim>
+  inline Tensor1_Expr<const Tensor3_contracted_01
+  <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim>,T,Dim,i>
+  operator()(const Index<j,Dim> index1, const Index<j,Dim> index2,
+	     const Index<i,Dim> index3) const
+  {
+    typedef const Tensor3_contracted_01
+      <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+//    template<char i, char j, int Dim01, int Dim2>
+//    inline Tensor1_Expr<const Tensor3_contracted_01
+//    <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim01>,T,Dim2,i>
+//    operator()(const Index<j,Dim01> index1, const Index<j,Dim01> index2,
+//  	     const Index<i,Dim2> index3) const
+//    {
+//      typedef const Tensor3_contracted_01
+//        <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim01>
+//        TensorExpr;
+//      return Tensor1_Expr<TensorExpr,T,Dim2,i>(TensorExpr(*this));
+//    }
+
+  /* non-const versions, needed so that overload resolution doesn't
+     pick the more general indexing operator. */
+
+  template<char i, char j, int Dim0, int Dim12>
+  inline Tensor1_Expr<const Tensor3_contracted_12
+  <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim12>,T,Dim0,i>
+  operator()(const Index<i,Dim0> index1, const Index<j,Dim12> index2,
+	     const Index<j,Dim12> index3)
+  {
+    typedef const Tensor3_contracted_12
+      <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim12>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim0,i>(TensorExpr(*this));
+  }
+
+  template<char i, char j, int Dim>
+  inline Tensor1_Expr<const Tensor3_contracted_02
+  <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim>,T,Dim,i>
+  operator()(const Index<j,Dim> index1, const Index<i,Dim> index2,
+	     const Index<j,Dim> index3)
+  {
+    typedef const Tensor3_contracted_02
+      <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+//    template<char i, char j, int Dim02, int Dim1>
+//    inline Tensor1_Expr<const Tensor3_contracted_02
+//    <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim02>,T,Dim1,i>
+//    operator()(const Index<j,Dim02> index1, const Index<i,Dim1> index2,
+//  	     const Index<j,Dim02> index3)
+//    {
+//      typedef const Tensor3_contracted_02
+//        <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim02>
+//        TensorExpr;
+//      return Tensor1_Expr<TensorExpr,T,Dim1,i>(TensorExpr(*this));
+//    }
+
+  template<char i, char j, int Dim>
+  inline Tensor1_Expr<const Tensor3_contracted_01
+  <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim>,T,Dim,i>
+  operator()(const Index<j,Dim> index1, const Index<j,Dim> index2,
+	     const Index<i,Dim> index3)
+  {
+    typedef const Tensor3_contracted_01
+      <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim>
+      TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+//    template<char i, char j, int Dim01, int Dim2>
+//    inline Tensor1_Expr<const Tensor3_contracted_01
+//    <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim01>,T,Dim2,i>
+//    operator()(const Index<j,Dim01> index1, const Index<j,Dim01> index2,
+//  	     const Index<i,Dim2> index3)
+//    {
+//      typedef const Tensor3_contracted_01
+//        <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,Dim01>
+//        TensorExpr;
+//      return Tensor1_Expr<TensorExpr,T,Dim2,i>(TensorExpr(*this));
+//    }
+
+  /* This is for expressions where a Number<> is used for one slot, and
+     an index for the others, yielding a Tensor2_symmetric_Expr. */
+
+  template<char i, char j, int N, int Dim12>
+  Tensor2_symmetric_Expr<const Tensor3_christof_number_0
+  <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,N>,T,Dim12,i,j>
+  operator()(const Number<N> n1, const Index<i,Dim12> index1,
+	     const Index<j,Dim12> index2) const
+  {
+    typedef const Tensor3_christof_number_0
+      <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T,N> TensorExpr;
+    return Tensor2_symmetric_Expr<TensorExpr,T,Dim12,i,j>(TensorExpr(*this));
+  }
+
+  /* This is for expressions where an int is used for one slot, and
+     an index for the others, yielding a Tensor2_symmetric_Expr. */
+
+  template<char i, char j, int Dim12>
+  Tensor2_symmetric_Expr<const Tensor3_christof_numeral_0
+  <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T>,T,Dim12,i,j>
+  operator()(const int N, const Index<i,Dim12> index1,
+	     const Index<j,Dim12> index2) const
+  {
+    typedef const Tensor3_christof_numeral_0
+      <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T> TensorExpr;
+    return Tensor2_symmetric_Expr<TensorExpr,T,Dim12,i,j>(TensorExpr(*this,N));
+  }
+  
+  /* An int in one spot, Index for the others, yielding a Tensor2.  I
+     can use the same structure for both, since Tensor3_christof is
+     symmetric on the last two indices. */
+
+  template<char i, char j, int Dim0, int Dim2>
+  Tensor2_Expr<const Tensor3_christof_numeral_1
+  <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T>,T,Dim0,Dim2,i,j>
+  operator()(const Index<i,Dim0> index1, const int N,
+	     const Index<j,Dim2> index2) const
+  {
+    typedef const Tensor3_christof_numeral_1
+      <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T> TensorExpr;
+    return Tensor2_Expr<TensorExpr,T,Dim0,Dim2,i,j>(TensorExpr(*this,N));
+  }
+
+  template<char i, char j, int Dim0, int Dim2>
+  Tensor2_Expr<const Tensor3_christof_numeral_1
+  <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T>,T,Dim0,Dim2,i,j>
+  operator()(const Index<i,Dim0> index1, const Index<j,Dim2> index2,
+	     const int N) const
+  {
+    typedef const Tensor3_christof_numeral_1
+      <const Tensor3_christof<T,Tensor_Dim0,Tensor_Dim12>,T> TensorExpr;
+    return Tensor2_Expr<TensorExpr,T,Dim0,Dim2,i,j>(TensorExpr(*this,N));
+  }
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg.h
--- a/Tensor3_dg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-/* Declarations for a Tensor3_dg.  This is symmetric on the first two
-   indices. */
-
-#include "Tensor3_dg/Tensor3_dg_number.h"
-#include "Tensor3_dg/Tensor3_dg_numeral.h"
-
-#include "Tensor3_dg/Tensor3_dg_constructor.h"
-#include "Tensor3_dg/Tensor3_dg_value.h"
-#include "Tensor3_dg/Tensor3_dg_pointer.h"
-
-#include "Tensor3_dg/Tensor3_dg_Expr.h"
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,11 @@
+/* Declarations for a Tensor3_dg.  This is symmetric on the first two
+   indices. */
+
+#include "Tensor3_dg/Tensor3_dg_number.hpp"
+#include "Tensor3_dg/Tensor3_dg_numeral.hpp"
+
+#include "Tensor3_dg/Tensor3_dg_constructor.hpp"
+#include "Tensor3_dg/Tensor3_dg_value.hpp"
+#include "Tensor3_dg/Tensor3_dg_pointer.hpp"
+
+#include "Tensor3_dg/Tensor3_dg_Expr.hpp"
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_Expr.h
--- a/Tensor3_dg/Tensor3_dg_Expr.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,152 +0,0 @@
-/* Declares a wrapper class for symmetric rank 3 Tensor expressions
-   that are symmetric on the first two indices.  It is also used for
-   Tensor3_christof's but with some games played with the
-   indices. */
-
-#include "Tensor3_dg_plus_Tensor3_dg.h"
-#include "Tensor3_dg_minus_Tensor3_dg.h"
-#include "Tensor3_dg_and_Tensor3_dg.h"
-#include "Tensor3_dg_or_Tensor3_dg.h"
-#include "Tensor3_dg_times_Tensor3_dg.h"
-#include "Tensor3_dg_times_Tensor2.h"
-#include "Tensor3_dg_times_Tensor2_symmetric.h"
-#include "Tensor3_dg_and_Tensor2_symmetric.h"
-#include "Tensor3_dg_times_Tensor1.h"
-#include "Tensor3_dg_and_Tensor1.h"
-#include "Tensor3_dg_times_generic.h"
-#include "Tensor3_dg_divide_generic.h"
-#include "minus_Tensor3_dg.h"
-
-template<class A, class T, int Dim01, int Dim2, char i, char j, char k>
-class Tensor3_dg_Expr
-{
-  A iter;
-public:
-  Tensor3_dg_Expr(A &a): iter(a) {}
-  T operator()(const int N1, const int N2, const int N3) const
-  {
-    return iter(N1,N2,N3);
-  }
-};
-
-template<class A, class T, int Tensor_Dim01, int Tensor_Dim2,
-  int Dim01, int Dim2, char i, char j, char k>
-class Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k>
-{
-  Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2> &iter;
-public:
-  Tensor3_dg_Expr(Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2> &a): iter(a) {}
-  T & operator()(const int N1, const int N2, const int N3)
-  {
-    return iter(N1,N2,N3);
-  }
-  T operator()(const int N1, const int N2, const int N3) const
-  {
-    return iter(N1,N2,N3);
-  }
-
-  /* Various assignment operators.  I have to explicitly declare the
-     second operator= because otherwise the compiler will generate its
-     own and not use the template code. */
-
-  template<class B, class U> inline
-  const Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k> &
-  operator=(const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> &result);
-
-  const Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k> &
-  operator=(const Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k> &result);
-
-  template <class U> inline
-  const Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k> &
-  operator=(const U &d);
-};
-
-/* I need a version for const and non-const Tensor3_christof,
-   otherwise it will use the default and the index order will get all
-   messed up. The class A is either T or T*, depending on whether
-   Tensor3_christof has an array of T's or T *'s. */
-
-template<class A, class T, int Tensor_Dim0, int Tensor_Dim12,
-  int Dim12, int Dim0, char i, char j, char k>
-class Tensor3_dg_Expr<const Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12>,
-  T,Dim12,Dim0,i,j,k>
-{
-  const Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12> &iter;
-public:
-  Tensor3_dg_Expr(const Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12> &a): iter(a) {}
-
-  /* Need to switch the index order because a christof tensor is just
-     a dg tensor with the indices switched. */
-
-  T operator()(const int N1, const int N2, const int N3) const
-  {
-    return iter(N3,N1,N2);
-  }
-};
-
-template<class A, class T, int Tensor_Dim0, int Tensor_Dim12,
-  int Dim12, int Dim0, char i, char j, char k>
-class Tensor3_dg_Expr<Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k>
-{
-  Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12> &iter;
-public:
-  Tensor3_dg_Expr(Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12> &a): iter(a) {}
-
-  /* Need to switch the index order because a christof tensor is just
-     a dg tensor with the indices switched.  I have to explicitly
-     declare the second operator= because otherwise the compiler will
-     generate its own and not use the template code. */
-
-  T operator()(const int N1, const int N2, const int N3) const
-  {
-    return iter(N3,N1,N2);
-  }
-  template<class B, class U> inline
-  const Tensor3_dg_Expr<Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k> &
-  operator=(const Tensor3_dg_Expr<B,U,Dim12,Dim0,i,j,k> &result);
-
-  inline
-  const Tensor3_dg_Expr<Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k> &
-  operator=(const Tensor3_dg_Expr<Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12>,
-	    T,Dim12,Dim0,i,j,k> &result);
-
-  template<class U> inline
-  const Tensor3_dg_Expr<Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k> &
-  operator=(const U &d);
-};
-
-/* Specialized for Tensor4_ddg_number_rhs_0 (Tensor4_ddg with the
-   first index explicitly given). */
-
-template<class A, class T, int Dim23, int Dim1, char i, char j, char k, int N0>
-class Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0<A,T,N0>,
-  T,Dim23,Dim1,i,j,k>
-{
-  A &iter;
-public:
-  Tensor3_dg_Expr(A &a): iter(a) {}
-  T & operator()(const int N1, const int N2, const int N3)
-  {
-    return iter(N0,N1,N2,N3);
-  }
-  T operator()(const int N1, const int N2, const int N3) const
-  {
-    return iter(N0,N1,N2,N3);
-  }
-
-  /* Various assignment operators.  I have to explicitly declare the
-     second operator= because otherwise the compiler will generate its
-     own and not use the template code. */
-
-  template<class B, class U>
-  const Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0<A,T,N0>,
-    T,Dim23,Dim1,i,j,k> &
-  operator=(const Tensor3_dg_Expr<B,U,Dim23,Dim1,i,j,k> &result);
-
-  const Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0<A,T,N0>,
-    T,Dim23,Dim1,i,j,k> &
-  operator=(const Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0<A,T,N0>,
-	    T,Dim23,Dim1,i,j,k> &result);
-};
-
-#include "Tensor3_dg_Expr_equals.h"
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_Expr.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/Tensor3_dg_Expr.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,152 @@
+/* Declares a wrapper class for symmetric rank 3 Tensor expressions
+   that are symmetric on the first two indices.  It is also used for
+   Tensor3_christof's but with some games played with the
+   indices. */
+
+#include "Tensor3_dg_plus_Tensor3_dg.hpp"
+#include "Tensor3_dg_minus_Tensor3_dg.hpp"
+#include "Tensor3_dg_and_Tensor3_dg.hpp"
+#include "Tensor3_dg_or_Tensor3_dg.hpp"
+#include "Tensor3_dg_times_Tensor3_dg.hpp"
+#include "Tensor3_dg_times_Tensor2.hpp"
+#include "Tensor3_dg_times_Tensor2_symmetric.hpp"
+#include "Tensor3_dg_and_Tensor2_symmetric.hpp"
+#include "Tensor3_dg_times_Tensor1.hpp"
+#include "Tensor3_dg_and_Tensor1.hpp"
+#include "Tensor3_dg_times_generic.hpp"
+#include "Tensor3_dg_divide_generic.hpp"
+#include "minus_Tensor3_dg.hpp"
+
+template<class A, class T, int Dim01, int Dim2, char i, char j, char k>
+class Tensor3_dg_Expr
+{
+  A iter;
+public:
+  Tensor3_dg_Expr(A &a): iter(a) {}
+  T operator()(const int N1, const int N2, const int N3) const
+  {
+    return iter(N1,N2,N3);
+  }
+};
+
+template<class A, class T, int Tensor_Dim01, int Tensor_Dim2,
+  int Dim01, int Dim2, char i, char j, char k>
+class Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k>
+{
+  Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2> &iter;
+public:
+  Tensor3_dg_Expr(Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2> &a): iter(a) {}
+  T & operator()(const int N1, const int N2, const int N3)
+  {
+    return iter(N1,N2,N3);
+  }
+  T operator()(const int N1, const int N2, const int N3) const
+  {
+    return iter(N1,N2,N3);
+  }
+
+  /* Various assignment operators.  I have to explicitly declare the
+     second operator= because otherwise the compiler will generate its
+     own and not use the template code. */
+
+  template<class B, class U> inline
+  const Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k> &
+  operator=(const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> &result);
+
+  const Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k> &
+  operator=(const Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k> &result);
+
+  template <class U> inline
+  const Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k> &
+  operator=(const U &d);
+};
+
+/* I need a version for const and non-const Tensor3_christof,
+   otherwise it will use the default and the index order will get all
+   messed up. The class A is either T or T*, depending on whether
+   Tensor3_christof has an array of T's or T *'s. */
+
+template<class A, class T, int Tensor_Dim0, int Tensor_Dim12,
+  int Dim12, int Dim0, char i, char j, char k>
+class Tensor3_dg_Expr<const Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12>,
+  T,Dim12,Dim0,i,j,k>
+{
+  const Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12> &iter;
+public:
+  Tensor3_dg_Expr(const Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12> &a): iter(a) {}
+
+  /* Need to switch the index order because a christof tensor is just
+     a dg tensor with the indices switched. */
+
+  T operator()(const int N1, const int N2, const int N3) const
+  {
+    return iter(N3,N1,N2);
+  }
+};
+
+template<class A, class T, int Tensor_Dim0, int Tensor_Dim12,
+  int Dim12, int Dim0, char i, char j, char k>
+class Tensor3_dg_Expr<Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k>
+{
+  Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12> &iter;
+public:
+  Tensor3_dg_Expr(Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12> &a): iter(a) {}
+
+  /* Need to switch the index order because a christof tensor is just
+     a dg tensor with the indices switched.  I have to explicitly
+     declare the second operator= because otherwise the compiler will
+     generate its own and not use the template code. */
+
+  T operator()(const int N1, const int N2, const int N3) const
+  {
+    return iter(N3,N1,N2);
+  }
+  template<class B, class U> inline
+  const Tensor3_dg_Expr<Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k> &
+  operator=(const Tensor3_dg_Expr<B,U,Dim12,Dim0,i,j,k> &result);
+
+  inline
+  const Tensor3_dg_Expr<Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k> &
+  operator=(const Tensor3_dg_Expr<Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12>,
+	    T,Dim12,Dim0,i,j,k> &result);
+
+  template<class U> inline
+  const Tensor3_dg_Expr<Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k> &
+  operator=(const U &d);
+};
+
+/* Specialized for Tensor4_ddg_number_rhs_0 (Tensor4_ddg with the
+   first index explicitly given). */
+
+template<class A, class T, int Dim23, int Dim1, char i, char j, char k, int N0>
+class Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0<A,T,N0>,
+  T,Dim23,Dim1,i,j,k>
+{
+  A &iter;
+public:
+  Tensor3_dg_Expr(A &a): iter(a) {}
+  T & operator()(const int N1, const int N2, const int N3)
+  {
+    return iter(N0,N1,N2,N3);
+  }
+  T operator()(const int N1, const int N2, const int N3) const
+  {
+    return iter(N0,N1,N2,N3);
+  }
+
+  /* Various assignment operators.  I have to explicitly declare the
+     second operator= because otherwise the compiler will generate its
+     own and not use the template code. */
+
+  template<class B, class U>
+  const Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0<A,T,N0>,
+    T,Dim23,Dim1,i,j,k> &
+  operator=(const Tensor3_dg_Expr<B,U,Dim23,Dim1,i,j,k> &result);
+
+  const Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0<A,T,N0>,
+    T,Dim23,Dim1,i,j,k> &
+  operator=(const Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0<A,T,N0>,
+	    T,Dim23,Dim1,i,j,k> &result);
+};
+
+#include "Tensor3_dg_Expr_equals.hpp"
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_Expr_equals.h
--- a/Tensor3_dg/Tensor3_dg_Expr_equals.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,366 +0,0 @@
-/* Various assignment operators, including specializations to
-   Tensor3_christof.  I have to explicitly declare the second
-   operator= because otherwise the compiler will generate its own and
-   not use the template code. */
-
-/* T3dg=T3dg */
-
-template<class A, class B, class U, int Dim01, int Dim2,
-  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline void T3dg_equals_T3dg
-(A &iter, const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> &result,
- const Number<Current_Dim0> &N0, const Number<Current_Dim1> &N1,
- const Number<Current_Dim2> &N2)
-{
-  iter(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)=
-    result(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1);
-  T3dg_equals_T3dg(iter,result,Number<Current_Dim0-1>(),
-		   Number<Current_Dim1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class U, int Dim01, int Dim2,
-  char i, char j, char k, int Current_Dim1, int Current_Dim2>
-inline void T3dg_equals_T3dg
-(A &iter, const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> &result,
- const Number<1> &N0, const Number<Current_Dim1> &N1,
- const Number<Current_Dim2> &N2)
-{
-  iter(0,Current_Dim1-1,Current_Dim2-1)=
-    result(0,Current_Dim1-1,Current_Dim2-1);
-  T3dg_equals_T3dg(iter,result,Number<Current_Dim1-1>(),
-		   Number<Current_Dim1-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class U, int Dim01, int Dim2,
-  char i, char j, char k, int Current_Dim2>
-inline void T3dg_equals_T3dg
-(A &iter, const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> &result,
- const Number<1> &N0, const Number<1> &N1,
- const Number<Current_Dim2> &N2)
-{
-  iter(0,0,Current_Dim2-1)=result(0,0,Current_Dim2-1);
-  T3dg_equals_T3dg(iter,result,Number<Dim01>(),
-		   Number<Dim01>(),Number<Current_Dim2-1>());
-}
-
-template<class A, class B, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline void T3dg_equals_T3dg
-(A &iter, const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> &result,
- const Number<1> &N0, const Number<1> &N1, const Number<1> &N2)
-{
-  iter(0,0,0)=result(0,0,0);
-}
-
-template<class A, class T, int Tensor_Dim01, int Tensor_Dim2,
-  int Dim01, int Dim2, char i, char j, char k>
-template<class B, class U> inline
-const Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k> &
-Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k>::
-operator=(const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> &result)
-{
-  T3dg_equals_T3dg(iter,result,Number<Dim01>(),Number<Dim01>(),Number<Dim2>());
-  return *this;
-}
-
-/* T3dg=T3dg_Expr(T3dg) */
-
-template<class A, class T, int Tensor_Dim01, int Tensor_Dim2,
-  int Dim01, int Dim2, char i, char j, char k> inline
-const Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k> &
-Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k>::
-operator=(const Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k> &result)
-{
-  return operator=<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T>(result);
-}
-
-/* T3dg=U */
-
-template<class A, class U, int Dim01, int Dim2,
-  int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline void T3dg_equals_generic(A &iter, const U &u,
-				const Number<Current_Dim0> &N0,
-				const Number<Current_Dim1> &N1,
-				const Number<Current_Dim2> &N2,
-				const Number<Dim01> &ND01,
-				const Number<Dim2> &ND2)
-{
-  iter(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)=u;
-  T3dg_equals_generic(iter,u,Number<Current_Dim0-1>(),
-		      Number<Current_Dim1>(),Number<Current_Dim2>(),
-		      Number<Dim01>(),Number<Dim2>());
-}
-
-template<class A, class U, int Dim01, int Dim2,
-  int Current_Dim1, int Current_Dim2>
-inline void T3dg_equals_generic(A &iter, const U &u,
-				const Number<1> &N0,
-				const Number<Current_Dim1> &N1,
-				const Number<Current_Dim2> &N2,
-				const Number<Dim01> &ND01,
-				const Number<Dim2> &ND2)
-{
-  iter(0,Current_Dim1-1,Current_Dim2-1)=u;
-  T3dg_equals_generic(iter,u,Number<Current_Dim1-1>(),
-		      Number<Current_Dim1-1>(),Number<Current_Dim2>(),
-		      Number<Dim01>(),Number<Dim2>());
-}
-
-template<class A, class U, int Dim01, int Dim2, int Current_Dim2>
-inline void T3dg_equals_generic(A &iter, const U &u,
-				const Number<1> &N0, const Number<1> &N1,
-				const Number<Current_Dim2> &N2,
-				const Number<Dim01> &ND01,
-				const Number<Dim2> &ND2)
-{
-  iter(0,0,Current_Dim2-1)=u;
-  T3dg_equals_generic(iter,u,Number<Dim01>(),
-		      Number<Dim01>(),Number<Current_Dim2-1>(),
-		      Number<Dim01>(),Number<Dim2>());
-}
-
-template<class A, class U, int Dim01, int Dim2>
-inline void T3dg_equals_generic(A &iter, const U &u,
-				const Number<1> &N0, const Number<1> &N1,
-				const Number<1> &N2,
-				const Number<Dim01> &ND01,
-				const Number<Dim2> &ND2)
-{
-  iter(0,0,0)=u;
-}
-
-template<class A, class T, int Tensor_Dim01, int Tensor_Dim2,
-  int Dim01, int Dim2, char i, char j, char k>
-template<class U> inline
-const Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k> &
-Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k>::
-operator=(const U &u)
-{
-  T3dg_equals_generic(iter,u,Number<Dim01>(),Number<Dim01>(),Number<Dim2>(),
-		      Number<Dim01>(),Number<Dim2>());
-  return *this;
-}
-
-
-/* Assignment operators for the specializations to Tensor3_christof. */
-
-/* T3ch=T3dg */
-
-template<class A, class B, class U, int Dim12, int Dim0,
-  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline void T3ch_equals_T3dg
-(A &iter, const Tensor3_dg_Expr<B,U,Dim12,Dim0,i,j,k> &result,
- const Number<Current_Dim0> &N0, const Number<Current_Dim1> &N1,
- const Number<Current_Dim2> &N2)
-{
-  iter(Current_Dim2-1,Current_Dim0-1,Current_Dim1-1)=
-    result(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1);
-  T3ch_equals_T3dg(iter,result,Number<Current_Dim0-1>(),
-		   Number<Current_Dim1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class U, int Dim12, int Dim0,
-  char i, char j, char k, int Current_Dim1, int Current_Dim2>
-inline void T3ch_equals_T3dg
-(A &iter, const Tensor3_dg_Expr<B,U,Dim12,Dim0,i,j,k> &result,
- const Number<1> &N0, const Number<Current_Dim1> &N1,
- const Number<Current_Dim2> &N2)
-{
-  iter(Current_Dim2-1,0,Current_Dim1-1)=
-    result(0,Current_Dim1-1,Current_Dim2-1);
-  T3ch_equals_T3dg(iter,result,Number<Current_Dim1-1>(),
-		   Number<Current_Dim1-1>(),Number<Current_Dim2>());
-}
-
-template<class A, class B, class U, int Dim12, int Dim0,
-  char i, char j, char k, int Current_Dim2>
-inline void T3ch_equals_T3dg
-(A &iter, const Tensor3_dg_Expr<B,U,Dim12,Dim0,i,j,k> &result,
- const Number<1> &N0, const Number<1> &N1,
- const Number<Current_Dim2> &N2)
-{
-  iter(Current_Dim2-1,0,0)=result(0,0,Current_Dim2-1);
-  T3ch_equals_T3dg(iter,result,Number<Dim12>(),
-		   Number<Dim12>(),Number<Current_Dim2-1>());
-}
-
-template<class A, class B, class U, int Dim12, int Dim0,
-  char i, char j, char k>
-inline void T3ch_equals_T3dg
-(A &iter, const Tensor3_dg_Expr<B,U,Dim12,Dim0,i,j,k> &result,
- const Number<1> &N0, const Number<1> &N1, const Number<1> &N2)
-{
-  iter(0,0,0)=result(0,0,0);
-}
-
-
-template<class Tp, class T, int Tensor_Dim0, int Tensor_Dim12,
-  int Dim12, int Dim0, char i, char j, char k>
-template<class B, class U> inline
-const Tensor3_dg_Expr<Tensor3_christof<Tp,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k> &
-Tensor3_dg_Expr<Tensor3_christof<Tp,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k>::
-operator=(const Tensor3_dg_Expr<B,U,Dim12,Dim0,i,j,k> &result)
-{
-  T3ch_equals_T3dg(iter,result,Number<Dim12>(),Number<Dim12>(),Number<Dim0>());
-  return *this;
-}
-
-/* T3ch=T3ch_Expr(T3ch) */
-
-template<class Tp, class T, int Tensor_Dim0, int Tensor_Dim12,
-  int Dim12, int Dim0, char i, char j, char k> inline
-const Tensor3_dg_Expr<Tensor3_christof<Tp,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k> &
-Tensor3_dg_Expr<Tensor3_christof<Tp,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k>::
-operator=(const Tensor3_dg_Expr<Tensor3_christof<Tp,Tensor_Dim0,Tensor_Dim12>,
-	  T,Dim12,Dim0,i,j,k> &result)
-{
-  return operator=<Tensor3_christof<Tp,Tensor_Dim0,Tensor_Dim12>,T>(result);
-}
-
-
-/* T3ch=U */
-
-template<class A, class U, int Dim12, int Dim0,
-  int Current_Dim0, int Current_Dim1, int Current_Dim2>
-inline void T3ch_equals_generic(A &iter, const U &u,
-				const Number<Current_Dim0> &N0,
-				const Number<Current_Dim1> &N1,
-				const Number<Current_Dim2> &N2,
-				const Number<Dim12> &ND01,
-				const Number<Dim0> &ND2)
-{
-  iter(Current_Dim2-1,Current_Dim0-1,Current_Dim1-1)=u;
-  T3ch_equals_generic(iter,u,Number<Current_Dim0-1>(),
-		      Number<Current_Dim1>(),Number<Current_Dim2>(),
-		      Number<Dim12>(),Number<Dim0>());
-}
-
-template<class A, class U, int Dim12, int Dim0,
-  int Current_Dim1, int Current_Dim2>
-inline void T3ch_equals_generic(A &iter, const U &u,
-				const Number<1> &N0,
-				const Number<Current_Dim1> &N1,
-				const Number<Current_Dim2> &N2,
-				const Number<Dim12> &ND01,
-				const Number<Dim0> &ND2)
-{
-  iter(Current_Dim2-1,0,Current_Dim1-1)=u;
-  T3ch_equals_generic(iter,u,Number<Current_Dim1-1>(),
-		      Number<Current_Dim1-1>(),Number<Current_Dim2>(),
-		      Number<Dim12>(),Number<Dim0>());
-}
-
-template<class A, class U, int Dim12, int Dim0, int Current_Dim2>
-inline void T3ch_equals_generic(A &iter, const U &u,
-				const Number<1> &N0, const Number<1> &N1,
-				const Number<Current_Dim2> &N2,
-				const Number<Dim12> &ND01,
-				const Number<Dim0> &ND2)
-{
-  iter(Current_Dim2-1,0,0)=u;
-  T3ch_equals_generic(iter,u,Number<Dim12>(),
-		      Number<Dim12>(),Number<Current_Dim2-1>(),
-		      Number<Dim12>(),Number<Dim0>());
-}
-
-template<class A, class U, int Dim12, int Dim0>
-inline void T3ch_equals_generic(A &iter, const U &u,
-				const Number<1> &N0, const Number<1> &N1,
-				const Number<1> &N2,
-				const Number<Dim12> &ND01,
-				const Number<Dim0> &ND2)
-{
-  iter(0,0,0)=u;
-}
-
-template<class A, class T, int Tensor_Dim0, int Tensor_Dim12,
-  int Dim12, int Dim0, char i, char j, char k>
-template<class U> inline
-const Tensor3_dg_Expr<Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12>,
-  T,Dim12,Dim0,i,j,k> &
-Tensor3_dg_Expr<Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12>,
-  T,Dim12,Dim0,i,j,k>::
-operator=(const U &u)
-{
-  T3ch_equals_generic(iter,u,Number<Dim12>(),Number<Dim12>(),Number<Dim0>(),
-		      Number<Dim12>(),Number<Dim0>());
-  return *this;
-}
-
-/* Assignment operators for the specializations to Tensor4_ddg_number_rhs_0. */
-
-/* T4ddgrhs0=T3dg */
-
-template<class A, class B, class U, int Dim23, int Dim1, char i, char j,
-  char k, int Current_Dim0, int Current_Dim1, int Current_Dim2, int N>
-inline void T4ddgrhs0_equals_T3dg
-(A &iter, const Tensor3_dg_Expr<B,U,Dim23,Dim1,i,j,k> &result,
- const Number<Current_Dim0> &N0, const Number<Current_Dim1> &N1,
- const Number<Current_Dim2> &N2, const Number<N> &NN)
-{
-  iter(N,Current_Dim2-1,Current_Dim0-1,Current_Dim1-1)=
-    result(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1);
-  T4ddgrhs0_equals_T3dg(iter,result,Number<Current_Dim0-1>(),
-			Number<Current_Dim1>(),Number<Current_Dim2>(),
-			Number<N>());
-}
-
-template<class A, class B, class U, int Dim23, int Dim1,
-  char i, char j, char k, int Current_Dim1, int Current_Dim2, int N>
-inline void T4ddgrhs0_equals_T3dg
-(A &iter, const Tensor3_dg_Expr<B,U,Dim23,Dim1,i,j,k> &result,
- const Number<1> &N0, const Number<Current_Dim1> &N1,
- const Number<Current_Dim2> &N2, const Number<N> &NN)
-{
-  iter(N,Current_Dim2-1,0,Current_Dim1-1)=
-    result(0,Current_Dim1-1,Current_Dim2-1);
-  T4ddgrhs0_equals_T3dg(iter,result,Number<Current_Dim1-1>(),
-			Number<Current_Dim1-1>(),Number<Current_Dim2>(),
-			Number<N>());
-}
-
-template<class A, class B, class U, int Dim23, int Dim1,
-  char i, char j, char k, int Current_Dim2, int N>
-inline void T4ddgrhs0_equals_T3dg
-(A &iter, const Tensor3_dg_Expr<B,U,Dim23,Dim1,i,j,k> &result,
- const Number<1> &N0, const Number<1> &N1,
- const Number<Current_Dim2> &N2, const Number<N> &NN)
-{
-  iter(N,Current_Dim2-1,0,0)=result(0,0,Current_Dim2-1);
-  T4ddgrhs0_equals_T3dg(iter,result,Number<Dim23>(),
-		   Number<Dim23>(),Number<Current_Dim2-1>(),Number<N>());
-}
-
-template<class A, class B, class U, int Dim23, int Dim1,
-  char i, char j, char k, int N>
-inline void T4ddgrhs0_equals_T3dg
-(A &iter, const Tensor3_dg_Expr<B,U,Dim23,Dim1,i,j,k> &result,
- const Number<1> &N0, const Number<1> &N1, const Number<1> &N2,
- const Number<N> &NN)
-{
-  iter(N,0,0,0)=result(0,0,0);
-}
-
-template<class A, class T, int Dim23, int Dim1, char i, char j, char k, int N>
-template<class B, class U> inline
-const Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0<A,T,N>,T,Dim23,Dim1,i,j,k> &
-Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0<A,T,N>,T,Dim23,Dim1,i,j,k>::
-operator=(const Tensor3_dg_Expr<B,U,Dim23,Dim1,i,j,k> &result)
-{
-  T4ddgrhs0_equals_T3dg(iter,result,Number<Dim23>(),Number<Dim23>(),
-			Number<Dim1>(),Number<N>());
-  return *this;
-}
-
-/* T4ddgrhs0=T4ddgrhs0 */
-
-template<class A, class T, int Dim23, int Dim1, char i, char j, char k, int N>
-inline
-const Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0<A,T,N>,T,Dim23,Dim1,i,j,k> &
-Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0<A,T,N>,T,Dim23,Dim1,i,j,k>::
-operator=(const Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0<A,T,N>,
-	  T,Dim23,Dim1,i,j,k> &result)
-{
-  return operator=<Tensor4_ddg_number_rhs_0<A,T,N>,T>(result);
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_Expr_equals.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/Tensor3_dg_Expr_equals.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,366 @@
+/* Various assignment operators, including specializations to
+   Tensor3_christof.  I have to explicitly declare the second
+   operator= because otherwise the compiler will generate its own and
+   not use the template code. */
+
+/* T3dg=T3dg */
+
+template<class A, class B, class U, int Dim01, int Dim2,
+  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline void T3dg_equals_T3dg
+(A &iter, const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> &result,
+ const Number<Current_Dim0> &N0, const Number<Current_Dim1> &N1,
+ const Number<Current_Dim2> &N2)
+{
+  iter(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)=
+    result(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1);
+  T3dg_equals_T3dg(iter,result,Number<Current_Dim0-1>(),
+		   Number<Current_Dim1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class U, int Dim01, int Dim2,
+  char i, char j, char k, int Current_Dim1, int Current_Dim2>
+inline void T3dg_equals_T3dg
+(A &iter, const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> &result,
+ const Number<1> &N0, const Number<Current_Dim1> &N1,
+ const Number<Current_Dim2> &N2)
+{
+  iter(0,Current_Dim1-1,Current_Dim2-1)=
+    result(0,Current_Dim1-1,Current_Dim2-1);
+  T3dg_equals_T3dg(iter,result,Number<Current_Dim1-1>(),
+		   Number<Current_Dim1-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class U, int Dim01, int Dim2,
+  char i, char j, char k, int Current_Dim2>
+inline void T3dg_equals_T3dg
+(A &iter, const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> &result,
+ const Number<1> &N0, const Number<1> &N1,
+ const Number<Current_Dim2> &N2)
+{
+  iter(0,0,Current_Dim2-1)=result(0,0,Current_Dim2-1);
+  T3dg_equals_T3dg(iter,result,Number<Dim01>(),
+		   Number<Dim01>(),Number<Current_Dim2-1>());
+}
+
+template<class A, class B, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline void T3dg_equals_T3dg
+(A &iter, const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> &result,
+ const Number<1> &N0, const Number<1> &N1, const Number<1> &N2)
+{
+  iter(0,0,0)=result(0,0,0);
+}
+
+template<class A, class T, int Tensor_Dim01, int Tensor_Dim2,
+  int Dim01, int Dim2, char i, char j, char k>
+template<class B, class U> inline
+const Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k> &
+Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k>::
+operator=(const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> &result)
+{
+  T3dg_equals_T3dg(iter,result,Number<Dim01>(),Number<Dim01>(),Number<Dim2>());
+  return *this;
+}
+
+/* T3dg=T3dg_Expr(T3dg) */
+
+template<class A, class T, int Tensor_Dim01, int Tensor_Dim2,
+  int Dim01, int Dim2, char i, char j, char k> inline
+const Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k> &
+Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k>::
+operator=(const Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k> &result)
+{
+  return operator=<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T>(result);
+}
+
+/* T3dg=U */
+
+template<class A, class U, int Dim01, int Dim2,
+  int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline void T3dg_equals_generic(A &iter, const U &u,
+				const Number<Current_Dim0> &N0,
+				const Number<Current_Dim1> &N1,
+				const Number<Current_Dim2> &N2,
+				const Number<Dim01> &ND01,
+				const Number<Dim2> &ND2)
+{
+  iter(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1)=u;
+  T3dg_equals_generic(iter,u,Number<Current_Dim0-1>(),
+		      Number<Current_Dim1>(),Number<Current_Dim2>(),
+		      Number<Dim01>(),Number<Dim2>());
+}
+
+template<class A, class U, int Dim01, int Dim2,
+  int Current_Dim1, int Current_Dim2>
+inline void T3dg_equals_generic(A &iter, const U &u,
+				const Number<1> &N0,
+				const Number<Current_Dim1> &N1,
+				const Number<Current_Dim2> &N2,
+				const Number<Dim01> &ND01,
+				const Number<Dim2> &ND2)
+{
+  iter(0,Current_Dim1-1,Current_Dim2-1)=u;
+  T3dg_equals_generic(iter,u,Number<Current_Dim1-1>(),
+		      Number<Current_Dim1-1>(),Number<Current_Dim2>(),
+		      Number<Dim01>(),Number<Dim2>());
+}
+
+template<class A, class U, int Dim01, int Dim2, int Current_Dim2>
+inline void T3dg_equals_generic(A &iter, const U &u,
+				const Number<1> &N0, const Number<1> &N1,
+				const Number<Current_Dim2> &N2,
+				const Number<Dim01> &ND01,
+				const Number<Dim2> &ND2)
+{
+  iter(0,0,Current_Dim2-1)=u;
+  T3dg_equals_generic(iter,u,Number<Dim01>(),
+		      Number<Dim01>(),Number<Current_Dim2-1>(),
+		      Number<Dim01>(),Number<Dim2>());
+}
+
+template<class A, class U, int Dim01, int Dim2>
+inline void T3dg_equals_generic(A &iter, const U &u,
+				const Number<1> &N0, const Number<1> &N1,
+				const Number<1> &N2,
+				const Number<Dim01> &ND01,
+				const Number<Dim2> &ND2)
+{
+  iter(0,0,0)=u;
+}
+
+template<class A, class T, int Tensor_Dim01, int Tensor_Dim2,
+  int Dim01, int Dim2, char i, char j, char k>
+template<class U> inline
+const Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k> &
+Tensor3_dg_Expr<Tensor3_dg<A,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k>::
+operator=(const U &u)
+{
+  T3dg_equals_generic(iter,u,Number<Dim01>(),Number<Dim01>(),Number<Dim2>(),
+		      Number<Dim01>(),Number<Dim2>());
+  return *this;
+}
+
+
+/* Assignment operators for the specializations to Tensor3_christof. */
+
+/* T3ch=T3dg */
+
+template<class A, class B, class U, int Dim12, int Dim0,
+  char i, char j, char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline void T3ch_equals_T3dg
+(A &iter, const Tensor3_dg_Expr<B,U,Dim12,Dim0,i,j,k> &result,
+ const Number<Current_Dim0> &N0, const Number<Current_Dim1> &N1,
+ const Number<Current_Dim2> &N2)
+{
+  iter(Current_Dim2-1,Current_Dim0-1,Current_Dim1-1)=
+    result(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1);
+  T3ch_equals_T3dg(iter,result,Number<Current_Dim0-1>(),
+		   Number<Current_Dim1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class U, int Dim12, int Dim0,
+  char i, char j, char k, int Current_Dim1, int Current_Dim2>
+inline void T3ch_equals_T3dg
+(A &iter, const Tensor3_dg_Expr<B,U,Dim12,Dim0,i,j,k> &result,
+ const Number<1> &N0, const Number<Current_Dim1> &N1,
+ const Number<Current_Dim2> &N2)
+{
+  iter(Current_Dim2-1,0,Current_Dim1-1)=
+    result(0,Current_Dim1-1,Current_Dim2-1);
+  T3ch_equals_T3dg(iter,result,Number<Current_Dim1-1>(),
+		   Number<Current_Dim1-1>(),Number<Current_Dim2>());
+}
+
+template<class A, class B, class U, int Dim12, int Dim0,
+  char i, char j, char k, int Current_Dim2>
+inline void T3ch_equals_T3dg
+(A &iter, const Tensor3_dg_Expr<B,U,Dim12,Dim0,i,j,k> &result,
+ const Number<1> &N0, const Number<1> &N1,
+ const Number<Current_Dim2> &N2)
+{
+  iter(Current_Dim2-1,0,0)=result(0,0,Current_Dim2-1);
+  T3ch_equals_T3dg(iter,result,Number<Dim12>(),
+		   Number<Dim12>(),Number<Current_Dim2-1>());
+}
+
+template<class A, class B, class U, int Dim12, int Dim0,
+  char i, char j, char k>
+inline void T3ch_equals_T3dg
+(A &iter, const Tensor3_dg_Expr<B,U,Dim12,Dim0,i,j,k> &result,
+ const Number<1> &N0, const Number<1> &N1, const Number<1> &N2)
+{
+  iter(0,0,0)=result(0,0,0);
+}
+
+
+template<class Tp, class T, int Tensor_Dim0, int Tensor_Dim12,
+  int Dim12, int Dim0, char i, char j, char k>
+template<class B, class U> inline
+const Tensor3_dg_Expr<Tensor3_christof<Tp,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k> &
+Tensor3_dg_Expr<Tensor3_christof<Tp,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k>::
+operator=(const Tensor3_dg_Expr<B,U,Dim12,Dim0,i,j,k> &result)
+{
+  T3ch_equals_T3dg(iter,result,Number<Dim12>(),Number<Dim12>(),Number<Dim0>());
+  return *this;
+}
+
+/* T3ch=T3ch_Expr(T3ch) */
+
+template<class Tp, class T, int Tensor_Dim0, int Tensor_Dim12,
+  int Dim12, int Dim0, char i, char j, char k> inline
+const Tensor3_dg_Expr<Tensor3_christof<Tp,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k> &
+Tensor3_dg_Expr<Tensor3_christof<Tp,Tensor_Dim0,Tensor_Dim12>,T,Dim12,Dim0,i,j,k>::
+operator=(const Tensor3_dg_Expr<Tensor3_christof<Tp,Tensor_Dim0,Tensor_Dim12>,
+	  T,Dim12,Dim0,i,j,k> &result)
+{
+  return operator=<Tensor3_christof<Tp,Tensor_Dim0,Tensor_Dim12>,T>(result);
+}
+
+
+/* T3ch=U */
+
+template<class A, class U, int Dim12, int Dim0,
+  int Current_Dim0, int Current_Dim1, int Current_Dim2>
+inline void T3ch_equals_generic(A &iter, const U &u,
+				const Number<Current_Dim0> &N0,
+				const Number<Current_Dim1> &N1,
+				const Number<Current_Dim2> &N2,
+				const Number<Dim12> &ND01,
+				const Number<Dim0> &ND2)
+{
+  iter(Current_Dim2-1,Current_Dim0-1,Current_Dim1-1)=u;
+  T3ch_equals_generic(iter,u,Number<Current_Dim0-1>(),
+		      Number<Current_Dim1>(),Number<Current_Dim2>(),
+		      Number<Dim12>(),Number<Dim0>());
+}
+
+template<class A, class U, int Dim12, int Dim0,
+  int Current_Dim1, int Current_Dim2>
+inline void T3ch_equals_generic(A &iter, const U &u,
+				const Number<1> &N0,
+				const Number<Current_Dim1> &N1,
+				const Number<Current_Dim2> &N2,
+				const Number<Dim12> &ND01,
+				const Number<Dim0> &ND2)
+{
+  iter(Current_Dim2-1,0,Current_Dim1-1)=u;
+  T3ch_equals_generic(iter,u,Number<Current_Dim1-1>(),
+		      Number<Current_Dim1-1>(),Number<Current_Dim2>(),
+		      Number<Dim12>(),Number<Dim0>());
+}
+
+template<class A, class U, int Dim12, int Dim0, int Current_Dim2>
+inline void T3ch_equals_generic(A &iter, const U &u,
+				const Number<1> &N0, const Number<1> &N1,
+				const Number<Current_Dim2> &N2,
+				const Number<Dim12> &ND01,
+				const Number<Dim0> &ND2)
+{
+  iter(Current_Dim2-1,0,0)=u;
+  T3ch_equals_generic(iter,u,Number<Dim12>(),
+		      Number<Dim12>(),Number<Current_Dim2-1>(),
+		      Number<Dim12>(),Number<Dim0>());
+}
+
+template<class A, class U, int Dim12, int Dim0>
+inline void T3ch_equals_generic(A &iter, const U &u,
+				const Number<1> &N0, const Number<1> &N1,
+				const Number<1> &N2,
+				const Number<Dim12> &ND01,
+				const Number<Dim0> &ND2)
+{
+  iter(0,0,0)=u;
+}
+
+template<class A, class T, int Tensor_Dim0, int Tensor_Dim12,
+  int Dim12, int Dim0, char i, char j, char k>
+template<class U> inline
+const Tensor3_dg_Expr<Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12>,
+  T,Dim12,Dim0,i,j,k> &
+Tensor3_dg_Expr<Tensor3_christof<A,Tensor_Dim0,Tensor_Dim12>,
+  T,Dim12,Dim0,i,j,k>::
+operator=(const U &u)
+{
+  T3ch_equals_generic(iter,u,Number<Dim12>(),Number<Dim12>(),Number<Dim0>(),
+		      Number<Dim12>(),Number<Dim0>());
+  return *this;
+}
+
+/* Assignment operators for the specializations to Tensor4_ddg_number_rhs_0. */
+
+/* T4ddgrhs0=T3dg */
+
+template<class A, class B, class U, int Dim23, int Dim1, char i, char j,
+  char k, int Current_Dim0, int Current_Dim1, int Current_Dim2, int N>
+inline void T4ddgrhs0_equals_T3dg
+(A &iter, const Tensor3_dg_Expr<B,U,Dim23,Dim1,i,j,k> &result,
+ const Number<Current_Dim0> &N0, const Number<Current_Dim1> &N1,
+ const Number<Current_Dim2> &N2, const Number<N> &NN)
+{
+  iter(N,Current_Dim2-1,Current_Dim0-1,Current_Dim1-1)=
+    result(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1);
+  T4ddgrhs0_equals_T3dg(iter,result,Number<Current_Dim0-1>(),
+			Number<Current_Dim1>(),Number<Current_Dim2>(),
+			Number<N>());
+}
+
+template<class A, class B, class U, int Dim23, int Dim1,
+  char i, char j, char k, int Current_Dim1, int Current_Dim2, int N>
+inline void T4ddgrhs0_equals_T3dg
+(A &iter, const Tensor3_dg_Expr<B,U,Dim23,Dim1,i,j,k> &result,
+ const Number<1> &N0, const Number<Current_Dim1> &N1,
+ const Number<Current_Dim2> &N2, const Number<N> &NN)
+{
+  iter(N,Current_Dim2-1,0,Current_Dim1-1)=
+    result(0,Current_Dim1-1,Current_Dim2-1);
+  T4ddgrhs0_equals_T3dg(iter,result,Number<Current_Dim1-1>(),
+			Number<Current_Dim1-1>(),Number<Current_Dim2>(),
+			Number<N>());
+}
+
+template<class A, class B, class U, int Dim23, int Dim1,
+  char i, char j, char k, int Current_Dim2, int N>
+inline void T4ddgrhs0_equals_T3dg
+(A &iter, const Tensor3_dg_Expr<B,U,Dim23,Dim1,i,j,k> &result,
+ const Number<1> &N0, const Number<1> &N1,
+ const Number<Current_Dim2> &N2, const Number<N> &NN)
+{
+  iter(N,Current_Dim2-1,0,0)=result(0,0,Current_Dim2-1);
+  T4ddgrhs0_equals_T3dg(iter,result,Number<Dim23>(),
+		   Number<Dim23>(),Number<Current_Dim2-1>(),Number<N>());
+}
+
+template<class A, class B, class U, int Dim23, int Dim1,
+  char i, char j, char k, int N>
+inline void T4ddgrhs0_equals_T3dg
+(A &iter, const Tensor3_dg_Expr<B,U,Dim23,Dim1,i,j,k> &result,
+ const Number<1> &N0, const Number<1> &N1, const Number<1> &N2,
+ const Number<N> &NN)
+{
+  iter(N,0,0,0)=result(0,0,0);
+}
+
+template<class A, class T, int Dim23, int Dim1, char i, char j, char k, int N>
+template<class B, class U> inline
+const Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0<A,T,N>,T,Dim23,Dim1,i,j,k> &
+Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0<A,T,N>,T,Dim23,Dim1,i,j,k>::
+operator=(const Tensor3_dg_Expr<B,U,Dim23,Dim1,i,j,k> &result)
+{
+  T4ddgrhs0_equals_T3dg(iter,result,Number<Dim23>(),Number<Dim23>(),
+			Number<Dim1>(),Number<N>());
+  return *this;
+}
+
+/* T4ddgrhs0=T4ddgrhs0 */
+
+template<class A, class T, int Dim23, int Dim1, char i, char j, char k, int N>
+inline
+const Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0<A,T,N>,T,Dim23,Dim1,i,j,k> &
+Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0<A,T,N>,T,Dim23,Dim1,i,j,k>::
+operator=(const Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0<A,T,N>,
+	  T,Dim23,Dim1,i,j,k> &result)
+{
+  return operator=<Tensor4_ddg_number_rhs_0<A,T,N>,T>(result);
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_and_Tensor1.h
--- a/Tensor3_dg/Tensor3_dg_and_Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/* Multiply a Tensor1 and a Tensor3_dg together but don't contract, yielding a
-   Tensor3_dg. */
-
-/* A(i,j,k) & B(k) -> Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-class Tensor3_dg_and_Tensor1
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-  const Tensor1_Expr<B,U,Dim2,k> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)*iterB(N3);
-  }
-  
-  Tensor3_dg_and_Tensor1(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-			 const Tensor1_Expr<B,U,Dim2,k> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_dg_Expr<const Tensor3_dg_and_Tensor1<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,Dim2,i,j,k>
-operator&(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-	   const Tensor1_Expr<B,U,Dim2,k> &b)
-{
-  typedef const Tensor3_dg_and_Tensor1<A,B,T,U,Dim01,Dim2,i,j,k> TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
-    (TensorExpr(a,b));
-}
-
-/* B(k) & A(i,j,k) -> Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_dg_Expr<const Tensor3_dg_and_Tensor1<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,Dim2,i,j,k>
-operator&(const Tensor1_Expr<B,U,Dim2,k> &b,
-	   const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
-{
-  typedef const Tensor3_dg_and_Tensor1<A,B,T,U,Dim01,Dim2,i,j,k> TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_and_Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/Tensor3_dg_and_Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,47 @@
+/* Multiply a Tensor1 and a Tensor3_dg together but don't contract, yielding a
+   Tensor3_dg. */
+
+/* A(i,j,k) & B(k) -> Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+class Tensor3_dg_and_Tensor1
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+  const Tensor1_Expr<B,U,Dim2,k> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)*iterB(N3);
+  }
+  
+  Tensor3_dg_and_Tensor1(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+			 const Tensor1_Expr<B,U,Dim2,k> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_dg_Expr<const Tensor3_dg_and_Tensor1<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,Dim2,i,j,k>
+operator&(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+	   const Tensor1_Expr<B,U,Dim2,k> &b)
+{
+  typedef const Tensor3_dg_and_Tensor1<A,B,T,U,Dim01,Dim2,i,j,k> TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
+    (TensorExpr(a,b));
+}
+
+/* B(k) & A(i,j,k) -> Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_dg_Expr<const Tensor3_dg_and_Tensor1<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,Dim2,i,j,k>
+operator&(const Tensor1_Expr<B,U,Dim2,k> &b,
+	   const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
+{
+  typedef const Tensor3_dg_and_Tensor1<A,B,T,U,Dim01,Dim2,i,j,k> TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_and_Tensor2_symmetric.h
--- a/Tensor3_dg/Tensor3_dg_and_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-/* Multiply a Tensor2_symmetric and a Tensor3_dg together but don't
-   contract, yielding a Tensor3_dg. */
-
-/* A(i,j,k) & B(i,j) -> Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-class Tensor3_dg_and_Tensor2_symmetric
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim01,i,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)*iterB(N1,N2);
-  }
-
-  Tensor3_dg_and_Tensor2_symmetric
-  (const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_dg_Expr
-<const Tensor3_dg_and_Tensor2_symmetric<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,Dim2,i,j,k>
-operator&(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b)
-{
-  typedef const Tensor3_dg_and_Tensor2_symmetric<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
-    (TensorExpr(a,b));
-}
-
-/* B(i,j) & A(i,j,k) -> Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_dg_Expr
-<const Tensor3_dg_and_Tensor2_symmetric<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,Dim2,i,j,k>
-operator&(const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
-{
-  typedef const Tensor3_dg_and_Tensor2_symmetric<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_and_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/Tensor3_dg_and_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,51 @@
+/* Multiply a Tensor2_symmetric and a Tensor3_dg together but don't
+   contract, yielding a Tensor3_dg. */
+
+/* A(i,j,k) & B(i,j) -> Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+class Tensor3_dg_and_Tensor2_symmetric
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim01,i,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)*iterB(N1,N2);
+  }
+
+  Tensor3_dg_and_Tensor2_symmetric
+  (const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_dg_Expr
+<const Tensor3_dg_and_Tensor2_symmetric<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,Dim2,i,j,k>
+operator&(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b)
+{
+  typedef const Tensor3_dg_and_Tensor2_symmetric<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
+    (TensorExpr(a,b));
+}
+
+/* B(i,j) & A(i,j,k) -> Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_dg_Expr
+<const Tensor3_dg_and_Tensor2_symmetric<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,Dim2,i,j,k>
+operator&(const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
+{
+  typedef const Tensor3_dg_and_Tensor2_symmetric<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_and_Tensor3_dg.h
--- a/Tensor3_dg/Tensor3_dg_and_Tensor3_dg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-/* Subtracts a Tensor3_dg from a Tensor3_dg, yielding a
-   Tensor3_antisymmetric. */
-
-/* A(i,j,k)-B(i,k,j)->Tensor3_antisymmetric */
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-class Tensor3_dg_and_Tensor3_dg_12
-{
-  const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> iterA;
-  const Tensor3_dg_Expr<B,U,Dim,Dim,i,k,j> iterB;
-public:
-  typename promote<T,U>::V  operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)-iterB(N1,N3,N2);
-  }
-
-  Tensor3_dg_and_Tensor3_dg_12(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
-			       const Tensor3_dg_Expr<B,U,Dim,Dim,i,k,j> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-inline const Tensor3_antisymmetric_Expr
-<const Tensor3_dg_and_Tensor3_dg_12<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,Dim,i,j,k>
-operator&&(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
-	   const Tensor3_dg_Expr<B,U,Dim,Dim,i,k,j> &b)
-{
-  typedef const Tensor3_dg_and_Tensor3_dg_12<A,B,T,U,Dim,i,j,k> TensorExpr;
-  return Tensor3_antisymmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j,k>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)-B(k,j,i)->Tensor3_antisymmetric */
-/* We have to do a little index gymnastics here because a
-   Tensor3_antisymmetric is antisymmetric on the last two indices, not
-   the first and last index. */
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-class Tensor3_dg_and_Tensor3_dg_02
-{
-  const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> iterA;
-  const Tensor3_dg_Expr<B,U,Dim,Dim,k,j,i> iterB;
-public:
-  typename promote<T,U>::V  operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N2,N1,N3)-iterB(N3,N1,N2);
-  }
-
-  Tensor3_dg_and_Tensor3_dg_02(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
-			       const Tensor3_dg_Expr<B,U,Dim,Dim,k,j,i> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-inline const Tensor3_antisymmetric_Expr
-<const Tensor3_dg_and_Tensor3_dg_02<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,Dim,j,i,k>
-operator&&(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
-	   const Tensor3_dg_Expr<B,U,Dim,Dim,k,j,i> &b)
-{
-  typedef const Tensor3_dg_and_Tensor3_dg_02<A,B,T,U,Dim,i,j,k> TensorExpr;
-  return Tensor3_antisymmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,j,i,k>
-    (TensorExpr(a,b));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_and_Tensor3_dg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/Tensor3_dg_and_Tensor3_dg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,66 @@
+/* Subtracts a Tensor3_dg from a Tensor3_dg, yielding a
+   Tensor3_antisymmetric. */
+
+/* A(i,j,k)-B(i,k,j)->Tensor3_antisymmetric */
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+class Tensor3_dg_and_Tensor3_dg_12
+{
+  const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> iterA;
+  const Tensor3_dg_Expr<B,U,Dim,Dim,i,k,j> iterB;
+public:
+  typename promote<T,U>::V  operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)-iterB(N1,N3,N2);
+  }
+
+  Tensor3_dg_and_Tensor3_dg_12(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
+			       const Tensor3_dg_Expr<B,U,Dim,Dim,i,k,j> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+inline const Tensor3_antisymmetric_Expr
+<const Tensor3_dg_and_Tensor3_dg_12<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,Dim,i,j,k>
+operator&&(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
+	   const Tensor3_dg_Expr<B,U,Dim,Dim,i,k,j> &b)
+{
+  typedef const Tensor3_dg_and_Tensor3_dg_12<A,B,T,U,Dim,i,j,k> TensorExpr;
+  return Tensor3_antisymmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j,k>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)-B(k,j,i)->Tensor3_antisymmetric */
+/* We have to do a little index gymnastics here because a
+   Tensor3_antisymmetric is antisymmetric on the last two indices, not
+   the first and last index. */
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+class Tensor3_dg_and_Tensor3_dg_02
+{
+  const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> iterA;
+  const Tensor3_dg_Expr<B,U,Dim,Dim,k,j,i> iterB;
+public:
+  typename promote<T,U>::V  operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N2,N1,N3)-iterB(N3,N1,N2);
+  }
+
+  Tensor3_dg_and_Tensor3_dg_02(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
+			       const Tensor3_dg_Expr<B,U,Dim,Dim,k,j,i> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+inline const Tensor3_antisymmetric_Expr
+<const Tensor3_dg_and_Tensor3_dg_02<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,Dim,j,i,k>
+operator&&(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
+	   const Tensor3_dg_Expr<B,U,Dim,Dim,k,j,i> &b)
+{
+  typedef const Tensor3_dg_and_Tensor3_dg_02<A,B,T,U,Dim,i,j,k> TensorExpr;
+  return Tensor3_antisymmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,j,i,k>
+    (TensorExpr(a,b));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_constructor.h
--- a/Tensor3_dg/Tensor3_dg_constructor.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,164 +0,0 @@
-/* A helper class that allows simple initialization of the Tensor3_dg,
-   but only if it has the correct number of elements. */
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-class Tensor3_dg_constructor;
-
-template<class T>
-class Tensor3_dg_constructor<T,2,2>
-{
-public:
-  Tensor3_dg_constructor(T data[3][2], T d000, T d001, T d010, T d011,
-			 T d110, T d111)
-  {
-    data[0][0]=d000;
-    data[0][1]=d001;
-    data[1][0]=d010;
-    data[1][1]=d011;
-    data[2][0]=d110;
-    data[2][1]=d111;
-  }
-};
-
-template<class T>
-class Tensor3_dg_constructor<T,3,3>
-{
-public:
-  Tensor3_dg_constructor(T data[6][3], T d000, T d001, T d002, T d010, T d011,
-			 T d012, T d020, T d021, T d022, T d110, T d111,
-			 T d112, T d120, T d121, T d122, T d220, T d221,
-			 T d222)
-  {
-    data[0][0]=d000;
-    data[1][0]=d010;
-    data[2][0]=d020;
-    data[3][0]=d110;
-    data[4][0]=d120;
-    data[5][0]=d220;
-
-    data[0][1]=d001;
-    data[1][1]=d011;
-    data[2][1]=d021;
-    data[3][1]=d111;
-    data[4][1]=d121;
-    data[5][1]=d221;
-
-    data[0][2]=d002;
-    data[1][2]=d012;
-    data[2][2]=d022;
-    data[3][2]=d112;
-    data[4][2]=d122;
-    data[5][2]=d222;
-  }
-};
-
-template<class T>
-class Tensor3_dg_constructor<T,4,4>
-{
-public:
-  Tensor3_dg_constructor(T data[10][4], T d000, T d001, T d002, T d003,
-			 T d010, T d011, T d012, T d013,
-			 T d020, T d021, T d022, T d023,
-			 T d030, T d031, T d032, T d033,
-			 T d110, T d111, T d112, T d113,
-			 T d120, T d121, T d122, T d123,
-			 T d130, T d131, T d132, T d133,
-			 T d220, T d221, T d222, T d223,
-			 T d230, T d231, T d232, T d233,
-			 T d330, T d331, T d332, T d333)
-  {
-    data[0][0]=d000;
-    data[1][0]=d010;
-    data[2][0]=d020;
-    data[3][0]=d030;
-    data[4][0]=d110;
-    data[5][0]=d120;
-    data[6][0]=d130;
-    data[7][0]=d220;
-    data[8][0]=d230;
-    data[9][0]=d330;
-
-    data[0][1]=d001;
-    data[1][1]=d011;
-    data[2][1]=d021;
-    data[3][1]=d031;
-    data[4][1]=d111;
-    data[5][1]=d121;
-    data[6][1]=d131;
-    data[7][1]=d221;
-    data[8][1]=d231;
-    data[9][1]=d331;
-
-    data[0][2]=d002;
-    data[1][2]=d012;
-    data[2][2]=d022;
-    data[3][2]=d032;
-    data[4][2]=d112;
-    data[5][2]=d122;
-    data[6][2]=d132;
-    data[7][2]=d222;
-    data[8][2]=d232;
-    data[9][2]=d332;
-
-    data[0][3]=d003;
-    data[1][3]=d013;
-    data[2][3]=d023;
-    data[3][3]=d033;
-    data[4][3]=d113;
-    data[5][3]=d123;
-    data[6][3]=d133;
-    data[7][3]=d223;
-    data[8][3]=d233;
-    data[9][3]=d333;
-  }
-};
-
-template<class T>
-class Tensor3_dg_constructor<T,4,3>
-{
-public:
-  Tensor3_dg_constructor(T data[10][3], T d000, T d001, T d002,
-			 T d010, T d011, T d012,
-			 T d020, T d021, T d022,
-			 T d030, T d031, T d032,
-			 T d110, T d111, T d112,
-			 T d120, T d121, T d122,
-			 T d130, T d131, T d132,
-			 T d220, T d221, T d222,
-			 T d230, T d231, T d232,
-			 T d330, T d331, T d332)
-  {
-    data[0][0]=d000;
-    data[1][0]=d010;
-    data[2][0]=d020;
-    data[3][0]=d030;
-    data[4][0]=d110;
-    data[5][0]=d120;
-    data[6][0]=d130;
-    data[7][0]=d220;
-    data[8][0]=d230;
-    data[9][0]=d330;
-
-    data[0][1]=d001;
-    data[1][1]=d011;
-    data[2][1]=d021;
-    data[3][1]=d031;
-    data[4][1]=d111;
-    data[5][1]=d121;
-    data[6][1]=d131;
-    data[7][1]=d221;
-    data[8][1]=d231;
-    data[9][1]=d331;
-
-    data[0][2]=d002;
-    data[1][2]=d012;
-    data[2][2]=d022;
-    data[3][2]=d032;
-    data[4][2]=d112;
-    data[5][2]=d122;
-    data[6][2]=d132;
-    data[7][2]=d222;
-    data[8][2]=d232;
-    data[9][2]=d332;
-  }
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_constructor.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/Tensor3_dg_constructor.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,164 @@
+/* A helper class that allows simple initialization of the Tensor3_dg,
+   but only if it has the correct number of elements. */
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+class Tensor3_dg_constructor;
+
+template<class T>
+class Tensor3_dg_constructor<T,2,2>
+{
+public:
+  Tensor3_dg_constructor(T data[3][2], T d000, T d001, T d010, T d011,
+			 T d110, T d111)
+  {
+    data[0][0]=d000;
+    data[0][1]=d001;
+    data[1][0]=d010;
+    data[1][1]=d011;
+    data[2][0]=d110;
+    data[2][1]=d111;
+  }
+};
+
+template<class T>
+class Tensor3_dg_constructor<T,3,3>
+{
+public:
+  Tensor3_dg_constructor(T data[6][3], T d000, T d001, T d002, T d010, T d011,
+			 T d012, T d020, T d021, T d022, T d110, T d111,
+			 T d112, T d120, T d121, T d122, T d220, T d221,
+			 T d222)
+  {
+    data[0][0]=d000;
+    data[1][0]=d010;
+    data[2][0]=d020;
+    data[3][0]=d110;
+    data[4][0]=d120;
+    data[5][0]=d220;
+
+    data[0][1]=d001;
+    data[1][1]=d011;
+    data[2][1]=d021;
+    data[3][1]=d111;
+    data[4][1]=d121;
+    data[5][1]=d221;
+
+    data[0][2]=d002;
+    data[1][2]=d012;
+    data[2][2]=d022;
+    data[3][2]=d112;
+    data[4][2]=d122;
+    data[5][2]=d222;
+  }
+};
+
+template<class T>
+class Tensor3_dg_constructor<T,4,4>
+{
+public:
+  Tensor3_dg_constructor(T data[10][4], T d000, T d001, T d002, T d003,
+			 T d010, T d011, T d012, T d013,
+			 T d020, T d021, T d022, T d023,
+			 T d030, T d031, T d032, T d033,
+			 T d110, T d111, T d112, T d113,
+			 T d120, T d121, T d122, T d123,
+			 T d130, T d131, T d132, T d133,
+			 T d220, T d221, T d222, T d223,
+			 T d230, T d231, T d232, T d233,
+			 T d330, T d331, T d332, T d333)
+  {
+    data[0][0]=d000;
+    data[1][0]=d010;
+    data[2][0]=d020;
+    data[3][0]=d030;
+    data[4][0]=d110;
+    data[5][0]=d120;
+    data[6][0]=d130;
+    data[7][0]=d220;
+    data[8][0]=d230;
+    data[9][0]=d330;
+
+    data[0][1]=d001;
+    data[1][1]=d011;
+    data[2][1]=d021;
+    data[3][1]=d031;
+    data[4][1]=d111;
+    data[5][1]=d121;
+    data[6][1]=d131;
+    data[7][1]=d221;
+    data[8][1]=d231;
+    data[9][1]=d331;
+
+    data[0][2]=d002;
+    data[1][2]=d012;
+    data[2][2]=d022;
+    data[3][2]=d032;
+    data[4][2]=d112;
+    data[5][2]=d122;
+    data[6][2]=d132;
+    data[7][2]=d222;
+    data[8][2]=d232;
+    data[9][2]=d332;
+
+    data[0][3]=d003;
+    data[1][3]=d013;
+    data[2][3]=d023;
+    data[3][3]=d033;
+    data[4][3]=d113;
+    data[5][3]=d123;
+    data[6][3]=d133;
+    data[7][3]=d223;
+    data[8][3]=d233;
+    data[9][3]=d333;
+  }
+};
+
+template<class T>
+class Tensor3_dg_constructor<T,4,3>
+{
+public:
+  Tensor3_dg_constructor(T data[10][3], T d000, T d001, T d002,
+			 T d010, T d011, T d012,
+			 T d020, T d021, T d022,
+			 T d030, T d031, T d032,
+			 T d110, T d111, T d112,
+			 T d120, T d121, T d122,
+			 T d130, T d131, T d132,
+			 T d220, T d221, T d222,
+			 T d230, T d231, T d232,
+			 T d330, T d331, T d332)
+  {
+    data[0][0]=d000;
+    data[1][0]=d010;
+    data[2][0]=d020;
+    data[3][0]=d030;
+    data[4][0]=d110;
+    data[5][0]=d120;
+    data[6][0]=d130;
+    data[7][0]=d220;
+    data[8][0]=d230;
+    data[9][0]=d330;
+
+    data[0][1]=d001;
+    data[1][1]=d011;
+    data[2][1]=d021;
+    data[3][1]=d031;
+    data[4][1]=d111;
+    data[5][1]=d121;
+    data[6][1]=d131;
+    data[7][1]=d221;
+    data[8][1]=d231;
+    data[9][1]=d331;
+
+    data[0][2]=d002;
+    data[1][2]=d012;
+    data[2][2]=d022;
+    data[3][2]=d032;
+    data[4][2]=d112;
+    data[5][2]=d122;
+    data[6][2]=d132;
+    data[7][2]=d222;
+    data[8][2]=d232;
+    data[9][2]=d332;
+  }
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_divide_generic.h
--- a/Tensor3_dg/Tensor3_dg_divide_generic.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-/* Divides a Tensor3_dg by a generic, yielding a Tensor3_dg. */
-
-template<class A, class T, class U, int Dim01, int Dim2, char i, char j,char k>
-class Tensor3_dg_divide_generic
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-  const U d;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)/d;
-  }
-
-  Tensor3_dg_divide_generic(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-			   const U &d0): iterA(a), d(d0) {}
-};
-
-/* A(i,j,k)/d0->Tensor3_dg */
-
-template<class A, class T, class U, int Dim01, int Dim2, char i, char j,char k>
-inline const Tensor3_dg_Expr<const Tensor3_dg_divide_generic<A,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,Dim2,i,j,k>
-operator/(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a, const U &d0)
-{
-  typedef const Tensor3_dg_divide_generic<A,T,U,Dim01,Dim2,i,j,k> TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
-    (TensorExpr(a,d0));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_divide_generic.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/Tensor3_dg_divide_generic.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,28 @@
+/* Divides a Tensor3_dg by a generic, yielding a Tensor3_dg. */
+
+template<class A, class T, class U, int Dim01, int Dim2, char i, char j,char k>
+class Tensor3_dg_divide_generic
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+  const U d;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)/d;
+  }
+
+  Tensor3_dg_divide_generic(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+			   const U &d0): iterA(a), d(d0) {}
+};
+
+/* A(i,j,k)/d0->Tensor3_dg */
+
+template<class A, class T, class U, int Dim01, int Dim2, char i, char j,char k>
+inline const Tensor3_dg_Expr<const Tensor3_dg_divide_generic<A,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,Dim2,i,j,k>
+operator/(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a, const U &d0)
+{
+  typedef const Tensor3_dg_divide_generic<A,T,U,Dim01,Dim2,i,j,k> TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
+    (TensorExpr(a,d0));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_function_operator.h
--- a/Tensor3_dg/Tensor3_dg_function_operator.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,330 +0,0 @@
-/* This contains the definitions of the almost all of the indexing
-   operators for Tensor3_dg. */
-
-/* These operator()'s are the first part in constructing template
-   expressions. */
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, char j, char k, int Dim01, int Dim2>
-inline Tensor3_dg_Expr<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-  T,Dim01,Dim2,i,j,k>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()
-  (const Index<i,Dim01> index1, const Index<j,Dim01> index2,
-   const Index<k,Dim2> index3)
-{
-  return Tensor3_dg_Expr<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-    T,Dim01,Dim2,i,j,k>(*this);
-}
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, char j, char k, int Dim01, int Dim2>
-inline Tensor3_dg_Expr<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-  T,Dim01,Dim2,i,j,k>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()
-  (const Index<i,Dim01> index1, const Index<j,Dim01> index2,
-   const Index<k,Dim2> index3) const
-{
-  return Tensor3_dg_Expr<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-    T,Dim01,Dim2,i,j,k> (*this);
-}
-
-/* These operators are for internal contractions. */
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, char j, int Dim, int Dim12>
-inline Tensor1_Expr<const Tensor3_contracted_12
-<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,Dim12,i>,T,Dim,i>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()
-  (const Index<i,Dim> index1, const Index<j,Dim12> index2,
-   const Index<j,Dim12> index3) const
-{
-  typedef const Tensor3_contracted_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-    T,Dim12,i> TensorExpr;
-  return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-}
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, char j, int Dim, int Dim02>
-inline Tensor1_Expr<const Tensor3_contracted_02
-<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,Dim02,i>,T,Dim,i>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()
-  (const Index<j,Dim02> index1, const Index<i,Dim> index2,
-   const Index<j,Dim02> index3) const
-{
-  typedef const Tensor3_contracted_02<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-    T,Dim02,i> TensorExpr;
-  return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-}
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, char j, int Dim, int Dim01>
-inline Tensor1_Expr<const Tensor3_contracted_01
-<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,Dim01,i>,T,Dim,i>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()
-  (const Index<j,Dim01> index1, const Index<j,Dim01> index2,
-   const Index<i,Dim> index3) const
-{
-  typedef const Tensor3_contracted_01<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-    T,Dim01,i> TensorExpr;
-  return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-}
-
-/* This is for expressions where a number is used for one slot, and
-   indices for the others, yielding a Tensor2_Expr or
-   Tensor2_symmetric_Expr.  The non-const versions don't actually
-   create a Tensor3_dg_number_rhs_* object, while the const versions
-   do create a Tensor3_dg_number_*. */
-
-/* First slot. */
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, char j, int N, int Dim0, int Dim1>
-Tensor2_Expr<Tensor3_dg_number_rhs_0<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N>,
-  T,Dim0,Dim1,i,j>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Number<N> n1,
-				     const Index<i,Dim0> index1,
-				     const Index<j,Dim1> index2)
-{
-  typedef Tensor3_dg_number_rhs_0<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
-  return Tensor2_Expr<TensorExpr,T,Dim0,Dim1,i,j>(*this);
-}
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, char j, int N, int Dim0, int Dim1>
-const Tensor2_Expr<const Tensor3_dg_number_0<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N>,
-  T,Dim0,Dim1,i,j>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Number<N> n1,
-				     const Index<i,Dim0> index1,
-				     const Index<j,Dim1> index2) const
-{
-  typedef const Tensor3_dg_number_0<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
-  return Tensor2_Expr<TensorExpr,T,Dim0,Dim1,i,j>(TensorExpr(*this));
-}
-
-/* Second slot. */
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, char j, int N, int Dim0, int Dim1>
-Tensor2_Expr<Tensor3_dg_number_rhs_0<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N>,
-  T,Dim0,Dim1,i,j>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Index<i,Dim0> index1,
-				     const Number<N> n1,
-				     const Index<j,Dim1> index2)
-{
-  typedef Tensor3_dg_number_rhs_0<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
-  return Tensor2_Expr<TensorExpr,T,Dim0,Dim1,i,j>(*this);
-}
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, char j, int N, int Dim0, int Dim1>
-const Tensor2_Expr<const Tensor3_dg_number_0<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N>,
-  T,Dim0,Dim1,i,j>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Index<i,Dim0> index1,
-				     const Number<N> n1,
-				     const Index<j,Dim1> index2) const
-{
-  typedef const Tensor3_dg_number_0<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
-  return Tensor2_Expr<TensorExpr,T,Dim0,Dim1,i,j>(TensorExpr(*this));
-}
-
-/* Third slot. */
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, char j, int N, int Dim>
-inline Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N>,
-  T,Dim,i,j>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Index<i,Dim> index1,
-				     const Index<j,Dim> index2,
-				     const Number<N> n1)
-{
-  typedef Tensor3_dg_number_rhs_2<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(*this);
-}
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, char j, int N, int Dim>
-const Tensor2_symmetric_Expr<const Tensor3_dg_number_2
-<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim,i,j>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Index<i,Dim> index1,
-				     const Index<j,Dim> index2,
-				     const Number<N> n1) const
-{
-  typedef const Tensor3_dg_number_2<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(TensorExpr(*this));
-}
-
-/* This is for expressions where a number is used for two slots, and
-   an Index for the other, yielding a Tensor1_Expr.  The non-const
-   versions don't actually create a Tensor3_dg_number_rhs_* object,
-   while the const versions do create a Tensor3_dg_number_*. */
-
-/* Index in first slot. */
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, int N1, int N2, int Dim>
-Tensor1_Expr<Tensor3_dg_number_rhs_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Index<i,Dim> index,
-				     const Number<N1> n1,
-				     const Number<N2> n2)
-{
-  typedef Tensor3_dg_number_rhs_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2> TensorExpr;
-  return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
-}
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, int N1, int N2, int Dim>
-const Tensor1_Expr<const Tensor3_dg_number_12<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-  T,N1,N2>,T,Dim,i>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Index<i,Dim> index,
-				     const Number<N1> n1,
-				     const Number<N2> n2) const
-{
-  typedef const Tensor3_dg_number_12<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-}
-
-/* Index in second slot.  I use the same structures as for the Index
-   in the first slot since the tensor is symmetric on the first two
-   indices. */
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, int N1, int N2, int Dim>
-Tensor1_Expr<Tensor3_dg_number_rhs_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Number<N1> n1,
-				     const Index<i,Dim> index,
-				     const Number<N2> n2)
-{
-  typedef Tensor3_dg_number_rhs_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2> TensorExpr;
-  return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
-}
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, int N1, int N2, int Dim>
-const Tensor1_Expr<const Tensor3_dg_number_12<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-  T,N1,N2>,T,Dim,i>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Number<N1> n1,
-				     const Index<i,Dim> index,
-				     const Number<N2> n2) const
-{
-  typedef const Tensor3_dg_number_12<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-}
-
-/* Index in third slot. */
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, int N1, int N2, int Dim>
-Tensor1_Expr<Tensor3_dg_number_rhs_01<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Number<N1> n1, const Number<N2> n2,
-				     const Index<i,Dim> index)
-{
-  typedef Tensor3_dg_number_rhs_01<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2> TensorExpr;
-  return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
-}
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, int N1, int N2, int Dim>
-const Tensor1_Expr<const Tensor3_dg_number_01<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-  T,N1,N2>,T,Dim,i>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Number<N1> n1, const Number<N2> n2,
-				     const Index<i,Dim> index) const
-{
-  typedef const Tensor3_dg_number_01<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-}
-
-/* Specializations for using actual numbers instead of Number<>.
-   This is for expressions where an actual number is used for one
-   slot, and indices for the others, yielding a Tensor2_Expr or
-   Tensor2_symmetric_Expr. I only define the const versions. */
-
-/* First slot. */
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, char j, int Dim0, int Dim1>
-const Tensor2_Expr<const Tensor3_dg_numeral_0<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T>,
-  T,Dim0,Dim1,i,j>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const int N, const Index<i,Dim0> index1,
-				     const Index<j,Dim1> index2) const
-{
-  typedef const Tensor3_dg_numeral_0<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
-  return Tensor2_Expr<TensorExpr,T,Dim0,Dim1,i,j>(TensorExpr(*this,N));
-}
-
-/* Second slot. */
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, char j, int Dim0, int Dim1>
-const Tensor2_Expr<const Tensor3_dg_numeral_0<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T>,
-  T,Dim0,Dim1,i,j>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Index<i,Dim0> index1, const int N,
-				     const Index<j,Dim1> index2) const
-{
-  typedef const Tensor3_dg_numeral_0<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
-  return Tensor2_Expr<TensorExpr,T,Dim0,Dim1,i,j>(TensorExpr(*this,N));
-}
-
-/* Third slot. */
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, char j, int Dim>
-const Tensor2_symmetric_Expr<const Tensor3_dg_numeral_2
-<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim,i,j>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Index<i,Dim> index1,
-				     const Index<j,Dim> index2,
-				     const int N) const
-{
-  typedef const Tensor3_dg_numeral_2<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(TensorExpr(*this,N));
-}
-
-/* This is for expressions where an actual number is used for two
-   slots, and an Index for the other, yielding a Tensor1_Expr. I
-   only define the const versions. */
-
-/* Index in first slot. */
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, int Dim>
-const Tensor1_Expr<const Tensor3_dg_numeral_12<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-  T>,T,Dim,i>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Index<i,Dim> index, const int N1,
-				     const int N2) const
-{
-  typedef const Tensor3_dg_numeral_12<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2));
-}
-
-/* Index in second slot.  I use the same structures as for the Index
-   in the first slot since the tensor is symmetric on the first two
-   indices. */
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, int Dim>
-const Tensor1_Expr<const Tensor3_dg_numeral_12<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-  T>,T,Dim,i>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const int N1, const Index<i,Dim> index,
-				     const int N2) const
-{
-  typedef const Tensor3_dg_numeral_12<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2));
-}
-
-/* Index in third slot. */
-
-template<class T, int Tensor_Dim01, int Tensor_Dim2>
-template<char i, int Dim>
-const Tensor1_Expr<const Tensor3_dg_numeral_01<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-  T>,T,Dim,i>
-Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const int N1, const int N2,
-				     const Index<i,Dim> index) const
-{
-  typedef const Tensor3_dg_numeral_01<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_function_operator.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/Tensor3_dg_function_operator.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,330 @@
+/* This contains the definitions of the almost all of the indexing
+   operators for Tensor3_dg. */
+
+/* These operator()'s are the first part in constructing template
+   expressions. */
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, char j, char k, int Dim01, int Dim2>
+inline Tensor3_dg_Expr<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+  T,Dim01,Dim2,i,j,k>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()
+  (const Index<i,Dim01> index1, const Index<j,Dim01> index2,
+   const Index<k,Dim2> index3)
+{
+  return Tensor3_dg_Expr<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+    T,Dim01,Dim2,i,j,k>(*this);
+}
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, char j, char k, int Dim01, int Dim2>
+inline Tensor3_dg_Expr<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+  T,Dim01,Dim2,i,j,k>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()
+  (const Index<i,Dim01> index1, const Index<j,Dim01> index2,
+   const Index<k,Dim2> index3) const
+{
+  return Tensor3_dg_Expr<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+    T,Dim01,Dim2,i,j,k> (*this);
+}
+
+/* These operators are for internal contractions. */
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, char j, int Dim, int Dim12>
+inline Tensor1_Expr<const Tensor3_contracted_12
+<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,Dim12,i>,T,Dim,i>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()
+  (const Index<i,Dim> index1, const Index<j,Dim12> index2,
+   const Index<j,Dim12> index3) const
+{
+  typedef const Tensor3_contracted_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+    T,Dim12,i> TensorExpr;
+  return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+}
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, char j, int Dim, int Dim02>
+inline Tensor1_Expr<const Tensor3_contracted_02
+<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,Dim02,i>,T,Dim,i>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()
+  (const Index<j,Dim02> index1, const Index<i,Dim> index2,
+   const Index<j,Dim02> index3) const
+{
+  typedef const Tensor3_contracted_02<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+    T,Dim02,i> TensorExpr;
+  return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+}
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, char j, int Dim, int Dim01>
+inline Tensor1_Expr<const Tensor3_contracted_01
+<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,Dim01,i>,T,Dim,i>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()
+  (const Index<j,Dim01> index1, const Index<j,Dim01> index2,
+   const Index<i,Dim> index3) const
+{
+  typedef const Tensor3_contracted_01<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+    T,Dim01,i> TensorExpr;
+  return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+}
+
+/* This is for expressions where a number is used for one slot, and
+   indices for the others, yielding a Tensor2_Expr or
+   Tensor2_symmetric_Expr.  The non-const versions don't actually
+   create a Tensor3_dg_number_rhs_* object, while the const versions
+   do create a Tensor3_dg_number_*. */
+
+/* First slot. */
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, char j, int N, int Dim0, int Dim1>
+Tensor2_Expr<Tensor3_dg_number_rhs_0<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N>,
+  T,Dim0,Dim1,i,j>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Number<N> n1,
+				     const Index<i,Dim0> index1,
+				     const Index<j,Dim1> index2)
+{
+  typedef Tensor3_dg_number_rhs_0<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
+  return Tensor2_Expr<TensorExpr,T,Dim0,Dim1,i,j>(*this);
+}
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, char j, int N, int Dim0, int Dim1>
+const Tensor2_Expr<const Tensor3_dg_number_0<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N>,
+  T,Dim0,Dim1,i,j>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Number<N> n1,
+				     const Index<i,Dim0> index1,
+				     const Index<j,Dim1> index2) const
+{
+  typedef const Tensor3_dg_number_0<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
+  return Tensor2_Expr<TensorExpr,T,Dim0,Dim1,i,j>(TensorExpr(*this));
+}
+
+/* Second slot. */
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, char j, int N, int Dim0, int Dim1>
+Tensor2_Expr<Tensor3_dg_number_rhs_0<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N>,
+  T,Dim0,Dim1,i,j>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Index<i,Dim0> index1,
+				     const Number<N> n1,
+				     const Index<j,Dim1> index2)
+{
+  typedef Tensor3_dg_number_rhs_0<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
+  return Tensor2_Expr<TensorExpr,T,Dim0,Dim1,i,j>(*this);
+}
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, char j, int N, int Dim0, int Dim1>
+const Tensor2_Expr<const Tensor3_dg_number_0<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N>,
+  T,Dim0,Dim1,i,j>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Index<i,Dim0> index1,
+				     const Number<N> n1,
+				     const Index<j,Dim1> index2) const
+{
+  typedef const Tensor3_dg_number_0<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
+  return Tensor2_Expr<TensorExpr,T,Dim0,Dim1,i,j>(TensorExpr(*this));
+}
+
+/* Third slot. */
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, char j, int N, int Dim>
+inline Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N>,
+  T,Dim,i,j>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Index<i,Dim> index1,
+				     const Index<j,Dim> index2,
+				     const Number<N> n1)
+{
+  typedef Tensor3_dg_number_rhs_2<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(*this);
+}
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, char j, int N, int Dim>
+const Tensor2_symmetric_Expr<const Tensor3_dg_number_2
+<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim,i,j>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Index<i,Dim> index1,
+				     const Index<j,Dim> index2,
+				     const Number<N> n1) const
+{
+  typedef const Tensor3_dg_number_2<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(TensorExpr(*this));
+}
+
+/* This is for expressions where a number is used for two slots, and
+   an Index for the other, yielding a Tensor1_Expr.  The non-const
+   versions don't actually create a Tensor3_dg_number_rhs_* object,
+   while the const versions do create a Tensor3_dg_number_*. */
+
+/* Index in first slot. */
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, int N1, int N2, int Dim>
+Tensor1_Expr<Tensor3_dg_number_rhs_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Index<i,Dim> index,
+				     const Number<N1> n1,
+				     const Number<N2> n2)
+{
+  typedef Tensor3_dg_number_rhs_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2> TensorExpr;
+  return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
+}
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, int N1, int N2, int Dim>
+const Tensor1_Expr<const Tensor3_dg_number_12<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+  T,N1,N2>,T,Dim,i>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Index<i,Dim> index,
+				     const Number<N1> n1,
+				     const Number<N2> n2) const
+{
+  typedef const Tensor3_dg_number_12<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+}
+
+/* Index in second slot.  I use the same structures as for the Index
+   in the first slot since the tensor is symmetric on the first two
+   indices. */
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, int N1, int N2, int Dim>
+Tensor1_Expr<Tensor3_dg_number_rhs_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Number<N1> n1,
+				     const Index<i,Dim> index,
+				     const Number<N2> n2)
+{
+  typedef Tensor3_dg_number_rhs_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2> TensorExpr;
+  return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
+}
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, int N1, int N2, int Dim>
+const Tensor1_Expr<const Tensor3_dg_number_12<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+  T,N1,N2>,T,Dim,i>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Number<N1> n1,
+				     const Index<i,Dim> index,
+				     const Number<N2> n2) const
+{
+  typedef const Tensor3_dg_number_12<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+}
+
+/* Index in third slot. */
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, int N1, int N2, int Dim>
+Tensor1_Expr<Tensor3_dg_number_rhs_01<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Number<N1> n1, const Number<N2> n2,
+				     const Index<i,Dim> index)
+{
+  typedef Tensor3_dg_number_rhs_01<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2> TensorExpr;
+  return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
+}
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, int N1, int N2, int Dim>
+const Tensor1_Expr<const Tensor3_dg_number_01<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+  T,N1,N2>,T,Dim,i>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Number<N1> n1, const Number<N2> n2,
+				     const Index<i,Dim> index) const
+{
+  typedef const Tensor3_dg_number_01<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+}
+
+/* Specializations for using actual numbers instead of Number<>.
+   This is for expressions where an actual number is used for one
+   slot, and indices for the others, yielding a Tensor2_Expr or
+   Tensor2_symmetric_Expr. I only define the const versions. */
+
+/* First slot. */
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, char j, int Dim0, int Dim1>
+const Tensor2_Expr<const Tensor3_dg_numeral_0<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T>,
+  T,Dim0,Dim1,i,j>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const int N, const Index<i,Dim0> index1,
+				     const Index<j,Dim1> index2) const
+{
+  typedef const Tensor3_dg_numeral_0<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
+  return Tensor2_Expr<TensorExpr,T,Dim0,Dim1,i,j>(TensorExpr(*this,N));
+}
+
+/* Second slot. */
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, char j, int Dim0, int Dim1>
+const Tensor2_Expr<const Tensor3_dg_numeral_0<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T>,
+  T,Dim0,Dim1,i,j>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Index<i,Dim0> index1, const int N,
+				     const Index<j,Dim1> index2) const
+{
+  typedef const Tensor3_dg_numeral_0<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
+  return Tensor2_Expr<TensorExpr,T,Dim0,Dim1,i,j>(TensorExpr(*this,N));
+}
+
+/* Third slot. */
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, char j, int Dim>
+const Tensor2_symmetric_Expr<const Tensor3_dg_numeral_2
+<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim,i,j>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Index<i,Dim> index1,
+				     const Index<j,Dim> index2,
+				     const int N) const
+{
+  typedef const Tensor3_dg_numeral_2<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(TensorExpr(*this,N));
+}
+
+/* This is for expressions where an actual number is used for two
+   slots, and an Index for the other, yielding a Tensor1_Expr. I
+   only define the const versions. */
+
+/* Index in first slot. */
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, int Dim>
+const Tensor1_Expr<const Tensor3_dg_numeral_12<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+  T>,T,Dim,i>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const Index<i,Dim> index, const int N1,
+				     const int N2) const
+{
+  typedef const Tensor3_dg_numeral_12<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2));
+}
+
+/* Index in second slot.  I use the same structures as for the Index
+   in the first slot since the tensor is symmetric on the first two
+   indices. */
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, int Dim>
+const Tensor1_Expr<const Tensor3_dg_numeral_12<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+  T>,T,Dim,i>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const int N1, const Index<i,Dim> index,
+				     const int N2) const
+{
+  typedef const Tensor3_dg_numeral_12<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2));
+}
+
+/* Index in third slot. */
+
+template<class T, int Tensor_Dim01, int Tensor_Dim2>
+template<char i, int Dim>
+const Tensor1_Expr<const Tensor3_dg_numeral_01<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+  T>,T,Dim,i>
+Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>::operator()(const int N1, const int N2,
+				     const Index<i,Dim> index) const
+{
+  typedef const Tensor3_dg_numeral_01<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_minus_Tensor3_dg.h
--- a/Tensor3_dg/Tensor3_dg_minus_Tensor3_dg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-/* Subtracts a Tensor3_dg from a Tensor3_dg, yielding a Tensor3_dg or
-   Tensor3. */
-
-/* A(i,j,k)-B(i,j,k)->Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-class Tensor3_dg_minus_Tensor3_dg
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-  const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)-iterB(N1,N2,N3);
-  }
-
-  Tensor3_dg_minus_Tensor3_dg(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a, const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_dg_Expr<const Tensor3_dg_minus_Tensor3_dg
-<A,B,T,U,Dim01,Dim2,i,j,k>,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
-operator-(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-	  const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> &b)
-{
-  typedef const Tensor3_dg_minus_Tensor3_dg<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)-B(k,j,i)->Tensor3 */
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-class Tensor3_dg_minus_Tensor3_dg_02
-{
-  const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> iterA;
-  const Tensor3_dg_Expr<B,U,Dim,Dim,k,j,i> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)-iterB(N3,N2,N1);
-  }
-
-  Tensor3_dg_minus_Tensor3_dg_02(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
-				const Tensor3_dg_Expr<B,U,Dim,Dim,k,j,i> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-inline const Tensor3_Expr<const Tensor3_dg_minus_Tensor3_dg_02<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,Dim,Dim,i,j,k>
-operator-(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
-	  const Tensor3_dg_Expr<B,U,Dim,Dim,k,j,i> &b)
-{
-  typedef const Tensor3_dg_minus_Tensor3_dg_02<A,B,T,U,Dim,i,j,k> TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,Dim,i,j,k>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_minus_Tensor3_dg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/Tensor3_dg_minus_Tensor3_dg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,62 @@
+/* Subtracts a Tensor3_dg from a Tensor3_dg, yielding a Tensor3_dg or
+   Tensor3. */
+
+/* A(i,j,k)-B(i,j,k)->Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+class Tensor3_dg_minus_Tensor3_dg
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+  const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)-iterB(N1,N2,N3);
+  }
+
+  Tensor3_dg_minus_Tensor3_dg(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a, const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_dg_Expr<const Tensor3_dg_minus_Tensor3_dg
+<A,B,T,U,Dim01,Dim2,i,j,k>,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
+operator-(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+	  const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> &b)
+{
+  typedef const Tensor3_dg_minus_Tensor3_dg<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)-B(k,j,i)->Tensor3 */
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+class Tensor3_dg_minus_Tensor3_dg_02
+{
+  const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> iterA;
+  const Tensor3_dg_Expr<B,U,Dim,Dim,k,j,i> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)-iterB(N3,N2,N1);
+  }
+
+  Tensor3_dg_minus_Tensor3_dg_02(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
+				const Tensor3_dg_Expr<B,U,Dim,Dim,k,j,i> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+inline const Tensor3_Expr<const Tensor3_dg_minus_Tensor3_dg_02<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,Dim,Dim,i,j,k>
+operator-(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
+	  const Tensor3_dg_Expr<B,U,Dim,Dim,k,j,i> &b)
+{
+  typedef const Tensor3_dg_minus_Tensor3_dg_02<A,B,T,U,Dim,i,j,k> TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,Dim,i,j,k>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_number.h
--- a/Tensor3_dg/Tensor3_dg_number.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-/* This is for expressions where a number is used for one or two
-   slots, and an index for the others, yielding a Tensor1_Expr,
-   Tensor2_Expr, or Tensor2_symmetric_Expr. */
-
-/* First or second slot. */
-
-template<class A, class T, int N>
-class Tensor3_dg_number_0
-{
-  A iterA;
-public:
-  T operator()(const int N1, const int N2) const
-  {
-    return iterA(N,N1,N2);
-  }
-  Tensor3_dg_number_0(const A &a): iterA(a) {}
-};
-
-template<class A, class T, int N>
-class Tensor3_dg_number_rhs_0
-{};
-
-/* Third slot. */
-
-template<class A, class T, int N>
-class Tensor3_dg_number_2
-{
-  A iterA;
-public:
-  T operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2,N);
-  }
-  Tensor3_dg_number_2(const A &a): iterA(a) {}
-};
-
-template<class A, class T, int N>
-class Tensor3_dg_number_rhs_2
-{};
-
-/* Second and third slot (or first and third slot). */
-
-template<class A, class T, int N1, int N2>
-class Tensor3_dg_number_12
-{
-  A iterA;
-public:
-  T operator()(const int N) const
-  {
-    return iterA(N,N1,N2);
-  }
-  Tensor3_dg_number_12(const A &a):iterA(a) {}
-};
-
-template<class A, class T, int N1, int N2>
-class Tensor3_dg_number_rhs_12 {};
-
-
-/* First and second slot. */
-
-template<class A, class T, int N1, int N2>
-class Tensor3_dg_number_01
-{
-  A iterA;
-public:
-  T operator()(const int N) const
-  {
-    return iterA(N1,N2,N);
-  }
-  Tensor3_dg_number_01(const A &a):iterA(a) {}
-};
-
-template<class A, class T, int N1, int N2>
-class Tensor3_dg_number_rhs_01 {};
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_number.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/Tensor3_dg_number.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,74 @@
+/* This is for expressions where a number is used for one or two
+   slots, and an index for the others, yielding a Tensor1_Expr,
+   Tensor2_Expr, or Tensor2_symmetric_Expr. */
+
+/* First or second slot. */
+
+template<class A, class T, int N>
+class Tensor3_dg_number_0
+{
+  A iterA;
+public:
+  T operator()(const int N1, const int N2) const
+  {
+    return iterA(N,N1,N2);
+  }
+  Tensor3_dg_number_0(const A &a): iterA(a) {}
+};
+
+template<class A, class T, int N>
+class Tensor3_dg_number_rhs_0
+{};
+
+/* Third slot. */
+
+template<class A, class T, int N>
+class Tensor3_dg_number_2
+{
+  A iterA;
+public:
+  T operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2,N);
+  }
+  Tensor3_dg_number_2(const A &a): iterA(a) {}
+};
+
+template<class A, class T, int N>
+class Tensor3_dg_number_rhs_2
+{};
+
+/* Second and third slot (or first and third slot). */
+
+template<class A, class T, int N1, int N2>
+class Tensor3_dg_number_12
+{
+  A iterA;
+public:
+  T operator()(const int N) const
+  {
+    return iterA(N,N1,N2);
+  }
+  Tensor3_dg_number_12(const A &a):iterA(a) {}
+};
+
+template<class A, class T, int N1, int N2>
+class Tensor3_dg_number_rhs_12 {};
+
+
+/* First and second slot. */
+
+template<class A, class T, int N1, int N2>
+class Tensor3_dg_number_01
+{
+  A iterA;
+public:
+  T operator()(const int N) const
+  {
+    return iterA(N1,N2,N);
+  }
+  Tensor3_dg_number_01(const A &a):iterA(a) {}
+};
+
+template<class A, class T, int N1, int N2>
+class Tensor3_dg_number_rhs_01 {};
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_numeral.h
--- a/Tensor3_dg/Tensor3_dg_numeral.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-/* This is for expressions where a number is used for one or two
-   slots, and an index for the others, yielding a Tensor1_Expr,
-   Tensor2_Expr, or Tensor2_symmetric_Expr. */
-
-/* First or second slot. */
-
-template<class A, class T>
-class Tensor3_dg_numeral_0
-{
-  A iterA;
-  const int N;
-public:
-  T operator()(const int N1, const int N2) const
-  {
-    return iterA(N,N1,N2);
-  }
-  Tensor3_dg_numeral_0(const A &a, const int NN): iterA(a), N(NN) {}
-};
-
-/* Third slot. */
-
-template<class A, class T>
-class Tensor3_dg_numeral_2
-{
-  A iterA;
-  const int N;
-public:
-  T operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2,N);
-  }
-  Tensor3_dg_numeral_2(const A &a, const int NN): iterA(a), N(NN) {}
-};
-
-/* Second and third slot (or first and third slot). */
-
-template<class A, class T>
-class Tensor3_dg_numeral_12
-{
-  A iterA;
-  const int N1,N2;
-public:
-  T operator()(const int N) const
-  {
-    return iterA(N,N1,N2);
-  }
-  Tensor3_dg_numeral_12(const A &a, const int NN1, const int NN2)
-    :iterA(a), N1(NN1), N2(NN2) {}
-};
-
-/* First and second slot. */
-
-template<class A, class T>
-class Tensor3_dg_numeral_01
-{
-  A iterA;
-  const int N1,N2;
-public:
-  T operator()(const int N) const
-  {
-    return iterA(N1,N2,N);
-  }
-  Tensor3_dg_numeral_01(const A &a, const int NN1, const int NN2)
-    :iterA(a), N1(NN1), N2(NN2) {}
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_numeral.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/Tensor3_dg_numeral.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,65 @@
+/* This is for expressions where a number is used for one or two
+   slots, and an index for the others, yielding a Tensor1_Expr,
+   Tensor2_Expr, or Tensor2_symmetric_Expr. */
+
+/* First or second slot. */
+
+template<class A, class T>
+class Tensor3_dg_numeral_0
+{
+  A iterA;
+  const int N;
+public:
+  T operator()(const int N1, const int N2) const
+  {
+    return iterA(N,N1,N2);
+  }
+  Tensor3_dg_numeral_0(const A &a, const int NN): iterA(a), N(NN) {}
+};
+
+/* Third slot. */
+
+template<class A, class T>
+class Tensor3_dg_numeral_2
+{
+  A iterA;
+  const int N;
+public:
+  T operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2,N);
+  }
+  Tensor3_dg_numeral_2(const A &a, const int NN): iterA(a), N(NN) {}
+};
+
+/* Second and third slot (or first and third slot). */
+
+template<class A, class T>
+class Tensor3_dg_numeral_12
+{
+  A iterA;
+  const int N1,N2;
+public:
+  T operator()(const int N) const
+  {
+    return iterA(N,N1,N2);
+  }
+  Tensor3_dg_numeral_12(const A &a, const int NN1, const int NN2)
+    :iterA(a), N1(NN1), N2(NN2) {}
+};
+
+/* First and second slot. */
+
+template<class A, class T>
+class Tensor3_dg_numeral_01
+{
+  A iterA;
+  const int N1,N2;
+public:
+  T operator()(const int N) const
+  {
+    return iterA(N1,N2,N);
+  }
+  Tensor3_dg_numeral_01(const A &a, const int NN1, const int NN2)
+    :iterA(a), N1(NN1), N2(NN2) {}
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_or_Tensor3_dg.h
--- a/Tensor3_dg/Tensor3_dg_or_Tensor3_dg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-/* Adds two Tensor3_dg's to make a Tensor3_dg, but with different
-   symmetries. */
-
-/* A(i,j,k)+B(i,k,j) -> Tensor3_dg(j,k,i) */
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-class Tensor3_dg_or_Tensor3_dg_12
-{
-  const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> iterA;
-  const Tensor3_dg_Expr<B,U,Dim,Dim,i,k,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N3,N1,N2)+iterB(N3,N2,N1);
-  }
-
-  Tensor3_dg_or_Tensor3_dg_12(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
-			      const Tensor3_dg_Expr<B,U,Dim,Dim,i,k,j> &b)
-    : iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-inline const Tensor3_dg_Expr<const Tensor3_dg_or_Tensor3_dg_12<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,Dim,j,k,i>
-operator||(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
-	   const Tensor3_dg_Expr<B,U,Dim,Dim,i,k,j> &b)
-{
-  typedef const Tensor3_dg_or_Tensor3_dg_12<A,B,T,U,Dim,i,j,k> TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,j,k,i>
-    (TensorExpr(a,b));
-}
-
-/* A(j,i,k)+B(k,i,j) -> Tensor3_dg(j,k,i) */
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-class Tensor3_dg_or_Tensor3_dg_02
-{
-  const Tensor3_dg_Expr<A,T,Dim,Dim,j,i,k> iterA;
-  const Tensor3_dg_Expr<B,U,Dim,Dim,k,i,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N3,N2)+iterB(N2,N3,N1);
-  }
-
-  Tensor3_dg_or_Tensor3_dg_02(const Tensor3_dg_Expr<A,T,Dim,Dim,j,i,k> &a,
-			      const Tensor3_dg_Expr<B,U,Dim,Dim,k,i,j> &b)
-    : iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-inline const Tensor3_dg_Expr<const Tensor3_dg_or_Tensor3_dg_02<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,Dim,j,k,i>
-operator||(const Tensor3_dg_Expr<A,T,Dim,Dim,j,i,k> &a,
-	   const Tensor3_dg_Expr<B,U,Dim,Dim,k,i,j> &b)
-{
-  typedef const Tensor3_dg_or_Tensor3_dg_02<A,B,T,U,Dim,i,j,k> TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,j,k,i>
-    (TensorExpr(a,b));
-}
-
-
-    
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_or_Tensor3_dg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/Tensor3_dg_or_Tensor3_dg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,63 @@
+/* Adds two Tensor3_dg's to make a Tensor3_dg, but with different
+   symmetries. */
+
+/* A(i,j,k)+B(i,k,j) -> Tensor3_dg(j,k,i) */
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+class Tensor3_dg_or_Tensor3_dg_12
+{
+  const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> iterA;
+  const Tensor3_dg_Expr<B,U,Dim,Dim,i,k,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N3,N1,N2)+iterB(N3,N2,N1);
+  }
+
+  Tensor3_dg_or_Tensor3_dg_12(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
+			      const Tensor3_dg_Expr<B,U,Dim,Dim,i,k,j> &b)
+    : iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+inline const Tensor3_dg_Expr<const Tensor3_dg_or_Tensor3_dg_12<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,Dim,j,k,i>
+operator||(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
+	   const Tensor3_dg_Expr<B,U,Dim,Dim,i,k,j> &b)
+{
+  typedef const Tensor3_dg_or_Tensor3_dg_12<A,B,T,U,Dim,i,j,k> TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,j,k,i>
+    (TensorExpr(a,b));
+}
+
+/* A(j,i,k)+B(k,i,j) -> Tensor3_dg(j,k,i) */
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+class Tensor3_dg_or_Tensor3_dg_02
+{
+  const Tensor3_dg_Expr<A,T,Dim,Dim,j,i,k> iterA;
+  const Tensor3_dg_Expr<B,U,Dim,Dim,k,i,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N3,N2)+iterB(N2,N3,N1);
+  }
+
+  Tensor3_dg_or_Tensor3_dg_02(const Tensor3_dg_Expr<A,T,Dim,Dim,j,i,k> &a,
+			      const Tensor3_dg_Expr<B,U,Dim,Dim,k,i,j> &b)
+    : iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+inline const Tensor3_dg_Expr<const Tensor3_dg_or_Tensor3_dg_02<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,Dim,j,k,i>
+operator||(const Tensor3_dg_Expr<A,T,Dim,Dim,j,i,k> &a,
+	   const Tensor3_dg_Expr<B,U,Dim,Dim,k,i,j> &b)
+{
+  typedef const Tensor3_dg_or_Tensor3_dg_02<A,B,T,U,Dim,i,j,k> TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,j,k,i>
+    (TensorExpr(a,b));
+}
+
+
+    
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_plus_Tensor3_dg.h
--- a/Tensor3_dg/Tensor3_dg_plus_Tensor3_dg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,92 +0,0 @@
-/* Adds two Tensor3_dg's together, yielding a Tensor3_dg or Tensor3. */
-
-/* A(i,j,k)+B(i,j,k)->Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-class Tensor3_dg_plus_Tensor3_dg
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-  const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)+iterB(N1,N2,N3);
-  }
-
-  Tensor3_dg_plus_Tensor3_dg(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a, const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_dg_Expr<const Tensor3_dg_plus_Tensor3_dg
-<A,B,T,U,Dim01,Dim2,i,j,k>,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
-operator+(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-	  const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> &b)
-{
-  typedef const Tensor3_dg_plus_Tensor3_dg<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)+B(j,i,k)->Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-class Tensor3_dg_plus_Tensor3_dg_10
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-  const Tensor3_dg_Expr<B,U,Dim01,Dim2,j,i,k> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)+iterB(N1,N2,N3);
-  }
-
-  Tensor3_dg_plus_Tensor3_dg_10(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a, const Tensor3_dg_Expr<B,U,Dim01,Dim2,j,i,k> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor3_dg_Expr<const Tensor3_dg_plus_Tensor3_dg_10
-<A,B,T,U,Dim01,Dim2,i,j,k>,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
-operator+(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-	  const Tensor3_dg_Expr<B,U,Dim01,Dim2,j,i,k> &b)
-{
-  typedef const Tensor3_dg_plus_Tensor3_dg_10<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)+B(k,j,i)->Tensor3 */
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-class Tensor3_dg_plus_Tensor3_dg_210
-{
-  const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> iterA;
-  const Tensor3_dg_Expr<B,U,Dim,Dim,k,j,i> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)+iterB(N3,N2,N1);
-  }
-
-  Tensor3_dg_plus_Tensor3_dg_210(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
-				const Tensor3_dg_Expr<B,U,Dim,Dim,k,j,i> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, char i, char j, char k>
-inline const Tensor3_Expr<const Tensor3_dg_plus_Tensor3_dg_210<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,Dim,Dim,i,j,k>
-operator+(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
-	  const Tensor3_dg_Expr<B,U,Dim,Dim,k,j,i> &b)
-{
-  typedef const Tensor3_dg_plus_Tensor3_dg_210<A,B,T,U,Dim,i,j,k> TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,Dim,i,j,k>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_plus_Tensor3_dg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/Tensor3_dg_plus_Tensor3_dg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,92 @@
+/* Adds two Tensor3_dg's together, yielding a Tensor3_dg or Tensor3. */
+
+/* A(i,j,k)+B(i,j,k)->Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+class Tensor3_dg_plus_Tensor3_dg
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+  const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)+iterB(N1,N2,N3);
+  }
+
+  Tensor3_dg_plus_Tensor3_dg(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a, const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_dg_Expr<const Tensor3_dg_plus_Tensor3_dg
+<A,B,T,U,Dim01,Dim2,i,j,k>,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
+operator+(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+	  const Tensor3_dg_Expr<B,U,Dim01,Dim2,i,j,k> &b)
+{
+  typedef const Tensor3_dg_plus_Tensor3_dg<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)+B(j,i,k)->Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+class Tensor3_dg_plus_Tensor3_dg_10
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+  const Tensor3_dg_Expr<B,U,Dim01,Dim2,j,i,k> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)+iterB(N1,N2,N3);
+  }
+
+  Tensor3_dg_plus_Tensor3_dg_10(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a, const Tensor3_dg_Expr<B,U,Dim01,Dim2,j,i,k> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor3_dg_Expr<const Tensor3_dg_plus_Tensor3_dg_10
+<A,B,T,U,Dim01,Dim2,i,j,k>,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
+operator+(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+	  const Tensor3_dg_Expr<B,U,Dim01,Dim2,j,i,k> &b)
+{
+  typedef const Tensor3_dg_plus_Tensor3_dg_10<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)+B(k,j,i)->Tensor3 */
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+class Tensor3_dg_plus_Tensor3_dg_210
+{
+  const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> iterA;
+  const Tensor3_dg_Expr<B,U,Dim,Dim,k,j,i> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)+iterB(N3,N2,N1);
+  }
+
+  Tensor3_dg_plus_Tensor3_dg_210(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
+				const Tensor3_dg_Expr<B,U,Dim,Dim,k,j,i> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, char i, char j, char k>
+inline const Tensor3_Expr<const Tensor3_dg_plus_Tensor3_dg_210<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,Dim,Dim,i,j,k>
+operator+(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
+	  const Tensor3_dg_Expr<B,U,Dim,Dim,k,j,i> &b)
+{
+  typedef const Tensor3_dg_plus_Tensor3_dg_210<A,B,T,U,Dim,i,j,k> TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,Dim,i,j,k>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_pointer.h
--- a/Tensor3_dg/Tensor3_dg_pointer.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,459 +0,0 @@
-/* A version for pointers. */
-
-template <class T, int Tensor_Dim01, int Tensor_Dim2>
-class Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>
-{
-  mutable T * restrict data[(Tensor_Dim01*(Tensor_Dim01+1))/2][Tensor_Dim2];
-public:
-  Tensor3_dg() {}
-
-  /* Tensor_Dim01=2, Tensor_Dim2=2 */
-  Tensor3_dg(T *d000, T *d001, T *d010, T *d011, T *d110, T *d111)
-  {
-    Tensor3_dg_constructor<T* restrict,Tensor_Dim01,Tensor_Dim2>
-      (data,d000,d001,d010,d011,d110,d111);
-  }
-
-  /* Tensor_Dim01=3, Tensor_Dim2=3 */
-  Tensor3_dg(T *d000, T *d001, T *d002, T *d010,
-	     T *d011, T *d012, T *d020, T *d021,
-	     T *d022, T *d110, T *d111, T *d112,
-	     T *d120, T *d121, T *d122,
-	     T *d220, T *d221, T *d222)
-  {
-    Tensor3_dg_constructor<T* restrict,Tensor_Dim01,Tensor_Dim2>
-      (data,d000,d001,d002,d010,d011,d012,d020,d021,
-       d022,d110,d111,d112,d120,d121,d122,d220,d221,d222);
-  }
-
-  /* Tensor_Dim01=4, Tensor_Dim2=4 */
-  Tensor3_dg(T *d000, T *d001, T *d002, T *d003,
-	     T *d010, T *d011, T *d012, T *d013,
-	     T *d020, T *d021, T *d022, T *d023,
-	     T *d030, T *d031, T *d032, T *d033,
-	     T *d110, T *d111, T *d112, T *d113,
-	     T *d120, T *d121, T *d122, T *d123,
-	     T *d130, T *d131, T *d132, T *d133,
-	     T *d220, T *d221, T *d222, T *d223,
-	     T *d230, T *d231, T *d232, T *d233,
-	     T *d330, T *d331, T *d332, T *d333)
-  {
-    Tensor3_dg_constructor<T* restrict,Tensor_Dim01,Tensor_Dim2>
-      (data,d000,d001,d002,d003,d010,d011,d012,d013,
-       d020,d021,d022,d023,d030,d031,d032,d033,
-       d110,d111,d112,d113,d120,d121,d122,d123,
-       d130,d131,d132,d133,d220,d221,d222,d223,
-       d230,d231,d232,d233,d330,d331,d332,d333);
-  }
-
-  /* Tensor_Dim01=4, Tensor_Dim2=3 */
-  Tensor3_dg(T *d000, T *d001, T *d002, T *d010, T *d011, T *d012,
-	     T *d020, T *d021, T *d022, T *d030, T *d031, T *d032,
-	     T *d110, T *d111, T *d112, T *d120, T *d121, T *d122,
-	     T *d130, T *d131, T *d132, T *d220, T *d221, T *d222,
-	     T *d230, T *d231, T *d232, T *d330, T *d331, T *d332)
-  {
-    Tensor3_dg_constructor<T* restrict,Tensor_Dim01,Tensor_Dim2>
-      (data,d000,d001,d002,d010,d011,d012,
-       d020,d021,d022,d030,d031,d032,
-       d110,d111,d112,d120,d121,d122,
-       d130,d131,d132,d220,d221,d222,
-       d230,d231,d232,d330,d331,d332);
-  }
-
-  /* There are two operator(int,int,int)'s, one for non-consts that lets you
-     change the value, and one for consts that doesn't. */
-
-  T & operator()(const int N1, const int N2, const int N3)
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim01 || N1<0
-       || N2>=Tensor_Dim01 || N2<0 || N3>=Tensor_Dim2 || N3<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor3_dg<T*,"
-          << Tensor_Dim01 << "," << Tensor_Dim2
-          << ">.operator("
-          << N1 << "," << N2 << "," << N3 << ")" << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N1>N2 ? *data[N1+(N2*(2*Tensor_Dim01-N2-1))/2][N3]
-      : *data[N2+(N1*(2*Tensor_Dim01-N1-1))/2][N3];
-  }
-
-  T operator()(const int N1, const int N2, const int N3) const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim01 || N1<0
-       || N2>=Tensor_Dim01 || N2<0 || N3>=Tensor_Dim2 || N3<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor3_dg<T*,"
-          << Tensor_Dim01 << "," << Tensor_Dim2
-          << ">.operator("
-          << N1 << "," << N2 << "," << N3 << ") const"
-          << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N1>N2 ? *data[N1+(N2*(2*Tensor_Dim01-N2-1))/2][N3]
-      : *data[N2+(N1*(2*Tensor_Dim01-N1-1))/2][N3];
-  }
-
-  T* ptr(const int N1, const int N2, const int N3) const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim01 || N1<0
-       || N2>=Tensor_Dim01 || N2<0 || N3>=Tensor_Dim2 || N3<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor3_dg<T,"
-          << Tensor_Dim01 << "," << Tensor_Dim2 << ">.ptr("
-          << N1 << "," << N2 << "," << N3 << ")" << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N1>N2 ? data[N1+(N2*(2*Tensor_Dim01-N2-1))/2][N3]
-      : data[N2+(N1*(2*Tensor_Dim01-N1-1))/2][N3];
-  }
-
-  /* These operator()'s are the first part in constructing template
-     expressions. */
-
-  template<char i, char j, char k, int Dim01, int Dim2>
-  Tensor3_dg_Expr<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k>
-  operator()(const Index<i,Dim01> index1, const Index<j,Dim01> index2,
-	     const Index<k,Dim2> index3)
-  {
-    return Tensor3_dg_Expr<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
-      T,Dim01,Dim2,i,j,k>(*this);
-  }
-
-  template<char i, char j, char k, int Dim01, int Dim2>
-  Tensor3_dg_Expr<const Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
-    T,Dim01,Dim2,i,j,k> operator()
-    (const Index<i,Dim01> index1, const Index<j,Dim01> index2,
-     const Index<k,Dim2> index3) const
-  {
-    return Tensor3_dg_Expr<const Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
-      T,Dim01,Dim2,i,j,k>(*this);
-  }
-
-  /* These operators are for internal contractions. The commented out
-     versions are more general, but are ambiguous.  This means,
-     unfortunately, that you can't do something like A(i,j,j) where i
-     and j have different dimensions. */
-
-  template<char i, char j, int Dim>
-  inline Tensor1_Expr<const Tensor3_contracted_12<Tensor3_dg
-  <T*,Tensor_Dim01,Tensor_Dim2>,T,Dim>,T,Dim,i>
-  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
-	     const Index<j,Dim> index3) const
-  {
-    typedef const Tensor3_contracted_12<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
-      T,Dim> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-  template<char i, char j, int Dim>
-  inline Tensor1_Expr<const Tensor3_contracted_02<Tensor3_dg
-  <T*,Tensor_Dim01,Tensor_Dim2>,T,Dim>,T,Dim,i>
-  operator()(const Index<j,Dim> index1, const Index<i,Dim> index2,
-	     const Index<j,Dim> index3) const
-  {
-    typedef const Tensor3_contracted_02<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
-      T,Dim> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-//    template<char i, char j, int Dim0, int Dim12>
-//    inline Tensor1_Expr<const Tensor3_contracted_12<Tensor3_dg
-//    <T*,Tensor_Dim01,Tensor_Dim2>,T,Dim12>,T,Dim0,i>
-//    operator()(const Index<i,Dim0> index1, const Index<j,Dim12> index2,
-//  	     const Index<j,Dim12> index3) const
-//    {
-//      typedef const Tensor3_contracted_12<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
-//        T,Dim12> TensorExpr;
-//      return Tensor1_Expr<TensorExpr,T,Dim0,i>(TensorExpr(*this));
-//    }
-
-//    template<char i, char j, int Dim02, int Dim1>
-//    inline Tensor1_Expr<const Tensor3_contracted_02<Tensor3_dg
-//    <T*,Tensor_Dim01,Tensor_Dim2>,T,Dim02>,T,Dim1,i>
-//    operator()(const Index<j,Dim02> index1, const Index<i,Dim1> index2,
-//  	     const Index<j,Dim02> index3) const
-//    {
-//      typedef const Tensor3_contracted_02<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
-//        T,Dim02> TensorExpr;
-//      return Tensor1_Expr<TensorExpr,T,Dim1,i>(TensorExpr(*this));
-//    }
-
-  template<char i, char j, int Dim01, int Dim2>
-  inline Tensor1_Expr<const Tensor3_contracted_01<Tensor3_dg
-  <T*,Tensor_Dim01,Tensor_Dim2>,T,Dim01>,T,Dim2,i>
-  operator()(const Index<j,Dim01> index1, const Index<j,Dim01> index2,
-	     const Index<i,Dim2> index3) const
-  {
-    typedef const Tensor3_contracted_01<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
-      T,Dim01> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim2,i>(TensorExpr(*this));
-  }
-
-  /* This is for expressions where a number is used for one slot, and
-     indices for the others, yielding a Tensor2_Expr or
-     Tensor2_symmetric_Expr.  The non-const versions don't actually
-     create a Tensor3_dg_number_rhs_* object, while the const versions
-     do create a Tensor3_dg_number_*. */
-
-  /* First slot. */
-
-  template<char i, char j, int N, int Dim1, int Dim2>
-  Tensor2_Expr<Tensor3_dg_number_rhs_0<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
-    T,N>,T,Dim1,Dim2,i,j>
-  operator()(const Number<N> n1, const Index<i,Dim1> index1,
-	     const Index<j,Dim2> index2)
-  {
-    typedef Tensor3_dg_number_rhs_0<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,T,N>
-      TensorExpr;
-    return Tensor2_Expr<TensorExpr,T,Dim1,Dim2,i,j>(*this);
-  }
-
-  template<char i, char j, int N, int Dim1, int Dim2>
-  const Tensor2_Expr<const Tensor3_dg_number_0<const Tensor3_dg
-  <T*,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim1,Dim2,i,j>
-  operator()(const Number<N> n1, const Index<i,Dim1> index1,
-	     const Index<j,Dim2> index2) const
-  {
-    typedef const Tensor3_dg_number_0<const Tensor3_dg
-      <T*,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
-    return Tensor2_Expr<TensorExpr,T,Dim1,Dim2,i,j>(TensorExpr(*this));
-  }
-
-  /* Second slot. */
-
-  template<char i, char j, int N, int Dim0, int Dim2>
-  Tensor2_Expr<Tensor3_dg_number_rhs_0<Tensor3_dg
-  <T*,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim0,Dim2,i,j>
-  operator()(const Index<i,Dim0> index1, const Number<N> n1,
-	     const Index<j,Dim2> index2)
-  {
-    typedef Tensor3_dg_number_rhs_0<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,T,N>
-      TensorExpr;
-    return Tensor2_Expr<TensorExpr,T,Dim0,Dim2,i,j>(*this);
-  }
-
-  template<char i, char j, int N, int Dim0, int Dim2>
-  const Tensor2_Expr<const Tensor3_dg_number_0<const Tensor3_dg
-  <T*,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim0,Dim2,i,j>
-  operator()(const Index<i,Dim0> index1, const Number<N> n1,
-	     const Index<j,Dim2> index2) const
-  {
-    typedef const Tensor3_dg_number_0<const Tensor3_dg
-      <T*,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
-    return Tensor2_Expr<TensorExpr,T,Dim0,Dim2,i,j>(TensorExpr(*this));
-  }
-
-  /* Third slot. */
-
-  template<char i, char j, int N, int Dim>
-  Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<Tensor3_dg
-  <T*,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim,i,j>
-  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
-	     const Number<N> n1)
-  {
-    typedef Tensor3_dg_number_rhs_2<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,T,N>
-      TensorExpr;
-    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(*this);
-  }
-
-  template<char i, char j, int N, int Dim>
-  const Tensor2_symmetric_Expr<const Tensor3_dg_number_2
-  <const Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim,i,j>
-  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
-	     const Number<N> n1) const
-  {
-    typedef const Tensor3_dg_number_2<const Tensor3_dg
-      <T*,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
-    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(TensorExpr(*this));
-  }
-
-  /* This is for expressions where a number is used for two slots, and
-     an Index for the other, yielding a Tensor1_Expr.  The non-const
-     versions don't actually create a Tensor3_dg_number_rhs_* object,
-     while the const versions do create a Tensor3_dg_number_*. */
-
-  /* Index in first slot. */
-
-  template<char i, int N1, int N2, int Dim>
-  Tensor1_Expr<Tensor3_dg_number_rhs_12<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
-    T,N1,N2>,T,Dim,i>
-  operator()(const Index<i,Dim> index, const Number<N1> n1,
-	     const Number<N2> n2)
-  {
-    typedef Tensor3_dg_number_rhs_12<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
-      T,N1,N2> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
-  }
-
-  template<char i, int N1, int N2, int Dim>
-  const Tensor1_Expr<const Tensor3_dg_number_12<const Tensor3_dg
-  <T*,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
-  operator()(const Index<i,Dim> index, const Number<N1> n1,
-	     const Number<N2> n2) const
-  {
-    typedef const Tensor3_dg_number_12<const Tensor3_dg
-      <T*,Tensor_Dim01,Tensor_Dim2>,T,N1,N2> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-  /* Index in second slot.  I use the same structures as for the Index
-     in the first slot since the tensor is symmetric on the first two
-     indices. */
-
-  template<char i, int N1, int N2, int Dim>
-  Tensor1_Expr<Tensor3_dg_number_rhs_12<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
-    T,N1,N2>,T,Dim,i>
-  operator()(const Number<N1> n1, const Index<i,Dim> index,
-	     const Number<N2> n2)
-  {
-    typedef Tensor3_dg_number_rhs_12<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
-      T,N1,N2> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
-  }
-
-  template<char i, int N1, int N2, int Dim>
-  const Tensor1_Expr<const Tensor3_dg_number_12<const Tensor3_dg
-  <T*,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
-  operator()(const Number<N1> n1, const Index<i,Dim> index,
-	     const Number<N2> n2) const
-  {
-    typedef const Tensor3_dg_number_12<const Tensor3_dg
-      <T*,Tensor_Dim01,Tensor_Dim2>,T,N1,N2> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-  /* Index in third slot. */
-
-  template<char i, int N1, int N2, int Dim>
-  Tensor1_Expr<Tensor3_dg_number_rhs_01<Tensor3_dg
-  <T*,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
-  operator()(const Number<N1> n1, const Number<N2> n2,
-	     const Index<i,Dim> index)
-  {
-    typedef Tensor3_dg_number_rhs_01<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
-      T,N1,N2> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
-  }
-
-  template<char i, int N1, int N2, int Dim>
-  const Tensor1_Expr<const Tensor3_dg_number_01<const Tensor3_dg
-  <T*,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
-  operator()(const Number<N1> n1, const Number<N2> n2,
-	     const Index<i,Dim> index) const
-  {
-    typedef const Tensor3_dg_number_01<const Tensor3_dg
-      <T*,Tensor_Dim01,Tensor_Dim2>,T,N1,N2> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-  /* Specializations for using actual numbers instead of Number<>.
-     This is for expressions where an actual number is used for one
-     slot, and indices for the others, yielding a Tensor2_Expr or
-     Tensor2_symmetric_Expr. I only define the const versions. */
-
-  /* First slot. */
-
-  template<char i, char j, int Dim1, int Dim2>
-  const Tensor2_Expr<const Tensor3_dg_numeral_0<const Tensor3_dg
-  <T*,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim1,Dim2,i,j>
-  operator()(const int N, const Index<i,Dim1> index1,
-	     const Index<j,Dim2> index2) const
-  {
-    typedef const Tensor3_dg_numeral_0<const Tensor3_dg
-      <T*,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
-    return Tensor2_Expr<TensorExpr,T,Dim1,Dim2,i,j>(TensorExpr(*this,N));
-  }
-
-  /* Second slot. */
-
-  template<char i, char j, int Dim0, int Dim2>
-  const Tensor2_Expr<const Tensor3_dg_numeral_0<const Tensor3_dg
-  <T*,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim0,Dim2,i,j>
-  operator()(const Index<i,Dim0> index1, const int N,
-	     const Index<j,Dim2> index2) const
-  {
-    typedef const Tensor3_dg_numeral_0<const Tensor3_dg
-      <T*,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
-    return Tensor2_Expr<TensorExpr,T,Dim0,Dim2,i,j>(TensorExpr(*this,N));
-  }
-
-  /* Third slot. */
-
-  template<char i, char j, int Dim>
-  const Tensor2_symmetric_Expr<const Tensor3_dg_numeral_2
-  <const Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim,i,j>
-  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
-	     const int N) const
-  {
-    typedef const Tensor3_dg_numeral_2<const Tensor3_dg
-      <T*,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
-    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(TensorExpr(*this,N));
-  }
-
-  /* This is for expressions where a numeral is used for two slots, and
-     an Index for the other, yielding a Tensor1_Expr. */
-
-  /* Index in first slot. */
-
-  template<char i, int Dim>
-  const Tensor1_Expr<const Tensor3_dg_numeral_12<const Tensor3_dg
-  <T*,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim,i>
-  operator()(const Index<i,Dim> index, const int N1,
-	     const int N2) const
-  {
-    typedef const Tensor3_dg_numeral_12<const Tensor3_dg
-      <T*,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2));
-  }
-
-  /* Index in second slot.  I use the same structures as for the Index
-     in the first slot since the tensor is symmetric on the first two
-     indices. */
-
-  template<char i, int Dim>
-  const Tensor1_Expr<const Tensor3_dg_numeral_12<const Tensor3_dg
-  <T*,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim,i>
-  operator()(const int N1, const Index<i,Dim> index,
-	     const int N2) const
-  {
-    typedef const Tensor3_dg_numeral_12<const Tensor3_dg
-      <T*,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2));
-  }
-
-  /* Index in third slot. */
-
-  template<char i, int Dim>
-  const Tensor1_Expr<const Tensor3_dg_numeral_01<const Tensor3_dg
-  <T*,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim,i>
-  operator()(const int N1, const int N2,
-	     const Index<i,Dim> index) const
-  {
-    typedef const Tensor3_dg_numeral_01<const Tensor3_dg
-      <T*,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2));
-  }
-  
-  /* The ++ operator increments the pointer, not the number that the
-     pointer points to.  This allows iterating over a grid. */
-
-  const Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2> & operator++() const
-  {
-    for(int i=0;i<(Tensor_Dim01*(Tensor_Dim01+1))/2;++i)
-      for(int j=0;j<Tensor_Dim2;++j)
-	++data[i][j];
-    return *this;
-  }
-};
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_pointer.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/Tensor3_dg_pointer.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,459 @@
+/* A version for pointers. */
+
+template <class T, int Tensor_Dim01, int Tensor_Dim2>
+class Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>
+{
+  mutable T * restrict data[(Tensor_Dim01*(Tensor_Dim01+1))/2][Tensor_Dim2];
+public:
+  Tensor3_dg() {}
+
+  /* Tensor_Dim01=2, Tensor_Dim2=2 */
+  Tensor3_dg(T *d000, T *d001, T *d010, T *d011, T *d110, T *d111)
+  {
+    Tensor3_dg_constructor<T* restrict,Tensor_Dim01,Tensor_Dim2>
+      (data,d000,d001,d010,d011,d110,d111);
+  }
+
+  /* Tensor_Dim01=3, Tensor_Dim2=3 */
+  Tensor3_dg(T *d000, T *d001, T *d002, T *d010,
+	     T *d011, T *d012, T *d020, T *d021,
+	     T *d022, T *d110, T *d111, T *d112,
+	     T *d120, T *d121, T *d122,
+	     T *d220, T *d221, T *d222)
+  {
+    Tensor3_dg_constructor<T* restrict,Tensor_Dim01,Tensor_Dim2>
+      (data,d000,d001,d002,d010,d011,d012,d020,d021,
+       d022,d110,d111,d112,d120,d121,d122,d220,d221,d222);
+  }
+
+  /* Tensor_Dim01=4, Tensor_Dim2=4 */
+  Tensor3_dg(T *d000, T *d001, T *d002, T *d003,
+	     T *d010, T *d011, T *d012, T *d013,
+	     T *d020, T *d021, T *d022, T *d023,
+	     T *d030, T *d031, T *d032, T *d033,
+	     T *d110, T *d111, T *d112, T *d113,
+	     T *d120, T *d121, T *d122, T *d123,
+	     T *d130, T *d131, T *d132, T *d133,
+	     T *d220, T *d221, T *d222, T *d223,
+	     T *d230, T *d231, T *d232, T *d233,
+	     T *d330, T *d331, T *d332, T *d333)
+  {
+    Tensor3_dg_constructor<T* restrict,Tensor_Dim01,Tensor_Dim2>
+      (data,d000,d001,d002,d003,d010,d011,d012,d013,
+       d020,d021,d022,d023,d030,d031,d032,d033,
+       d110,d111,d112,d113,d120,d121,d122,d123,
+       d130,d131,d132,d133,d220,d221,d222,d223,
+       d230,d231,d232,d233,d330,d331,d332,d333);
+  }
+
+  /* Tensor_Dim01=4, Tensor_Dim2=3 */
+  Tensor3_dg(T *d000, T *d001, T *d002, T *d010, T *d011, T *d012,
+	     T *d020, T *d021, T *d022, T *d030, T *d031, T *d032,
+	     T *d110, T *d111, T *d112, T *d120, T *d121, T *d122,
+	     T *d130, T *d131, T *d132, T *d220, T *d221, T *d222,
+	     T *d230, T *d231, T *d232, T *d330, T *d331, T *d332)
+  {
+    Tensor3_dg_constructor<T* restrict,Tensor_Dim01,Tensor_Dim2>
+      (data,d000,d001,d002,d010,d011,d012,
+       d020,d021,d022,d030,d031,d032,
+       d110,d111,d112,d120,d121,d122,
+       d130,d131,d132,d220,d221,d222,
+       d230,d231,d232,d330,d331,d332);
+  }
+
+  /* There are two operator(int,int,int)'s, one for non-consts that lets you
+     change the value, and one for consts that doesn't. */
+
+  T & operator()(const int N1, const int N2, const int N3)
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim01 || N1<0
+       || N2>=Tensor_Dim01 || N2<0 || N3>=Tensor_Dim2 || N3<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor3_dg<T*,"
+          << Tensor_Dim01 << "," << Tensor_Dim2
+          << ">.operator("
+          << N1 << "," << N2 << "," << N3 << ")" << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N1>N2 ? *data[N1+(N2*(2*Tensor_Dim01-N2-1))/2][N3]
+      : *data[N2+(N1*(2*Tensor_Dim01-N1-1))/2][N3];
+  }
+
+  T operator()(const int N1, const int N2, const int N3) const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim01 || N1<0
+       || N2>=Tensor_Dim01 || N2<0 || N3>=Tensor_Dim2 || N3<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor3_dg<T*,"
+          << Tensor_Dim01 << "," << Tensor_Dim2
+          << ">.operator("
+          << N1 << "," << N2 << "," << N3 << ") const"
+          << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N1>N2 ? *data[N1+(N2*(2*Tensor_Dim01-N2-1))/2][N3]
+      : *data[N2+(N1*(2*Tensor_Dim01-N1-1))/2][N3];
+  }
+
+  T* ptr(const int N1, const int N2, const int N3) const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim01 || N1<0
+       || N2>=Tensor_Dim01 || N2<0 || N3>=Tensor_Dim2 || N3<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor3_dg<T,"
+          << Tensor_Dim01 << "," << Tensor_Dim2 << ">.ptr("
+          << N1 << "," << N2 << "," << N3 << ")" << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N1>N2 ? data[N1+(N2*(2*Tensor_Dim01-N2-1))/2][N3]
+      : data[N2+(N1*(2*Tensor_Dim01-N1-1))/2][N3];
+  }
+
+  /* These operator()'s are the first part in constructing template
+     expressions. */
+
+  template<char i, char j, char k, int Dim01, int Dim2>
+  Tensor3_dg_Expr<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k>
+  operator()(const Index<i,Dim01> index1, const Index<j,Dim01> index2,
+	     const Index<k,Dim2> index3)
+  {
+    return Tensor3_dg_Expr<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
+      T,Dim01,Dim2,i,j,k>(*this);
+  }
+
+  template<char i, char j, char k, int Dim01, int Dim2>
+  Tensor3_dg_Expr<const Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
+    T,Dim01,Dim2,i,j,k> operator()
+    (const Index<i,Dim01> index1, const Index<j,Dim01> index2,
+     const Index<k,Dim2> index3) const
+  {
+    return Tensor3_dg_Expr<const Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
+      T,Dim01,Dim2,i,j,k>(*this);
+  }
+
+  /* These operators are for internal contractions. The commented out
+     versions are more general, but are ambiguous.  This means,
+     unfortunately, that you can't do something like A(i,j,j) where i
+     and j have different dimensions. */
+
+  template<char i, char j, int Dim>
+  inline Tensor1_Expr<const Tensor3_contracted_12<Tensor3_dg
+  <T*,Tensor_Dim01,Tensor_Dim2>,T,Dim>,T,Dim,i>
+  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
+	     const Index<j,Dim> index3) const
+  {
+    typedef const Tensor3_contracted_12<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
+      T,Dim> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+  template<char i, char j, int Dim>
+  inline Tensor1_Expr<const Tensor3_contracted_02<Tensor3_dg
+  <T*,Tensor_Dim01,Tensor_Dim2>,T,Dim>,T,Dim,i>
+  operator()(const Index<j,Dim> index1, const Index<i,Dim> index2,
+	     const Index<j,Dim> index3) const
+  {
+    typedef const Tensor3_contracted_02<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
+      T,Dim> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+//    template<char i, char j, int Dim0, int Dim12>
+//    inline Tensor1_Expr<const Tensor3_contracted_12<Tensor3_dg
+//    <T*,Tensor_Dim01,Tensor_Dim2>,T,Dim12>,T,Dim0,i>
+//    operator()(const Index<i,Dim0> index1, const Index<j,Dim12> index2,
+//  	     const Index<j,Dim12> index3) const
+//    {
+//      typedef const Tensor3_contracted_12<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
+//        T,Dim12> TensorExpr;
+//      return Tensor1_Expr<TensorExpr,T,Dim0,i>(TensorExpr(*this));
+//    }
+
+//    template<char i, char j, int Dim02, int Dim1>
+//    inline Tensor1_Expr<const Tensor3_contracted_02<Tensor3_dg
+//    <T*,Tensor_Dim01,Tensor_Dim2>,T,Dim02>,T,Dim1,i>
+//    operator()(const Index<j,Dim02> index1, const Index<i,Dim1> index2,
+//  	     const Index<j,Dim02> index3) const
+//    {
+//      typedef const Tensor3_contracted_02<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
+//        T,Dim02> TensorExpr;
+//      return Tensor1_Expr<TensorExpr,T,Dim1,i>(TensorExpr(*this));
+//    }
+
+  template<char i, char j, int Dim01, int Dim2>
+  inline Tensor1_Expr<const Tensor3_contracted_01<Tensor3_dg
+  <T*,Tensor_Dim01,Tensor_Dim2>,T,Dim01>,T,Dim2,i>
+  operator()(const Index<j,Dim01> index1, const Index<j,Dim01> index2,
+	     const Index<i,Dim2> index3) const
+  {
+    typedef const Tensor3_contracted_01<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
+      T,Dim01> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim2,i>(TensorExpr(*this));
+  }
+
+  /* This is for expressions where a number is used for one slot, and
+     indices for the others, yielding a Tensor2_Expr or
+     Tensor2_symmetric_Expr.  The non-const versions don't actually
+     create a Tensor3_dg_number_rhs_* object, while the const versions
+     do create a Tensor3_dg_number_*. */
+
+  /* First slot. */
+
+  template<char i, char j, int N, int Dim1, int Dim2>
+  Tensor2_Expr<Tensor3_dg_number_rhs_0<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
+    T,N>,T,Dim1,Dim2,i,j>
+  operator()(const Number<N> n1, const Index<i,Dim1> index1,
+	     const Index<j,Dim2> index2)
+  {
+    typedef Tensor3_dg_number_rhs_0<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,T,N>
+      TensorExpr;
+    return Tensor2_Expr<TensorExpr,T,Dim1,Dim2,i,j>(*this);
+  }
+
+  template<char i, char j, int N, int Dim1, int Dim2>
+  const Tensor2_Expr<const Tensor3_dg_number_0<const Tensor3_dg
+  <T*,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim1,Dim2,i,j>
+  operator()(const Number<N> n1, const Index<i,Dim1> index1,
+	     const Index<j,Dim2> index2) const
+  {
+    typedef const Tensor3_dg_number_0<const Tensor3_dg
+      <T*,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
+    return Tensor2_Expr<TensorExpr,T,Dim1,Dim2,i,j>(TensorExpr(*this));
+  }
+
+  /* Second slot. */
+
+  template<char i, char j, int N, int Dim0, int Dim2>
+  Tensor2_Expr<Tensor3_dg_number_rhs_0<Tensor3_dg
+  <T*,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim0,Dim2,i,j>
+  operator()(const Index<i,Dim0> index1, const Number<N> n1,
+	     const Index<j,Dim2> index2)
+  {
+    typedef Tensor3_dg_number_rhs_0<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,T,N>
+      TensorExpr;
+    return Tensor2_Expr<TensorExpr,T,Dim0,Dim2,i,j>(*this);
+  }
+
+  template<char i, char j, int N, int Dim0, int Dim2>
+  const Tensor2_Expr<const Tensor3_dg_number_0<const Tensor3_dg
+  <T*,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim0,Dim2,i,j>
+  operator()(const Index<i,Dim0> index1, const Number<N> n1,
+	     const Index<j,Dim2> index2) const
+  {
+    typedef const Tensor3_dg_number_0<const Tensor3_dg
+      <T*,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
+    return Tensor2_Expr<TensorExpr,T,Dim0,Dim2,i,j>(TensorExpr(*this));
+  }
+
+  /* Third slot. */
+
+  template<char i, char j, int N, int Dim>
+  Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<Tensor3_dg
+  <T*,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim,i,j>
+  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
+	     const Number<N> n1)
+  {
+    typedef Tensor3_dg_number_rhs_2<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,T,N>
+      TensorExpr;
+    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(*this);
+  }
+
+  template<char i, char j, int N, int Dim>
+  const Tensor2_symmetric_Expr<const Tensor3_dg_number_2
+  <const Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim,i,j>
+  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
+	     const Number<N> n1) const
+  {
+    typedef const Tensor3_dg_number_2<const Tensor3_dg
+      <T*,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
+    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(TensorExpr(*this));
+  }
+
+  /* This is for expressions where a number is used for two slots, and
+     an Index for the other, yielding a Tensor1_Expr.  The non-const
+     versions don't actually create a Tensor3_dg_number_rhs_* object,
+     while the const versions do create a Tensor3_dg_number_*. */
+
+  /* Index in first slot. */
+
+  template<char i, int N1, int N2, int Dim>
+  Tensor1_Expr<Tensor3_dg_number_rhs_12<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
+    T,N1,N2>,T,Dim,i>
+  operator()(const Index<i,Dim> index, const Number<N1> n1,
+	     const Number<N2> n2)
+  {
+    typedef Tensor3_dg_number_rhs_12<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
+      T,N1,N2> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
+  }
+
+  template<char i, int N1, int N2, int Dim>
+  const Tensor1_Expr<const Tensor3_dg_number_12<const Tensor3_dg
+  <T*,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
+  operator()(const Index<i,Dim> index, const Number<N1> n1,
+	     const Number<N2> n2) const
+  {
+    typedef const Tensor3_dg_number_12<const Tensor3_dg
+      <T*,Tensor_Dim01,Tensor_Dim2>,T,N1,N2> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+  /* Index in second slot.  I use the same structures as for the Index
+     in the first slot since the tensor is symmetric on the first two
+     indices. */
+
+  template<char i, int N1, int N2, int Dim>
+  Tensor1_Expr<Tensor3_dg_number_rhs_12<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
+    T,N1,N2>,T,Dim,i>
+  operator()(const Number<N1> n1, const Index<i,Dim> index,
+	     const Number<N2> n2)
+  {
+    typedef Tensor3_dg_number_rhs_12<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
+      T,N1,N2> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
+  }
+
+  template<char i, int N1, int N2, int Dim>
+  const Tensor1_Expr<const Tensor3_dg_number_12<const Tensor3_dg
+  <T*,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
+  operator()(const Number<N1> n1, const Index<i,Dim> index,
+	     const Number<N2> n2) const
+  {
+    typedef const Tensor3_dg_number_12<const Tensor3_dg
+      <T*,Tensor_Dim01,Tensor_Dim2>,T,N1,N2> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+  /* Index in third slot. */
+
+  template<char i, int N1, int N2, int Dim>
+  Tensor1_Expr<Tensor3_dg_number_rhs_01<Tensor3_dg
+  <T*,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
+  operator()(const Number<N1> n1, const Number<N2> n2,
+	     const Index<i,Dim> index)
+  {
+    typedef Tensor3_dg_number_rhs_01<Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,
+      T,N1,N2> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
+  }
+
+  template<char i, int N1, int N2, int Dim>
+  const Tensor1_Expr<const Tensor3_dg_number_01<const Tensor3_dg
+  <T*,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
+  operator()(const Number<N1> n1, const Number<N2> n2,
+	     const Index<i,Dim> index) const
+  {
+    typedef const Tensor3_dg_number_01<const Tensor3_dg
+      <T*,Tensor_Dim01,Tensor_Dim2>,T,N1,N2> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+  /* Specializations for using actual numbers instead of Number<>.
+     This is for expressions where an actual number is used for one
+     slot, and indices for the others, yielding a Tensor2_Expr or
+     Tensor2_symmetric_Expr. I only define the const versions. */
+
+  /* First slot. */
+
+  template<char i, char j, int Dim1, int Dim2>
+  const Tensor2_Expr<const Tensor3_dg_numeral_0<const Tensor3_dg
+  <T*,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim1,Dim2,i,j>
+  operator()(const int N, const Index<i,Dim1> index1,
+	     const Index<j,Dim2> index2) const
+  {
+    typedef const Tensor3_dg_numeral_0<const Tensor3_dg
+      <T*,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
+    return Tensor2_Expr<TensorExpr,T,Dim1,Dim2,i,j>(TensorExpr(*this,N));
+  }
+
+  /* Second slot. */
+
+  template<char i, char j, int Dim0, int Dim2>
+  const Tensor2_Expr<const Tensor3_dg_numeral_0<const Tensor3_dg
+  <T*,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim0,Dim2,i,j>
+  operator()(const Index<i,Dim0> index1, const int N,
+	     const Index<j,Dim2> index2) const
+  {
+    typedef const Tensor3_dg_numeral_0<const Tensor3_dg
+      <T*,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
+    return Tensor2_Expr<TensorExpr,T,Dim0,Dim2,i,j>(TensorExpr(*this,N));
+  }
+
+  /* Third slot. */
+
+  template<char i, char j, int Dim>
+  const Tensor2_symmetric_Expr<const Tensor3_dg_numeral_2
+  <const Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim,i,j>
+  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
+	     const int N) const
+  {
+    typedef const Tensor3_dg_numeral_2<const Tensor3_dg
+      <T*,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
+    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(TensorExpr(*this,N));
+  }
+
+  /* This is for expressions where a numeral is used for two slots, and
+     an Index for the other, yielding a Tensor1_Expr. */
+
+  /* Index in first slot. */
+
+  template<char i, int Dim>
+  const Tensor1_Expr<const Tensor3_dg_numeral_12<const Tensor3_dg
+  <T*,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim,i>
+  operator()(const Index<i,Dim> index, const int N1,
+	     const int N2) const
+  {
+    typedef const Tensor3_dg_numeral_12<const Tensor3_dg
+      <T*,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2));
+  }
+
+  /* Index in second slot.  I use the same structures as for the Index
+     in the first slot since the tensor is symmetric on the first two
+     indices. */
+
+  template<char i, int Dim>
+  const Tensor1_Expr<const Tensor3_dg_numeral_12<const Tensor3_dg
+  <T*,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim,i>
+  operator()(const int N1, const Index<i,Dim> index,
+	     const int N2) const
+  {
+    typedef const Tensor3_dg_numeral_12<const Tensor3_dg
+      <T*,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2));
+  }
+
+  /* Index in third slot. */
+
+  template<char i, int Dim>
+  const Tensor1_Expr<const Tensor3_dg_numeral_01<const Tensor3_dg
+  <T*,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim,i>
+  operator()(const int N1, const int N2,
+	     const Index<i,Dim> index) const
+  {
+    typedef const Tensor3_dg_numeral_01<const Tensor3_dg
+      <T*,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2));
+  }
+  
+  /* The ++ operator increments the pointer, not the number that the
+     pointer points to.  This allows iterating over a grid. */
+
+  const Tensor3_dg<T*,Tensor_Dim01,Tensor_Dim2> & operator++() const
+  {
+    for(int i=0;i<(Tensor_Dim01*(Tensor_Dim01+1))/2;++i)
+      for(int j=0;j<Tensor_Dim2;++j)
+	++data[i][j];
+    return *this;
+  }
+};
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_times_Tensor1.h
--- a/Tensor3_dg/Tensor3_dg_times_Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,182 +0,0 @@
-/* This file has all of the declarations for expressions like
-   Tensor3_dg*Tensor1 and Tensor1*Tensor3_dg, yielding a
-   Tensor2_symmetric or Tensor2. */
-
-/* A(i,j,k)*B(k)->Tensor2_symmetric */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, 
-  char i, char j, char k>
-class Tensor3_dg_times_Tensor1_2
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-  const Tensor1_Expr<B,U,Dim2,k> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N)  const
-  {
-    return iterA(N1,N2,Current_Dim-1)*iterB(Current_Dim-1)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &N) const
-  {
-    return iterA(N1,N2,0)*iterB(0);
-  }
-public:
-  Tensor3_dg_times_Tensor1_2(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-			     const Tensor1_Expr<B,U,Dim2,k> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim2>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, 
-  char i, char j, char k>
-inline const Tensor2_symmetric_Expr
-<const Tensor3_dg_times_Tensor1_2<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,i,j>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-	  const Tensor1_Expr<B,U,Dim2,k> &b)
-{
-  typedef const Tensor3_dg_times_Tensor1_2<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i,j>
-    (TensorExpr(a,b));
-}
-
-/* B(k)*A(i,j,k)->Tensor2_symmetric */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, 
-  char i, char j, char k>
-inline const Tensor2_symmetric_Expr
-<const Tensor3_dg_times_Tensor1_2<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,i,j>
-operator*(const Tensor1_Expr<B,U,Dim2,k> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
-{
-  typedef const Tensor3_dg_times_Tensor1_2<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i,j>
-    (TensorExpr(a,b));
-}
-
-/* A(i,k,j)*B(k)->Tensor2 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, 
-  char i, char j, char k>
-class Tensor3_dg_times_Tensor1_1
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,k,j> iterA;
-  const Tensor1_Expr<B,U,Dim01,k> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N)  const
-  {
-    return iterA(N1,Current_Dim-1,N2)*iterB(Current_Dim-1)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &N) const
-  {
-    return iterA(N1,0,N2)*iterB(0);
-  }
-public:
-  Tensor3_dg_times_Tensor1_1(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,k,j> &a,
-			     const Tensor1_Expr<B,U,Dim01,k> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim01>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, 
-  char i, char j, char k>
-inline const Tensor2_Expr<const Tensor3_dg_times_Tensor1_1<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,Dim2,i,j>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,k,j> &a,
-	  const Tensor1_Expr<B,U,Dim01,k> &b)
-{
-  typedef const Tensor3_dg_times_Tensor1_1<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j>
-    (TensorExpr(a,b));
-}
-
-/* B(k)*A(i,k,j)->Tensor2 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, 
-  char i, char j, char k>
-inline const Tensor2_Expr<const Tensor3_dg_times_Tensor1_1<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,Dim2,i,j>
-operator*(const Tensor1_Expr<B,U,Dim01,k> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,k,j> &a)
-{
-  typedef const Tensor3_dg_times_Tensor1_1<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j>
-    (TensorExpr(a,b));
-}
-
-/* A(k,i,j)*B(k)->Tensor2 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, 
-  char i, char j, char k>
-class Tensor3_dg_times_Tensor1_0
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,k,i,j> iterA;
-  const Tensor1_Expr<B,U,Dim01,k> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim> &N)  const
-  {
-    return iterA(N1,Current_Dim-1,N2)*iterB(Current_Dim-1)
-      + eval(N1,N2,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &N) const
-  {
-    return iterA(N1,0,N2)*iterB(0);
-  }
-public:
-  Tensor3_dg_times_Tensor1_0(const Tensor3_dg_Expr<A,T,Dim01,Dim2,k,i,j> &a,
-			     const Tensor1_Expr<B,U,Dim01,k> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim01>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, 
-  char i, char j, char k>
-inline const Tensor2_Expr<const Tensor3_dg_times_Tensor1_0<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,Dim2,i,j>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,k,i,j> &a,
-	  const Tensor1_Expr<B,U,Dim01,k> &b)
-{
-  typedef const Tensor3_dg_times_Tensor1_0<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j>
-    (TensorExpr(a,b));
-}
-
-/* B(k)*A(k,i,j)->Tensor2 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, 
-  char i, char j, char k>
-inline const Tensor2_Expr<const Tensor3_dg_times_Tensor1_0<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,Dim2,i,j>
-operator*(const Tensor1_Expr<B,U,Dim01,k> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,k,i,j> &a)
-{
-  typedef const Tensor3_dg_times_Tensor1_0<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_times_Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/Tensor3_dg_times_Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,182 @@
+/* This file has all of the declarations for expressions like
+   Tensor3_dg*Tensor1 and Tensor1*Tensor3_dg, yielding a
+   Tensor2_symmetric or Tensor2. */
+
+/* A(i,j,k)*B(k)->Tensor2_symmetric */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, 
+  char i, char j, char k>
+class Tensor3_dg_times_Tensor1_2
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+  const Tensor1_Expr<B,U,Dim2,k> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N)  const
+  {
+    return iterA(N1,N2,Current_Dim-1)*iterB(Current_Dim-1)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &N) const
+  {
+    return iterA(N1,N2,0)*iterB(0);
+  }
+public:
+  Tensor3_dg_times_Tensor1_2(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+			     const Tensor1_Expr<B,U,Dim2,k> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim2>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, 
+  char i, char j, char k>
+inline const Tensor2_symmetric_Expr
+<const Tensor3_dg_times_Tensor1_2<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,i,j>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+	  const Tensor1_Expr<B,U,Dim2,k> &b)
+{
+  typedef const Tensor3_dg_times_Tensor1_2<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i,j>
+    (TensorExpr(a,b));
+}
+
+/* B(k)*A(i,j,k)->Tensor2_symmetric */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, 
+  char i, char j, char k>
+inline const Tensor2_symmetric_Expr
+<const Tensor3_dg_times_Tensor1_2<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,i,j>
+operator*(const Tensor1_Expr<B,U,Dim2,k> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
+{
+  typedef const Tensor3_dg_times_Tensor1_2<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i,j>
+    (TensorExpr(a,b));
+}
+
+/* A(i,k,j)*B(k)->Tensor2 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, 
+  char i, char j, char k>
+class Tensor3_dg_times_Tensor1_1
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,k,j> iterA;
+  const Tensor1_Expr<B,U,Dim01,k> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N)  const
+  {
+    return iterA(N1,Current_Dim-1,N2)*iterB(Current_Dim-1)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &N) const
+  {
+    return iterA(N1,0,N2)*iterB(0);
+  }
+public:
+  Tensor3_dg_times_Tensor1_1(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,k,j> &a,
+			     const Tensor1_Expr<B,U,Dim01,k> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim01>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, 
+  char i, char j, char k>
+inline const Tensor2_Expr<const Tensor3_dg_times_Tensor1_1<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,Dim2,i,j>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,k,j> &a,
+	  const Tensor1_Expr<B,U,Dim01,k> &b)
+{
+  typedef const Tensor3_dg_times_Tensor1_1<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j>
+    (TensorExpr(a,b));
+}
+
+/* B(k)*A(i,k,j)->Tensor2 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, 
+  char i, char j, char k>
+inline const Tensor2_Expr<const Tensor3_dg_times_Tensor1_1<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,Dim2,i,j>
+operator*(const Tensor1_Expr<B,U,Dim01,k> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,k,j> &a)
+{
+  typedef const Tensor3_dg_times_Tensor1_1<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j>
+    (TensorExpr(a,b));
+}
+
+/* A(k,i,j)*B(k)->Tensor2 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, 
+  char i, char j, char k>
+class Tensor3_dg_times_Tensor1_0
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,k,i,j> iterA;
+  const Tensor1_Expr<B,U,Dim01,k> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim> &N)  const
+  {
+    return iterA(N1,Current_Dim-1,N2)*iterB(Current_Dim-1)
+      + eval(N1,N2,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &N) const
+  {
+    return iterA(N1,0,N2)*iterB(0);
+  }
+public:
+  Tensor3_dg_times_Tensor1_0(const Tensor3_dg_Expr<A,T,Dim01,Dim2,k,i,j> &a,
+			     const Tensor1_Expr<B,U,Dim01,k> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim01>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, 
+  char i, char j, char k>
+inline const Tensor2_Expr<const Tensor3_dg_times_Tensor1_0<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,Dim2,i,j>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,k,i,j> &a,
+	  const Tensor1_Expr<B,U,Dim01,k> &b)
+{
+  typedef const Tensor3_dg_times_Tensor1_0<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j>
+    (TensorExpr(a,b));
+}
+
+/* B(k)*A(k,i,j)->Tensor2 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, 
+  char i, char j, char k>
+inline const Tensor2_Expr<const Tensor3_dg_times_Tensor1_0<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,Dim2,i,j>
+operator*(const Tensor1_Expr<B,U,Dim01,k> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,k,i,j> &a)
+{
+  typedef const Tensor3_dg_times_Tensor1_0<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_times_Tensor2.h
--- a/Tensor3_dg/Tensor3_dg_times_Tensor2.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,668 +0,0 @@
-/* This file has all of the declarations for expressions like
-   Tensor3_dg*Tensor2 and Tensor2*Tensor3_dg, yielding a
-   Tensor3_dg, Tensor3, or Tensor1. */
-
-/* A(i,j,k)*B(k,l)->Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
-  char i, char j, char k, char l>
-class Tensor3_dg_times_Tensor2_0
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-  const Tensor2_Expr<B,U,Dim2,Dim3,k,l> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
-		       const Number<Current_Dim> &N)  const
-  {
-    return iterA(N1,N2,Current_Dim-1)*iterB(Current_Dim-1,N3)
-      + eval(N1,N2,N3,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
-		       const Number<1> &N) const
-  {
-    return iterA(N1,N2,0)*iterB(0,N3);
-  }
-public:
-  Tensor3_dg_times_Tensor2_0(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-			     const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return eval(N1,N2,N3,Number<Dim2>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
-  char i, char j, char k, char l>
-inline const Tensor3_dg_Expr
-<const Tensor3_dg_times_Tensor2_0<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim3,i,j,l>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-	  const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b)
-{
-  typedef const Tensor3_dg_times_Tensor2_0<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>
-    TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim3,i,j,l>
-    (TensorExpr(a,b));
-}
-
-/* B(k,l)*A(i,j,k)->Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
-  char i, char j, char k, char l>
-inline const Tensor3_dg_Expr
-<const Tensor3_dg_times_Tensor2_0<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim3,i,j,l>
-operator*(const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
-{
-  typedef const Tensor3_dg_times_Tensor2_0<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>
-    TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim3,i,j,l>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)*B(l,k)->Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
-  char i, char j, char k, char l>
-class Tensor3_dg_times_Tensor2_1
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-  const Tensor2_Expr<B,U,Dim3,Dim2,l,k> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
-		       const Number<Current_Dim> &N)  const
-  {
-    return iterA(N1,N2,Current_Dim-1)*iterB(N3,Current_Dim-1)
-      + eval(N1,N2,N3,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
-		       const Number<1> &N) const
-  {
-    return iterA(N1,N2,0)*iterB(N3,0);
-  }
-public:
-  Tensor3_dg_times_Tensor2_1(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-			     const Tensor2_Expr<B,U,Dim3,Dim2,l,k> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return eval(N1,N2,N3,Number<Dim2>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
-  char i, char j, char k, char l>
-inline const Tensor3_dg_Expr
-<const Tensor3_dg_times_Tensor2_1<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim3,i,j,l>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-	  const Tensor2_Expr<B,U,Dim3,Dim2,l,k> &b)
-{
-  typedef const Tensor3_dg_times_Tensor2_1<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>
-    TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim3,i,j,l>
-    (TensorExpr(a,b));
-}
-
-/* B(l,k)*A(i,j,k)->Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
-  char i, char j, char k, char l>
-inline const Tensor3_dg_Expr
-<const Tensor3_dg_times_Tensor2_1<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim3,i,j,l>
-operator*(const Tensor2_Expr<B,U,Dim3,Dim2,l,k> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
-{
-  typedef const Tensor3_dg_times_Tensor2_1<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>
-    TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim3,i,j,l>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)*B(j,l)->Tensor3 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
-  char i, char j, char k, char l>
-class Tensor3_dg_times_Tensor2_1_0
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-  const Tensor2_Expr<B,U,Dim01,Dim3,j,l> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
-		       const Number<Current_Dim> &N)  const
-  {
-    return iterA(N1,Current_Dim-1,N2)*iterB(Current_Dim-1,N3)
-      + eval(N1,N2,N3,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
-		       const Number<1> &N) const
-  {
-    return iterA(N1,0,N2)*iterB(0,N3);
-  }
-public:
-  Tensor3_dg_times_Tensor2_1_0(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-			       const Tensor2_Expr<B,U,Dim01,Dim3,j,l> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return eval(N1,N2,N3,Number<Dim01>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
-  char i, char j, char k, char l>
-inline const Tensor3_Expr
-<const Tensor3_dg_times_Tensor2_1_0<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim2,Dim3,i,k,l>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-	  const Tensor2_Expr<B,U,Dim01,Dim3,j,l> &b)
-{
-  typedef const Tensor3_dg_times_Tensor2_1_0<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>
-    TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,Dim3,i,k,l>
-    (TensorExpr(a,b));
-}
-
-/* B(j,l)*A(i,j,k)->Tensor3 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
-  char i, char j, char k, char l>
-inline const Tensor3_Expr
-<const Tensor3_dg_times_Tensor2_1_0<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim2,Dim3,i,k,l>
-operator*(const Tensor2_Expr<B,U,Dim01,Dim3,j,l> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
-{
-  typedef const Tensor3_dg_times_Tensor2_1_0<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>
-    TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,Dim3,i,k,l>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)*B(l,j)->Tensor3 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
-  char i, char j, char k, char l>
-class Tensor3_dg_times_Tensor2_1_1
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-  const Tensor2_Expr<B,U,Dim3,Dim01,l,j> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
-		       const Number<Current_Dim> &N)  const
-  {
-    return iterA(N1,Current_Dim-1,N2)*iterB(N3,Current_Dim-1)
-      + eval(N1,N2,N3,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
-		       const Number<1> &N) const
-  {
-    return iterA(N1,0,N2)*iterB(N3,0);
-  }
-public:
-  Tensor3_dg_times_Tensor2_1_1(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-			       const Tensor2_Expr<B,U,Dim3,Dim01,l,j> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return eval(N1,N2,N3,Number<Dim01>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
-  char i, char j, char k, char l>
-inline const Tensor3_Expr
-<const Tensor3_dg_times_Tensor2_1_1<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim2,Dim3,i,k,l>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-	  const Tensor2_Expr<B,U,Dim3,Dim01,l,j> &b)
-{
-  typedef const Tensor3_dg_times_Tensor2_1_1<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>
-    TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,Dim3,i,k,l>
-    (TensorExpr(a,b));
-}
-
-/* B(l,j)*A(i,j,k)->Tensor3 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
-  char i, char j, char k, char l>
-inline const Tensor3_Expr
-<const Tensor3_dg_times_Tensor2_1_1<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim2,Dim3,i,k,l>
-operator*(const Tensor2_Expr<B,U,Dim3,Dim01,l,j> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
-{
-  typedef const Tensor3_dg_times_Tensor2_1_1<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>
-    TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,Dim3,i,k,l>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)*B(j,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-class Tensor3_dg_times_Tensor2_12
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-  const Tensor2_Expr<B,U,Dim01,Dim2,j,k> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,Current_Dim0-1,Current_Dim1-1)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,0,Current_Dim1-1)*iterB(0,Current_Dim1-1)
-      + eval(N1,Number<Dim01>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(N1,0,0)*iterB(0,0);
-  }
-public:
-  Tensor3_dg_times_Tensor2_12(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-			      const Tensor2_Expr<B,U,Dim01,Dim2,j,k> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim01>(),Number<Dim2>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_12<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,i>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-	  const Tensor2_Expr<B,U,Dim01,Dim2,j,k> &b)
-{
-  typedef const Tensor3_dg_times_Tensor2_12<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i>(TensorExpr(a,b));
-}
-
-/* B(j,k)*A(i,j,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_12<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,i>
-operator*(const Tensor2_Expr<B,U,Dim01,Dim2,j,k> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
-{
-  typedef const Tensor3_dg_times_Tensor2_12<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i>(TensorExpr(a,b));
-}
-
-/* A(i,j,k)*B(k,j)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-class Tensor3_dg_times_Tensor2_21
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-  const Tensor2_Expr<B,U,Dim2,Dim01,k,j> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,Current_Dim0-1,Current_Dim1-1)
-      *iterB(Current_Dim1-1,Current_Dim0-1)
-      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,0,Current_Dim1-1)*iterB(Current_Dim1-1,0)
-      + eval(N1,Number<Dim01>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(N1,0,0)*iterB(0,0);
-  }
-public:
-  Tensor3_dg_times_Tensor2_21(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-			      const Tensor2_Expr<B,U,Dim2,Dim01,k,j> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim01>(),Number<Dim2>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_21<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,i>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-	  const Tensor2_Expr<B,U,Dim2,Dim01,k,j> &b)
-{
-  typedef const Tensor3_dg_times_Tensor2_21<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i>(TensorExpr(a,b));
-}
-
-/* B(k,j)*A(i,j,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_21<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,i>
-operator*(const Tensor2_Expr<B,U,Dim2,Dim01,k,j> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
-{
-  typedef const Tensor3_dg_times_Tensor2_21<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i>(TensorExpr(a,b));
-}
-
-/* A(j,i,k)*B(j,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-class Tensor3_dg_times_Tensor2_02
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,i,k> iterA;
-  const Tensor2_Expr<B,U,Dim01,Dim2,j,k> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,N1,Current_Dim1-1)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,N1,Current_Dim1-1)*iterB(0,Current_Dim1-1)
-      + eval(N1,Number<Dim01>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,N1,0)*iterB(0,0);
-  }
-public:
-  Tensor3_dg_times_Tensor2_02(const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,i,k> &a,
-			      const Tensor2_Expr<B,U,Dim01,Dim2,j,k> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim01>(),Number<Dim2>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_02<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,i>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,i,k> &a,
-	  const Tensor2_Expr<B,U,Dim01,Dim2,j,k> &b)
-{
-  typedef const Tensor3_dg_times_Tensor2_02<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i>(TensorExpr(a,b));
-}
-
-/* B(j,k)*A(j,i,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_02<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,i>
-operator*(const Tensor2_Expr<B,U,Dim01,Dim2,j,k> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,i,k> &a)
-{
-  typedef const Tensor3_dg_times_Tensor2_02<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i>(TensorExpr(a,b));
-}
-
-/* A(k,i,j)*B(j,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-class Tensor3_dg_times_Tensor2_20
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,k,i,j> iterA;
-  const Tensor2_Expr<B,U,Dim2,Dim01,j,k> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,N1,Current_Dim1-1)
-      *iterB(Current_Dim1-1,Current_Dim0-1)
-      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,N1,Current_Dim1-1)*iterB(Current_Dim1-1,0)
-      + eval(N1,Number<Dim01>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,N1,0)*iterB(0,0);
-  }
-public:
-  Tensor3_dg_times_Tensor2_20(const Tensor3_dg_Expr<A,T,Dim01,Dim2,k,i,j> &a,
-			      const Tensor2_Expr<B,U,Dim2,Dim01,j,k> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim01>(),Number<Dim2>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_20<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,i>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,k,i,j> &a,
-	  const Tensor2_Expr<B,U,Dim2,Dim01,j,k> &b)
-{
-  typedef const Tensor3_dg_times_Tensor2_20<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i>(TensorExpr(a,b));
-}
-
-/* B(j,k)*A(k,i,j)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_20<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,i>
-operator*(const Tensor2_Expr<B,U,Dim2,Dim01,j,k> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,k,i,j> &a)
-{
-  typedef const Tensor3_dg_times_Tensor2_20<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i>(TensorExpr(a,b));
-}
-
-/* A(j,k,i)*B(j,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-class Tensor3_dg_times_Tensor2_01
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> iterA;
-  const Tensor2_Expr<B,U,Dim01,Dim01,j,k> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,Current_Dim1-1,N1)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,Current_Dim1-1,N1)*iterB(0,Current_Dim1-1)
-      + eval(N1,Number<Dim01>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,0,N1)*iterB(0,0);
-  }
-public:
-  Tensor3_dg_times_Tensor2_01(const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a,
-			      const Tensor2_Expr<B,U,Dim01,Dim01,j,k> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim01>(),Number<Dim01>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_01<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim2,i>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a,
-	  const Tensor2_Expr<B,U,Dim01,Dim01,j,k> &b)
-{
-  typedef const Tensor3_dg_times_Tensor2_01<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
-}
-
-/* B(j,k)*A(j,k,i)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_01<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim2,i>
-operator*(const Tensor2_Expr<B,U,Dim01,Dim01,j,k> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a)
-{
-  typedef const Tensor3_dg_times_Tensor2_01<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
-}
-
-/* A(j,k,i)*B(k,j)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-class Tensor3_dg_times_Tensor2_10
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> iterA;
-  const Tensor2_Expr<B,U,Dim01,Dim01,k,j> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,Current_Dim1-1,N1)
-      *iterB(Current_Dim1-1,Current_Dim0-1)
-      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,Current_Dim1-1,N1)*iterB(Current_Dim1-1,0)
-      + eval(N1,Number<Dim01>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,0,N1)*iterB(0,0);
-  }
-public:
-  Tensor3_dg_times_Tensor2_10(const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a,
-			      const Tensor2_Expr<B,U,Dim01,Dim01,k,j> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim01>(),Number<Dim01>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_10<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim2,i>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a,
-	  const Tensor2_Expr<B,U,Dim01,Dim01,k,j> &b)
-{
-  typedef const Tensor3_dg_times_Tensor2_10<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
-}
-
-/* B(k,j)*A(j,k,i)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_10<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim2,i>
-operator*(const Tensor2_Expr<B,U,Dim01,Dim01,k,j> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a)
-{
-  typedef const Tensor3_dg_times_Tensor2_10<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_times_Tensor2.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/Tensor3_dg_times_Tensor2.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,668 @@
+/* This file has all of the declarations for expressions like
+   Tensor3_dg*Tensor2 and Tensor2*Tensor3_dg, yielding a
+   Tensor3_dg, Tensor3, or Tensor1. */
+
+/* A(i,j,k)*B(k,l)->Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
+  char i, char j, char k, char l>
+class Tensor3_dg_times_Tensor2_0
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+  const Tensor2_Expr<B,U,Dim2,Dim3,k,l> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
+		       const Number<Current_Dim> &N)  const
+  {
+    return iterA(N1,N2,Current_Dim-1)*iterB(Current_Dim-1,N3)
+      + eval(N1,N2,N3,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
+		       const Number<1> &N) const
+  {
+    return iterA(N1,N2,0)*iterB(0,N3);
+  }
+public:
+  Tensor3_dg_times_Tensor2_0(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+			     const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return eval(N1,N2,N3,Number<Dim2>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
+  char i, char j, char k, char l>
+inline const Tensor3_dg_Expr
+<const Tensor3_dg_times_Tensor2_0<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim3,i,j,l>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+	  const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b)
+{
+  typedef const Tensor3_dg_times_Tensor2_0<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>
+    TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim3,i,j,l>
+    (TensorExpr(a,b));
+}
+
+/* B(k,l)*A(i,j,k)->Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
+  char i, char j, char k, char l>
+inline const Tensor3_dg_Expr
+<const Tensor3_dg_times_Tensor2_0<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim3,i,j,l>
+operator*(const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
+{
+  typedef const Tensor3_dg_times_Tensor2_0<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>
+    TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim3,i,j,l>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)*B(l,k)->Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
+  char i, char j, char k, char l>
+class Tensor3_dg_times_Tensor2_1
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+  const Tensor2_Expr<B,U,Dim3,Dim2,l,k> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
+		       const Number<Current_Dim> &N)  const
+  {
+    return iterA(N1,N2,Current_Dim-1)*iterB(N3,Current_Dim-1)
+      + eval(N1,N2,N3,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
+		       const Number<1> &N) const
+  {
+    return iterA(N1,N2,0)*iterB(N3,0);
+  }
+public:
+  Tensor3_dg_times_Tensor2_1(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+			     const Tensor2_Expr<B,U,Dim3,Dim2,l,k> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return eval(N1,N2,N3,Number<Dim2>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
+  char i, char j, char k, char l>
+inline const Tensor3_dg_Expr
+<const Tensor3_dg_times_Tensor2_1<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim3,i,j,l>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+	  const Tensor2_Expr<B,U,Dim3,Dim2,l,k> &b)
+{
+  typedef const Tensor3_dg_times_Tensor2_1<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>
+    TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim3,i,j,l>
+    (TensorExpr(a,b));
+}
+
+/* B(l,k)*A(i,j,k)->Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
+  char i, char j, char k, char l>
+inline const Tensor3_dg_Expr
+<const Tensor3_dg_times_Tensor2_1<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim3,i,j,l>
+operator*(const Tensor2_Expr<B,U,Dim3,Dim2,l,k> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
+{
+  typedef const Tensor3_dg_times_Tensor2_1<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>
+    TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim3,i,j,l>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)*B(j,l)->Tensor3 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
+  char i, char j, char k, char l>
+class Tensor3_dg_times_Tensor2_1_0
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+  const Tensor2_Expr<B,U,Dim01,Dim3,j,l> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
+		       const Number<Current_Dim> &N)  const
+  {
+    return iterA(N1,Current_Dim-1,N2)*iterB(Current_Dim-1,N3)
+      + eval(N1,N2,N3,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
+		       const Number<1> &N) const
+  {
+    return iterA(N1,0,N2)*iterB(0,N3);
+  }
+public:
+  Tensor3_dg_times_Tensor2_1_0(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+			       const Tensor2_Expr<B,U,Dim01,Dim3,j,l> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return eval(N1,N2,N3,Number<Dim01>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
+  char i, char j, char k, char l>
+inline const Tensor3_Expr
+<const Tensor3_dg_times_Tensor2_1_0<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim2,Dim3,i,k,l>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+	  const Tensor2_Expr<B,U,Dim01,Dim3,j,l> &b)
+{
+  typedef const Tensor3_dg_times_Tensor2_1_0<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>
+    TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,Dim3,i,k,l>
+    (TensorExpr(a,b));
+}
+
+/* B(j,l)*A(i,j,k)->Tensor3 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
+  char i, char j, char k, char l>
+inline const Tensor3_Expr
+<const Tensor3_dg_times_Tensor2_1_0<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim2,Dim3,i,k,l>
+operator*(const Tensor2_Expr<B,U,Dim01,Dim3,j,l> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
+{
+  typedef const Tensor3_dg_times_Tensor2_1_0<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>
+    TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,Dim3,i,k,l>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)*B(l,j)->Tensor3 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
+  char i, char j, char k, char l>
+class Tensor3_dg_times_Tensor2_1_1
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+  const Tensor2_Expr<B,U,Dim3,Dim01,l,j> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
+		       const Number<Current_Dim> &N)  const
+  {
+    return iterA(N1,Current_Dim-1,N2)*iterB(N3,Current_Dim-1)
+      + eval(N1,N2,N3,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
+		       const Number<1> &N) const
+  {
+    return iterA(N1,0,N2)*iterB(N3,0);
+  }
+public:
+  Tensor3_dg_times_Tensor2_1_1(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+			       const Tensor2_Expr<B,U,Dim3,Dim01,l,j> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return eval(N1,N2,N3,Number<Dim01>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
+  char i, char j, char k, char l>
+inline const Tensor3_Expr
+<const Tensor3_dg_times_Tensor2_1_1<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim2,Dim3,i,k,l>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+	  const Tensor2_Expr<B,U,Dim3,Dim01,l,j> &b)
+{
+  typedef const Tensor3_dg_times_Tensor2_1_1<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>
+    TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,Dim3,i,k,l>
+    (TensorExpr(a,b));
+}
+
+/* B(l,j)*A(i,j,k)->Tensor3 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
+  char i, char j, char k, char l>
+inline const Tensor3_Expr
+<const Tensor3_dg_times_Tensor2_1_1<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim2,Dim3,i,k,l>
+operator*(const Tensor2_Expr<B,U,Dim3,Dim01,l,j> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
+{
+  typedef const Tensor3_dg_times_Tensor2_1_1<A,B,T,U,Dim01,Dim2,Dim3,i,j,k,l>
+    TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,Dim3,i,k,l>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)*B(j,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+class Tensor3_dg_times_Tensor2_12
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+  const Tensor2_Expr<B,U,Dim01,Dim2,j,k> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,Current_Dim0-1,Current_Dim1-1)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,0,Current_Dim1-1)*iterB(0,Current_Dim1-1)
+      + eval(N1,Number<Dim01>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(N1,0,0)*iterB(0,0);
+  }
+public:
+  Tensor3_dg_times_Tensor2_12(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+			      const Tensor2_Expr<B,U,Dim01,Dim2,j,k> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim01>(),Number<Dim2>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_12<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,i>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+	  const Tensor2_Expr<B,U,Dim01,Dim2,j,k> &b)
+{
+  typedef const Tensor3_dg_times_Tensor2_12<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i>(TensorExpr(a,b));
+}
+
+/* B(j,k)*A(i,j,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_12<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,i>
+operator*(const Tensor2_Expr<B,U,Dim01,Dim2,j,k> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
+{
+  typedef const Tensor3_dg_times_Tensor2_12<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i>(TensorExpr(a,b));
+}
+
+/* A(i,j,k)*B(k,j)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+class Tensor3_dg_times_Tensor2_21
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+  const Tensor2_Expr<B,U,Dim2,Dim01,k,j> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,Current_Dim0-1,Current_Dim1-1)
+      *iterB(Current_Dim1-1,Current_Dim0-1)
+      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,0,Current_Dim1-1)*iterB(Current_Dim1-1,0)
+      + eval(N1,Number<Dim01>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(N1,0,0)*iterB(0,0);
+  }
+public:
+  Tensor3_dg_times_Tensor2_21(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+			      const Tensor2_Expr<B,U,Dim2,Dim01,k,j> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim01>(),Number<Dim2>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_21<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,i>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+	  const Tensor2_Expr<B,U,Dim2,Dim01,k,j> &b)
+{
+  typedef const Tensor3_dg_times_Tensor2_21<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i>(TensorExpr(a,b));
+}
+
+/* B(k,j)*A(i,j,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_21<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,i>
+operator*(const Tensor2_Expr<B,U,Dim2,Dim01,k,j> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
+{
+  typedef const Tensor3_dg_times_Tensor2_21<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i>(TensorExpr(a,b));
+}
+
+/* A(j,i,k)*B(j,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+class Tensor3_dg_times_Tensor2_02
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,i,k> iterA;
+  const Tensor2_Expr<B,U,Dim01,Dim2,j,k> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,N1,Current_Dim1-1)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,N1,Current_Dim1-1)*iterB(0,Current_Dim1-1)
+      + eval(N1,Number<Dim01>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,N1,0)*iterB(0,0);
+  }
+public:
+  Tensor3_dg_times_Tensor2_02(const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,i,k> &a,
+			      const Tensor2_Expr<B,U,Dim01,Dim2,j,k> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim01>(),Number<Dim2>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_02<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,i>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,i,k> &a,
+	  const Tensor2_Expr<B,U,Dim01,Dim2,j,k> &b)
+{
+  typedef const Tensor3_dg_times_Tensor2_02<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i>(TensorExpr(a,b));
+}
+
+/* B(j,k)*A(j,i,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_02<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,i>
+operator*(const Tensor2_Expr<B,U,Dim01,Dim2,j,k> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,i,k> &a)
+{
+  typedef const Tensor3_dg_times_Tensor2_02<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i>(TensorExpr(a,b));
+}
+
+/* A(k,i,j)*B(j,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+class Tensor3_dg_times_Tensor2_20
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,k,i,j> iterA;
+  const Tensor2_Expr<B,U,Dim2,Dim01,j,k> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,N1,Current_Dim1-1)
+      *iterB(Current_Dim1-1,Current_Dim0-1)
+      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,N1,Current_Dim1-1)*iterB(Current_Dim1-1,0)
+      + eval(N1,Number<Dim01>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,N1,0)*iterB(0,0);
+  }
+public:
+  Tensor3_dg_times_Tensor2_20(const Tensor3_dg_Expr<A,T,Dim01,Dim2,k,i,j> &a,
+			      const Tensor2_Expr<B,U,Dim2,Dim01,j,k> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim01>(),Number<Dim2>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_20<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,i>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,k,i,j> &a,
+	  const Tensor2_Expr<B,U,Dim2,Dim01,j,k> &b)
+{
+  typedef const Tensor3_dg_times_Tensor2_20<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i>(TensorExpr(a,b));
+}
+
+/* B(j,k)*A(k,i,j)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_20<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,i>
+operator*(const Tensor2_Expr<B,U,Dim2,Dim01,j,k> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,k,i,j> &a)
+{
+  typedef const Tensor3_dg_times_Tensor2_20<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i>(TensorExpr(a,b));
+}
+
+/* A(j,k,i)*B(j,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+class Tensor3_dg_times_Tensor2_01
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> iterA;
+  const Tensor2_Expr<B,U,Dim01,Dim01,j,k> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,Current_Dim1-1,N1)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,Current_Dim1-1,N1)*iterB(0,Current_Dim1-1)
+      + eval(N1,Number<Dim01>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,0,N1)*iterB(0,0);
+  }
+public:
+  Tensor3_dg_times_Tensor2_01(const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a,
+			      const Tensor2_Expr<B,U,Dim01,Dim01,j,k> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim01>(),Number<Dim01>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_01<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim2,i>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a,
+	  const Tensor2_Expr<B,U,Dim01,Dim01,j,k> &b)
+{
+  typedef const Tensor3_dg_times_Tensor2_01<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
+}
+
+/* B(j,k)*A(j,k,i)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_01<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim2,i>
+operator*(const Tensor2_Expr<B,U,Dim01,Dim01,j,k> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a)
+{
+  typedef const Tensor3_dg_times_Tensor2_01<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
+}
+
+/* A(j,k,i)*B(k,j)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+class Tensor3_dg_times_Tensor2_10
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> iterA;
+  const Tensor2_Expr<B,U,Dim01,Dim01,k,j> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,Current_Dim1-1,N1)
+      *iterB(Current_Dim1-1,Current_Dim0-1)
+      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,Current_Dim1-1,N1)*iterB(Current_Dim1-1,0)
+      + eval(N1,Number<Dim01>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,0,N1)*iterB(0,0);
+  }
+public:
+  Tensor3_dg_times_Tensor2_10(const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a,
+			      const Tensor2_Expr<B,U,Dim01,Dim01,k,j> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim01>(),Number<Dim01>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_10<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim2,i>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a,
+	  const Tensor2_Expr<B,U,Dim01,Dim01,k,j> &b)
+{
+  typedef const Tensor3_dg_times_Tensor2_10<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
+}
+
+/* B(k,j)*A(j,k,i)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_10<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim2,i>
+operator*(const Tensor2_Expr<B,U,Dim01,Dim01,k,j> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a)
+{
+  typedef const Tensor3_dg_times_Tensor2_10<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_times_Tensor2_symmetric.h
--- a/Tensor3_dg/Tensor3_dg_times_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,668 +0,0 @@
-/* This file has all of the declarations for expressions like
-   Tensor3_dg*Tensor2_symmetric and Tensor2_symmetric*Tensor3_dg,
-   yielding a Tensor3_dg, Tensor3, or Tensor1. */
-
-/* A(i,j,k)*B(k,l)->Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k, char l>
-class Tensor3_dg_times_Tensor2_symmetric_0
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim2,k,l> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
-		       const Number<Current_Dim> &N)  const
-  {
-    return iterA(N1,N2,Current_Dim-1)*iterB(Current_Dim-1,N3)
-      + eval(N1,N2,N3,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
-		       const Number<1> &N) const
-  {
-    return iterA(N1,N2,0)*iterB(0,N3);
-  }
-public:
-  Tensor3_dg_times_Tensor2_symmetric_0(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-			     const Tensor2_symmetric_Expr<B,U,Dim2,k,l> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return eval(N1,N2,N3,Number<Dim2>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k, char l>
-inline const Tensor3_dg_Expr
-<const Tensor3_dg_times_Tensor2_symmetric_0<A,B,T,U,Dim01,Dim2,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim2,i,j,l>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim2,k,l> &b)
-{
-  typedef const Tensor3_dg_times_Tensor2_symmetric_0<A,B,T,U,Dim01,Dim2,i,j,k,l>
-    TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,l>
-    (TensorExpr(a,b));
-}
-
-/* B(k,l)*A(i,j,k)->Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k, char l>
-inline const Tensor3_dg_Expr
-<const Tensor3_dg_times_Tensor2_symmetric_0<A,B,T,U,Dim01,Dim2,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim2,i,j,l>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim2,k,l> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
-{
-  typedef const Tensor3_dg_times_Tensor2_symmetric_0<A,B,T,U,Dim01,Dim2,i,j,k,l>
-    TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,l>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)*B(l,k)->Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k, char l>
-class Tensor3_dg_times_Tensor2_symmetric_1
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim2,l,k> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
-		       const Number<Current_Dim> &N)  const
-  {
-    return iterA(N1,N2,Current_Dim-1)*iterB(N3,Current_Dim-1)
-      + eval(N1,N2,N3,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
-		       const Number<1> &N) const
-  {
-    return iterA(N1,N2,0)*iterB(N3,0);
-  }
-public:
-  Tensor3_dg_times_Tensor2_symmetric_1(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-			     const Tensor2_symmetric_Expr<B,U,Dim2,l,k> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return eval(N1,N2,N3,Number<Dim2>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k, char l>
-inline const Tensor3_dg_Expr
-<const Tensor3_dg_times_Tensor2_symmetric_1<A,B,T,U,Dim01,Dim2,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim2,i,j,l>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim2,l,k> &b)
-{
-  typedef const Tensor3_dg_times_Tensor2_symmetric_1<A,B,T,U,Dim01,Dim2,i,j,k,l>
-    TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,l>
-    (TensorExpr(a,b));
-}
-
-/* B(l,k)*A(i,j,k)->Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k, char l>
-inline const Tensor3_dg_Expr
-<const Tensor3_dg_times_Tensor2_symmetric_1<A,B,T,U,Dim01,Dim2,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim2,i,j,l>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim2,l,k> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
-{
-  typedef const Tensor3_dg_times_Tensor2_symmetric_1<A,B,T,U,Dim01,Dim2,i,j,k,l>
-    TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,l>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)*B(j,l)->Tensor3 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k, char l>
-class Tensor3_dg_times_Tensor2_symmetric_1_0
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim01,j,l> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
-		       const Number<Current_Dim> &N)  const
-  {
-    return iterA(N1,Current_Dim-1,N2)*iterB(Current_Dim-1,N3)
-      + eval(N1,N2,N3,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
-		       const Number<1> &N) const
-  {
-    return iterA(N1,0,N2)*iterB(0,N3);
-  }
-public:
-  Tensor3_dg_times_Tensor2_symmetric_1_0(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-			       const Tensor2_symmetric_Expr<B,U,Dim01,j,l> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return eval(N1,N2,N3,Number<Dim01>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k, char l>
-inline const Tensor3_Expr
-<const Tensor3_dg_times_Tensor2_symmetric_1_0<A,B,T,U,Dim01,Dim2,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim2,Dim01,i,k,l>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim01,j,l> &b)
-{
-  typedef const Tensor3_dg_times_Tensor2_symmetric_1_0<A,B,T,U,Dim01,Dim2,i,j,k,l>
-    TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,Dim01,i,k,l>
-    (TensorExpr(a,b));
-}
-
-/* B(j,l)*A(i,j,k)->Tensor3 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k, char l>
-inline const Tensor3_Expr
-<const Tensor3_dg_times_Tensor2_symmetric_1_0<A,B,T,U,Dim01,Dim2,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim2,Dim01,i,k,l>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim01,j,l> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
-{
-  typedef const Tensor3_dg_times_Tensor2_symmetric_1_0<A,B,T,U,Dim01,Dim2,i,j,k,l>
-    TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,Dim01,i,k,l>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)*B(l,j)->Tensor3 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k, char l>
-class Tensor3_dg_times_Tensor2_symmetric_1_1
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim01,l,j> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
-		       const Number<Current_Dim> &N)  const
-  {
-    return iterA(N1,Current_Dim-1,N2)*iterB(N3,Current_Dim-1)
-      + eval(N1,N2,N3,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
-		       const Number<1> &N) const
-  {
-    return iterA(N1,0,N2)*iterB(N3,0);
-  }
-public:
-  Tensor3_dg_times_Tensor2_symmetric_1_1(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-			       const Tensor2_symmetric_Expr<B,U,Dim01,l,j> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return eval(N1,N2,N3,Number<Dim01>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k, char l>
-inline const Tensor3_Expr
-<const Tensor3_dg_times_Tensor2_symmetric_1_1<A,B,T,U,Dim01,Dim2,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim2,Dim01,i,k,l>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim01,l,j> &b)
-{
-  typedef const Tensor3_dg_times_Tensor2_symmetric_1_1<A,B,T,U,Dim01,Dim2,i,j,k,l>
-    TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,Dim01,i,k,l>
-    (TensorExpr(a,b));
-}
-
-/* B(l,j)*A(i,j,k)->Tensor3 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k, char l>
-inline const Tensor3_Expr
-<const Tensor3_dg_times_Tensor2_symmetric_1_1<A,B,T,U,Dim01,Dim2,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim2,Dim01,i,k,l>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim01,l,j> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
-{
-  typedef const Tensor3_dg_times_Tensor2_symmetric_1_1<A,B,T,U,Dim01,Dim2,i,j,k,l>
-    TensorExpr;
-  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,Dim01,i,k,l>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)*B(j,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-class Tensor3_dg_times_Tensor2_symmetric_12
-{
-  const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,j,k> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,Current_Dim0-1,Current_Dim1-1)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,0,Current_Dim1-1)*iterB(0,Current_Dim1-1)
-      + eval(N1,Number<Dim>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(N1,0,0)*iterB(0,0);
-  }
-public:
-  Tensor3_dg_times_Tensor2_symmetric_12(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
-			      const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim>(),Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_symmetric_12<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,i>
-operator*(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
-{
-  typedef const Tensor3_dg_times_Tensor2_symmetric_12<A,B,T,U,Dim,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
-}
-
-/* B(j,k)*A(i,j,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_symmetric_12<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,i>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b,
-	  const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a)
-{
-  typedef const Tensor3_dg_times_Tensor2_symmetric_12<A,B,T,U,Dim,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
-}
-
-/* A(i,j,k)*B(k,j)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-class Tensor3_dg_times_Tensor2_symmetric_21
-{
-  const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,k,j> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,Current_Dim0-1,Current_Dim1-1)
-      *iterB(Current_Dim1-1,Current_Dim0-1)
-      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,0,Current_Dim1-1)*iterB(Current_Dim1-1,0)
-      + eval(N1,Number<Dim>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(N1,0,0)*iterB(0,0);
-  }
-public:
-  Tensor3_dg_times_Tensor2_symmetric_21(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
-			      const Tensor2_symmetric_Expr<B,U,Dim,k,j> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim>(),Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_symmetric_21<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,i>
-operator*(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,k,j> &b)
-{
-  typedef const Tensor3_dg_times_Tensor2_symmetric_21<A,B,T,U,Dim,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
-}
-
-/* B(k,j)*A(i,j,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_symmetric_21<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,i>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim,k,j> &b,
-	  const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a)
-{
-  typedef const Tensor3_dg_times_Tensor2_symmetric_21<A,B,T,U,Dim,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
-}
-
-/* A(j,i,k)*B(j,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-class Tensor3_dg_times_Tensor2_symmetric_02
-{
-  const Tensor3_dg_Expr<A,T,Dim,Dim,j,i,k> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,j,k> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,N1,Current_Dim1-1)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,N1,Current_Dim1-1)*iterB(0,Current_Dim1-1)
-      + eval(N1,Number<Dim>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,N1,0)*iterB(0,0);
-  }
-public:
-  Tensor3_dg_times_Tensor2_symmetric_02(const Tensor3_dg_Expr<A,T,Dim,Dim,j,i,k> &a,
-			      const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim>(),Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_symmetric_02<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,i>
-operator*(const Tensor3_dg_Expr<A,T,Dim,Dim,j,i,k> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
-{
-  typedef const Tensor3_dg_times_Tensor2_symmetric_02<A,B,T,U,Dim,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
-}
-
-/* B(j,k)*A(j,i,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_symmetric_02<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,i>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b,
-	  const Tensor3_dg_Expr<A,T,Dim,Dim,j,i,k> &a)
-{
-  typedef const Tensor3_dg_times_Tensor2_symmetric_02<A,B,T,U,Dim,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
-}
-
-/* A(k,i,j)*B(j,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-class Tensor3_dg_times_Tensor2_symmetric_20
-{
-  const Tensor3_dg_Expr<A,T,Dim,Dim,k,i,j> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,j,k> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,N1,Current_Dim1-1)
-      *iterB(Current_Dim1-1,Current_Dim0-1)
-      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,N1,Current_Dim1-1)*iterB(Current_Dim1-1,0)
-      + eval(N1,Number<Dim>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,N1,0)*iterB(0,0);
-  }
-public:
-  Tensor3_dg_times_Tensor2_symmetric_20(const Tensor3_dg_Expr<A,T,Dim,Dim,k,i,j> &a,
-			      const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim>(),Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_symmetric_20<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,i>
-operator*(const Tensor3_dg_Expr<A,T,Dim,Dim,k,i,j> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
-{
-  typedef const Tensor3_dg_times_Tensor2_symmetric_20<A,B,T,U,Dim,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
-}
-
-/* B(j,k)*A(k,i,j)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_symmetric_20<A,B,T,U,Dim,i,j,k>,
-  typename promote<T,U>::V,Dim,i>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b,
-	  const Tensor3_dg_Expr<A,T,Dim,Dim,k,i,j> &a)
-{
-  typedef const Tensor3_dg_times_Tensor2_symmetric_20<A,B,T,U,Dim,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
-}
-
-/* A(j,k,i)*B(j,k)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-class Tensor3_dg_times_Tensor2_symmetric_01
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim01,j,k> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,Current_Dim1-1,N1)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,Current_Dim1-1,N1)*iterB(0,Current_Dim1-1)
-      + eval(N1,Number<Dim01>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,0,N1)*iterB(0,0);
-  }
-public:
-  Tensor3_dg_times_Tensor2_symmetric_01(const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a,
-			      const Tensor2_symmetric_Expr<B,U,Dim01,j,k> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim01>(),Number<Dim01>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim2,i>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim01,j,k> &b)
-{
-  typedef const Tensor3_dg_times_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
-}
-
-/* B(j,k)*A(j,k,i)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim2,i>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim01,j,k> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a)
-{
-  typedef const Tensor3_dg_times_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
-}
-
-/* A(j,k,i)*B(k,j)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-class Tensor3_dg_times_Tensor2_symmetric_10
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim01,k,j> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,Current_Dim1-1,N1)
-      *iterB(Current_Dim1-1,Current_Dim0-1)
-      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,Current_Dim1-1,N1)*iterB(Current_Dim1-1,0)
-      + eval(N1,Number<Dim01>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,0,N1)*iterB(0,0);
-  }
-public:
-  Tensor3_dg_times_Tensor2_symmetric_10(const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a,
-			      const Tensor2_symmetric_Expr<B,U,Dim01,k,j> &b)
-    : iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1) const
-  {
-    return eval(N1,Number<Dim01>(),Number<Dim01>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_symmetric_10<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim2,i>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim01,k,j> &b)
-{
-  typedef const Tensor3_dg_times_Tensor2_symmetric_10<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
-}
-
-/* B(k,j)*A(j,k,i)->Tensor1 */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k>
-inline const Tensor1_Expr
-<const Tensor3_dg_times_Tensor2_symmetric_10<A,B,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim2,i>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim01,k,j> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a)
-{
-  typedef const Tensor3_dg_times_Tensor2_symmetric_10<A,B,T,U,Dim01,Dim2,i,j,k>
-    TensorExpr;
-  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_times_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/Tensor3_dg_times_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,668 @@
+/* This file has all of the declarations for expressions like
+   Tensor3_dg*Tensor2_symmetric and Tensor2_symmetric*Tensor3_dg,
+   yielding a Tensor3_dg, Tensor3, or Tensor1. */
+
+/* A(i,j,k)*B(k,l)->Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k, char l>
+class Tensor3_dg_times_Tensor2_symmetric_0
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim2,k,l> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
+		       const Number<Current_Dim> &N)  const
+  {
+    return iterA(N1,N2,Current_Dim-1)*iterB(Current_Dim-1,N3)
+      + eval(N1,N2,N3,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
+		       const Number<1> &N) const
+  {
+    return iterA(N1,N2,0)*iterB(0,N3);
+  }
+public:
+  Tensor3_dg_times_Tensor2_symmetric_0(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+			     const Tensor2_symmetric_Expr<B,U,Dim2,k,l> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return eval(N1,N2,N3,Number<Dim2>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k, char l>
+inline const Tensor3_dg_Expr
+<const Tensor3_dg_times_Tensor2_symmetric_0<A,B,T,U,Dim01,Dim2,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim2,i,j,l>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim2,k,l> &b)
+{
+  typedef const Tensor3_dg_times_Tensor2_symmetric_0<A,B,T,U,Dim01,Dim2,i,j,k,l>
+    TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,l>
+    (TensorExpr(a,b));
+}
+
+/* B(k,l)*A(i,j,k)->Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k, char l>
+inline const Tensor3_dg_Expr
+<const Tensor3_dg_times_Tensor2_symmetric_0<A,B,T,U,Dim01,Dim2,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim2,i,j,l>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim2,k,l> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
+{
+  typedef const Tensor3_dg_times_Tensor2_symmetric_0<A,B,T,U,Dim01,Dim2,i,j,k,l>
+    TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,l>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)*B(l,k)->Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k, char l>
+class Tensor3_dg_times_Tensor2_symmetric_1
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim2,l,k> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
+		       const Number<Current_Dim> &N)  const
+  {
+    return iterA(N1,N2,Current_Dim-1)*iterB(N3,Current_Dim-1)
+      + eval(N1,N2,N3,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
+		       const Number<1> &N) const
+  {
+    return iterA(N1,N2,0)*iterB(N3,0);
+  }
+public:
+  Tensor3_dg_times_Tensor2_symmetric_1(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+			     const Tensor2_symmetric_Expr<B,U,Dim2,l,k> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return eval(N1,N2,N3,Number<Dim2>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k, char l>
+inline const Tensor3_dg_Expr
+<const Tensor3_dg_times_Tensor2_symmetric_1<A,B,T,U,Dim01,Dim2,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim2,i,j,l>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim2,l,k> &b)
+{
+  typedef const Tensor3_dg_times_Tensor2_symmetric_1<A,B,T,U,Dim01,Dim2,i,j,k,l>
+    TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,l>
+    (TensorExpr(a,b));
+}
+
+/* B(l,k)*A(i,j,k)->Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k, char l>
+inline const Tensor3_dg_Expr
+<const Tensor3_dg_times_Tensor2_symmetric_1<A,B,T,U,Dim01,Dim2,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim2,i,j,l>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim2,l,k> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
+{
+  typedef const Tensor3_dg_times_Tensor2_symmetric_1<A,B,T,U,Dim01,Dim2,i,j,k,l>
+    TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,l>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)*B(j,l)->Tensor3 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k, char l>
+class Tensor3_dg_times_Tensor2_symmetric_1_0
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim01,j,l> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
+		       const Number<Current_Dim> &N)  const
+  {
+    return iterA(N1,Current_Dim-1,N2)*iterB(Current_Dim-1,N3)
+      + eval(N1,N2,N3,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
+		       const Number<1> &N) const
+  {
+    return iterA(N1,0,N2)*iterB(0,N3);
+  }
+public:
+  Tensor3_dg_times_Tensor2_symmetric_1_0(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+			       const Tensor2_symmetric_Expr<B,U,Dim01,j,l> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return eval(N1,N2,N3,Number<Dim01>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k, char l>
+inline const Tensor3_Expr
+<const Tensor3_dg_times_Tensor2_symmetric_1_0<A,B,T,U,Dim01,Dim2,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim2,Dim01,i,k,l>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim01,j,l> &b)
+{
+  typedef const Tensor3_dg_times_Tensor2_symmetric_1_0<A,B,T,U,Dim01,Dim2,i,j,k,l>
+    TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,Dim01,i,k,l>
+    (TensorExpr(a,b));
+}
+
+/* B(j,l)*A(i,j,k)->Tensor3 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k, char l>
+inline const Tensor3_Expr
+<const Tensor3_dg_times_Tensor2_symmetric_1_0<A,B,T,U,Dim01,Dim2,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim2,Dim01,i,k,l>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim01,j,l> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
+{
+  typedef const Tensor3_dg_times_Tensor2_symmetric_1_0<A,B,T,U,Dim01,Dim2,i,j,k,l>
+    TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,Dim01,i,k,l>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)*B(l,j)->Tensor3 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k, char l>
+class Tensor3_dg_times_Tensor2_symmetric_1_1
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim01,l,j> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
+		       const Number<Current_Dim> &N)  const
+  {
+    return iterA(N1,Current_Dim-1,N2)*iterB(N3,Current_Dim-1)
+      + eval(N1,N2,N3,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
+		       const Number<1> &N) const
+  {
+    return iterA(N1,0,N2)*iterB(N3,0);
+  }
+public:
+  Tensor3_dg_times_Tensor2_symmetric_1_1(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+			       const Tensor2_symmetric_Expr<B,U,Dim01,l,j> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return eval(N1,N2,N3,Number<Dim01>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k, char l>
+inline const Tensor3_Expr
+<const Tensor3_dg_times_Tensor2_symmetric_1_1<A,B,T,U,Dim01,Dim2,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim2,Dim01,i,k,l>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim01,l,j> &b)
+{
+  typedef const Tensor3_dg_times_Tensor2_symmetric_1_1<A,B,T,U,Dim01,Dim2,i,j,k,l>
+    TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,Dim01,i,k,l>
+    (TensorExpr(a,b));
+}
+
+/* B(l,j)*A(i,j,k)->Tensor3 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k, char l>
+inline const Tensor3_Expr
+<const Tensor3_dg_times_Tensor2_symmetric_1_1<A,B,T,U,Dim01,Dim2,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim2,Dim01,i,k,l>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim01,l,j> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
+{
+  typedef const Tensor3_dg_times_Tensor2_symmetric_1_1<A,B,T,U,Dim01,Dim2,i,j,k,l>
+    TensorExpr;
+  return Tensor3_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,Dim01,i,k,l>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)*B(j,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+class Tensor3_dg_times_Tensor2_symmetric_12
+{
+  const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,j,k> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,Current_Dim0-1,Current_Dim1-1)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,0,Current_Dim1-1)*iterB(0,Current_Dim1-1)
+      + eval(N1,Number<Dim>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(N1,0,0)*iterB(0,0);
+  }
+public:
+  Tensor3_dg_times_Tensor2_symmetric_12(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
+			      const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim>(),Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_symmetric_12<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,i>
+operator*(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
+{
+  typedef const Tensor3_dg_times_Tensor2_symmetric_12<A,B,T,U,Dim,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
+}
+
+/* B(j,k)*A(i,j,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_symmetric_12<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,i>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b,
+	  const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a)
+{
+  typedef const Tensor3_dg_times_Tensor2_symmetric_12<A,B,T,U,Dim,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
+}
+
+/* A(i,j,k)*B(k,j)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+class Tensor3_dg_times_Tensor2_symmetric_21
+{
+  const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,k,j> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,Current_Dim0-1,Current_Dim1-1)
+      *iterB(Current_Dim1-1,Current_Dim0-1)
+      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,0,Current_Dim1-1)*iterB(Current_Dim1-1,0)
+      + eval(N1,Number<Dim>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(N1,0,0)*iterB(0,0);
+  }
+public:
+  Tensor3_dg_times_Tensor2_symmetric_21(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
+			      const Tensor2_symmetric_Expr<B,U,Dim,k,j> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim>(),Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_symmetric_21<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,i>
+operator*(const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,k,j> &b)
+{
+  typedef const Tensor3_dg_times_Tensor2_symmetric_21<A,B,T,U,Dim,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
+}
+
+/* B(k,j)*A(i,j,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_symmetric_21<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,i>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim,k,j> &b,
+	  const Tensor3_dg_Expr<A,T,Dim,Dim,i,j,k> &a)
+{
+  typedef const Tensor3_dg_times_Tensor2_symmetric_21<A,B,T,U,Dim,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
+}
+
+/* A(j,i,k)*B(j,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+class Tensor3_dg_times_Tensor2_symmetric_02
+{
+  const Tensor3_dg_Expr<A,T,Dim,Dim,j,i,k> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,j,k> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,N1,Current_Dim1-1)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,N1,Current_Dim1-1)*iterB(0,Current_Dim1-1)
+      + eval(N1,Number<Dim>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,N1,0)*iterB(0,0);
+  }
+public:
+  Tensor3_dg_times_Tensor2_symmetric_02(const Tensor3_dg_Expr<A,T,Dim,Dim,j,i,k> &a,
+			      const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim>(),Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_symmetric_02<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,i>
+operator*(const Tensor3_dg_Expr<A,T,Dim,Dim,j,i,k> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
+{
+  typedef const Tensor3_dg_times_Tensor2_symmetric_02<A,B,T,U,Dim,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
+}
+
+/* B(j,k)*A(j,i,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_symmetric_02<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,i>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b,
+	  const Tensor3_dg_Expr<A,T,Dim,Dim,j,i,k> &a)
+{
+  typedef const Tensor3_dg_times_Tensor2_symmetric_02<A,B,T,U,Dim,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
+}
+
+/* A(k,i,j)*B(j,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+class Tensor3_dg_times_Tensor2_symmetric_20
+{
+  const Tensor3_dg_Expr<A,T,Dim,Dim,k,i,j> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,j,k> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,N1,Current_Dim1-1)
+      *iterB(Current_Dim1-1,Current_Dim0-1)
+      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,N1,Current_Dim1-1)*iterB(Current_Dim1-1,0)
+      + eval(N1,Number<Dim>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,N1,0)*iterB(0,0);
+  }
+public:
+  Tensor3_dg_times_Tensor2_symmetric_20(const Tensor3_dg_Expr<A,T,Dim,Dim,k,i,j> &a,
+			      const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim>(),Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_symmetric_20<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,i>
+operator*(const Tensor3_dg_Expr<A,T,Dim,Dim,k,i,j> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b)
+{
+  typedef const Tensor3_dg_times_Tensor2_symmetric_20<A,B,T,U,Dim,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
+}
+
+/* B(j,k)*A(k,i,j)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_symmetric_20<A,B,T,U,Dim,i,j,k>,
+  typename promote<T,U>::V,Dim,i>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim,j,k> &b,
+	  const Tensor3_dg_Expr<A,T,Dim,Dim,k,i,j> &a)
+{
+  typedef const Tensor3_dg_times_Tensor2_symmetric_20<A,B,T,U,Dim,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim,i>(TensorExpr(a,b));
+}
+
+/* A(j,k,i)*B(j,k)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+class Tensor3_dg_times_Tensor2_symmetric_01
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim01,j,k> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,Current_Dim1-1,N1)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,Current_Dim1-1,N1)*iterB(0,Current_Dim1-1)
+      + eval(N1,Number<Dim01>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,0,N1)*iterB(0,0);
+  }
+public:
+  Tensor3_dg_times_Tensor2_symmetric_01(const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a,
+			      const Tensor2_symmetric_Expr<B,U,Dim01,j,k> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim01>(),Number<Dim01>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim2,i>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim01,j,k> &b)
+{
+  typedef const Tensor3_dg_times_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
+}
+
+/* B(j,k)*A(j,k,i)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim2,i>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim01,j,k> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a)
+{
+  typedef const Tensor3_dg_times_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
+}
+
+/* A(j,k,i)*B(k,j)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+class Tensor3_dg_times_Tensor2_symmetric_10
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim01,k,j> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,Current_Dim1-1,N1)
+      *iterB(Current_Dim1-1,Current_Dim0-1)
+      + eval(N1,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,Current_Dim1-1,N1)*iterB(Current_Dim1-1,0)
+      + eval(N1,Number<Dim01>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,0,N1)*iterB(0,0);
+  }
+public:
+  Tensor3_dg_times_Tensor2_symmetric_10(const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a,
+			      const Tensor2_symmetric_Expr<B,U,Dim01,k,j> &b)
+    : iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1) const
+  {
+    return eval(N1,Number<Dim01>(),Number<Dim01>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_symmetric_10<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim2,i>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim01,k,j> &b)
+{
+  typedef const Tensor3_dg_times_Tensor2_symmetric_10<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
+}
+
+/* B(k,j)*A(j,k,i)->Tensor1 */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k>
+inline const Tensor1_Expr
+<const Tensor3_dg_times_Tensor2_symmetric_10<A,B,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim2,i>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim01,k,j> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,j,k,i> &a)
+{
+  typedef const Tensor3_dg_times_Tensor2_symmetric_10<A,B,T,U,Dim01,Dim2,i,j,k>
+    TensorExpr;
+  return Tensor1_Expr<TensorExpr,typename promote<T,U>::V,Dim2,i>(TensorExpr(a,b));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_times_Tensor3_dg.h
--- a/Tensor3_dg/Tensor3_dg_times_Tensor3_dg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,192 +0,0 @@
-/* This file has all of the declarations for expressions like
-   Tensor3_dg*Tensor3_dg yielding a Tensor2 or Tensor4_ddg. */
-
-/* A(i,j,k)*B(j,k,l) */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k, char l>
-class Tensor3_dg_times_Tensor3_dg_12_01
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim01,i,j,k> iterA;
-  const Tensor3_dg_Expr<B,U,Dim01,Dim2,j,k,l> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1) const
-  {
-    return iterA(N1,Current_Dim0-1,Current_Dim1-1)
-      *iterB(Current_Dim0-1,Current_Dim1-1,N2)
-      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1) const
-  {
-    return iterA(N1,0,Current_Dim1-1)*iterB(0,Current_Dim1-1,N2)
-      + eval(N1,N2,Number<Dim01>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0, const Number<1> &ND1) const
-  {
-    return iterA(N1,0,0)*iterB(0,0,N2);
-  }
-public:
-  Tensor3_dg_times_Tensor3_dg_12_01
-  (const Tensor3_dg_Expr<A,T,Dim01,Dim01,i,j,k> &a,
-   const Tensor3_dg_Expr<B,U,Dim01,Dim2,j,k,l> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim01>(),Number<Dim01>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k, char l>
-inline const Tensor2_Expr
-<const Tensor3_dg_times_Tensor3_dg_12_01<A,B,T,U,Dim01,Dim2,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim2,i,l>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim01,i,j,k> &a,
-	  const Tensor3_dg_Expr<B,U,Dim01,Dim2,j,k,l> &b)
-{
-  typedef const Tensor3_dg_times_Tensor3_dg_12_01<A,B,T,U,Dim01,Dim2,i,j,k,l>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,l>
-    (TensorExpr(a,b));
-}
-
-/* B(j,k,l)*A(i,j,k) */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k, char l>
-inline const Tensor2_Expr
-<const Tensor3_dg_times_Tensor3_dg_12_01<A,B,T,U,Dim01,Dim2,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim2,i,l>
-operator*(const Tensor3_dg_Expr<B,U,Dim01,Dim2,j,k,l> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim01,i,j,k> &a)
-{
-  typedef const Tensor3_dg_times_Tensor3_dg_12_01<A,B,T,U,Dim01,Dim2,i,j,k,l>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,l>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)*B(k,l,j) */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k, char l>
-class Tensor3_dg_times_Tensor3_dg_12_20
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-  const Tensor3_dg_Expr<B,U,Dim2,Dim01,k,l,j> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1) const
-  {
-    return iterA(N1,Current_Dim0-1,Current_Dim1-1)
-      *iterB(Current_Dim1-1,N2,Current_Dim0-1)
-      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1) const
-  {
-    return iterA(N1,0,Current_Dim1-1)*iterB(Current_Dim1-1,N2,0)
-      + eval(N1,N2,Number<Dim01>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0, const Number<1> &ND1) const
-  {
-    return iterA(N1,0,0)*iterB(0,N2,0);
-  }
-public:
-  Tensor3_dg_times_Tensor3_dg_12_20
-  (const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-   const Tensor3_dg_Expr<B,U,Dim2,Dim01,k,l,j> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim01>(),Number<Dim2>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k, char l>
-inline const Tensor2_Expr
-<const Tensor3_dg_times_Tensor3_dg_12_20<A,B,T,U,Dim01,Dim2,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim2,i,l>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-	  const Tensor3_dg_Expr<B,U,Dim2,Dim01,k,l,j> &b)
-{
-  typedef const Tensor3_dg_times_Tensor3_dg_12_20<A,B,T,U,Dim01,Dim2,i,j,k,l>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,l>
-    (TensorExpr(a,b));
-}
-
-/* B(k,l,j)*A(i,j,k) */
-
-template<class A, class B, class T, class U, int Dim01, int Dim2,
-  char i, char j, char k, char l>
-inline const Tensor2_Expr
-<const Tensor3_dg_times_Tensor3_dg_12_20<A,B,T,U,Dim01,Dim2,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim2,i,l>
-operator*(const Tensor3_dg_Expr<B,U,Dim2,Dim01,k,l,j> &b,
-	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
-{
-  typedef const Tensor3_dg_times_Tensor3_dg_12_20<A,B,T,U,Dim01,Dim2,i,j,k,l>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,l>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k)*B(l,m,k) -> Tensor4_ddg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23, int Dim2,
-  char i, char j, char k, char l, char m>
-class Tensor3_dg_times_Tensor3_dg_2
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-  const Tensor3_dg_Expr<B,U,Dim23,Dim2,l,m,k> iterB;
-
-  template<int Current_Dim0>
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3, const int N4,
-		       const Number<Current_Dim0> &ND0) const
-  {
-    return iterA(N1,N2,Current_Dim0-1)*iterB(N3,N4,Current_Dim0-1)
-      + eval(N1,N2,N3,N4,Number<Current_Dim0-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3, const int N4,
-		       const Number<1> &ND0) const
-  {
-    return iterA(N1,N2,0)*iterB(N3,N4,0);
-  }
-public:
-  Tensor3_dg_times_Tensor3_dg_2
-  (const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-   const Tensor3_dg_Expr<B,U,Dim23,Dim2,l,m,k> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-			  const int N4) const
-  {
-    return eval(N1,N2,N3,N4,Number<Dim2>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim23, int Dim2,
-  char i, char j, char k, char l, char m>
-inline const Tensor4_ddg_Expr
-<const Tensor3_dg_times_Tensor3_dg_2<A,B,T,U,Dim01,Dim23,Dim2,i,j,k,l,m>,
-  typename promote<T,U>::V,Dim01,Dim23,i,j,l,m>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-	  const Tensor3_dg_Expr<B,U,Dim23,Dim2,l,m,k> &b)
-{
-  typedef const Tensor3_dg_times_Tensor3_dg_2
-    <A,B,T,U,Dim01,Dim23,Dim2,i,j,k,l,m> TensorExpr;
-  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,l,m>
-    (TensorExpr(a,b));
-}
-
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_times_Tensor3_dg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/Tensor3_dg_times_Tensor3_dg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,192 @@
+/* This file has all of the declarations for expressions like
+   Tensor3_dg*Tensor3_dg yielding a Tensor2 or Tensor4_ddg. */
+
+/* A(i,j,k)*B(j,k,l) */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k, char l>
+class Tensor3_dg_times_Tensor3_dg_12_01
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim01,i,j,k> iterA;
+  const Tensor3_dg_Expr<B,U,Dim01,Dim2,j,k,l> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1) const
+  {
+    return iterA(N1,Current_Dim0-1,Current_Dim1-1)
+      *iterB(Current_Dim0-1,Current_Dim1-1,N2)
+      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1) const
+  {
+    return iterA(N1,0,Current_Dim1-1)*iterB(0,Current_Dim1-1,N2)
+      + eval(N1,N2,Number<Dim01>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0, const Number<1> &ND1) const
+  {
+    return iterA(N1,0,0)*iterB(0,0,N2);
+  }
+public:
+  Tensor3_dg_times_Tensor3_dg_12_01
+  (const Tensor3_dg_Expr<A,T,Dim01,Dim01,i,j,k> &a,
+   const Tensor3_dg_Expr<B,U,Dim01,Dim2,j,k,l> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim01>(),Number<Dim01>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k, char l>
+inline const Tensor2_Expr
+<const Tensor3_dg_times_Tensor3_dg_12_01<A,B,T,U,Dim01,Dim2,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim2,i,l>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim01,i,j,k> &a,
+	  const Tensor3_dg_Expr<B,U,Dim01,Dim2,j,k,l> &b)
+{
+  typedef const Tensor3_dg_times_Tensor3_dg_12_01<A,B,T,U,Dim01,Dim2,i,j,k,l>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,l>
+    (TensorExpr(a,b));
+}
+
+/* B(j,k,l)*A(i,j,k) */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k, char l>
+inline const Tensor2_Expr
+<const Tensor3_dg_times_Tensor3_dg_12_01<A,B,T,U,Dim01,Dim2,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim2,i,l>
+operator*(const Tensor3_dg_Expr<B,U,Dim01,Dim2,j,k,l> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim01,i,j,k> &a)
+{
+  typedef const Tensor3_dg_times_Tensor3_dg_12_01<A,B,T,U,Dim01,Dim2,i,j,k,l>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,l>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)*B(k,l,j) */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k, char l>
+class Tensor3_dg_times_Tensor3_dg_12_20
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+  const Tensor3_dg_Expr<B,U,Dim2,Dim01,k,l,j> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1) const
+  {
+    return iterA(N1,Current_Dim0-1,Current_Dim1-1)
+      *iterB(Current_Dim1-1,N2,Current_Dim0-1)
+      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1) const
+  {
+    return iterA(N1,0,Current_Dim1-1)*iterB(Current_Dim1-1,N2,0)
+      + eval(N1,N2,Number<Dim01>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0, const Number<1> &ND1) const
+  {
+    return iterA(N1,0,0)*iterB(0,N2,0);
+  }
+public:
+  Tensor3_dg_times_Tensor3_dg_12_20
+  (const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+   const Tensor3_dg_Expr<B,U,Dim2,Dim01,k,l,j> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim01>(),Number<Dim2>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k, char l>
+inline const Tensor2_Expr
+<const Tensor3_dg_times_Tensor3_dg_12_20<A,B,T,U,Dim01,Dim2,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim2,i,l>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+	  const Tensor3_dg_Expr<B,U,Dim2,Dim01,k,l,j> &b)
+{
+  typedef const Tensor3_dg_times_Tensor3_dg_12_20<A,B,T,U,Dim01,Dim2,i,j,k,l>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,l>
+    (TensorExpr(a,b));
+}
+
+/* B(k,l,j)*A(i,j,k) */
+
+template<class A, class B, class T, class U, int Dim01, int Dim2,
+  char i, char j, char k, char l>
+inline const Tensor2_Expr
+<const Tensor3_dg_times_Tensor3_dg_12_20<A,B,T,U,Dim01,Dim2,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim2,i,l>
+operator*(const Tensor3_dg_Expr<B,U,Dim2,Dim01,k,l,j> &b,
+	  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
+{
+  typedef const Tensor3_dg_times_Tensor3_dg_12_20<A,B,T,U,Dim01,Dim2,i,j,k,l>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,l>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k)*B(l,m,k) -> Tensor4_ddg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23, int Dim2,
+  char i, char j, char k, char l, char m>
+class Tensor3_dg_times_Tensor3_dg_2
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+  const Tensor3_dg_Expr<B,U,Dim23,Dim2,l,m,k> iterB;
+
+  template<int Current_Dim0>
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3, const int N4,
+		       const Number<Current_Dim0> &ND0) const
+  {
+    return iterA(N1,N2,Current_Dim0-1)*iterB(N3,N4,Current_Dim0-1)
+      + eval(N1,N2,N3,N4,Number<Current_Dim0-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3, const int N4,
+		       const Number<1> &ND0) const
+  {
+    return iterA(N1,N2,0)*iterB(N3,N4,0);
+  }
+public:
+  Tensor3_dg_times_Tensor3_dg_2
+  (const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+   const Tensor3_dg_Expr<B,U,Dim23,Dim2,l,m,k> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+			  const int N4) const
+  {
+    return eval(N1,N2,N3,N4,Number<Dim2>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim23, int Dim2,
+  char i, char j, char k, char l, char m>
+inline const Tensor4_ddg_Expr
+<const Tensor3_dg_times_Tensor3_dg_2<A,B,T,U,Dim01,Dim23,Dim2,i,j,k,l,m>,
+  typename promote<T,U>::V,Dim01,Dim23,i,j,l,m>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+	  const Tensor3_dg_Expr<B,U,Dim23,Dim2,l,m,k> &b)
+{
+  typedef const Tensor3_dg_times_Tensor3_dg_2
+    <A,B,T,U,Dim01,Dim23,Dim2,i,j,k,l,m> TensorExpr;
+  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,l,m>
+    (TensorExpr(a,b));
+}
+
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_times_generic.h
--- a/Tensor3_dg/Tensor3_dg_times_generic.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/* Multiplies a Tensor3_dg with a generic, yielding a Tensor3_dg. */
-
-template<class A, class T, class U, int Dim01, int Dim2, char i, char j,char k>
-class Tensor3_dg_times_generic
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-  const U d;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3)*d;
-  }
-
-  Tensor3_dg_times_generic(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
-			   const U &d0): iterA(a), d(d0) {}
-};
-
-/* A(i,j,k)*d0->Tensor3_dg */
-
-template<class A, class T, class U, int Dim01, int Dim2, char i, char j,char k>
-inline const Tensor3_dg_Expr<const Tensor3_dg_times_generic<A,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,Dim2,i,j,k>
-operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a, const U &d0)
-{
-  typedef const Tensor3_dg_times_generic<A,T,U,Dim01,Dim2,i,j,k> TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
-    (TensorExpr(a,d0));
-}
-
-/* d0*A(i,j,k)->Tensor3_dg */
-
-template<class A, class T, class U, int Dim01, int Dim2, char i, char j,char k>
-inline const Tensor3_dg_Expr<const Tensor3_dg_times_generic<A,T,U,Dim01,Dim2,i,j,k>,
-  typename promote<T,U>::V,Dim01,Dim2,i,j,k>
-operator*(const U &d0, const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
-{
-  typedef const Tensor3_dg_times_generic<A,T,U,Dim01,Dim2,i,j,k> TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
-    (TensorExpr(a,d0));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_times_generic.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/Tensor3_dg_times_generic.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+/* Multiplies a Tensor3_dg with a generic, yielding a Tensor3_dg. */
+
+template<class A, class T, class U, int Dim01, int Dim2, char i, char j,char k>
+class Tensor3_dg_times_generic
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+  const U d;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3)*d;
+  }
+
+  Tensor3_dg_times_generic(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a,
+			   const U &d0): iterA(a), d(d0) {}
+};
+
+/* A(i,j,k)*d0->Tensor3_dg */
+
+template<class A, class T, class U, int Dim01, int Dim2, char i, char j,char k>
+inline const Tensor3_dg_Expr<const Tensor3_dg_times_generic<A,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,Dim2,i,j,k>
+operator*(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a, const U &d0)
+{
+  typedef const Tensor3_dg_times_generic<A,T,U,Dim01,Dim2,i,j,k> TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
+    (TensorExpr(a,d0));
+}
+
+/* d0*A(i,j,k)->Tensor3_dg */
+
+template<class A, class T, class U, int Dim01, int Dim2, char i, char j,char k>
+inline const Tensor3_dg_Expr<const Tensor3_dg_times_generic<A,T,U,Dim01,Dim2,i,j,k>,
+  typename promote<T,U>::V,Dim01,Dim2,i,j,k>
+operator*(const U &d0, const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
+{
+  typedef const Tensor3_dg_times_generic<A,T,U,Dim01,Dim2,i,j,k> TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim2,i,j,k>
+    (TensorExpr(a,d0));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_value.h
--- a/Tensor3_dg/Tensor3_dg_value.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,470 +0,0 @@
-/* A general version, not for pointers. */
-
-template <class T, int Tensor_Dim01, int Tensor_Dim2>
-class Tensor3_dg
-{
-  T data[(Tensor_Dim01*(Tensor_Dim01+1))/2][Tensor_Dim2];
-public:
-  Tensor3_dg() {}
-
-  /* Tensor_Dim01=2, Tensor_Dim2=2 */
-  Tensor3_dg(T d000, T d001, T d010, T d011, T d110, T d111)
-  {
-    Tensor3_dg_constructor<T,Tensor_Dim01,Tensor_Dim2>
-      (data,d000,d001,d010,d011,d110,d111);
-  }
-
-  /* Tensor_Dim01=3, Tensor_Dim2=3 */
-  Tensor3_dg(T d000, T d001, T d002, T d010,
-	     T d011, T d012, T d020, T d021,
-	     T d022, T d110, T d111, T d112,
-	     T d120, T d121, T d122,
-	     T d220, T d221, T d222)
-  {
-    Tensor3_dg_constructor<T,Tensor_Dim01,Tensor_Dim2>
-      (data,d000,d001,d002,d010,d011,d012,d020,d021,
-       d022,d110,d111,d112,d120,d121,d122,d220,d221,d222);
-  }
-
-  /* Tensor_Dim01=4, Tensor_Dim2=4 */
-  Tensor3_dg(T d000, T d001, T d002, T d003,
-	     T d010, T d011, T d012, T d013,
-	     T d020, T d021, T d022, T d023,
-	     T d030, T d031, T d032, T d033,
-	     T d110, T d111, T d112, T d113,
-	     T d120, T d121, T d122, T d123,
-	     T d130, T d131, T d132, T d133,
-	     T d220, T d221, T d222, T d223,
-	     T d230, T d231, T d232, T d233,
-	     T d330, T d331, T d332, T d333)
-  {
-    Tensor3_dg_constructor<T,Tensor_Dim01,Tensor_Dim2>
-      (data,d000,d001,d002,d003,d010,d011,d012,d013,
-       d020,d021,d022,d023,d030,d031,d032,d033,
-       d110,d111,d112,d113,d120,d121,d122,d123,
-       d130,d131,d132,d133,d220,d221,d222,d223,
-       d230,d231,d232,d233,d330,d331,d332,d333);
-  }
-
-  /* Tensor_Dim01=4, Tensor_Dim2=3 */
-  Tensor3_dg(T d000, T d001, T d002, T d010, T d011, T d012,
-	     T d020, T d021, T d022, T d030, T d031, T d032,
-	     T d110, T d111, T d112, T d120, T d121, T d122,
-	     T d130, T d131, T d132, T d220, T d221, T d222,
-	     T d230, T d231, T d232, T d330, T d331, T d332)
-  {
-    Tensor3_dg_constructor<T,Tensor_Dim01,Tensor_Dim2>
-      (data,d000,d001,d002,d010,d011,d012,
-       d020,d021,d022,d030,d031,d032,
-       d110,d111,d112,d120,d121,d122,
-       d130,d131,d132,d220,d221,d222,
-       d230,d231,d232,d330,d331,d332);
-  }
-
-  /* There are two operator(int,int,int)'s, one for non-consts that lets you
-     change the value, and one for consts that doesn't. */
-
-  T & operator()(const int N1, const int N2, const int N3)
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim01 || N1<0
-       || N2>=Tensor_Dim01 || N2<0 || N3>=Tensor_Dim2 || N3<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor3_dg<T,"
-          << Tensor_Dim01 << "," << Tensor_Dim2
-          << ">.operator("
-          << N1 << "," << N2 << "," << N3 << ")" << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N1>N2 ? data[N1+(N2*(2*Tensor_Dim01-N2-1))/2][N3]
-      : data[N2+(N1*(2*Tensor_Dim01-N1-1))/2][N3];
-  }
-
-  T operator()(const int N1, const int N2, const int N3) const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim01 || N1<0
-       || N2>=Tensor_Dim01 || N2<0 || N3>=Tensor_Dim2 || N3<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor3_dg<T,"
-          << Tensor_Dim01 << "," << Tensor_Dim2
-          << ">.operator("
-          << N1 << "," << N2 << "," << N3 << ") const"
-          << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N1>N2 ? data[N1+(N2*(2*Tensor_Dim01-N2-1))/2][N3]
-      : data[N2+(N1*(2*Tensor_Dim01-N1-1))/2][N3];
-  }
-
-  /* These operator()'s are the first part in constructing template
-     expressions. */
-
-  template<char i, char j, char k, int Dim01, int Dim2>
-  Tensor3_dg_Expr<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k>
-  operator()(const Index<i,Dim01> index1, const Index<j,Dim01> index2,
-	     const Index<k,Dim2> index3)
-  {
-    return Tensor3_dg_Expr<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-      T,Dim01,Dim2,i,j,k>(*this);
-  }
-
-  template<char i, char j, char k, int Dim01, int Dim2>
-  Tensor3_dg_Expr<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-    T,Dim01,Dim2,i,j,k> operator()
-    (const Index<i,Dim01> index1, const Index<j,Dim01> index2,
-     const Index<k,Dim2> index3) const
-  {
-    return Tensor3_dg_Expr<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-      T,Dim01,Dim2,i,j,k>(*this);
-  }
-
-  /* These operators are for internal contractions. The commented out
-     versions are more general, but are ambiguous.  This means,
-     unfortunately, that you can't do something like A(i,j,j) where i
-     and j have different dimensions. */
-
-  /* A(i,j,j) */
-
-  template<char i, char j, int Dim>
-  inline Tensor1_Expr<const Tensor3_contracted_12<Tensor3_dg
-  <T,Tensor_Dim01,Tensor_Dim2>,T,Dim>,T,Dim,i>
-  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
-	     const Index<j,Dim> index3) const
-  {
-    typedef const Tensor3_contracted_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-      T,Dim> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-  template<char i, char j, int Dim>
-  inline Tensor1_Expr<const Tensor3_contracted_12<Tensor3_dg
-  <T,Tensor_Dim01,Tensor_Dim2>,T,Dim>,T,Dim,i>
-  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
-	     const Index<j,Dim> index3)
-  {
-    typedef const Tensor3_contracted_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-      T,Dim> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-//    template<char i, char j, int Dim0, int Dim12>
-//    inline Tensor1_Expr<const Tensor3_contracted_12<Tensor3_dg
-//    <T,Tensor_Dim01,Tensor_Dim2>,T,Dim12>,T,Dim0,i>
-//    operator()(const Index<i,Dim0> index1, const Index<j,Dim12> index2,
-//  	     const Index<j,Dim12> index3) const
-//    {
-//      typedef const Tensor3_contracted_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-//        T,Dim12> TensorExpr;
-//      return Tensor1_Expr<TensorExpr,T,Dim0,i>(TensorExpr(*this));
-//    }
-
-  /* A(j,i,j) */
-
-  template<char i, char j, int Dim>
-  inline Tensor1_Expr<const Tensor3_contracted_02<Tensor3_dg
-  <T,Tensor_Dim01,Tensor_Dim2>,T,Dim>,T,Dim,i>
-  operator()(const Index<j,Dim> index1, const Index<i,Dim> index2,
-	     const Index<j,Dim> index3) const
-  {
-    typedef const Tensor3_contracted_02<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-      T,Dim> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-  template<char i, char j, int Dim>
-  inline Tensor1_Expr<const Tensor3_contracted_02<Tensor3_dg
-  <T,Tensor_Dim01,Tensor_Dim2>,T,Dim>,T,Dim,i>
-  operator()(const Index<j,Dim> index1, const Index<i,Dim> index2,
-	     const Index<j,Dim> index3)
-  {
-    typedef const Tensor3_contracted_02<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-      T,Dim> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-//    template<char i, char j, int Dim02, int Dim1>
-//    inline Tensor1_Expr<const Tensor3_contracted_02<Tensor3_dg
-//    <T,Tensor_Dim01,Tensor_Dim2>,T,Dim02>,T,Dim1,i>
-//    operator()(const Index<j,Dim02> index1, const Index<i,Dim1> index2,
-//  	     const Index<j,Dim02> index3) const
-//    {
-//      typedef const Tensor3_contracted_02<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-//        T,Dim02> TensorExpr;
-//      return Tensor1_Expr<TensorExpr,T,Dim1,i>(TensorExpr(*this));
-//    }
-
-  /* A(j,j,i) */
-
-  template<char i, char j, int Dim01, int Dim2>
-  inline Tensor1_Expr<const Tensor3_contracted_01<Tensor3_dg
-  <T,Tensor_Dim01,Tensor_Dim2>,T,Dim01>,T,Dim2,i>
-  operator()(const Index<j,Dim01> index1, const Index<j,Dim01> index2,
-	     const Index<i,Dim2> index3) const
-  {
-    typedef const Tensor3_contracted_01<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-      T,Dim01> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim2,i>(TensorExpr(*this));
-  }
-
-  template<char i, char j, int Dim01, int Dim2>
-  inline Tensor1_Expr<const Tensor3_contracted_01<Tensor3_dg
-  <T,Tensor_Dim01,Tensor_Dim2>,T,Dim01>,T,Dim2,i>
-  operator()(const Index<j,Dim01> index1, const Index<j,Dim01> index2,
-	     const Index<i,Dim2> index3)
-  {
-    typedef const Tensor3_contracted_01<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-      T,Dim01> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim2,i>(TensorExpr(*this));
-  }
-
-  /* This is for expressions where a number is used for one slot, and
-     indices for the others, yielding a Tensor2_Expr or
-     Tensor2_symmetric_Expr.  The non-const versions don't actually
-     create a Tensor3_dg_number_rhs_* object, while the const versions
-     do create a Tensor3_dg_number_*. */
-
-  /* First slot. */
-
-  template<char i, char j, int N, int Dim1, int Dim2>
-  Tensor2_Expr<Tensor3_dg_number_rhs_0<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-    T,N>,T,Dim1,Dim2,i,j>
-  operator()(const Number<N> n1, const Index<i,Dim1> index1,
-	     const Index<j,Dim2> index2)
-  {
-    typedef Tensor3_dg_number_rhs_0<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N>
-      TensorExpr;
-    return Tensor2_Expr<TensorExpr,T,Dim1,Dim2,i,j>(*this);
-  }
-
-  template<char i, char j, int N, int Dim1, int Dim2>
-  const Tensor2_Expr<const Tensor3_dg_number_0<const Tensor3_dg
-  <T,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim1,Dim2,i,j>
-  operator()(const Number<N> n1, const Index<i,Dim1> index1,
-	     const Index<j,Dim2> index2) const
-  {
-    typedef const Tensor3_dg_number_0<const Tensor3_dg
-      <T,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
-    return Tensor2_Expr<TensorExpr,T,Dim1,Dim2,i,j>(TensorExpr(*this));
-  }
-
-  /* Second slot. */
-
-  template<char i, char j, int N, int Dim0, int Dim2>
-  Tensor2_Expr<Tensor3_dg_number_rhs_0<Tensor3_dg
-  <T,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim0,Dim2,i,j>
-  operator()(const Index<i,Dim0> index1, const Number<N> n1,
-	     const Index<j,Dim2> index2)
-  {
-    typedef Tensor3_dg_number_rhs_0<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N>
-      TensorExpr;
-    return Tensor2_Expr<TensorExpr,T,Dim0,Dim2,i,j>(*this);
-  }
-
-  template<char i, char j, int N, int Dim0, int Dim2>
-  const Tensor2_Expr<const Tensor3_dg_number_0<const Tensor3_dg
-  <T,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim0,Dim2,i,j>
-  operator()(const Index<i,Dim0> index1, const Number<N> n1,
-	     const Index<j,Dim2> index2) const
-  {
-    typedef const Tensor3_dg_number_0<const Tensor3_dg
-      <T,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
-    return Tensor2_Expr<TensorExpr,T,Dim0,Dim2,i,j>(TensorExpr(*this));
-  }
-
-  /* Third slot. */
-
-  template<char i, char j, int N, int Dim>
-  Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<Tensor3_dg
-  <T,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim,i,j>
-  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
-	     const Number<N> n1)
-  {
-    typedef Tensor3_dg_number_rhs_2<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N>
-      TensorExpr;
-    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(*this);
-  }
-
-  template<char i, char j, int N, int Dim>
-  const Tensor2_symmetric_Expr<const Tensor3_dg_number_2
-  <const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim,i,j>
-  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
-	     const Number<N> n1) const
-  {
-    typedef const Tensor3_dg_number_2<const Tensor3_dg
-      <T,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
-    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(TensorExpr(*this));
-  }
-
-  /* This is for expressions where a number is used for two slots, and
-     an Index for the other, yielding a Tensor1_Expr.  The non-const
-     versions don't actually create a Tensor3_dg_number_rhs_* object,
-     while the const versions do create a Tensor3_dg_number_*. */
-
-  /* Index in first slot. */
-
-  template<char i, int N1, int N2, int Dim>
-  Tensor1_Expr<Tensor3_dg_number_rhs_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-    T,N1,N2>,T,Dim,i>
-  operator()(const Index<i,Dim> index, const Number<N1> n1,
-	     const Number<N2> n2)
-  {
-    typedef Tensor3_dg_number_rhs_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-      T,N1,N2> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
-  }
-
-  template<char i, int N1, int N2, int Dim>
-  const Tensor1_Expr<const Tensor3_dg_number_12<const Tensor3_dg
-  <T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
-  operator()(const Index<i,Dim> index, const Number<N1> n1,
-	     const Number<N2> n2) const
-  {
-    typedef const Tensor3_dg_number_12<const Tensor3_dg
-      <T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-  /* Index in second slot.  I use the same structures as for the Index
-     in the first slot since the tensor is symmetric on the first two
-     indices. */
-
-  template<char i, int N1, int N2, int Dim>
-  Tensor1_Expr<Tensor3_dg_number_rhs_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-    T,N1,N2>,T,Dim,i>
-  operator()(const Number<N1> n1, const Index<i,Dim> index,
-	     const Number<N2> n2)
-  {
-    typedef Tensor3_dg_number_rhs_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-      T,N1,N2> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
-  }
-
-  template<char i, int N1, int N2, int Dim>
-  const Tensor1_Expr<const Tensor3_dg_number_12<const Tensor3_dg
-  <T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
-  operator()(const Number<N1> n1, const Index<i,Dim> index,
-	     const Number<N2> n2) const
-  {
-    typedef const Tensor3_dg_number_12<const Tensor3_dg
-      <T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-  /* Index in third slot. */
-
-  template<char i, int N1, int N2, int Dim>
-  Tensor1_Expr<Tensor3_dg_number_rhs_01<Tensor3_dg
-  <T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
-  operator()(const Number<N1> n1, const Number<N2> n2,
-	     const Index<i,Dim> index)
-  {
-    typedef Tensor3_dg_number_rhs_01<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
-      T,N1,N2> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
-  }
-
-  template<char i, int N1, int N2, int Dim>
-  const Tensor1_Expr<const Tensor3_dg_number_01<const Tensor3_dg
-  <T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
-  operator()(const Number<N1> n1, const Number<N2> n2,
-	     const Index<i,Dim> index) const
-  {
-    typedef const Tensor3_dg_number_01<const Tensor3_dg
-      <T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
-  }
-
-  /* Specializations for using actual numbers instead of Number<>.
-     This is for expressions where an actual number is used for one
-     slot, and indices for the others, yielding a Tensor2_Expr or
-     Tensor2_symmetric_Expr. I only define the const versions. */
-
-  /* First slot. */
-
-  template<char i, char j, int Dim1, int Dim2>
-  const Tensor2_Expr<const Tensor3_dg_numeral_0<const Tensor3_dg
-  <T,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim1,Dim2,i,j>
-  operator()(const int N, const Index<i,Dim1> index1,
-	     const Index<j,Dim2> index2) const
-  {
-    typedef const Tensor3_dg_numeral_0<const Tensor3_dg
-      <T,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
-    return Tensor2_Expr<TensorExpr,T,Dim1,Dim2,i,j>(TensorExpr(*this,N));
-  }
-
-  /* Second slot. */
-
-  template<char i, char j, int Dim0, int Dim2>
-  const Tensor2_Expr<const Tensor3_dg_numeral_0<const Tensor3_dg
-  <T,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim0,Dim2,i,j>
-  operator()(const Index<i,Dim0> index1, const int N,
-	     const Index<j,Dim2> index2) const
-  {
-    typedef const Tensor3_dg_numeral_0<const Tensor3_dg
-      <T,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
-    return Tensor2_Expr<TensorExpr,T,Dim0,Dim2,i,j>(TensorExpr(*this,N));
-  }
-
-  /* Third slot. */
-
-  template<char i, char j, int Dim>
-  const Tensor2_symmetric_Expr<const Tensor3_dg_numeral_2
-  <const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim,i,j>
-  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
-	     const int N) const
-  {
-    typedef const Tensor3_dg_numeral_2<const Tensor3_dg
-      <T,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
-    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(TensorExpr(*this,N));
-  }
-
-  /* This is for expressions where a numeral is used for two slots, and
-     an Index for the other, yielding a Tensor1_Expr. */
-
-  /* Index in first slot. */
-
-  template<char i, int Dim>
-  const Tensor1_Expr<const Tensor3_dg_numeral_12<const Tensor3_dg
-  <T,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim,i>
-  operator()(const Index<i,Dim> index, const int N1,
-	     const int N2) const
-  {
-    typedef const Tensor3_dg_numeral_12<const Tensor3_dg
-      <T,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2));
-  }
-
-  /* Index in second slot.  I use the same structures as for the Index
-     in the first slot since the tensor is symmetric on the first two
-     indices. */
-
-  template<char i, int Dim>
-  const Tensor1_Expr<const Tensor3_dg_numeral_12<const Tensor3_dg
-  <T,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim,i>
-  operator()(const int N1, const Index<i,Dim> index,
-	     const int N2) const
-  {
-    typedef const Tensor3_dg_numeral_12<const Tensor3_dg
-      <T,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2));
-  }
-
-  /* Index in third slot. */
-
-  template<char i, int Dim>
-  const Tensor1_Expr<const Tensor3_dg_numeral_01<const Tensor3_dg
-  <T,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim,i>
-  operator()(const int N1, const int N2,
-	     const Index<i,Dim> index) const
-  {
-    typedef const Tensor3_dg_numeral_01<const Tensor3_dg
-      <T,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2));
-  }
-};
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/Tensor3_dg_value.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/Tensor3_dg_value.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,470 @@
+/* A general version, not for pointers. */
+
+template <class T, int Tensor_Dim01, int Tensor_Dim2>
+class Tensor3_dg
+{
+  T data[(Tensor_Dim01*(Tensor_Dim01+1))/2][Tensor_Dim2];
+public:
+  Tensor3_dg() {}
+
+  /* Tensor_Dim01=2, Tensor_Dim2=2 */
+  Tensor3_dg(T d000, T d001, T d010, T d011, T d110, T d111)
+  {
+    Tensor3_dg_constructor<T,Tensor_Dim01,Tensor_Dim2>
+      (data,d000,d001,d010,d011,d110,d111);
+  }
+
+  /* Tensor_Dim01=3, Tensor_Dim2=3 */
+  Tensor3_dg(T d000, T d001, T d002, T d010,
+	     T d011, T d012, T d020, T d021,
+	     T d022, T d110, T d111, T d112,
+	     T d120, T d121, T d122,
+	     T d220, T d221, T d222)
+  {
+    Tensor3_dg_constructor<T,Tensor_Dim01,Tensor_Dim2>
+      (data,d000,d001,d002,d010,d011,d012,d020,d021,
+       d022,d110,d111,d112,d120,d121,d122,d220,d221,d222);
+  }
+
+  /* Tensor_Dim01=4, Tensor_Dim2=4 */
+  Tensor3_dg(T d000, T d001, T d002, T d003,
+	     T d010, T d011, T d012, T d013,
+	     T d020, T d021, T d022, T d023,
+	     T d030, T d031, T d032, T d033,
+	     T d110, T d111, T d112, T d113,
+	     T d120, T d121, T d122, T d123,
+	     T d130, T d131, T d132, T d133,
+	     T d220, T d221, T d222, T d223,
+	     T d230, T d231, T d232, T d233,
+	     T d330, T d331, T d332, T d333)
+  {
+    Tensor3_dg_constructor<T,Tensor_Dim01,Tensor_Dim2>
+      (data,d000,d001,d002,d003,d010,d011,d012,d013,
+       d020,d021,d022,d023,d030,d031,d032,d033,
+       d110,d111,d112,d113,d120,d121,d122,d123,
+       d130,d131,d132,d133,d220,d221,d222,d223,
+       d230,d231,d232,d233,d330,d331,d332,d333);
+  }
+
+  /* Tensor_Dim01=4, Tensor_Dim2=3 */
+  Tensor3_dg(T d000, T d001, T d002, T d010, T d011, T d012,
+	     T d020, T d021, T d022, T d030, T d031, T d032,
+	     T d110, T d111, T d112, T d120, T d121, T d122,
+	     T d130, T d131, T d132, T d220, T d221, T d222,
+	     T d230, T d231, T d232, T d330, T d331, T d332)
+  {
+    Tensor3_dg_constructor<T,Tensor_Dim01,Tensor_Dim2>
+      (data,d000,d001,d002,d010,d011,d012,
+       d020,d021,d022,d030,d031,d032,
+       d110,d111,d112,d120,d121,d122,
+       d130,d131,d132,d220,d221,d222,
+       d230,d231,d232,d330,d331,d332);
+  }
+
+  /* There are two operator(int,int,int)'s, one for non-consts that lets you
+     change the value, and one for consts that doesn't. */
+
+  T & operator()(const int N1, const int N2, const int N3)
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim01 || N1<0
+       || N2>=Tensor_Dim01 || N2<0 || N3>=Tensor_Dim2 || N3<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor3_dg<T,"
+          << Tensor_Dim01 << "," << Tensor_Dim2
+          << ">.operator("
+          << N1 << "," << N2 << "," << N3 << ")" << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N1>N2 ? data[N1+(N2*(2*Tensor_Dim01-N2-1))/2][N3]
+      : data[N2+(N1*(2*Tensor_Dim01-N1-1))/2][N3];
+  }
+
+  T operator()(const int N1, const int N2, const int N3) const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim01 || N1<0
+       || N2>=Tensor_Dim01 || N2<0 || N3>=Tensor_Dim2 || N3<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor3_dg<T,"
+          << Tensor_Dim01 << "," << Tensor_Dim2
+          << ">.operator("
+          << N1 << "," << N2 << "," << N3 << ") const"
+          << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N1>N2 ? data[N1+(N2*(2*Tensor_Dim01-N2-1))/2][N3]
+      : data[N2+(N1*(2*Tensor_Dim01-N1-1))/2][N3];
+  }
+
+  /* These operator()'s are the first part in constructing template
+     expressions. */
+
+  template<char i, char j, char k, int Dim01, int Dim2>
+  Tensor3_dg_Expr<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,Dim01,Dim2,i,j,k>
+  operator()(const Index<i,Dim01> index1, const Index<j,Dim01> index2,
+	     const Index<k,Dim2> index3)
+  {
+    return Tensor3_dg_Expr<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+      T,Dim01,Dim2,i,j,k>(*this);
+  }
+
+  template<char i, char j, char k, int Dim01, int Dim2>
+  Tensor3_dg_Expr<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+    T,Dim01,Dim2,i,j,k> operator()
+    (const Index<i,Dim01> index1, const Index<j,Dim01> index2,
+     const Index<k,Dim2> index3) const
+  {
+    return Tensor3_dg_Expr<const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+      T,Dim01,Dim2,i,j,k>(*this);
+  }
+
+  /* These operators are for internal contractions. The commented out
+     versions are more general, but are ambiguous.  This means,
+     unfortunately, that you can't do something like A(i,j,j) where i
+     and j have different dimensions. */
+
+  /* A(i,j,j) */
+
+  template<char i, char j, int Dim>
+  inline Tensor1_Expr<const Tensor3_contracted_12<Tensor3_dg
+  <T,Tensor_Dim01,Tensor_Dim2>,T,Dim>,T,Dim,i>
+  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
+	     const Index<j,Dim> index3) const
+  {
+    typedef const Tensor3_contracted_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+      T,Dim> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+  template<char i, char j, int Dim>
+  inline Tensor1_Expr<const Tensor3_contracted_12<Tensor3_dg
+  <T,Tensor_Dim01,Tensor_Dim2>,T,Dim>,T,Dim,i>
+  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
+	     const Index<j,Dim> index3)
+  {
+    typedef const Tensor3_contracted_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+      T,Dim> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+//    template<char i, char j, int Dim0, int Dim12>
+//    inline Tensor1_Expr<const Tensor3_contracted_12<Tensor3_dg
+//    <T,Tensor_Dim01,Tensor_Dim2>,T,Dim12>,T,Dim0,i>
+//    operator()(const Index<i,Dim0> index1, const Index<j,Dim12> index2,
+//  	     const Index<j,Dim12> index3) const
+//    {
+//      typedef const Tensor3_contracted_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+//        T,Dim12> TensorExpr;
+//      return Tensor1_Expr<TensorExpr,T,Dim0,i>(TensorExpr(*this));
+//    }
+
+  /* A(j,i,j) */
+
+  template<char i, char j, int Dim>
+  inline Tensor1_Expr<const Tensor3_contracted_02<Tensor3_dg
+  <T,Tensor_Dim01,Tensor_Dim2>,T,Dim>,T,Dim,i>
+  operator()(const Index<j,Dim> index1, const Index<i,Dim> index2,
+	     const Index<j,Dim> index3) const
+  {
+    typedef const Tensor3_contracted_02<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+      T,Dim> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+  template<char i, char j, int Dim>
+  inline Tensor1_Expr<const Tensor3_contracted_02<Tensor3_dg
+  <T,Tensor_Dim01,Tensor_Dim2>,T,Dim>,T,Dim,i>
+  operator()(const Index<j,Dim> index1, const Index<i,Dim> index2,
+	     const Index<j,Dim> index3)
+  {
+    typedef const Tensor3_contracted_02<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+      T,Dim> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+//    template<char i, char j, int Dim02, int Dim1>
+//    inline Tensor1_Expr<const Tensor3_contracted_02<Tensor3_dg
+//    <T,Tensor_Dim01,Tensor_Dim2>,T,Dim02>,T,Dim1,i>
+//    operator()(const Index<j,Dim02> index1, const Index<i,Dim1> index2,
+//  	     const Index<j,Dim02> index3) const
+//    {
+//      typedef const Tensor3_contracted_02<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+//        T,Dim02> TensorExpr;
+//      return Tensor1_Expr<TensorExpr,T,Dim1,i>(TensorExpr(*this));
+//    }
+
+  /* A(j,j,i) */
+
+  template<char i, char j, int Dim01, int Dim2>
+  inline Tensor1_Expr<const Tensor3_contracted_01<Tensor3_dg
+  <T,Tensor_Dim01,Tensor_Dim2>,T,Dim01>,T,Dim2,i>
+  operator()(const Index<j,Dim01> index1, const Index<j,Dim01> index2,
+	     const Index<i,Dim2> index3) const
+  {
+    typedef const Tensor3_contracted_01<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+      T,Dim01> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim2,i>(TensorExpr(*this));
+  }
+
+  template<char i, char j, int Dim01, int Dim2>
+  inline Tensor1_Expr<const Tensor3_contracted_01<Tensor3_dg
+  <T,Tensor_Dim01,Tensor_Dim2>,T,Dim01>,T,Dim2,i>
+  operator()(const Index<j,Dim01> index1, const Index<j,Dim01> index2,
+	     const Index<i,Dim2> index3)
+  {
+    typedef const Tensor3_contracted_01<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+      T,Dim01> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim2,i>(TensorExpr(*this));
+  }
+
+  /* This is for expressions where a number is used for one slot, and
+     indices for the others, yielding a Tensor2_Expr or
+     Tensor2_symmetric_Expr.  The non-const versions don't actually
+     create a Tensor3_dg_number_rhs_* object, while the const versions
+     do create a Tensor3_dg_number_*. */
+
+  /* First slot. */
+
+  template<char i, char j, int N, int Dim1, int Dim2>
+  Tensor2_Expr<Tensor3_dg_number_rhs_0<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+    T,N>,T,Dim1,Dim2,i,j>
+  operator()(const Number<N> n1, const Index<i,Dim1> index1,
+	     const Index<j,Dim2> index2)
+  {
+    typedef Tensor3_dg_number_rhs_0<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N>
+      TensorExpr;
+    return Tensor2_Expr<TensorExpr,T,Dim1,Dim2,i,j>(*this);
+  }
+
+  template<char i, char j, int N, int Dim1, int Dim2>
+  const Tensor2_Expr<const Tensor3_dg_number_0<const Tensor3_dg
+  <T,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim1,Dim2,i,j>
+  operator()(const Number<N> n1, const Index<i,Dim1> index1,
+	     const Index<j,Dim2> index2) const
+  {
+    typedef const Tensor3_dg_number_0<const Tensor3_dg
+      <T,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
+    return Tensor2_Expr<TensorExpr,T,Dim1,Dim2,i,j>(TensorExpr(*this));
+  }
+
+  /* Second slot. */
+
+  template<char i, char j, int N, int Dim0, int Dim2>
+  Tensor2_Expr<Tensor3_dg_number_rhs_0<Tensor3_dg
+  <T,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim0,Dim2,i,j>
+  operator()(const Index<i,Dim0> index1, const Number<N> n1,
+	     const Index<j,Dim2> index2)
+  {
+    typedef Tensor3_dg_number_rhs_0<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N>
+      TensorExpr;
+    return Tensor2_Expr<TensorExpr,T,Dim0,Dim2,i,j>(*this);
+  }
+
+  template<char i, char j, int N, int Dim0, int Dim2>
+  const Tensor2_Expr<const Tensor3_dg_number_0<const Tensor3_dg
+  <T,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim0,Dim2,i,j>
+  operator()(const Index<i,Dim0> index1, const Number<N> n1,
+	     const Index<j,Dim2> index2) const
+  {
+    typedef const Tensor3_dg_number_0<const Tensor3_dg
+      <T,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
+    return Tensor2_Expr<TensorExpr,T,Dim0,Dim2,i,j>(TensorExpr(*this));
+  }
+
+  /* Third slot. */
+
+  template<char i, char j, int N, int Dim>
+  Tensor2_symmetric_Expr<Tensor3_dg_number_rhs_2<Tensor3_dg
+  <T,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim,i,j>
+  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
+	     const Number<N> n1)
+  {
+    typedef Tensor3_dg_number_rhs_2<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N>
+      TensorExpr;
+    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(*this);
+  }
+
+  template<char i, char j, int N, int Dim>
+  const Tensor2_symmetric_Expr<const Tensor3_dg_number_2
+  <const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T,N>,T,Dim,i,j>
+  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
+	     const Number<N> n1) const
+  {
+    typedef const Tensor3_dg_number_2<const Tensor3_dg
+      <T,Tensor_Dim01,Tensor_Dim2>,T,N> TensorExpr;
+    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(TensorExpr(*this));
+  }
+
+  /* This is for expressions where a number is used for two slots, and
+     an Index for the other, yielding a Tensor1_Expr.  The non-const
+     versions don't actually create a Tensor3_dg_number_rhs_* object,
+     while the const versions do create a Tensor3_dg_number_*. */
+
+  /* Index in first slot. */
+
+  template<char i, int N1, int N2, int Dim>
+  Tensor1_Expr<Tensor3_dg_number_rhs_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+    T,N1,N2>,T,Dim,i>
+  operator()(const Index<i,Dim> index, const Number<N1> n1,
+	     const Number<N2> n2)
+  {
+    typedef Tensor3_dg_number_rhs_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+      T,N1,N2> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
+  }
+
+  template<char i, int N1, int N2, int Dim>
+  const Tensor1_Expr<const Tensor3_dg_number_12<const Tensor3_dg
+  <T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
+  operator()(const Index<i,Dim> index, const Number<N1> n1,
+	     const Number<N2> n2) const
+  {
+    typedef const Tensor3_dg_number_12<const Tensor3_dg
+      <T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+  /* Index in second slot.  I use the same structures as for the Index
+     in the first slot since the tensor is symmetric on the first two
+     indices. */
+
+  template<char i, int N1, int N2, int Dim>
+  Tensor1_Expr<Tensor3_dg_number_rhs_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+    T,N1,N2>,T,Dim,i>
+  operator()(const Number<N1> n1, const Index<i,Dim> index,
+	     const Number<N2> n2)
+  {
+    typedef Tensor3_dg_number_rhs_12<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+      T,N1,N2> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
+  }
+
+  template<char i, int N1, int N2, int Dim>
+  const Tensor1_Expr<const Tensor3_dg_number_12<const Tensor3_dg
+  <T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
+  operator()(const Number<N1> n1, const Index<i,Dim> index,
+	     const Number<N2> n2) const
+  {
+    typedef const Tensor3_dg_number_12<const Tensor3_dg
+      <T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+  /* Index in third slot. */
+
+  template<char i, int N1, int N2, int Dim>
+  Tensor1_Expr<Tensor3_dg_number_rhs_01<Tensor3_dg
+  <T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
+  operator()(const Number<N1> n1, const Number<N2> n2,
+	     const Index<i,Dim> index)
+  {
+    typedef Tensor3_dg_number_rhs_01<Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,
+      T,N1,N2> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(*this);
+  }
+
+  template<char i, int N1, int N2, int Dim>
+  const Tensor1_Expr<const Tensor3_dg_number_01<const Tensor3_dg
+  <T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2>,T,Dim,i>
+  operator()(const Number<N1> n1, const Number<N2> n2,
+	     const Index<i,Dim> index) const
+  {
+    typedef const Tensor3_dg_number_01<const Tensor3_dg
+      <T,Tensor_Dim01,Tensor_Dim2>,T,N1,N2> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this));
+  }
+
+  /* Specializations for using actual numbers instead of Number<>.
+     This is for expressions where an actual number is used for one
+     slot, and indices for the others, yielding a Tensor2_Expr or
+     Tensor2_symmetric_Expr. I only define the const versions. */
+
+  /* First slot. */
+
+  template<char i, char j, int Dim1, int Dim2>
+  const Tensor2_Expr<const Tensor3_dg_numeral_0<const Tensor3_dg
+  <T,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim1,Dim2,i,j>
+  operator()(const int N, const Index<i,Dim1> index1,
+	     const Index<j,Dim2> index2) const
+  {
+    typedef const Tensor3_dg_numeral_0<const Tensor3_dg
+      <T,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
+    return Tensor2_Expr<TensorExpr,T,Dim1,Dim2,i,j>(TensorExpr(*this,N));
+  }
+
+  /* Second slot. */
+
+  template<char i, char j, int Dim0, int Dim2>
+  const Tensor2_Expr<const Tensor3_dg_numeral_0<const Tensor3_dg
+  <T,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim0,Dim2,i,j>
+  operator()(const Index<i,Dim0> index1, const int N,
+	     const Index<j,Dim2> index2) const
+  {
+    typedef const Tensor3_dg_numeral_0<const Tensor3_dg
+      <T,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
+    return Tensor2_Expr<TensorExpr,T,Dim0,Dim2,i,j>(TensorExpr(*this,N));
+  }
+
+  /* Third slot. */
+
+  template<char i, char j, int Dim>
+  const Tensor2_symmetric_Expr<const Tensor3_dg_numeral_2
+  <const Tensor3_dg<T,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim,i,j>
+  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
+	     const int N) const
+  {
+    typedef const Tensor3_dg_numeral_2<const Tensor3_dg
+      <T,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
+    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(TensorExpr(*this,N));
+  }
+
+  /* This is for expressions where a numeral is used for two slots, and
+     an Index for the other, yielding a Tensor1_Expr. */
+
+  /* Index in first slot. */
+
+  template<char i, int Dim>
+  const Tensor1_Expr<const Tensor3_dg_numeral_12<const Tensor3_dg
+  <T,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim,i>
+  operator()(const Index<i,Dim> index, const int N1,
+	     const int N2) const
+  {
+    typedef const Tensor3_dg_numeral_12<const Tensor3_dg
+      <T,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2));
+  }
+
+  /* Index in second slot.  I use the same structures as for the Index
+     in the first slot since the tensor is symmetric on the first two
+     indices. */
+
+  template<char i, int Dim>
+  const Tensor1_Expr<const Tensor3_dg_numeral_12<const Tensor3_dg
+  <T,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim,i>
+  operator()(const int N1, const Index<i,Dim> index,
+	     const int N2) const
+  {
+    typedef const Tensor3_dg_numeral_12<const Tensor3_dg
+      <T,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2));
+  }
+
+  /* Index in third slot. */
+
+  template<char i, int Dim>
+  const Tensor1_Expr<const Tensor3_dg_numeral_01<const Tensor3_dg
+  <T,Tensor_Dim01,Tensor_Dim2>,T>,T,Dim,i>
+  operator()(const int N1, const int N2,
+	     const Index<i,Dim> index) const
+  {
+    typedef const Tensor3_dg_numeral_01<const Tensor3_dg
+      <T,Tensor_Dim01,Tensor_Dim2>,T> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2));
+  }
+};
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/minus_Tensor3_dg.h
--- a/Tensor3_dg/minus_Tensor3_dg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-/* Unary minus operator. */
-
-template<class A, class T, int Dim01, int Dim2, char i, char j, char k>
-class minus_Tensor3_dg
-{
-  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
-public:
-  T operator()(const int N1, const int N2, const int N3) const
-  {
-    return -iterA(N1,N2,N3);
-  }
-
-  minus_Tensor3_dg(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a): iterA(a) {}
-};
-
-template<class A, class T, int Dim01, int Dim2, char i, char j, char k>
-inline const Tensor3_dg_Expr<const minus_Tensor3_dg<A,T,Dim01,Dim2,i,j,k>,
-  T,Dim01,Dim2,i,j,k>
-operator-(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
-{
-    typedef const minus_Tensor3_dg<A,T,Dim01,Dim2,i,j,k> TensorExpr;
-    return Tensor3_dg_Expr<TensorExpr,T,Dim01,Dim2,i,j,k>(TensorExpr(a));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor3_dg/minus_Tensor3_dg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor3_dg/minus_Tensor3_dg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,24 @@
+/* Unary minus operator. */
+
+template<class A, class T, int Dim01, int Dim2, char i, char j, char k>
+class minus_Tensor3_dg
+{
+  const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> iterA;
+public:
+  T operator()(const int N1, const int N2, const int N3) const
+  {
+    return -iterA(N1,N2,N3);
+  }
+
+  minus_Tensor3_dg(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a): iterA(a) {}
+};
+
+template<class A, class T, int Dim01, int Dim2, char i, char j, char k>
+inline const Tensor3_dg_Expr<const minus_Tensor3_dg<A,T,Dim01,Dim2,i,j,k>,
+  T,Dim01,Dim2,i,j,k>
+operator-(const Tensor3_dg_Expr<A,T,Dim01,Dim2,i,j,k> &a)
+{
+    typedef const minus_Tensor3_dg<A,T,Dim01,Dim2,i,j,k> TensorExpr;
+    return Tensor3_dg_Expr<TensorExpr,T,Dim01,Dim2,i,j,k>(TensorExpr(a));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor4/Tensor4_Expr.h
--- a/Tensor4/Tensor4_Expr.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-/* Declare a wrapper class for generic rank 4 Tensor expressions. */
-
-#include "Tensor4_plus_Tensor4.h"
-#include "Tensor4_times_Tensor2_symmetric.h"
-#include "Tensor4_times_Tensor2.h"
-
-template<class A, class T, int Dim0, int Dim1, int Dim2, int Dim3,
-  char i, char j, char k, char l>
-class Tensor4_Expr
-{
-  A iter;
-public:
-  Tensor4_Expr(A &a): iter(a) {}
-  T operator()(const int N1, const int N2, const int N3,
-	       const int N4) const
-  {
-    return iter(N1,N2,N3,N4);
-  }
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor4/Tensor4_Expr.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4/Tensor4_Expr.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,19 @@
+/* Declare a wrapper class for generic rank 4 Tensor expressions. */
+
+#include "Tensor4_plus_Tensor4.hpp"
+#include "Tensor4_times_Tensor2_symmetric.hpp"
+#include "Tensor4_times_Tensor2.hpp"
+
+template<class A, class T, int Dim0, int Dim1, int Dim2, int Dim3,
+  char i, char j, char k, char l>
+class Tensor4_Expr
+{
+  A iter;
+public:
+  Tensor4_Expr(A &a): iter(a) {}
+  T operator()(const int N1, const int N2, const int N3,
+	       const int N4) const
+  {
+    return iter(N1,N2,N3,N4);
+  }
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor4/Tensor4_minus_Tensor4.h
--- a/Tensor4/Tensor4_minus_Tensor4.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-//  /* Subtracts a Tensor4 from a Tensor4, yielding a Tensor4_Riemann
-//     (definitely not a general purpose subtraction routine). */
-
-//  template<class A, class B, char i, char j, char k, char l>
-//  class Tensor4_minus_Tensor4
-//  {
-//    Tensor4_Expr<A,i,j,k,l> iterA;
-//    Tensor4_Expr<B,i,l,k,j> iterB;
-//  public:
-//    double operator()(const int N1, const int N2, const int N3,
-//  			  const int N4) const
-//    {
-//      return iterA(N2,N3,N1,N4)-iterB(N2,N4,N1,N3);
-//    }
-//    Tensor4_minus_Tensor4(const Tensor4_Expr<A,i,j,k,l> &a,
-//  			const Tensor4_Expr<B,i,l,k,j> &b):
-//      iterA(a), iterB(b) {}
-//  };
-
-//  template<class A, class B, char i, char j, char k, char l>
-//  inline Tensor4_Riemann_Expr<const Tensor4_minus_Tensor4
-//  <const Tensor4_Expr<A,i,j,k,l>, const Tensor4_Expr<B,i,l,k,j>,i,j,k,l>,k,i,j,l>
-//  operator-(const Tensor4_Expr<A,i,j,k,l> &a, const Tensor4_Expr<B,i,l,k,j> &b)
-//  {
-//    typedef const Tensor4_minus_Tensor4<const Tensor4_Expr<A,i,j,k,l>,
-//      const Tensor4_Expr<B,i,l,k,j>,i,j,k,l> TensorExpr;
-//    return Tensor4_Riemann_Expr<TensorExpr,k,i,j,l>(TensorExpr(a,b));
-//  }
diff -r dd991b426d75 -r 1042a48dad5a Tensor4/Tensor4_minus_Tensor4.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4/Tensor4_minus_Tensor4.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,28 @@
+//  /* Subtracts a Tensor4 from a Tensor4, yielding a Tensor4_Riemann
+//     (definitely not a general purpose subtraction routine). */
+
+//  template<class A, class B, char i, char j, char k, char l>
+//  class Tensor4_minus_Tensor4
+//  {
+//    Tensor4_Expr<A,i,j,k,l> iterA;
+//    Tensor4_Expr<B,i,l,k,j> iterB;
+//  public:
+//    double operator()(const int N1, const int N2, const int N3,
+//  			  const int N4) const
+//    {
+//      return iterA(N2,N3,N1,N4)-iterB(N2,N4,N1,N3);
+//    }
+//    Tensor4_minus_Tensor4(const Tensor4_Expr<A,i,j,k,l> &a,
+//  			const Tensor4_Expr<B,i,l,k,j> &b):
+//      iterA(a), iterB(b) {}
+//  };
+
+//  template<class A, class B, char i, char j, char k, char l>
+//  inline Tensor4_Riemann_Expr<const Tensor4_minus_Tensor4
+//  <const Tensor4_Expr<A,i,j,k,l>, const Tensor4_Expr<B,i,l,k,j>,i,j,k,l>,k,i,j,l>
+//  operator-(const Tensor4_Expr<A,i,j,k,l> &a, const Tensor4_Expr<B,i,l,k,j> &b)
+//  {
+//    typedef const Tensor4_minus_Tensor4<const Tensor4_Expr<A,i,j,k,l>,
+//      const Tensor4_Expr<B,i,l,k,j>,i,j,k,l> TensorExpr;
+//    return Tensor4_Riemann_Expr<TensorExpr,k,i,j,l>(TensorExpr(a,b));
+//  }
diff -r dd991b426d75 -r 1042a48dad5a Tensor4/Tensor4_plus_Tensor4.h
--- a/Tensor4/Tensor4_plus_Tensor4.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-/* Adds Tensor4+Tensor4 -> Tensor4 */
-
-/* A(i,j,k,l)+B(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-class Tensor4_plus_Tensor4
-{
-  const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> iterA;
-  const Tensor4_Expr<B,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-		    const int N4) const
-  {
-    return iterA(N1,N2,N3,N4)+iterB(N1,N2,N3,N4);
-  }
-
-  Tensor4_plus_Tensor4(const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
-		       const Tensor4_Expr<B,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &b)
-    : iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-inline Tensor4_Expr
-<const Tensor4_plus_Tensor4<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
-operator+(const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
-	  const Tensor4_Expr<B,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &b)
-{
-  typedef const Tensor4_plus_Tensor4<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
-    TensorExpr;
-  return Tensor4_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k,l)+B(l,k,i,j) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-class Tensor4_plus_Tensor4_3201
-{
-  const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> iterA;
-  const Tensor4_Expr<B,U,Dim2,Dim3,Dim0,Dim1,l,k,i,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-		    const int N4) const
-  {
-    return iterA(N1,N2,N3,N4)+iterB(N4,N3,N1,N2);
-  }
-
-  Tensor4_plus_Tensor4_3201
-  (const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
-   const Tensor4_Expr<B,U,Dim2,Dim3,Dim0,Dim1,l,k,i,j> &b)
-    : iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-inline Tensor4_Expr
-<const Tensor4_plus_Tensor4_3201<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
-operator+(const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
-	  const Tensor4_Expr<B,U,Dim2,Dim3,Dim0,Dim1,l,k,i,j> &b)
-{
-  typedef const Tensor4_plus_Tensor4_3201<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
-    TensorExpr;
-  return Tensor4_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4/Tensor4_plus_Tensor4.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4/Tensor4_plus_Tensor4.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,70 @@
+/* Adds Tensor4+Tensor4 -> Tensor4 */
+
+/* A(i,j,k,l)+B(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+class Tensor4_plus_Tensor4
+{
+  const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> iterA;
+  const Tensor4_Expr<B,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+		    const int N4) const
+  {
+    return iterA(N1,N2,N3,N4)+iterB(N1,N2,N3,N4);
+  }
+
+  Tensor4_plus_Tensor4(const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
+		       const Tensor4_Expr<B,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &b)
+    : iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+inline Tensor4_Expr
+<const Tensor4_plus_Tensor4<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
+operator+(const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
+	  const Tensor4_Expr<B,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &b)
+{
+  typedef const Tensor4_plus_Tensor4<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
+    TensorExpr;
+  return Tensor4_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k,l)+B(l,k,i,j) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+class Tensor4_plus_Tensor4_3201
+{
+  const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> iterA;
+  const Tensor4_Expr<B,U,Dim2,Dim3,Dim0,Dim1,l,k,i,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+		    const int N4) const
+  {
+    return iterA(N1,N2,N3,N4)+iterB(N4,N3,N1,N2);
+  }
+
+  Tensor4_plus_Tensor4_3201
+  (const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
+   const Tensor4_Expr<B,U,Dim2,Dim3,Dim0,Dim1,l,k,i,j> &b)
+    : iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+inline Tensor4_Expr
+<const Tensor4_plus_Tensor4_3201<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
+operator+(const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
+	  const Tensor4_Expr<B,U,Dim2,Dim3,Dim0,Dim1,l,k,i,j> &b)
+{
+  typedef const Tensor4_plus_Tensor4_3201<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
+    TensorExpr;
+  return Tensor4_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,Dim2,Dim3,i,j,k,l>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4/Tensor4_times_Tensor2.h
--- a/Tensor4/Tensor4_times_Tensor2.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,296 +0,0 @@
-/* This file has all of the declarations for expressions like
-   Tensor4*Tensor2 and Tensor2*Tensor4, yielding a
-   Tensor2. */
-
-/* A(i,j,k,l)*B(k,l) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-class Tensor4_times_Tensor2_23
-{
-  const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> iterA;
-  const Tensor2_Expr<B,U,Dim2,Dim3,k,l> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,N2,Current_Dim0-1,Current_Dim1-1)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,N2,0,Current_Dim1-1)*iterB(0,Current_Dim1-1)
-      + eval(N1,N2,Number<Dim2>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(N1,N2,0,0)*iterB(0,0);
-  }
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim2>(),Number<Dim3>());
-  }
-
-  Tensor4_times_Tensor2_23
-  (const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
-   const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-inline Tensor2_Expr
-<const Tensor4_times_Tensor2_23<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim0,Dim1,i,j>
-operator*(const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
-	  const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b)
-{
-  typedef const Tensor4_times_Tensor2_23
-    <A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,b));
-}
-
-/* B(k,l)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-inline Tensor2_Expr
-<const Tensor4_times_Tensor2_23<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim0,Dim1,i,j>
-operator*(const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b,
-	  const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a)
-{
-  typedef const Tensor4_times_Tensor2_23
-    <A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k,l)*B(l,k) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-class Tensor4_times_Tensor2_32
-{
-  const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> iterA;
-  const Tensor2_Expr<B,U,Dim3,Dim2,l,k> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,N2,Current_Dim0-1,Current_Dim1-1)
-      *iterB(Current_Dim1-1,Current_Dim0-1)
-      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,N2,0,Current_Dim1-1)*iterB(Current_Dim1-1,0)
-      + eval(N1,N2,Number<Dim2>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(N1,N2,0,0)*iterB(0,0);
-  }
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim2>(),Number<Dim3>());
-  }
-
-  Tensor4_times_Tensor2_32
-  (const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
-   const Tensor2_Expr<B,U,Dim3,Dim2,l,k> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-inline Tensor2_Expr
-<const Tensor4_times_Tensor2_32<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim0,Dim1,i,j>
-operator*(const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
-	  const Tensor2_Expr<B,U,Dim3,Dim2,l,k> &b)
-{
-  typedef const Tensor4_times_Tensor2_32
-    <A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,b));
-}
-
-/* B(l,k)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-inline Tensor2_Expr
-<const Tensor4_times_Tensor2_32<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim0,Dim1,i,j>
-operator*(const Tensor2_Expr<B,U,Dim3,Dim2,l,k> &b,
-	  const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a)
-{
-  typedef const Tensor4_times_Tensor2_32
-    <A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k,l)*B(i,l) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-class Tensor4_times_Tensor2_03
-{
-  const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> iterA;
-  const Tensor2_Expr<B,U,Dim0,Dim3,i,l> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,N1,N2,Current_Dim1-1)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,N1,N2,Current_Dim1-1)*iterB(0,Current_Dim1-1)
-      + eval(N1,N2,Number<Dim0>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,N1,N2,0)*iterB(0,0);
-  }
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim0>(),Number<Dim3>());
-  }
-
-  Tensor4_times_Tensor2_03
-  (const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
-   const Tensor2_Expr<B,U,Dim0,Dim3,i,l> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-inline Tensor2_Expr
-<const Tensor4_times_Tensor2_03<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim1,Dim2,j,k>
-operator*(const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
-	  const Tensor2_Expr<B,U,Dim0,Dim3,i,l> &b)
-{
-  typedef const Tensor4_times_Tensor2_03
-    <A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,k>
-    (TensorExpr(a,b));
-}
-
-/* B(i,l)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-inline Tensor2_Expr
-<const Tensor4_times_Tensor2_03<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim1,Dim2,j,k>
-operator*(const Tensor2_Expr<B,U,Dim0,Dim3,i,l> &b,
-	  const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a)
-{
-  typedef const Tensor4_times_Tensor2_03
-    <A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,k>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k,l)*B(l,i) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-class Tensor4_times_Tensor2_30
-{
-  const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> iterA;
-  const Tensor2_Expr<B,U,Dim3,Dim0,l,i> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,N1,N2,Current_Dim1-1)
-      *iterB(Current_Dim1-1,Current_Dim0-1)
-      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,N1,N2,Current_Dim1-1)*iterB(Current_Dim1-1,0)
-      + eval(N1,N2,Number<Dim0>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,N1,N2,0)*iterB(0,0);
-  }
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim0>(),Number<Dim3>());
-  }
-
-  Tensor4_times_Tensor2_30
-  (const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
-   const Tensor2_Expr<B,U,Dim3,Dim0,l,i> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-inline Tensor2_Expr
-<const Tensor4_times_Tensor2_30<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim1,Dim2,j,k>
-operator*(const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
-	  const Tensor2_Expr<B,U,Dim3,Dim0,l,i> &b)
-{
-  typedef const Tensor4_times_Tensor2_30
-    <A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,k>
-    (TensorExpr(a,b));
-}
-
-/* B(l,i)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
-  int Dim3, char i, char j, char k, char l>
-inline Tensor2_Expr
-<const Tensor4_times_Tensor2_30<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
-  typename promote<T,U>::V,Dim1,Dim2,j,k>
-operator*(const Tensor2_Expr<B,U,Dim3,Dim0,l,i> &b,
-	  const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a)
-{
-  typedef const Tensor4_times_Tensor2_30
-    <A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,k>
-    (TensorExpr(a,b));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor4/Tensor4_times_Tensor2.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4/Tensor4_times_Tensor2.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,296 @@
+/* This file has all of the declarations for expressions like
+   Tensor4*Tensor2 and Tensor2*Tensor4, yielding a
+   Tensor2. */
+
+/* A(i,j,k,l)*B(k,l) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+class Tensor4_times_Tensor2_23
+{
+  const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> iterA;
+  const Tensor2_Expr<B,U,Dim2,Dim3,k,l> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,N2,Current_Dim0-1,Current_Dim1-1)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,N2,0,Current_Dim1-1)*iterB(0,Current_Dim1-1)
+      + eval(N1,N2,Number<Dim2>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(N1,N2,0,0)*iterB(0,0);
+  }
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim2>(),Number<Dim3>());
+  }
+
+  Tensor4_times_Tensor2_23
+  (const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
+   const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+inline Tensor2_Expr
+<const Tensor4_times_Tensor2_23<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim0,Dim1,i,j>
+operator*(const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
+	  const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b)
+{
+  typedef const Tensor4_times_Tensor2_23
+    <A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,b));
+}
+
+/* B(k,l)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+inline Tensor2_Expr
+<const Tensor4_times_Tensor2_23<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim0,Dim1,i,j>
+operator*(const Tensor2_Expr<B,U,Dim2,Dim3,k,l> &b,
+	  const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a)
+{
+  typedef const Tensor4_times_Tensor2_23
+    <A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k,l)*B(l,k) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+class Tensor4_times_Tensor2_32
+{
+  const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> iterA;
+  const Tensor2_Expr<B,U,Dim3,Dim2,l,k> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,N2,Current_Dim0-1,Current_Dim1-1)
+      *iterB(Current_Dim1-1,Current_Dim0-1)
+      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,N2,0,Current_Dim1-1)*iterB(Current_Dim1-1,0)
+      + eval(N1,N2,Number<Dim2>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(N1,N2,0,0)*iterB(0,0);
+  }
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim2>(),Number<Dim3>());
+  }
+
+  Tensor4_times_Tensor2_32
+  (const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
+   const Tensor2_Expr<B,U,Dim3,Dim2,l,k> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+inline Tensor2_Expr
+<const Tensor4_times_Tensor2_32<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim0,Dim1,i,j>
+operator*(const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
+	  const Tensor2_Expr<B,U,Dim3,Dim2,l,k> &b)
+{
+  typedef const Tensor4_times_Tensor2_32
+    <A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,b));
+}
+
+/* B(l,k)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+inline Tensor2_Expr
+<const Tensor4_times_Tensor2_32<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim0,Dim1,i,j>
+operator*(const Tensor2_Expr<B,U,Dim3,Dim2,l,k> &b,
+	  const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a)
+{
+  typedef const Tensor4_times_Tensor2_32
+    <A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k,l)*B(i,l) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+class Tensor4_times_Tensor2_03
+{
+  const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> iterA;
+  const Tensor2_Expr<B,U,Dim0,Dim3,i,l> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,N1,N2,Current_Dim1-1)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,N1,N2,Current_Dim1-1)*iterB(0,Current_Dim1-1)
+      + eval(N1,N2,Number<Dim0>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,N1,N2,0)*iterB(0,0);
+  }
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim0>(),Number<Dim3>());
+  }
+
+  Tensor4_times_Tensor2_03
+  (const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
+   const Tensor2_Expr<B,U,Dim0,Dim3,i,l> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+inline Tensor2_Expr
+<const Tensor4_times_Tensor2_03<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim1,Dim2,j,k>
+operator*(const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
+	  const Tensor2_Expr<B,U,Dim0,Dim3,i,l> &b)
+{
+  typedef const Tensor4_times_Tensor2_03
+    <A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,k>
+    (TensorExpr(a,b));
+}
+
+/* B(i,l)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+inline Tensor2_Expr
+<const Tensor4_times_Tensor2_03<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim1,Dim2,j,k>
+operator*(const Tensor2_Expr<B,U,Dim0,Dim3,i,l> &b,
+	  const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a)
+{
+  typedef const Tensor4_times_Tensor2_03
+    <A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,k>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k,l)*B(l,i) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+class Tensor4_times_Tensor2_30
+{
+  const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> iterA;
+  const Tensor2_Expr<B,U,Dim3,Dim0,l,i> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,N1,N2,Current_Dim1-1)
+      *iterB(Current_Dim1-1,Current_Dim0-1)
+      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,N1,N2,Current_Dim1-1)*iterB(Current_Dim1-1,0)
+      + eval(N1,N2,Number<Dim0>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,N1,N2,0)*iterB(0,0);
+  }
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim0>(),Number<Dim3>());
+  }
+
+  Tensor4_times_Tensor2_30
+  (const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
+   const Tensor2_Expr<B,U,Dim3,Dim0,l,i> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+inline Tensor2_Expr
+<const Tensor4_times_Tensor2_30<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim1,Dim2,j,k>
+operator*(const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a,
+	  const Tensor2_Expr<B,U,Dim3,Dim0,l,i> &b)
+{
+  typedef const Tensor4_times_Tensor2_30
+    <A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,k>
+    (TensorExpr(a,b));
+}
+
+/* B(l,i)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
+  int Dim3, char i, char j, char k, char l>
+inline Tensor2_Expr
+<const Tensor4_times_Tensor2_30<A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l>,
+  typename promote<T,U>::V,Dim1,Dim2,j,k>
+operator*(const Tensor2_Expr<B,U,Dim3,Dim0,l,i> &b,
+	  const Tensor4_Expr<A,T,Dim0,Dim1,Dim2,Dim3,i,j,k,l> &a)
+{
+  typedef const Tensor4_times_Tensor2_30
+    <A,B,T,U,Dim0,Dim1,Dim2,Dim3,i,j,k,l> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,k>
+    (TensorExpr(a,b));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor4/Tensor4_times_Tensor2_symmetric.h
--- a/Tensor4/Tensor4_times_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,371 +0,0 @@
-/* This file has all of the declarations for expressions like
-   Tensor4*Tensor2_symmetric and Tensor2_symmetric*Tensor4, yielding a
-   Tensor2. */
-
-/* A(i,j,k,l)*B(k,l) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim,
-  char i, char j, char k, char l>
-class Tensor4_times_Tensor2_symmetric_23
-{
-  const Tensor4_Expr<A,T,Dim0,Dim1,Dim,Dim,i,j,k,l> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,k,l> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,N2,Current_Dim0-1,Current_Dim1-1)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,N2,0,Current_Dim1-1)*iterB(0,Current_Dim1-1)
-      + eval(N1,N2,Number<Dim>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(N1,N2,0,0)*iterB(0,0);
-  }
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim>(),Number<Dim>());
-  }
-
-  Tensor4_times_Tensor2_symmetric_23
-  (const Tensor4_Expr<A,T,Dim0,Dim1,Dim,Dim,i,j,k,l> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,k,l> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim,
-  char i, char j, char k, char l>
-inline Tensor2_Expr
-<const Tensor4_times_Tensor2_symmetric_23<A,B,T,U,Dim0,Dim1,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim0,Dim1,i,j>
-operator*(const Tensor4_Expr<A,T,Dim0,Dim1,Dim,Dim,i,j,k,l> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,k,l> &b)
-{
-  typedef const Tensor4_times_Tensor2_symmetric_23
-    <A,B,T,U,Dim0,Dim1,Dim,i,j,k,l> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,b));
-}
-
-/* B(k,l)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim,
-  char i, char j, char k, char l>
-inline Tensor2_Expr
-<const Tensor4_times_Tensor2_symmetric_23<A,B,T,U,Dim0,Dim1,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim0,Dim1,i,j>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim,k,l> &b,
-	  const Tensor4_Expr<A,T,Dim0,Dim1,Dim,Dim,i,j,k,l> &a)
-{
-  typedef const Tensor4_times_Tensor2_symmetric_23
-    <A,B,T,U,Dim0,Dim1,Dim,i,j,k,l> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k,l)*B(l,k) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim,
-  char i, char j, char k, char l>
-class Tensor4_times_Tensor2_symmetric_32
-{
-  const Tensor4_Expr<A,T,Dim0,Dim1,Dim,Dim,i,j,k,l> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,l,k> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,N2,Current_Dim0-1,Current_Dim1-1)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,N2,0,Current_Dim1-1)*iterB(0,Current_Dim1-1)
-      + eval(N1,N2,Number<Dim>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(N1,N2,0,0)*iterB(0,0);
-  }
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim>(),Number<Dim>());
-  }
-
-  Tensor4_times_Tensor2_symmetric_32
-  (const Tensor4_Expr<A,T,Dim0,Dim1,Dim,Dim,i,j,k,l> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,l,k> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim,
-  char i, char j, char k, char l>
-inline Tensor2_Expr
-<const Tensor4_times_Tensor2_symmetric_32<A,B,T,U,Dim0,Dim1,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim0,Dim1,i,j>
-operator*(const Tensor4_Expr<A,T,Dim0,Dim1,Dim,Dim,i,j,k,l> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,l,k> &b)
-{
-  typedef const Tensor4_times_Tensor2_symmetric_32
-    <A,B,T,U,Dim0,Dim1,Dim,i,j,k,l> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,b));
-}
-
-/* B(l,k)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim,
-  char i, char j, char k, char l>
-inline Tensor2_Expr
-<const Tensor4_times_Tensor2_symmetric_32<A,B,T,U,Dim0,Dim1,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim0,Dim1,i,j>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim,l,k> &b,
-	  const Tensor4_Expr<A,T,Dim0,Dim1,Dim,Dim,i,j,k,l> &a)
-{
-  typedef const Tensor4_times_Tensor2_symmetric_32
-    <A,B,T,U,Dim0,Dim1,Dim,i,j,k,l> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k,l)*B(i,l) */
-
-template<class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
-  char i, char j, char k, char l>
-class Tensor4_times_Tensor2_symmetric_03
-{
-  const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,i,l> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,N1,N2,Current_Dim1-1)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,N1,N2,Current_Dim1-1)*iterB(0,Current_Dim1-1)
-      + eval(N1,N2,Number<Dim>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,N1,N2,0)*iterB(0,0);
-  }
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim>(),Number<Dim>());
-  }
-
-  Tensor4_times_Tensor2_symmetric_03
-  (const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,i,l> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
-  char i, char j, char k, char l>
-inline Tensor2_Expr
-<const Tensor4_times_Tensor2_symmetric_03<A,B,T,U,Dim1,Dim2,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim1,Dim2,j,k>
-operator*(const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,i,l> &b)
-{
-  typedef const Tensor4_times_Tensor2_symmetric_03
-    <A,B,T,U,Dim1,Dim2,Dim,i,j,k,l> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,k>
-    (TensorExpr(a,b));
-}
-
-/* B(i,l)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
-  char i, char j, char k, char l>
-inline Tensor2_Expr
-<const Tensor4_times_Tensor2_symmetric_03<A,B,T,U,Dim1,Dim2,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim1,Dim2,j,k>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim,i,l> &b,
-	  const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> &a)
-{
-  typedef const Tensor4_times_Tensor2_symmetric_03
-    <A,B,T,U,Dim1,Dim2,Dim,i,j,k,l> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,k>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k,l)*B(l,i) */
-
-template<class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
-  char i, char j, char k, char l>
-class Tensor4_times_Tensor2_symmetric_30
-{
-  const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,l,i> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,N1,N2,Current_Dim1-1)
-      *iterB(Current_Dim1-1,Current_Dim0-1)
-      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,N1,N2,Current_Dim1-1)*iterB(Current_Dim1-1,0)
-      + eval(N1,N2,Number<Dim>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,N1,N2,0)*iterB(0,0);
-  }
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim>(),Number<Dim>());
-  }
-
-  Tensor4_times_Tensor2_symmetric_30
-  (const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,l,i> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
-  char i, char j, char k, char l>
-inline Tensor2_Expr
-<const Tensor4_times_Tensor2_symmetric_30<A,B,T,U,Dim1,Dim2,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim1,Dim2,j,k>
-operator*(const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,l,i> &b)
-{
-  typedef const Tensor4_times_Tensor2_symmetric_30
-    <A,B,T,U,Dim1,Dim2,Dim,i,j,k,l> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,k>
-    (TensorExpr(a,b));
-}
-
-/* B(l,i)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
-  char i, char j, char k, char l>
-inline Tensor2_Expr
-<const Tensor4_times_Tensor2_symmetric_30<A,B,T,U,Dim1,Dim2,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim1,Dim2,j,k>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim,l,i> &b,
-	  const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> &a)
-{
-  typedef const Tensor4_times_Tensor2_symmetric_30
-    <A,B,T,U,Dim1,Dim2,Dim,i,j,k,l> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,k>
-    (TensorExpr(a,b));
-}
-
-
-
-
-/* A(i,j,k,l)*B(i,k) */
-
-template<class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
-  char i, char j, char k, char l>
-class Tensor4_times_Tensor2_symmetric_02
-{
-  const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,i,k> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,N1,Current_Dim1-1,N2)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,N1,Current_Dim1-1,N2)*iterB(0,Current_Dim1-1)
-      + eval(N1,N2,Number<Dim>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,N1,0,N2)*iterB(0,0);
-  }
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim>(),Number<Dim>());
-  }
-
-  Tensor4_times_Tensor2_symmetric_02
-  (const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,i,k> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
-  char i, char j, char k, char l>
-inline Tensor2_Expr
-<const Tensor4_times_Tensor2_symmetric_02<A,B,T,U,Dim1,Dim2,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim1,Dim2,j,l>
-operator*(const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,i,k> &b)
-{
-  typedef const Tensor4_times_Tensor2_symmetric_02
-    <A,B,T,U,Dim1,Dim2,Dim,i,j,k,l> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,l>
-    (TensorExpr(a,b));
-}
-
-/* B(i,k)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
-  char i, char j, char k, char l>
-inline Tensor2_Expr
-<const Tensor4_times_Tensor2_symmetric_02<A,B,T,U,Dim1,Dim2,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim1,Dim2,j,l>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim,i,k> &b,
-	  const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> &a)
-{
-  typedef const Tensor4_times_Tensor2_symmetric_02
-    <A,B,T,U,Dim1,Dim2,Dim,i,j,k,l> TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,l>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4/Tensor4_times_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4/Tensor4_times_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,371 @@
+/* This file has all of the declarations for expressions like
+   Tensor4*Tensor2_symmetric and Tensor2_symmetric*Tensor4, yielding a
+   Tensor2. */
+
+/* A(i,j,k,l)*B(k,l) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim,
+  char i, char j, char k, char l>
+class Tensor4_times_Tensor2_symmetric_23
+{
+  const Tensor4_Expr<A,T,Dim0,Dim1,Dim,Dim,i,j,k,l> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,k,l> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,N2,Current_Dim0-1,Current_Dim1-1)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,N2,0,Current_Dim1-1)*iterB(0,Current_Dim1-1)
+      + eval(N1,N2,Number<Dim>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(N1,N2,0,0)*iterB(0,0);
+  }
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim>(),Number<Dim>());
+  }
+
+  Tensor4_times_Tensor2_symmetric_23
+  (const Tensor4_Expr<A,T,Dim0,Dim1,Dim,Dim,i,j,k,l> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,k,l> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim,
+  char i, char j, char k, char l>
+inline Tensor2_Expr
+<const Tensor4_times_Tensor2_symmetric_23<A,B,T,U,Dim0,Dim1,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim0,Dim1,i,j>
+operator*(const Tensor4_Expr<A,T,Dim0,Dim1,Dim,Dim,i,j,k,l> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,k,l> &b)
+{
+  typedef const Tensor4_times_Tensor2_symmetric_23
+    <A,B,T,U,Dim0,Dim1,Dim,i,j,k,l> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,b));
+}
+
+/* B(k,l)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim,
+  char i, char j, char k, char l>
+inline Tensor2_Expr
+<const Tensor4_times_Tensor2_symmetric_23<A,B,T,U,Dim0,Dim1,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim0,Dim1,i,j>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim,k,l> &b,
+	  const Tensor4_Expr<A,T,Dim0,Dim1,Dim,Dim,i,j,k,l> &a)
+{
+  typedef const Tensor4_times_Tensor2_symmetric_23
+    <A,B,T,U,Dim0,Dim1,Dim,i,j,k,l> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k,l)*B(l,k) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim,
+  char i, char j, char k, char l>
+class Tensor4_times_Tensor2_symmetric_32
+{
+  const Tensor4_Expr<A,T,Dim0,Dim1,Dim,Dim,i,j,k,l> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,l,k> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,N2,Current_Dim0-1,Current_Dim1-1)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,N2,0,Current_Dim1-1)*iterB(0,Current_Dim1-1)
+      + eval(N1,N2,Number<Dim>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(N1,N2,0,0)*iterB(0,0);
+  }
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim>(),Number<Dim>());
+  }
+
+  Tensor4_times_Tensor2_symmetric_32
+  (const Tensor4_Expr<A,T,Dim0,Dim1,Dim,Dim,i,j,k,l> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,l,k> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim,
+  char i, char j, char k, char l>
+inline Tensor2_Expr
+<const Tensor4_times_Tensor2_symmetric_32<A,B,T,U,Dim0,Dim1,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim0,Dim1,i,j>
+operator*(const Tensor4_Expr<A,T,Dim0,Dim1,Dim,Dim,i,j,k,l> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,l,k> &b)
+{
+  typedef const Tensor4_times_Tensor2_symmetric_32
+    <A,B,T,U,Dim0,Dim1,Dim,i,j,k,l> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,b));
+}
+
+/* B(l,k)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim0, int Dim1, int Dim,
+  char i, char j, char k, char l>
+inline Tensor2_Expr
+<const Tensor4_times_Tensor2_symmetric_32<A,B,T,U,Dim0,Dim1,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim0,Dim1,i,j>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim,l,k> &b,
+	  const Tensor4_Expr<A,T,Dim0,Dim1,Dim,Dim,i,j,k,l> &a)
+{
+  typedef const Tensor4_times_Tensor2_symmetric_32
+    <A,B,T,U,Dim0,Dim1,Dim,i,j,k,l> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim0,Dim1,i,j>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k,l)*B(i,l) */
+
+template<class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
+  char i, char j, char k, char l>
+class Tensor4_times_Tensor2_symmetric_03
+{
+  const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,i,l> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,N1,N2,Current_Dim1-1)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,N1,N2,Current_Dim1-1)*iterB(0,Current_Dim1-1)
+      + eval(N1,N2,Number<Dim>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,N1,N2,0)*iterB(0,0);
+  }
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim>(),Number<Dim>());
+  }
+
+  Tensor4_times_Tensor2_symmetric_03
+  (const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,i,l> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
+  char i, char j, char k, char l>
+inline Tensor2_Expr
+<const Tensor4_times_Tensor2_symmetric_03<A,B,T,U,Dim1,Dim2,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim1,Dim2,j,k>
+operator*(const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,i,l> &b)
+{
+  typedef const Tensor4_times_Tensor2_symmetric_03
+    <A,B,T,U,Dim1,Dim2,Dim,i,j,k,l> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,k>
+    (TensorExpr(a,b));
+}
+
+/* B(i,l)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
+  char i, char j, char k, char l>
+inline Tensor2_Expr
+<const Tensor4_times_Tensor2_symmetric_03<A,B,T,U,Dim1,Dim2,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim1,Dim2,j,k>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim,i,l> &b,
+	  const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> &a)
+{
+  typedef const Tensor4_times_Tensor2_symmetric_03
+    <A,B,T,U,Dim1,Dim2,Dim,i,j,k,l> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,k>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k,l)*B(l,i) */
+
+template<class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
+  char i, char j, char k, char l>
+class Tensor4_times_Tensor2_symmetric_30
+{
+  const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,l,i> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,N1,N2,Current_Dim1-1)
+      *iterB(Current_Dim1-1,Current_Dim0-1)
+      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,N1,N2,Current_Dim1-1)*iterB(Current_Dim1-1,0)
+      + eval(N1,N2,Number<Dim>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,N1,N2,0)*iterB(0,0);
+  }
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim>(),Number<Dim>());
+  }
+
+  Tensor4_times_Tensor2_symmetric_30
+  (const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,l,i> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
+  char i, char j, char k, char l>
+inline Tensor2_Expr
+<const Tensor4_times_Tensor2_symmetric_30<A,B,T,U,Dim1,Dim2,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim1,Dim2,j,k>
+operator*(const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,l,i> &b)
+{
+  typedef const Tensor4_times_Tensor2_symmetric_30
+    <A,B,T,U,Dim1,Dim2,Dim,i,j,k,l> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,k>
+    (TensorExpr(a,b));
+}
+
+/* B(l,i)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
+  char i, char j, char k, char l>
+inline Tensor2_Expr
+<const Tensor4_times_Tensor2_symmetric_30<A,B,T,U,Dim1,Dim2,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim1,Dim2,j,k>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim,l,i> &b,
+	  const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> &a)
+{
+  typedef const Tensor4_times_Tensor2_symmetric_30
+    <A,B,T,U,Dim1,Dim2,Dim,i,j,k,l> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,k>
+    (TensorExpr(a,b));
+}
+
+
+
+
+/* A(i,j,k,l)*B(i,k) */
+
+template<class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
+  char i, char j, char k, char l>
+class Tensor4_times_Tensor2_symmetric_02
+{
+  const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,i,k> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,N1,Current_Dim1-1,N2)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,N1,Current_Dim1-1,N2)*iterB(0,Current_Dim1-1)
+      + eval(N1,N2,Number<Dim>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,N1,0,N2)*iterB(0,0);
+  }
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim>(),Number<Dim>());
+  }
+
+  Tensor4_times_Tensor2_symmetric_02
+  (const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,i,k> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
+  char i, char j, char k, char l>
+inline Tensor2_Expr
+<const Tensor4_times_Tensor2_symmetric_02<A,B,T,U,Dim1,Dim2,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim1,Dim2,j,l>
+operator*(const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,i,k> &b)
+{
+  typedef const Tensor4_times_Tensor2_symmetric_02
+    <A,B,T,U,Dim1,Dim2,Dim,i,j,k,l> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,l>
+    (TensorExpr(a,b));
+}
+
+/* B(i,k)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
+  char i, char j, char k, char l>
+inline Tensor2_Expr
+<const Tensor4_times_Tensor2_symmetric_02<A,B,T,U,Dim1,Dim2,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim1,Dim2,j,l>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim,i,k> &b,
+	  const Tensor4_Expr<A,T,Dim,Dim1,Dim2,Dim,i,j,k,l> &a)
+{
+  typedef const Tensor4_times_Tensor2_symmetric_02
+    <A,B,T,U,Dim1,Dim2,Dim,i,j,k,l> TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim1,Dim2,j,l>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_Riemann.h
--- a/Tensor4_Riemann.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,132 +0,0 @@
-/* Declaration for Tensor4_Riemann, which has the symmetries of the
-   Riemann tensor.  Antisymmetric on the first two indices and the
-   last two indices, and symmetric on a cyclic permutation of the last
-   three indices. */
-
-template <class T, int Dim>
-class Tensor4_Riemann
-{};
-
-template <class T>
-class Tensor4_Riemann<T,3>
-{
-  /* The zero variable is because some of the components of a tensor
-     with these symmetries are identically zero. */
-
-  T zero;
-  T data0101,data0102,data0112,data0202,data0212,data1212;
-public:
-  Tensor4_Riemann():zero(0.0) {}
-
-  /* There are two operator(int,int,int,int)'s, one for non-consts
-     that lets you change the value, and one for consts that doesn't.
-     The non-const one will give you a wrong answer if you aren't
-     careful.  The problem is that we only store the minimal set of
-     components, but some have different signs.  We can't return the
-     negative of a component, and assign something to it, because that
-     would assign something to a temporary.  To get the correct answer
-     if you don't want to change the value, use eval instead. */
-
-  T operator()(const int N1, const int N2, const int N3, const int N4)
-    const
-  {
-    return 
-      N1==0 ?
-      (N2==0 ? zero
-       : (N2==1 ?
-	  (N3==0 ?
-	   (N4==0 ? zero : (N4==1 ? data0101 : data0102))
-	   : (N3==1 ? (N4==0 ? -data0101 : (N4==1 ? zero : data0112))
-	      : (N4==0 ? -data0102 : (N4==1 ? -data0112 : zero))))
-	  : (N3==0 ?
-	   (N4==0 ? zero : (N4==1 ? data0102 : data0202))
-	   : (N3==1 ? (N4==0 ? -data0102 : (N4==1 ? zero : data0212))
-	      : (N4==0 ? -data0202 : (N4==1 ? -data0212 : zero))))))
-      : (N1==1 ?
-	 (N2==0 ?
-	  (N3==0 ?
-	   (N4==0 ? zero : (N4==1 ? -data0101 : -data0102))
-	   : (N3==1 ? (N4==0 ? data0101 : (N4==1 ? zero : -data0112))
-	      : (N4==0 ? data0102 : (N4==1 ? data0112 : zero))))
-	  : (N2==1 ? zero
-	     : (N3==0 ?
-		(N4==0 ? zero : (N4==1 ? data0112 : data0212))
-		: (N3==1 ? (N4==0 ? -data0112 : (N4==1 ? zero : data1212))
-		   : (N4==0 ? -data0212 : (N4==1 ? -data1212 : zero))))))
-	 : (N2==0 ?
-	    (N3==0 ?
-	     (N4==0 ? zero : (N4==1 ? -data0102 : -data0202))
-	     : (N3==1 ? (N4==0 ? data0102 : (N4==1 ? zero : -data0212))
-		: (N4==0 ? data0202 : (N4==1 ? data0212 : zero))))
-	    : (N2==1 ?
-	       (N3==0 ?
-		(N4==0 ? zero : (N4==1 ? -data0112 : -data0212))
-		: (N3==1 ? (N4==0 ? data0112 : (N4==1 ? zero : -data1212))
-		   : (N4==0 ? data0212 : (N4==1 ? data1212 : zero))))
-	       : zero)));
-  }
-
-  T eval(const int N1, const int N2, const int N3, const int N4)
-    const
-  {
-    return 
-      N1==0 ?
-      (N2==0 ? zero
-       : (N2==1 ?
-	  (N3==0 ?
-	   (N4==0 ? zero : (N4==1 ? data0101 : data0102))
-	   : (N3==1 ? (N4==0 ? -data0101 : (N4==1 ? zero : data0112))
-	      : (N4==0 ? -data0102 : (N4==1 ? -data0112 : zero))))
-	  : (N3==0 ?
-	   (N4==0 ? zero : (N4==1 ? data0102 : data0202))
-	   : (N3==1 ? (N4==0 ? -data0102 : (N4==1 ? zero : data0212))
-	      : (N4==0 ? -data0202 : (N4==1 ? -data0212 : zero))))))
-      : (N1==1 ?
-	 (N2==0 ?
-	  (N3==0 ?
-	   (N4==0 ? zero : (N4==1 ? -data0101 : -data0102))
-	   : (N3==1 ? (N4==0 ? data0101 : (N4==1 ? zero : -data0112))
-	      : (N4==0 ? data0102 : (N4==1 ? data0112 : zero))))
-	  : (N2==1 ? zero
-	     : (N3==0 ?
-		(N4==0 ? zero : (N4==1 ? data0112 : data0212))
-		: (N3==1 ? (N4==0 ? -data0112 : (N4==1 ? zero : data1212))
-		   : (N4==0 ? -data0212 : (N4==1 ? -data1212 : zero))))))
-	 : (N2==0 ?
-	    (N3==0 ?
-	     (N4==0 ? zero : (N4==1 ? -data0102 : -data0202))
-	     : (N3==1 ? (N4==0 ? data0102 : (N4==1 ? zero : -data0212))
-		: (N4==0 ? data0202 : (N4==1 ? data0212 : zero))))
-	    : (N2==1 ?
-	       (N3==0 ?
-		(N4==0 ? zero : (N4==1 ? -data0112 : -data0212))
-		: (N3==1 ? (N4==0 ? data0112 : (N4==1 ? zero : -data1212))
-		   : (N4==0 ? data0212 : (N4==1 ? data1212 : zero))))
-	       : zero)));
-  }
-
-  T & operator()(const int N1, const int N2, const int N3, const int N4)
-  {
-    return
-      (N1==0 && N2==1 && N3==0 && N4==1) ? data0101
-      : ((N1==0 && N2==1 && N3==0 && N4==2) ? data0102
-	 : ((N1==0 && N2==1 && N3==1 && N4==2) ? data0112
-	    : ((N1==0 && N2==2 && N3==1 && N4==2) ? data0212
-	       : ((N1==0 && N2==2 && N3==0 && N4==2) ? data0202
-		  : ((N1==1 && N2==2 && N3==1 && N4==2) ? data1212
-		     : zero)))));
-  }
-
-  /* These operator()'s are the first part in constructing template
-     expressions. */
-
-  template<char i, char j, char k, char l>
-  Tensor4_Riemann_Expr<Tensor4_Riemann<T,3>,T,3,i,j,k,l> operator()
-    (const Index<i,3> index1, const Index<j,3> index2, const Index<k,3> index3,
-     const Index<l,3> index4)
-  {
-    return Tensor4_Riemann_Expr<Tensor4_Riemann<T,3>,T,3,i,j,k,l>(*this);
-  }
-};
-
-#include "Tensor4_Riemann/Tensor4_Riemann_Expr.h"
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_Riemann.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_Riemann.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,132 @@
+/* Declaration for Tensor4_Riemann, which has the symmetries of the
+   Riemann tensor.  Antisymmetric on the first two indices and the
+   last two indices, and symmetric on a cyclic permutation of the last
+   three indices. */
+
+template <class T, int Dim>
+class Tensor4_Riemann
+{};
+
+template <class T>
+class Tensor4_Riemann<T,3>
+{
+  /* The zero variable is because some of the components of a tensor
+     with these symmetries are identically zero. */
+
+  T zero;
+  T data0101,data0102,data0112,data0202,data0212,data1212;
+public:
+  Tensor4_Riemann():zero(0.0) {}
+
+  /* There are two operator(int,int,int,int)'s, one for non-consts
+     that lets you change the value, and one for consts that doesn't.
+     The non-const one will give you a wrong answer if you aren't
+     careful.  The problem is that we only store the minimal set of
+     components, but some have different signs.  We can't return the
+     negative of a component, and assign something to it, because that
+     would assign something to a temporary.  To get the correct answer
+     if you don't want to change the value, use eval instead. */
+
+  T operator()(const int N1, const int N2, const int N3, const int N4)
+    const
+  {
+    return 
+      N1==0 ?
+      (N2==0 ? zero
+       : (N2==1 ?
+	  (N3==0 ?
+	   (N4==0 ? zero : (N4==1 ? data0101 : data0102))
+	   : (N3==1 ? (N4==0 ? -data0101 : (N4==1 ? zero : data0112))
+	      : (N4==0 ? -data0102 : (N4==1 ? -data0112 : zero))))
+	  : (N3==0 ?
+	   (N4==0 ? zero : (N4==1 ? data0102 : data0202))
+	   : (N3==1 ? (N4==0 ? -data0102 : (N4==1 ? zero : data0212))
+	      : (N4==0 ? -data0202 : (N4==1 ? -data0212 : zero))))))
+      : (N1==1 ?
+	 (N2==0 ?
+	  (N3==0 ?
+	   (N4==0 ? zero : (N4==1 ? -data0101 : -data0102))
+	   : (N3==1 ? (N4==0 ? data0101 : (N4==1 ? zero : -data0112))
+	      : (N4==0 ? data0102 : (N4==1 ? data0112 : zero))))
+	  : (N2==1 ? zero
+	     : (N3==0 ?
+		(N4==0 ? zero : (N4==1 ? data0112 : data0212))
+		: (N3==1 ? (N4==0 ? -data0112 : (N4==1 ? zero : data1212))
+		   : (N4==0 ? -data0212 : (N4==1 ? -data1212 : zero))))))
+	 : (N2==0 ?
+	    (N3==0 ?
+	     (N4==0 ? zero : (N4==1 ? -data0102 : -data0202))
+	     : (N3==1 ? (N4==0 ? data0102 : (N4==1 ? zero : -data0212))
+		: (N4==0 ? data0202 : (N4==1 ? data0212 : zero))))
+	    : (N2==1 ?
+	       (N3==0 ?
+		(N4==0 ? zero : (N4==1 ? -data0112 : -data0212))
+		: (N3==1 ? (N4==0 ? data0112 : (N4==1 ? zero : -data1212))
+		   : (N4==0 ? data0212 : (N4==1 ? data1212 : zero))))
+	       : zero)));
+  }
+
+  T eval(const int N1, const int N2, const int N3, const int N4)
+    const
+  {
+    return 
+      N1==0 ?
+      (N2==0 ? zero
+       : (N2==1 ?
+	  (N3==0 ?
+	   (N4==0 ? zero : (N4==1 ? data0101 : data0102))
+	   : (N3==1 ? (N4==0 ? -data0101 : (N4==1 ? zero : data0112))
+	      : (N4==0 ? -data0102 : (N4==1 ? -data0112 : zero))))
+	  : (N3==0 ?
+	   (N4==0 ? zero : (N4==1 ? data0102 : data0202))
+	   : (N3==1 ? (N4==0 ? -data0102 : (N4==1 ? zero : data0212))
+	      : (N4==0 ? -data0202 : (N4==1 ? -data0212 : zero))))))
+      : (N1==1 ?
+	 (N2==0 ?
+	  (N3==0 ?
+	   (N4==0 ? zero : (N4==1 ? -data0101 : -data0102))
+	   : (N3==1 ? (N4==0 ? data0101 : (N4==1 ? zero : -data0112))
+	      : (N4==0 ? data0102 : (N4==1 ? data0112 : zero))))
+	  : (N2==1 ? zero
+	     : (N3==0 ?
+		(N4==0 ? zero : (N4==1 ? data0112 : data0212))
+		: (N3==1 ? (N4==0 ? -data0112 : (N4==1 ? zero : data1212))
+		   : (N4==0 ? -data0212 : (N4==1 ? -data1212 : zero))))))
+	 : (N2==0 ?
+	    (N3==0 ?
+	     (N4==0 ? zero : (N4==1 ? -data0102 : -data0202))
+	     : (N3==1 ? (N4==0 ? data0102 : (N4==1 ? zero : -data0212))
+		: (N4==0 ? data0202 : (N4==1 ? data0212 : zero))))
+	    : (N2==1 ?
+	       (N3==0 ?
+		(N4==0 ? zero : (N4==1 ? -data0112 : -data0212))
+		: (N3==1 ? (N4==0 ? data0112 : (N4==1 ? zero : -data1212))
+		   : (N4==0 ? data0212 : (N4==1 ? data1212 : zero))))
+	       : zero)));
+  }
+
+  T & operator()(const int N1, const int N2, const int N3, const int N4)
+  {
+    return
+      (N1==0 && N2==1 && N3==0 && N4==1) ? data0101
+      : ((N1==0 && N2==1 && N3==0 && N4==2) ? data0102
+	 : ((N1==0 && N2==1 && N3==1 && N4==2) ? data0112
+	    : ((N1==0 && N2==2 && N3==1 && N4==2) ? data0212
+	       : ((N1==0 && N2==2 && N3==0 && N4==2) ? data0202
+		  : ((N1==1 && N2==2 && N3==1 && N4==2) ? data1212
+		     : zero)))));
+  }
+
+  /* These operator()'s are the first part in constructing template
+     expressions. */
+
+  template<char i, char j, char k, char l>
+  Tensor4_Riemann_Expr<Tensor4_Riemann<T,3>,T,3,i,j,k,l> operator()
+    (const Index<i,3> index1, const Index<j,3> index2, const Index<k,3> index3,
+     const Index<l,3> index4)
+  {
+    return Tensor4_Riemann_Expr<Tensor4_Riemann<T,3>,T,3,i,j,k,l>(*this);
+  }
+};
+
+#include "Tensor4_Riemann/Tensor4_Riemann_Expr.hpp"
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_Riemann/Tensor4_Riemann_Expr.h
--- a/Tensor4_Riemann/Tensor4_Riemann_Expr.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,88 +0,0 @@
-/* Declares a wrapper class for rank 4 Tensor expressions with Riemann
-   symmetries.  */
-
-#include "Tensor4_Riemann_times_Tensor2_symmetric.h"
-#include "Tensor4_Riemann_plus_Tensor4_Riemann.h"
-#include "Tensor4_Riemann_minus_Tensor4_Riemann.h"
-#include "Tensor4_Riemann_times_Tensor1.h"
-#include "Tensor4_Riemann_times_Tensor4_ddg.h"
-
-template<class A, class T, int Dim, char i, char j, char k, char l>
-class Tensor4_Riemann_Expr
-{
-  A iter;
-public:
-  Tensor4_Riemann_Expr(A &a): iter(a) {}
-  T operator()(const int N1, const int N2, const int N3, const int N4)
-    const
-  {
-    return iter(N1,N2,N3,N4);
-  }
-};
-
-
-template<class A, class T, int Dim, char i, char j, char k, char l>
-class Tensor4_Riemann_Expr<Tensor4_Riemann<A,Dim>,T,Dim,i,j,k,l>
-{
-  Tensor4_Riemann<A,Dim> &iter;
-public:
-  Tensor4_Riemann_Expr(Tensor4_Riemann<A,Dim> &a): iter(a) {}
-  T operator()(const int N1, const int N2, const int N3, const int N4)
-    const
-  {
-    return iter.eval(N1,N2,N3,N4);
-  }
-
-  /* Various assignment operators.  I have to explicitly declare the
-     second operator= because otherwise the compiler will generate its
-     own and not use the template code. */
-
-  template<class B, class U>
-  const Tensor4_Riemann_Expr<Tensor4_Riemann<A,Dim>,T,Dim,i,j,k,l> &
-  operator=(const Tensor4_Riemann_Expr<B,U,Dim,i,j,k,l> &result)
-  {
-    iter(0,1,0,1)=result(0,1,0,1);
-    iter(0,1,0,2)=result(0,1,0,2);
-    iter(0,2,0,2)=result(0,2,0,2);
-    iter(0,1,1,2)=result(0,1,1,2);
-    iter(0,2,1,2)=result(0,2,1,2);
-    iter(1,2,1,2)=result(1,2,1,2);
-    return *this;
-  }
-
-  const Tensor4_Riemann_Expr<Tensor4_Riemann<A,Dim>,T,Dim,i,j,k,l> &
-  operator=(const Tensor4_Riemann_Expr<Tensor4_Riemann<A,Dim>,T,Dim,i,j,k,l>
-	    &result)
-  {
-    return operator=<Tensor4_Riemann<A,Dim>,T>(result);
-  }
-  template<class B, class U>
-  const Tensor4_Riemann_Expr<Tensor4_Riemann<A,Dim>,T,Dim,i,j,k,l> &
-  operator+=(const Tensor4_Riemann_Expr<B,U,Dim,i,j,k,l> &result)
-  {
-    iter(0,1,0,1)+=result(0,1,0,1);
-    iter(0,1,0,2)+=result(0,1,0,2);
-    iter(0,2,0,2)+=result(0,2,0,2);
-    iter(0,1,1,2)+=result(0,1,1,2);
-    iter(0,2,1,2)+=result(0,2,1,2);
-    iter(1,2,1,2)+=result(1,2,1,2);
-    return *this;
-  }
-
-  /* Add a Tensor4_Riemann with the indices switched, making it a
-     subtraction. */
-
-  template<class B, class U>
-  const Tensor4_Riemann_Expr<Tensor4_Riemann<A,Dim>,T,Dim,i,j,k,l> &
-  operator+=(const Tensor4_Riemann_Expr<B,U,Dim,j,i,k,l> &result)
-  {
-    iter(0,1,0,1)-=result(0,1,0,1);
-    iter(0,1,0,2)-=result(0,1,0,2);
-    iter(0,2,0,2)-=result(0,2,0,2);
-    iter(0,1,1,2)-=result(0,1,1,2);
-    iter(0,2,1,2)-=result(0,2,1,2);
-    iter(1,2,1,2)-=result(1,2,1,2);
-    return *this;
-  }
-
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_Riemann/Tensor4_Riemann_Expr.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_Riemann/Tensor4_Riemann_Expr.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,88 @@
+/* Declares a wrapper class for rank 4 Tensor expressions with Riemann
+   symmetries.  */
+
+#include "Tensor4_Riemann_times_Tensor2_symmetric.hpp"
+#include "Tensor4_Riemann_plus_Tensor4_Riemann.hpp"
+#include "Tensor4_Riemann_minus_Tensor4_Riemann.hpp"
+#include "Tensor4_Riemann_times_Tensor1.hpp"
+#include "Tensor4_Riemann_times_Tensor4_ddg.hpp"
+
+template<class A, class T, int Dim, char i, char j, char k, char l>
+class Tensor4_Riemann_Expr
+{
+  A iter;
+public:
+  Tensor4_Riemann_Expr(A &a): iter(a) {}
+  T operator()(const int N1, const int N2, const int N3, const int N4)
+    const
+  {
+    return iter(N1,N2,N3,N4);
+  }
+};
+
+
+template<class A, class T, int Dim, char i, char j, char k, char l>
+class Tensor4_Riemann_Expr<Tensor4_Riemann<A,Dim>,T,Dim,i,j,k,l>
+{
+  Tensor4_Riemann<A,Dim> &iter;
+public:
+  Tensor4_Riemann_Expr(Tensor4_Riemann<A,Dim> &a): iter(a) {}
+  T operator()(const int N1, const int N2, const int N3, const int N4)
+    const
+  {
+    return iter.eval(N1,N2,N3,N4);
+  }
+
+  /* Various assignment operators.  I have to explicitly declare the
+     second operator= because otherwise the compiler will generate its
+     own and not use the template code. */
+
+  template<class B, class U>
+  const Tensor4_Riemann_Expr<Tensor4_Riemann<A,Dim>,T,Dim,i,j,k,l> &
+  operator=(const Tensor4_Riemann_Expr<B,U,Dim,i,j,k,l> &result)
+  {
+    iter(0,1,0,1)=result(0,1,0,1);
+    iter(0,1,0,2)=result(0,1,0,2);
+    iter(0,2,0,2)=result(0,2,0,2);
+    iter(0,1,1,2)=result(0,1,1,2);
+    iter(0,2,1,2)=result(0,2,1,2);
+    iter(1,2,1,2)=result(1,2,1,2);
+    return *this;
+  }
+
+  const Tensor4_Riemann_Expr<Tensor4_Riemann<A,Dim>,T,Dim,i,j,k,l> &
+  operator=(const Tensor4_Riemann_Expr<Tensor4_Riemann<A,Dim>,T,Dim,i,j,k,l>
+	    &result)
+  {
+    return operator=<Tensor4_Riemann<A,Dim>,T>(result);
+  }
+  template<class B, class U>
+  const Tensor4_Riemann_Expr<Tensor4_Riemann<A,Dim>,T,Dim,i,j,k,l> &
+  operator+=(const Tensor4_Riemann_Expr<B,U,Dim,i,j,k,l> &result)
+  {
+    iter(0,1,0,1)+=result(0,1,0,1);
+    iter(0,1,0,2)+=result(0,1,0,2);
+    iter(0,2,0,2)+=result(0,2,0,2);
+    iter(0,1,1,2)+=result(0,1,1,2);
+    iter(0,2,1,2)+=result(0,2,1,2);
+    iter(1,2,1,2)+=result(1,2,1,2);
+    return *this;
+  }
+
+  /* Add a Tensor4_Riemann with the indices switched, making it a
+     subtraction. */
+
+  template<class B, class U>
+  const Tensor4_Riemann_Expr<Tensor4_Riemann<A,Dim>,T,Dim,i,j,k,l> &
+  operator+=(const Tensor4_Riemann_Expr<B,U,Dim,j,i,k,l> &result)
+  {
+    iter(0,1,0,1)-=result(0,1,0,1);
+    iter(0,1,0,2)-=result(0,1,0,2);
+    iter(0,2,0,2)-=result(0,2,0,2);
+    iter(0,1,1,2)-=result(0,1,1,2);
+    iter(0,2,1,2)-=result(0,2,1,2);
+    iter(1,2,1,2)-=result(1,2,1,2);
+    return *this;
+  }
+
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_Riemann/Tensor4_Riemann_minus_Tensor4_Riemann.h
--- a/Tensor4_Riemann/Tensor4_Riemann_minus_Tensor4_Riemann.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-/* Subtracts a Tensor4_Riemann from a Tensor4_Riemann, yielding a
-   Tensor4_Riemann. */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-class Tensor4_Riemann_minus_Tensor4_Riemann
-{
-  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> iterA;
-  const Tensor4_Riemann_Expr<B,U,Dim,i,j,k,l> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-			     const int N4) const
-  {
-    return iterA(N1,N2,N3,N4)-iterB(N1,N2,N3,N4);
-  }
-
-  Tensor4_Riemann_minus_Tensor4_Riemann
-  (const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
-   const Tensor4_Riemann_Expr<B,U,Dim,i,j,k,l> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const Tensor4_Riemann_Expr
-<const Tensor4_Riemann_minus_Tensor4_Riemann<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,i,j,k,l>
-operator-(const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
-	  const Tensor4_Riemann_Expr<B,U,Dim,i,j,k,l> &b)
-{
-  typedef const Tensor4_Riemann_minus_Tensor4_Riemann<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor4_Riemann_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j,k,l>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_Riemann/Tensor4_Riemann_minus_Tensor4_Riemann.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_Riemann/Tensor4_Riemann_minus_Tensor4_Riemann.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,34 @@
+/* Subtracts a Tensor4_Riemann from a Tensor4_Riemann, yielding a
+   Tensor4_Riemann. */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+class Tensor4_Riemann_minus_Tensor4_Riemann
+{
+  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> iterA;
+  const Tensor4_Riemann_Expr<B,U,Dim,i,j,k,l> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+			     const int N4) const
+  {
+    return iterA(N1,N2,N3,N4)-iterB(N1,N2,N3,N4);
+  }
+
+  Tensor4_Riemann_minus_Tensor4_Riemann
+  (const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
+   const Tensor4_Riemann_Expr<B,U,Dim,i,j,k,l> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const Tensor4_Riemann_Expr
+<const Tensor4_Riemann_minus_Tensor4_Riemann<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,i,j,k,l>
+operator-(const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
+	  const Tensor4_Riemann_Expr<B,U,Dim,i,j,k,l> &b)
+{
+  typedef const Tensor4_Riemann_minus_Tensor4_Riemann<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor4_Riemann_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j,k,l>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_Riemann/Tensor4_Riemann_plus_Tensor4_Riemann.h
--- a/Tensor4_Riemann/Tensor4_Riemann_plus_Tensor4_Riemann.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-/* Adds a Tensor4_Riemann to a Tensor4_Riemann, yielding a
-   Tensor4_Riemann. */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-class Tensor4_Riemann_plus_Tensor4_Riemann
-{
-  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> iterA;
-  const Tensor4_Riemann_Expr<B,U,Dim,i,j,k,l> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-			     const int N4) const
-  {
-    return iterA(N1,N2,N3,N4)+iterB(N1,N2,N3,N4);
-  }
-
-  Tensor4_Riemann_plus_Tensor4_Riemann
-  (const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
-   const Tensor4_Riemann_Expr<B,U,Dim,i,j,k,l> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const Tensor4_Riemann_Expr
-<const Tensor4_Riemann_plus_Tensor4_Riemann<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,i,j,k,l>
-operator+(const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
-	  const Tensor4_Riemann_Expr<B,U,Dim,i,j,k,l> &b)
-{
-  typedef const Tensor4_Riemann_plus_Tensor4_Riemann<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor4_Riemann_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j,k,l>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_Riemann/Tensor4_Riemann_plus_Tensor4_Riemann.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_Riemann/Tensor4_Riemann_plus_Tensor4_Riemann.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,34 @@
+/* Adds a Tensor4_Riemann to a Tensor4_Riemann, yielding a
+   Tensor4_Riemann. */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+class Tensor4_Riemann_plus_Tensor4_Riemann
+{
+  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> iterA;
+  const Tensor4_Riemann_Expr<B,U,Dim,i,j,k,l> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+			     const int N4) const
+  {
+    return iterA(N1,N2,N3,N4)+iterB(N1,N2,N3,N4);
+  }
+
+  Tensor4_Riemann_plus_Tensor4_Riemann
+  (const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
+   const Tensor4_Riemann_Expr<B,U,Dim,i,j,k,l> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const Tensor4_Riemann_Expr
+<const Tensor4_Riemann_plus_Tensor4_Riemann<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,i,j,k,l>
+operator+(const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
+	  const Tensor4_Riemann_Expr<B,U,Dim,i,j,k,l> &b)
+{
+  typedef const Tensor4_Riemann_plus_Tensor4_Riemann<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor4_Riemann_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j,k,l>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_Riemann/Tensor4_Riemann_times_Tensor1.h
--- a/Tensor4_Riemann/Tensor4_Riemann_times_Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,199 +0,0 @@
-/* This file has all of the declarations for expressions like
-   Tensor4_Riemann*Tensor1, yielding a Tensor3_antisymmetric. */
-
-/* A(i,j,k,l)*B(i) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-class Tensor4_Riemann_times_Tensor1_0
-{
-  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> iterA;
-  const Tensor1_Expr<B,U,Dim,i> iterB;
-public:
-  Tensor4_Riemann_times_Tensor1_0
-  (const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
-   const Tensor1_Expr<B,U,Dim,i> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(0,N1,N2,N3)*iterB(0) + iterA(1,N1,N2,N3)*iterB(1)
-      + iterA(2,N1,N2,N3)*iterB(2);
-  }
-};
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const Tensor3_antisymmetric_Expr
-<const Tensor4_Riemann_times_Tensor1_0<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,Dim,j,k,l>
-operator*(const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
-	  const Tensor1_Expr<B,U,Dim,i> &b)
-{
-  typedef const Tensor4_Riemann_times_Tensor1_0<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor3_antisymmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,j,k,l>
-    (TensorExpr(a,b));
-}
-
-/* B(i)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const Tensor3_antisymmetric_Expr
-<const Tensor4_Riemann_times_Tensor1_0<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,Dim,j,k,l>
-operator*(const Tensor1_Expr<B,U,Dim,i> &b,
-	  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a)
-{
-  typedef const Tensor4_Riemann_times_Tensor1_0<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor3_antisymmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,j,k,l>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k,l)*B(j) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-class Tensor4_Riemann_times_Tensor1_1
-{
-  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> iterA;
-  const Tensor1_Expr<B,U,Dim,j> iterB;
-public:
-  Tensor4_Riemann_times_Tensor1_1
-  (const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
-   const Tensor1_Expr<B,U,Dim,j> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,0,N2,N3)*iterB(0) + iterA(N1,1,N2,N3)*iterB(1)
-      + iterA(N1,2,N2,N3)*iterB(2);
-  }
-};
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const Tensor3_antisymmetric_Expr
-<const Tensor4_Riemann_times_Tensor1_1<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,Dim,i,k,l>
-operator*(const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
-	  const Tensor1_Expr<B,U,Dim,j> &b)
-{
-  typedef const Tensor4_Riemann_times_Tensor1_1<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor3_antisymmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,k,l>
-    (TensorExpr(a,b));
-}
-
-/* B(j)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const Tensor3_antisymmetric_Expr
-<const Tensor4_Riemann_times_Tensor1_1<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,Dim,i,k,l>
-operator*(const Tensor1_Expr<B,U,Dim,j> &b,
-	  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a)
-{
-  typedef const Tensor4_Riemann_times_Tensor1_1<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor3_antisymmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,k,l>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k,l)*B(k) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-class Tensor4_Riemann_times_Tensor1_2
-{
-  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> iterA;
-  const Tensor1_Expr<B,U,Dim,k> iterB;
-public:
-  Tensor4_Riemann_times_Tensor1_2
-  (const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
-   const Tensor1_Expr<B,U,Dim,k> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,0,N3)*iterB(0) + iterA(N1,N2,1,N3)*iterB(1)
-      + iterA(N1,N2,2,N3)*iterB(2);
-  }
-};
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const Tensor3_antisymmetric_Expr
-<const Tensor4_Riemann_times_Tensor1_2<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,Dim,i,j,l>
-operator*(const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
-	  const Tensor1_Expr<B,U,Dim,k> &b)
-{
-  typedef const Tensor4_Riemann_times_Tensor1_2<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor3_antisymmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j,l>
-    (TensorExpr(a,b));
-}
-
-/* B(k)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const Tensor3_antisymmetric_Expr
-<const Tensor4_Riemann_times_Tensor1_2<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,Dim,i,j,l>
-operator*(const Tensor1_Expr<B,U,Dim,k> &b,
-	  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a)
-{
-  typedef const Tensor4_Riemann_times_Tensor1_2<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor3_antisymmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j,l>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k,l)*B(l) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-class Tensor4_Riemann_times_Tensor1_3
-{
-  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> iterA;
-  const Tensor1_Expr<B,U,Dim,l> iterB;
-public:
-  Tensor4_Riemann_times_Tensor1_3
-  (const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
-   const Tensor1_Expr<B,U,Dim,l> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return iterA(N1,N2,N3,0)*iterB(0) + iterA(N1,N2,N3,1)*iterB(1)
-      + iterA(N1,N2,N3,2)*iterB(2);
-  }
-};
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const Tensor3_antisymmetric_Expr
-<const Tensor4_Riemann_times_Tensor1_3<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,Dim,i,j,k>
-operator*(const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
-	  const Tensor1_Expr<B,U,Dim,l> &b)
-{
-  typedef const Tensor4_Riemann_times_Tensor1_3<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor3_antisymmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j,k>
-    (TensorExpr(a,b));
-}
-
-/* B(l)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const Tensor3_antisymmetric_Expr
-<const Tensor4_Riemann_times_Tensor1_3<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,Dim,i,j,k>
-operator*(const Tensor1_Expr<B,U,Dim,l> &b,
-	  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a)
-{
-  typedef const Tensor4_Riemann_times_Tensor1_3<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor3_antisymmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j,k>
-    (TensorExpr(a,b));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_Riemann/Tensor4_Riemann_times_Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_Riemann/Tensor4_Riemann_times_Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,199 @@
+/* This file has all of the declarations for expressions like
+   Tensor4_Riemann*Tensor1, yielding a Tensor3_antisymmetric. */
+
+/* A(i,j,k,l)*B(i) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+class Tensor4_Riemann_times_Tensor1_0
+{
+  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> iterA;
+  const Tensor1_Expr<B,U,Dim,i> iterB;
+public:
+  Tensor4_Riemann_times_Tensor1_0
+  (const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
+   const Tensor1_Expr<B,U,Dim,i> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(0,N1,N2,N3)*iterB(0) + iterA(1,N1,N2,N3)*iterB(1)
+      + iterA(2,N1,N2,N3)*iterB(2);
+  }
+};
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const Tensor3_antisymmetric_Expr
+<const Tensor4_Riemann_times_Tensor1_0<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,Dim,j,k,l>
+operator*(const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
+	  const Tensor1_Expr<B,U,Dim,i> &b)
+{
+  typedef const Tensor4_Riemann_times_Tensor1_0<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor3_antisymmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,j,k,l>
+    (TensorExpr(a,b));
+}
+
+/* B(i)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const Tensor3_antisymmetric_Expr
+<const Tensor4_Riemann_times_Tensor1_0<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,Dim,j,k,l>
+operator*(const Tensor1_Expr<B,U,Dim,i> &b,
+	  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a)
+{
+  typedef const Tensor4_Riemann_times_Tensor1_0<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor3_antisymmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,j,k,l>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k,l)*B(j) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+class Tensor4_Riemann_times_Tensor1_1
+{
+  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> iterA;
+  const Tensor1_Expr<B,U,Dim,j> iterB;
+public:
+  Tensor4_Riemann_times_Tensor1_1
+  (const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
+   const Tensor1_Expr<B,U,Dim,j> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,0,N2,N3)*iterB(0) + iterA(N1,1,N2,N3)*iterB(1)
+      + iterA(N1,2,N2,N3)*iterB(2);
+  }
+};
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const Tensor3_antisymmetric_Expr
+<const Tensor4_Riemann_times_Tensor1_1<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,Dim,i,k,l>
+operator*(const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
+	  const Tensor1_Expr<B,U,Dim,j> &b)
+{
+  typedef const Tensor4_Riemann_times_Tensor1_1<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor3_antisymmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,k,l>
+    (TensorExpr(a,b));
+}
+
+/* B(j)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const Tensor3_antisymmetric_Expr
+<const Tensor4_Riemann_times_Tensor1_1<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,Dim,i,k,l>
+operator*(const Tensor1_Expr<B,U,Dim,j> &b,
+	  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a)
+{
+  typedef const Tensor4_Riemann_times_Tensor1_1<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor3_antisymmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,k,l>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k,l)*B(k) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+class Tensor4_Riemann_times_Tensor1_2
+{
+  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> iterA;
+  const Tensor1_Expr<B,U,Dim,k> iterB;
+public:
+  Tensor4_Riemann_times_Tensor1_2
+  (const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
+   const Tensor1_Expr<B,U,Dim,k> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,0,N3)*iterB(0) + iterA(N1,N2,1,N3)*iterB(1)
+      + iterA(N1,N2,2,N3)*iterB(2);
+  }
+};
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const Tensor3_antisymmetric_Expr
+<const Tensor4_Riemann_times_Tensor1_2<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,Dim,i,j,l>
+operator*(const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
+	  const Tensor1_Expr<B,U,Dim,k> &b)
+{
+  typedef const Tensor4_Riemann_times_Tensor1_2<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor3_antisymmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j,l>
+    (TensorExpr(a,b));
+}
+
+/* B(k)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const Tensor3_antisymmetric_Expr
+<const Tensor4_Riemann_times_Tensor1_2<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,Dim,i,j,l>
+operator*(const Tensor1_Expr<B,U,Dim,k> &b,
+	  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a)
+{
+  typedef const Tensor4_Riemann_times_Tensor1_2<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor3_antisymmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j,l>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k,l)*B(l) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+class Tensor4_Riemann_times_Tensor1_3
+{
+  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> iterA;
+  const Tensor1_Expr<B,U,Dim,l> iterB;
+public:
+  Tensor4_Riemann_times_Tensor1_3
+  (const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
+   const Tensor1_Expr<B,U,Dim,l> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return iterA(N1,N2,N3,0)*iterB(0) + iterA(N1,N2,N3,1)*iterB(1)
+      + iterA(N1,N2,N3,2)*iterB(2);
+  }
+};
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const Tensor3_antisymmetric_Expr
+<const Tensor4_Riemann_times_Tensor1_3<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,Dim,i,j,k>
+operator*(const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
+	  const Tensor1_Expr<B,U,Dim,l> &b)
+{
+  typedef const Tensor4_Riemann_times_Tensor1_3<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor3_antisymmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j,k>
+    (TensorExpr(a,b));
+}
+
+/* B(l)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const Tensor3_antisymmetric_Expr
+<const Tensor4_Riemann_times_Tensor1_3<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,Dim,i,j,k>
+operator*(const Tensor1_Expr<B,U,Dim,l> &b,
+	  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a)
+{
+  typedef const Tensor4_Riemann_times_Tensor1_3<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor3_antisymmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j,k>
+    (TensorExpr(a,b));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_Riemann/Tensor4_Riemann_times_Tensor2_symmetric.h
--- a/Tensor4_Riemann/Tensor4_Riemann_times_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/* This file has all of the declarations for expressions like
-   Tensor4_Riemann*Tensor2_symmetric and
-   Tensor2_symmetric*Tensor4_Riemann, yielding a Tensor2_symmetric. */
-
-/* A(i,j,k,l)*B(i,k) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-class Tensor4_Riemann_times_Tensor2_symmetric_0
-{
-  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,i,k> iterB;
-public:
-  Tensor4_Riemann_times_Tensor2_symmetric_0
-  (const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,i,k> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return iterA(0,N1,0,N2)*iterB(0,0) + iterA(0,N1,1,N2)*iterB(0,1)
-      + iterA(0,N1,2,N2)*iterB(0,2) + iterA(1,N1,0,N2)*iterB(1,0)
-      + iterA(1,N1,1,N2)*iterB(1,1) + iterA(1,N1,2,N2)*iterB(1,2)
-      + iterA(2,N1,0,N2)*iterB(2,0) + iterA(2,N1,1,N2)*iterB(2,1)
-      + iterA(2,N1,2,N2)*iterB(2,2);
-  }
-};
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const Tensor2_symmetric_Expr
-<const Tensor4_Riemann_times_Tensor2_symmetric_0<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,j,l>
-operator*(const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,i,k> &b)
-{
-  typedef const Tensor4_Riemann_times_Tensor2_symmetric_0<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,j,l>
-    (TensorExpr(a,b));
-}
-
-/* B(i,k)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const Tensor2_symmetric_Expr
-<const Tensor4_Riemann_times_Tensor2_symmetric_0<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,j,l>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim,i,k> &b,
-	  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a)
-{
-  typedef const Tensor4_Riemann_times_Tensor2_symmetric_0<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,j,l>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_Riemann/Tensor4_Riemann_times_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_Riemann/Tensor4_Riemann_times_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,55 @@
+/* This file has all of the declarations for expressions like
+   Tensor4_Riemann*Tensor2_symmetric and
+   Tensor2_symmetric*Tensor4_Riemann, yielding a Tensor2_symmetric. */
+
+/* A(i,j,k,l)*B(i,k) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+class Tensor4_Riemann_times_Tensor2_symmetric_0
+{
+  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,i,k> iterB;
+public:
+  Tensor4_Riemann_times_Tensor2_symmetric_0
+  (const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,i,k> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return iterA(0,N1,0,N2)*iterB(0,0) + iterA(0,N1,1,N2)*iterB(0,1)
+      + iterA(0,N1,2,N2)*iterB(0,2) + iterA(1,N1,0,N2)*iterB(1,0)
+      + iterA(1,N1,1,N2)*iterB(1,1) + iterA(1,N1,2,N2)*iterB(1,2)
+      + iterA(2,N1,0,N2)*iterB(2,0) + iterA(2,N1,1,N2)*iterB(2,1)
+      + iterA(2,N1,2,N2)*iterB(2,2);
+  }
+};
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const Tensor2_symmetric_Expr
+<const Tensor4_Riemann_times_Tensor2_symmetric_0<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,j,l>
+operator*(const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,i,k> &b)
+{
+  typedef const Tensor4_Riemann_times_Tensor2_symmetric_0<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,j,l>
+    (TensorExpr(a,b));
+}
+
+/* B(i,k)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const Tensor2_symmetric_Expr
+<const Tensor4_Riemann_times_Tensor2_symmetric_0<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,j,l>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim,i,k> &b,
+	  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a)
+{
+  typedef const Tensor4_Riemann_times_Tensor2_symmetric_0<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,j,l>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_Riemann/Tensor4_Riemann_times_Tensor4.h
--- a/Tensor4_Riemann/Tensor4_Riemann_times_Tensor4.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-/* This file has the declaration for Tensor4_Riemann*Tensor4 yielding
-   a double.  I simplify the expression by removing the identically
-   zero components of Riemann. */
-
-/* A(i,j,k,l)*B(i,j,k,l) */
-
-template<class A, class B, char i, char j, char k, char l>
-inline double operator*(const Tensor4_Riemann_Expr<A,i,j,k,l> &a,
-			const Tensor4_Expr<B,i,j,k,l> &b)
-{
-  return a(1,0,0,1)*b(1,0,0,1) + a(2,0,0,1)*b(2,0,0,1)
-    + a(0,1,0,1)*b(0,1,0,1) + a(2,1,0,1)*b(2,1,0,1)
-    + a(0,2,0,1)*b(0,2,0,1) + a(1,2,0,1)*b(1,2,0,1)
-    + a(1,0,0,2)*b(1,0,0,2) + a(2,0,0,2)*b(2,0,0,2)
-    + a(0,1,0,2)*b(0,1,0,2) + a(2,1,0,2)*b(2,1,0,2)
-    + a(0,2,0,2)*b(0,2,0,2) + a(1,2,0,2)*b(1,2,0,2)
-    + a(1,0,1,0)*b(1,0,1,0) + a(2,0,1,0)*b(2,0,1,0)
-    + a(0,1,1,0)*b(0,1,1,0) + a(2,1,1,0)*b(2,1,1,0)
-    + a(0,2,1,0)*b(0,2,1,0) + a(1,2,1,0)*b(1,2,1,0)
-    + a(1,0,1,2)*b(1,0,1,2) + a(2,0,1,2)*b(2,0,1,2)
-    + a(0,1,1,2)*b(0,1,1,2) + a(2,1,1,2)*b(2,1,1,2)
-    + a(0,2,1,2)*b(0,2,1,2) + a(1,2,1,2)*b(1,2,1,2)
-    + a(1,0,2,0)*b(1,0,2,0) + a(2,0,2,0)*b(2,0,2,0)
-    + a(0,1,2,0)*b(0,1,2,0) + a(2,1,2,0)*b(2,1,2,0)
-    + a(0,2,2,0)*b(0,2,2,0) + a(1,2,2,0)*b(1,2,2,0)
-    + a(1,0,2,1)*b(1,0,2,1) + a(2,0,2,1)*b(2,0,2,1)
-    + a(0,1,2,1)*b(0,1,2,1) + a(2,1,2,1)*b(2,1,2,1)
-    + a(0,2,2,1)*b(0,2,2,1) + a(1,2,2,1)*b(1,2,2,1);
-
-//    return a(0,0,0,0)*b(0,0,0,0) + a(1,0,0,0)*b(1,0,0,0) + a(2,0,0,0)*b(2,0,0,0)
-//      + a(0,1,0,0)*b(0,1,0,0) + a(1,1,0,0)*b(1,1,0,0) + a(2,1,0,0)*b(2,1,0,0)
-//      + a(0,2,0,0)*b(0,2,0,0) + a(1,2,0,0)*b(1,2,0,0) + a(2,2,0,0)*b(2,2,0,0)
-//      + a(0,0,0,1)*b(0,0,0,1) + a(1,0,0,1)*b(1,0,0,1) + a(2,0,0,1)*b(2,0,0,1)
-//      + a(0,1,0,1)*b(0,1,0,1) + a(1,1,0,1)*b(1,1,0,1) + a(2,1,0,1)*b(2,1,0,1)
-//      + a(0,2,0,1)*b(0,2,0,1) + a(1,2,0,1)*b(1,2,0,1) + a(2,2,0,1)*b(2,2,0,1)
-//      + a(0,0,0,2)*b(0,0,0,2) + a(1,0,0,2)*b(1,0,0,2) + a(2,0,0,2)*b(2,0,0,2)
-//      + a(0,1,0,2)*b(0,1,0,2) + a(1,1,0,2)*b(1,1,0,2) + a(2,1,0,2)*b(2,1,0,2)
-//      + a(0,2,0,2)*b(0,2,0,2) + a(1,2,0,2)*b(1,2,0,2) + a(2,2,0,2)*b(2,2,0,2)
-//      + a(0,0,1,0)*b(0,0,1,0) + a(1,0,1,0)*b(1,0,1,0) + a(2,0,1,0)*b(2,0,1,0)
-//      + a(0,1,1,0)*b(0,1,1,0) + a(1,1,1,0)*b(1,1,1,0) + a(2,1,1,0)*b(2,1,1,0)
-//      + a(0,2,1,0)*b(0,2,1,0) + a(1,2,1,0)*b(1,2,1,0) + a(2,2,1,0)*b(2,2,1,0)
-//      + a(0,0,1,1)*b(0,0,1,1) + a(1,0,1,1)*b(1,0,1,1) + a(2,0,1,1)*b(2,0,1,1)
-//      + a(0,1,1,1)*b(0,1,1,1) + a(1,1,1,1)*b(1,1,1,1) + a(2,1,1,1)*b(2,1,1,1)
-//      + a(0,2,1,1)*b(0,2,1,1) + a(1,2,1,1)*b(1,2,1,1) + a(2,2,1,1)*b(2,2,1,1)
-//      + a(0,0,1,2)*b(0,0,1,2) + a(1,0,1,2)*b(1,0,1,2) + a(2,0,1,2)*b(2,0,1,2)
-//      + a(0,1,1,2)*b(0,1,1,2) + a(1,1,1,2)*b(1,1,1,2) + a(2,1,1,2)*b(2,1,1,2)
-//      + a(0,2,1,2)*b(0,2,1,2) + a(1,2,1,2)*b(1,2,1,2) + a(2,2,1,2)*b(2,2,1,2)
-//      + a(0,0,2,0)*b(0,0,2,0) + a(1,0,2,0)*b(1,0,2,0) + a(2,0,2,0)*b(2,0,2,0)
-//      + a(0,1,2,0)*b(0,1,2,0) + a(1,1,2,0)*b(1,1,2,0) + a(2,1,2,0)*b(2,1,2,0)
-//      + a(0,2,2,0)*b(0,2,2,0) + a(1,2,2,0)*b(1,2,2,0) + a(2,2,2,0)*b(2,2,2,0)
-//      + a(0,0,2,1)*b(0,0,2,1) + a(1,0,2,1)*b(1,0,2,1) + a(2,0,2,1)*b(2,0,2,1)
-//      + a(0,1,2,1)*b(0,1,2,1) + a(1,1,2,1)*b(1,1,2,1) + a(2,1,2,1)*b(2,1,2,1)
-//      + a(0,2,2,1)*b(0,2,2,1) + a(1,2,2,1)*b(1,2,2,1) + a(2,2,2,1)*b(2,2,2,1)
-//      + a(0,0,2,2)*b(0,0,2,2) + a(1,0,2,2)*b(1,0,2,2) + a(2,0,2,2)*b(2,0,2,2)
-//      + a(0,1,2,2)*b(0,1,2,2) + a(1,1,2,2)*b(1,1,2,2) + a(2,1,2,2)*b(2,1,2,2)
-//      + a(0,2,2,2)*b(0,2,2,2) + a(1,2,2,2)*b(1,2,2,2) + a(2,2,2,2)*b(2,2,2,2);
-}
-
-template<class A, class B, char i, char j, char k, char l>
-inline double operator*(const Tensor4_Expr<B,i,j,k,l> &b,
-			const Tensor4_Riemann_Expr<A,i,j,k,l> &a)
-			
-{
-  return operator*(a,b);
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_Riemann/Tensor4_Riemann_times_Tensor4.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_Riemann/Tensor4_Riemann_times_Tensor4.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,65 @@
+/* This file has the declaration for Tensor4_Riemann*Tensor4 yielding
+   a double.  I simplify the expression by removing the identically
+   zero components of Riemann. */
+
+/* A(i,j,k,l)*B(i,j,k,l) */
+
+template<class A, class B, char i, char j, char k, char l>
+inline double operator*(const Tensor4_Riemann_Expr<A,i,j,k,l> &a,
+			const Tensor4_Expr<B,i,j,k,l> &b)
+{
+  return a(1,0,0,1)*b(1,0,0,1) + a(2,0,0,1)*b(2,0,0,1)
+    + a(0,1,0,1)*b(0,1,0,1) + a(2,1,0,1)*b(2,1,0,1)
+    + a(0,2,0,1)*b(0,2,0,1) + a(1,2,0,1)*b(1,2,0,1)
+    + a(1,0,0,2)*b(1,0,0,2) + a(2,0,0,2)*b(2,0,0,2)
+    + a(0,1,0,2)*b(0,1,0,2) + a(2,1,0,2)*b(2,1,0,2)
+    + a(0,2,0,2)*b(0,2,0,2) + a(1,2,0,2)*b(1,2,0,2)
+    + a(1,0,1,0)*b(1,0,1,0) + a(2,0,1,0)*b(2,0,1,0)
+    + a(0,1,1,0)*b(0,1,1,0) + a(2,1,1,0)*b(2,1,1,0)
+    + a(0,2,1,0)*b(0,2,1,0) + a(1,2,1,0)*b(1,2,1,0)
+    + a(1,0,1,2)*b(1,0,1,2) + a(2,0,1,2)*b(2,0,1,2)
+    + a(0,1,1,2)*b(0,1,1,2) + a(2,1,1,2)*b(2,1,1,2)
+    + a(0,2,1,2)*b(0,2,1,2) + a(1,2,1,2)*b(1,2,1,2)
+    + a(1,0,2,0)*b(1,0,2,0) + a(2,0,2,0)*b(2,0,2,0)
+    + a(0,1,2,0)*b(0,1,2,0) + a(2,1,2,0)*b(2,1,2,0)
+    + a(0,2,2,0)*b(0,2,2,0) + a(1,2,2,0)*b(1,2,2,0)
+    + a(1,0,2,1)*b(1,0,2,1) + a(2,0,2,1)*b(2,0,2,1)
+    + a(0,1,2,1)*b(0,1,2,1) + a(2,1,2,1)*b(2,1,2,1)
+    + a(0,2,2,1)*b(0,2,2,1) + a(1,2,2,1)*b(1,2,2,1);
+
+//    return a(0,0,0,0)*b(0,0,0,0) + a(1,0,0,0)*b(1,0,0,0) + a(2,0,0,0)*b(2,0,0,0)
+//      + a(0,1,0,0)*b(0,1,0,0) + a(1,1,0,0)*b(1,1,0,0) + a(2,1,0,0)*b(2,1,0,0)
+//      + a(0,2,0,0)*b(0,2,0,0) + a(1,2,0,0)*b(1,2,0,0) + a(2,2,0,0)*b(2,2,0,0)
+//      + a(0,0,0,1)*b(0,0,0,1) + a(1,0,0,1)*b(1,0,0,1) + a(2,0,0,1)*b(2,0,0,1)
+//      + a(0,1,0,1)*b(0,1,0,1) + a(1,1,0,1)*b(1,1,0,1) + a(2,1,0,1)*b(2,1,0,1)
+//      + a(0,2,0,1)*b(0,2,0,1) + a(1,2,0,1)*b(1,2,0,1) + a(2,2,0,1)*b(2,2,0,1)
+//      + a(0,0,0,2)*b(0,0,0,2) + a(1,0,0,2)*b(1,0,0,2) + a(2,0,0,2)*b(2,0,0,2)
+//      + a(0,1,0,2)*b(0,1,0,2) + a(1,1,0,2)*b(1,1,0,2) + a(2,1,0,2)*b(2,1,0,2)
+//      + a(0,2,0,2)*b(0,2,0,2) + a(1,2,0,2)*b(1,2,0,2) + a(2,2,0,2)*b(2,2,0,2)
+//      + a(0,0,1,0)*b(0,0,1,0) + a(1,0,1,0)*b(1,0,1,0) + a(2,0,1,0)*b(2,0,1,0)
+//      + a(0,1,1,0)*b(0,1,1,0) + a(1,1,1,0)*b(1,1,1,0) + a(2,1,1,0)*b(2,1,1,0)
+//      + a(0,2,1,0)*b(0,2,1,0) + a(1,2,1,0)*b(1,2,1,0) + a(2,2,1,0)*b(2,2,1,0)
+//      + a(0,0,1,1)*b(0,0,1,1) + a(1,0,1,1)*b(1,0,1,1) + a(2,0,1,1)*b(2,0,1,1)
+//      + a(0,1,1,1)*b(0,1,1,1) + a(1,1,1,1)*b(1,1,1,1) + a(2,1,1,1)*b(2,1,1,1)
+//      + a(0,2,1,1)*b(0,2,1,1) + a(1,2,1,1)*b(1,2,1,1) + a(2,2,1,1)*b(2,2,1,1)
+//      + a(0,0,1,2)*b(0,0,1,2) + a(1,0,1,2)*b(1,0,1,2) + a(2,0,1,2)*b(2,0,1,2)
+//      + a(0,1,1,2)*b(0,1,1,2) + a(1,1,1,2)*b(1,1,1,2) + a(2,1,1,2)*b(2,1,1,2)
+//      + a(0,2,1,2)*b(0,2,1,2) + a(1,2,1,2)*b(1,2,1,2) + a(2,2,1,2)*b(2,2,1,2)
+//      + a(0,0,2,0)*b(0,0,2,0) + a(1,0,2,0)*b(1,0,2,0) + a(2,0,2,0)*b(2,0,2,0)
+//      + a(0,1,2,0)*b(0,1,2,0) + a(1,1,2,0)*b(1,1,2,0) + a(2,1,2,0)*b(2,1,2,0)
+//      + a(0,2,2,0)*b(0,2,2,0) + a(1,2,2,0)*b(1,2,2,0) + a(2,2,2,0)*b(2,2,2,0)
+//      + a(0,0,2,1)*b(0,0,2,1) + a(1,0,2,1)*b(1,0,2,1) + a(2,0,2,1)*b(2,0,2,1)
+//      + a(0,1,2,1)*b(0,1,2,1) + a(1,1,2,1)*b(1,1,2,1) + a(2,1,2,1)*b(2,1,2,1)
+//      + a(0,2,2,1)*b(0,2,2,1) + a(1,2,2,1)*b(1,2,2,1) + a(2,2,2,1)*b(2,2,2,1)
+//      + a(0,0,2,2)*b(0,0,2,2) + a(1,0,2,2)*b(1,0,2,2) + a(2,0,2,2)*b(2,0,2,2)
+//      + a(0,1,2,2)*b(0,1,2,2) + a(1,1,2,2)*b(1,1,2,2) + a(2,1,2,2)*b(2,1,2,2)
+//      + a(0,2,2,2)*b(0,2,2,2) + a(1,2,2,2)*b(1,2,2,2) + a(2,2,2,2)*b(2,2,2,2);
+}
+
+template<class A, class B, char i, char j, char k, char l>
+inline double operator*(const Tensor4_Expr<B,i,j,k,l> &b,
+			const Tensor4_Riemann_Expr<A,i,j,k,l> &a)
+			
+{
+  return operator*(a,b);
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_Riemann/Tensor4_Riemann_times_Tensor4_ddg.h
--- a/Tensor4_Riemann/Tensor4_Riemann_times_Tensor4_ddg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-/* This file has the declaration for Tensor4_Riemann*Tensor4_ddg yielding
-   a typename promote<T,U>::V.  I simplify the expression by removing the identically
-   zero components of Riemann. */
-
-/* A(i,j,k,l)*B(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const typename promote<T,U>::V
-operator*(const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
-	  const Tensor4_ddg_Expr<B,U,Dim,Dim,i,j,k,l> &b)
-{
-  return a(1,0,0,1)*b(1,0,0,1) + a(2,0,0,1)*b(2,0,0,1)
-    + a(0,1,0,1)*b(0,1,0,1) + a(2,1,0,1)*b(2,1,0,1)
-    + a(0,2,0,1)*b(0,2,0,1) + a(1,2,0,1)*b(1,2,0,1)
-    + a(1,0,0,2)*b(1,0,0,2) + a(2,0,0,2)*b(2,0,0,2)
-    + a(0,1,0,2)*b(0,1,0,2) + a(2,1,0,2)*b(2,1,0,2)
-    + a(0,2,0,2)*b(0,2,0,2) + a(1,2,0,2)*b(1,2,0,2)
-    + a(1,0,1,0)*b(1,0,1,0) + a(2,0,1,0)*b(2,0,1,0)
-    + a(0,1,1,0)*b(0,1,1,0) + a(2,1,1,0)*b(2,1,1,0)
-    + a(0,2,1,0)*b(0,2,1,0) + a(1,2,1,0)*b(1,2,1,0)
-    + a(1,0,1,2)*b(1,0,1,2) + a(2,0,1,2)*b(2,0,1,2)
-    + a(0,1,1,2)*b(0,1,1,2) + a(2,1,1,2)*b(2,1,1,2)
-    + a(0,2,1,2)*b(0,2,1,2) + a(1,2,1,2)*b(1,2,1,2)
-    + a(1,0,2,0)*b(1,0,2,0) + a(2,0,2,0)*b(2,0,2,0)
-    + a(0,1,2,0)*b(0,1,2,0) + a(2,1,2,0)*b(2,1,2,0)
-    + a(0,2,2,0)*b(0,2,2,0) + a(1,2,2,0)*b(1,2,2,0)
-    + a(1,0,2,1)*b(1,0,2,1) + a(2,0,2,1)*b(2,0,2,1)
-    + a(0,1,2,1)*b(0,1,2,1) + a(2,1,2,1)*b(2,1,2,1)
-    + a(0,2,2,1)*b(0,2,2,1) + a(1,2,2,1)*b(1,2,2,1);
-}
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const typename promote<T,U>::V
-operator*(const Tensor4_ddg_Expr<B,U,Dim,Dim,i,j,k,l> &b,
-	  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a)
-			
-{
-  return operator*(a,b);
-}
-
-/* A(i,j,k,l)*B(i,k,j,l) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const typename promote<T,U>::V
-operator*(const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
-	  const Tensor4_ddg_Expr<B,U,Dim,Dim,i,k,j,l> &b)
-{
-  return a(1,0,0,1)*b(1,0,0,1) + a(2,0,0,1)*b(2,0,0,1)
-    + a(0,1,0,1)*b(0,0,1,1) + a(2,1,0,1)*b(2,0,1,1)
-    + a(0,2,0,1)*b(0,0,2,1) + a(1,2,0,1)*b(1,0,2,1)
-    + a(1,0,0,2)*b(1,0,0,2) + a(2,0,0,2)*b(2,0,0,2)
-    + a(0,1,0,2)*b(0,0,1,2) + a(2,1,0,2)*b(2,0,1,2)
-    + a(0,2,0,2)*b(0,0,2,2) + a(1,2,0,2)*b(1,0,2,2)
-    + a(1,0,1,0)*b(1,1,0,0) + a(2,0,1,0)*b(2,1,0,0)
-    + a(0,1,1,0)*b(0,1,1,0) + a(2,1,1,0)*b(2,1,1,0)
-    + a(0,2,1,0)*b(0,1,2,0) + a(1,2,1,0)*b(1,1,2,0)
-    + a(1,0,1,2)*b(1,1,0,2) + a(2,0,1,2)*b(2,1,0,2)
-    + a(0,1,1,2)*b(0,1,1,2) + a(2,1,1,2)*b(2,1,1,2)
-    + a(0,2,1,2)*b(0,1,2,2) + a(1,2,1,2)*b(1,1,2,2)
-    + a(1,0,2,0)*b(1,2,0,0) + a(2,0,2,0)*b(2,2,0,0)
-    + a(0,1,2,0)*b(0,2,1,0) + a(2,1,2,0)*b(2,2,1,0)
-    + a(0,2,2,0)*b(0,2,2,0) + a(1,2,2,0)*b(1,2,2,0)
-    + a(1,0,2,1)*b(1,2,0,1) + a(2,0,2,1)*b(2,2,0,1)
-    + a(0,1,2,1)*b(0,2,1,1) + a(2,1,2,1)*b(2,2,1,1)
-    + a(0,2,2,1)*b(0,2,2,1) + a(1,2,2,1)*b(1,2,2,1);
-}
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const typename promote<T,U>::V
- operator*(const Tensor4_ddg_Expr<B,U,Dim,Dim,i,j,k,l> &b,
-	   const Tensor4_Riemann_Expr<A,T,Dim,i,k,j,l> &a)
-			
-{
-  return operator*(a,b);
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_Riemann/Tensor4_Riemann_times_Tensor4_ddg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_Riemann/Tensor4_Riemann_times_Tensor4_ddg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,79 @@
+/* This file has the declaration for Tensor4_Riemann*Tensor4_ddg yielding
+   a typename promote<T,U>::V.  I simplify the expression by removing the identically
+   zero components of Riemann. */
+
+/* A(i,j,k,l)*B(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const typename promote<T,U>::V
+operator*(const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
+	  const Tensor4_ddg_Expr<B,U,Dim,Dim,i,j,k,l> &b)
+{
+  return a(1,0,0,1)*b(1,0,0,1) + a(2,0,0,1)*b(2,0,0,1)
+    + a(0,1,0,1)*b(0,1,0,1) + a(2,1,0,1)*b(2,1,0,1)
+    + a(0,2,0,1)*b(0,2,0,1) + a(1,2,0,1)*b(1,2,0,1)
+    + a(1,0,0,2)*b(1,0,0,2) + a(2,0,0,2)*b(2,0,0,2)
+    + a(0,1,0,2)*b(0,1,0,2) + a(2,1,0,2)*b(2,1,0,2)
+    + a(0,2,0,2)*b(0,2,0,2) + a(1,2,0,2)*b(1,2,0,2)
+    + a(1,0,1,0)*b(1,0,1,0) + a(2,0,1,0)*b(2,0,1,0)
+    + a(0,1,1,0)*b(0,1,1,0) + a(2,1,1,0)*b(2,1,1,0)
+    + a(0,2,1,0)*b(0,2,1,0) + a(1,2,1,0)*b(1,2,1,0)
+    + a(1,0,1,2)*b(1,0,1,2) + a(2,0,1,2)*b(2,0,1,2)
+    + a(0,1,1,2)*b(0,1,1,2) + a(2,1,1,2)*b(2,1,1,2)
+    + a(0,2,1,2)*b(0,2,1,2) + a(1,2,1,2)*b(1,2,1,2)
+    + a(1,0,2,0)*b(1,0,2,0) + a(2,0,2,0)*b(2,0,2,0)
+    + a(0,1,2,0)*b(0,1,2,0) + a(2,1,2,0)*b(2,1,2,0)
+    + a(0,2,2,0)*b(0,2,2,0) + a(1,2,2,0)*b(1,2,2,0)
+    + a(1,0,2,1)*b(1,0,2,1) + a(2,0,2,1)*b(2,0,2,1)
+    + a(0,1,2,1)*b(0,1,2,1) + a(2,1,2,1)*b(2,1,2,1)
+    + a(0,2,2,1)*b(0,2,2,1) + a(1,2,2,1)*b(1,2,2,1);
+}
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const typename promote<T,U>::V
+operator*(const Tensor4_ddg_Expr<B,U,Dim,Dim,i,j,k,l> &b,
+	  const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a)
+			
+{
+  return operator*(a,b);
+}
+
+/* A(i,j,k,l)*B(i,k,j,l) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const typename promote<T,U>::V
+operator*(const Tensor4_Riemann_Expr<A,T,Dim,i,j,k,l> &a,
+	  const Tensor4_ddg_Expr<B,U,Dim,Dim,i,k,j,l> &b)
+{
+  return a(1,0,0,1)*b(1,0,0,1) + a(2,0,0,1)*b(2,0,0,1)
+    + a(0,1,0,1)*b(0,0,1,1) + a(2,1,0,1)*b(2,0,1,1)
+    + a(0,2,0,1)*b(0,0,2,1) + a(1,2,0,1)*b(1,0,2,1)
+    + a(1,0,0,2)*b(1,0,0,2) + a(2,0,0,2)*b(2,0,0,2)
+    + a(0,1,0,2)*b(0,0,1,2) + a(2,1,0,2)*b(2,0,1,2)
+    + a(0,2,0,2)*b(0,0,2,2) + a(1,2,0,2)*b(1,0,2,2)
+    + a(1,0,1,0)*b(1,1,0,0) + a(2,0,1,0)*b(2,1,0,0)
+    + a(0,1,1,0)*b(0,1,1,0) + a(2,1,1,0)*b(2,1,1,0)
+    + a(0,2,1,0)*b(0,1,2,0) + a(1,2,1,0)*b(1,1,2,0)
+    + a(1,0,1,2)*b(1,1,0,2) + a(2,0,1,2)*b(2,1,0,2)
+    + a(0,1,1,2)*b(0,1,1,2) + a(2,1,1,2)*b(2,1,1,2)
+    + a(0,2,1,2)*b(0,1,2,2) + a(1,2,1,2)*b(1,1,2,2)
+    + a(1,0,2,0)*b(1,2,0,0) + a(2,0,2,0)*b(2,2,0,0)
+    + a(0,1,2,0)*b(0,2,1,0) + a(2,1,2,0)*b(2,2,1,0)
+    + a(0,2,2,0)*b(0,2,2,0) + a(1,2,2,0)*b(1,2,2,0)
+    + a(1,0,2,1)*b(1,2,0,1) + a(2,0,2,1)*b(2,2,0,1)
+    + a(0,1,2,1)*b(0,2,1,1) + a(2,1,2,1)*b(2,2,1,1)
+    + a(0,2,2,1)*b(0,2,2,1) + a(1,2,2,1)*b(1,2,2,1);
+}
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const typename promote<T,U>::V
+ operator*(const Tensor4_ddg_Expr<B,U,Dim,Dim,i,j,k,l> &b,
+	   const Tensor4_Riemann_Expr<A,T,Dim,i,k,j,l> &a)
+			
+{
+  return operator*(a,b);
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg.h
--- a/Tensor4_ddg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-/* Declaration for Tensor4_ddg, which is separately symmetric on the
-   first two and last two indices. */
-
-#include "Tensor4_ddg/Tensor4_ddg_number.h"
-#include "Tensor4_ddg/Tensor4_ddg_numeral.h"
-
-#include "Tensor4_ddg/Tensor4_ddg_value.h"
-#include "Tensor4_ddg/Tensor4_ddg_pointer.h"
-
-/* The Expression files which define the generic intermediate template
-   as well as a place where assignment gets done. */
-
-#include "Tensor4_ddg/Tensor4_ddg_Expr.h"
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,13 @@
+/* Declaration for Tensor4_ddg, which is separately symmetric on the
+   first two and last two indices. */
+
+#include "Tensor4_ddg/Tensor4_ddg_number.hpp"
+#include "Tensor4_ddg/Tensor4_ddg_numeral.hpp"
+
+#include "Tensor4_ddg/Tensor4_ddg_value.hpp"
+#include "Tensor4_ddg/Tensor4_ddg_pointer.hpp"
+
+/* The Expression files which define the generic intermediate template
+   as well as a place where assignment gets done. */
+
+#include "Tensor4_ddg/Tensor4_ddg_Expr.hpp"
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_Expr.h
--- a/Tensor4_ddg/Tensor4_ddg_Expr.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-/* Declares a wrapper class for rank 4 Tensor expressions symmetric on
-   the first two and last two indices. */
-					 
-#include "Tensor4_ddg_times_Tensor2_symmetric.h"
-#include "Tensor4_ddg_carat_Tensor2_symmetric.h"
-#include "Tensor4_ddg_and_Tensor2_symmetric.h"
-#include "Tensor4_ddg_mod_Tensor2_symmetric.h"
-#include "Tensor4_ddg_times_Tensor2.h"
-#include "Tensor4_ddg_times_Tensor1.h"
-#include "Tensor4_ddg_times_generic.h"
-#include "Tensor4_ddg_times_Tensor4_ddg.h"
-#include "Tensor4_ddg_plus_Tensor4_ddg.h"
-#include "Tensor4_ddg_minus_Tensor4_ddg.h"
-#include "Tensor4_ddg_or_Tensor4_ddg.h"
-#include "Tensor4_ddg_and_Tensor4_ddg.h"
-#include "Tensor4_ddg_carat_Tensor4_ddg.h"
-#include "minus_Tensor4_ddg.h"
-//  #include "Tensor4_ddg_mod_Tensor4_ddg.h"
-
-template<class A, class T, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-class Tensor4_ddg_Expr
-{
-  A iter;
-public:
-  Tensor4_ddg_Expr(A &a): iter(a) {}
-  T operator()(const int N1, const int N2, const int N3, const int N4)
-    const
-  {
-    return iter(N1,N2,N3,N4);
-  }
-};
-
-template<class A, class T, int Tensor_Dim01, int Tensor_Dim23,
-  int Dim01, int Dim23, char i, char j, char k, char l>
-class Tensor4_ddg_Expr<Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23>,T,Dim01,Dim23,i,j,k,l>
-{
-  Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23> &iter;
-public:
-  Tensor4_ddg_Expr(Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23> &a): iter(a) {}
-  T operator()(const int N1, const int N2, const int N3, const int N4)
-    const
-  {
-    return iter(N1,N2,N3,N4);
-  }
-
-  /* Various assignment operators.  I have to explicitly declare the
-     second operator= because otherwise the compiler will generate its
-     own and not use the template code. */
-
-  template<class B, class U>
-  const Tensor4_ddg_Expr<Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23>,T,Dim01,Dim23,i,j,k,l> &
-  operator=(const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &result);
-
-  const Tensor4_ddg_Expr<Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23>,T,Dim01,Dim23,i,j,k,l> &
-  operator=(const Tensor4_ddg_Expr<Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23>,T,Dim01,Dim23,i,j,k,l> &result);
-};
-
-#include "Tensor4_ddg_Expr_equals.h"
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_Expr.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_Expr.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,59 @@
+/* Declares a wrapper class for rank 4 Tensor expressions symmetric on
+   the first two and last two indices. */
+					 
+#include "Tensor4_ddg_times_Tensor2_symmetric.hpp"
+#include "Tensor4_ddg_carat_Tensor2_symmetric.hpp"
+#include "Tensor4_ddg_and_Tensor2_symmetric.hpp"
+#include "Tensor4_ddg_mod_Tensor2_symmetric.hpp"
+#include "Tensor4_ddg_times_Tensor2.hpp"
+#include "Tensor4_ddg_times_Tensor1.hpp"
+#include "Tensor4_ddg_times_generic.hpp"
+#include "Tensor4_ddg_times_Tensor4_ddg.hpp"
+#include "Tensor4_ddg_plus_Tensor4_ddg.hpp"
+#include "Tensor4_ddg_minus_Tensor4_ddg.hpp"
+#include "Tensor4_ddg_or_Tensor4_ddg.hpp"
+#include "Tensor4_ddg_and_Tensor4_ddg.hpp"
+#include "Tensor4_ddg_carat_Tensor4_ddg.hpp"
+#include "minus_Tensor4_ddg.hpp"
+//  #include "Tensor4_ddg_mod_Tensor4_ddg.hpp"
+
+template<class A, class T, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+class Tensor4_ddg_Expr
+{
+  A iter;
+public:
+  Tensor4_ddg_Expr(A &a): iter(a) {}
+  T operator()(const int N1, const int N2, const int N3, const int N4)
+    const
+  {
+    return iter(N1,N2,N3,N4);
+  }
+};
+
+template<class A, class T, int Tensor_Dim01, int Tensor_Dim23,
+  int Dim01, int Dim23, char i, char j, char k, char l>
+class Tensor4_ddg_Expr<Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23>,T,Dim01,Dim23,i,j,k,l>
+{
+  Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23> &iter;
+public:
+  Tensor4_ddg_Expr(Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23> &a): iter(a) {}
+  T operator()(const int N1, const int N2, const int N3, const int N4)
+    const
+  {
+    return iter(N1,N2,N3,N4);
+  }
+
+  /* Various assignment operators.  I have to explicitly declare the
+     second operator= because otherwise the compiler will generate its
+     own and not use the template code. */
+
+  template<class B, class U>
+  const Tensor4_ddg_Expr<Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23>,T,Dim01,Dim23,i,j,k,l> &
+  operator=(const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &result);
+
+  const Tensor4_ddg_Expr<Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23>,T,Dim01,Dim23,i,j,k,l> &
+  operator=(const Tensor4_ddg_Expr<Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23>,T,Dim01,Dim23,i,j,k,l> &result);
+};
+
+#include "Tensor4_ddg_Expr_equals.hpp"
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_Expr_equals.h
--- a/Tensor4_ddg/Tensor4_ddg_Expr_equals.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,108 +0,0 @@
-/* Various assignment operators.  I have to explicitly declare the
-   second operator= because otherwise the compiler will generate its
-   own and not use the template code. */
-
-template<class A, class B, class U, int Current_Dim0, int Current_Dim1,
-  int Current_Dim2, int Current_Dim3, int Dim01, int Dim23, char i, char j,
-  char k, char l>
-inline void
-T4ddg_equals_T4ddg(A &iter,
-		   const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &result,
-		   const Number<Current_Dim0> &ND0,
-		   const Number<Current_Dim1> &ND1,
-		   const Number<Current_Dim2> &ND2,
-		   const Number<Current_Dim3> &ND3)
-{
-  iter(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1,Current_Dim3-1)=
-    result(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1,Current_Dim3-1);
-  T4ddg_equals_T4ddg(iter,result,Number<Current_Dim0-1>(),
-		     Number<Current_Dim1>(),Number<Current_Dim2>(),
-		     Number<Current_Dim3>());
-}
-
-template<class A, class B, class U, int Current_Dim1, int Current_Dim2,
-  int Current_Dim3, int Dim01, int Dim23, char i, char j, char k, char l>
-inline void
-T4ddg_equals_T4ddg(A &iter,
-		   const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &result,
-		   const Number<1> &ND0,
-		   const Number<Current_Dim1> &ND1,
-		   const Number<Current_Dim2> &ND2,
-		   const Number<Current_Dim3> &ND3)
-{
-  iter(0,Current_Dim1-1,Current_Dim2-1,Current_Dim3-1)=
-    result(0,Current_Dim1-1,Current_Dim2-1,Current_Dim3-1);
-  T4ddg_equals_T4ddg(iter,result,Number<Current_Dim1-1>(),
-		     Number<Current_Dim1-1>(),Number<Current_Dim2>(),
-		     Number<Current_Dim3>());
-}
-
-template<class A, class B, class U, int Current_Dim2, int Current_Dim3,
-  int Dim01, int Dim23, char i, char j, char k, char l>
-inline void
-T4ddg_equals_T4ddg(A &iter,
-		   const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &result,
-		   const Number<1> &ND0,
-		   const Number<1> &ND1,
-		   const Number<Current_Dim2> &ND2,
-		   const Number<Current_Dim3> &ND3)
-{
-  iter(0,0,Current_Dim2-1,Current_Dim3-1)=
-    result(0,0,Current_Dim2-1,Current_Dim3-1);
-  T4ddg_equals_T4ddg(iter,result,Number<Dim01>(),
-		     Number<Dim01>(),Number<Current_Dim2-1>(),
-		     Number<Current_Dim3>());
-}
-
-template<class A, class B, class U, int Current_Dim3, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline void
-T4ddg_equals_T4ddg(A &iter,
-		   const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &result,
-		   const Number<1> &ND0,
-		   const Number<1> &ND1,
-		   const Number<1> &ND2,
-		   const Number<Current_Dim3> &ND3)
-{
-  iter(0,0,0,Current_Dim3-1)=result(0,0,0,Current_Dim3-1);
-  T4ddg_equals_T4ddg(iter,result,Number<Dim01>(),
-		     Number<Dim01>(),Number<Current_Dim3-1>(),
-		     Number<Current_Dim3-1>());
-}
-
-template<class A, class B, class U, int Dim01, int Dim23, char i, char j,
-  char k, char l>
-inline void
-T4ddg_equals_T4ddg(A &iter,
-		   const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &result,
-		   const Number<1> &ND0, const Number<1> &ND1,
-		   const Number<1> &ND2, const Number<1> &ND3)
-{
-  iter(0,0,0,0)=result(0,0,0,0);
-}
-
-template<class A, class T, int Tensor_Dim01, int Tensor_Dim23,
-  int Dim01, int Dim23, char i, char j, char k,char l>
-template<class B, class U> inline
-const Tensor4_ddg_Expr<Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23>,
-  T,Dim01,Dim23,i,j,k,l> &
-Tensor4_ddg_Expr<Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23>,
-  T,Dim01,Dim23,i,j,k,l>
-::operator=(const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &result)
-  {
-    T4ddg_equals_T4ddg(iter,result,Number<Dim01>(),Number<Dim01>(),
-		       Number<Dim23>(),Number<Dim23>());
-    return *this;
-  }
-
-template<class A, class T, int Tensor_Dim01, int Tensor_Dim23,
-  int Dim01, int Dim23, char i, char j, char k,char l> inline
-const Tensor4_ddg_Expr<Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23>,
-  T,Dim01,Dim23,i,j,k,l> &
-Tensor4_ddg_Expr<Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23>,
-  T,Dim01,Dim23,i,j,k,l>
-::operator=(const Tensor4_ddg_Expr<Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23>,
-	    T,Dim01,Dim23,i,j,k,l> &result)
-  {
-    return operator=<Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23>,T>(result);
-  }
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_Expr_equals.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_Expr_equals.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,108 @@
+/* Various assignment operators.  I have to explicitly declare the
+   second operator= because otherwise the compiler will generate its
+   own and not use the template code. */
+
+template<class A, class B, class U, int Current_Dim0, int Current_Dim1,
+  int Current_Dim2, int Current_Dim3, int Dim01, int Dim23, char i, char j,
+  char k, char l>
+inline void
+T4ddg_equals_T4ddg(A &iter,
+		   const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &result,
+		   const Number<Current_Dim0> &ND0,
+		   const Number<Current_Dim1> &ND1,
+		   const Number<Current_Dim2> &ND2,
+		   const Number<Current_Dim3> &ND3)
+{
+  iter(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1,Current_Dim3-1)=
+    result(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1,Current_Dim3-1);
+  T4ddg_equals_T4ddg(iter,result,Number<Current_Dim0-1>(),
+		     Number<Current_Dim1>(),Number<Current_Dim2>(),
+		     Number<Current_Dim3>());
+}
+
+template<class A, class B, class U, int Current_Dim1, int Current_Dim2,
+  int Current_Dim3, int Dim01, int Dim23, char i, char j, char k, char l>
+inline void
+T4ddg_equals_T4ddg(A &iter,
+		   const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &result,
+		   const Number<1> &ND0,
+		   const Number<Current_Dim1> &ND1,
+		   const Number<Current_Dim2> &ND2,
+		   const Number<Current_Dim3> &ND3)
+{
+  iter(0,Current_Dim1-1,Current_Dim2-1,Current_Dim3-1)=
+    result(0,Current_Dim1-1,Current_Dim2-1,Current_Dim3-1);
+  T4ddg_equals_T4ddg(iter,result,Number<Current_Dim1-1>(),
+		     Number<Current_Dim1-1>(),Number<Current_Dim2>(),
+		     Number<Current_Dim3>());
+}
+
+template<class A, class B, class U, int Current_Dim2, int Current_Dim3,
+  int Dim01, int Dim23, char i, char j, char k, char l>
+inline void
+T4ddg_equals_T4ddg(A &iter,
+		   const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &result,
+		   const Number<1> &ND0,
+		   const Number<1> &ND1,
+		   const Number<Current_Dim2> &ND2,
+		   const Number<Current_Dim3> &ND3)
+{
+  iter(0,0,Current_Dim2-1,Current_Dim3-1)=
+    result(0,0,Current_Dim2-1,Current_Dim3-1);
+  T4ddg_equals_T4ddg(iter,result,Number<Dim01>(),
+		     Number<Dim01>(),Number<Current_Dim2-1>(),
+		     Number<Current_Dim3>());
+}
+
+template<class A, class B, class U, int Current_Dim3, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline void
+T4ddg_equals_T4ddg(A &iter,
+		   const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &result,
+		   const Number<1> &ND0,
+		   const Number<1> &ND1,
+		   const Number<1> &ND2,
+		   const Number<Current_Dim3> &ND3)
+{
+  iter(0,0,0,Current_Dim3-1)=result(0,0,0,Current_Dim3-1);
+  T4ddg_equals_T4ddg(iter,result,Number<Dim01>(),
+		     Number<Dim01>(),Number<Current_Dim3-1>(),
+		     Number<Current_Dim3-1>());
+}
+
+template<class A, class B, class U, int Dim01, int Dim23, char i, char j,
+  char k, char l>
+inline void
+T4ddg_equals_T4ddg(A &iter,
+		   const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &result,
+		   const Number<1> &ND0, const Number<1> &ND1,
+		   const Number<1> &ND2, const Number<1> &ND3)
+{
+  iter(0,0,0,0)=result(0,0,0,0);
+}
+
+template<class A, class T, int Tensor_Dim01, int Tensor_Dim23,
+  int Dim01, int Dim23, char i, char j, char k,char l>
+template<class B, class U> inline
+const Tensor4_ddg_Expr<Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23>,
+  T,Dim01,Dim23,i,j,k,l> &
+Tensor4_ddg_Expr<Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23>,
+  T,Dim01,Dim23,i,j,k,l>
+::operator=(const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &result)
+  {
+    T4ddg_equals_T4ddg(iter,result,Number<Dim01>(),Number<Dim01>(),
+		       Number<Dim23>(),Number<Dim23>());
+    return *this;
+  }
+
+template<class A, class T, int Tensor_Dim01, int Tensor_Dim23,
+  int Dim01, int Dim23, char i, char j, char k,char l> inline
+const Tensor4_ddg_Expr<Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23>,
+  T,Dim01,Dim23,i,j,k,l> &
+Tensor4_ddg_Expr<Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23>,
+  T,Dim01,Dim23,i,j,k,l>
+::operator=(const Tensor4_ddg_Expr<Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23>,
+	    T,Dim01,Dim23,i,j,k,l> &result)
+  {
+    return operator=<Tensor4_ddg<A,Tensor_Dim01,Tensor_Dim23>,T>(result);
+  }
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_and_Tensor2_symmetric.h
--- a/Tensor4_ddg/Tensor4_ddg_and_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,206 +0,0 @@
-/* Multiply a Tensor2_symmetric and a Tensor4_ddg together but don't
-   contract, yielding a Tensor4_ddg. */
-
-/* A(i,j,k,l) & B(i,j) -> Tensor4_ddg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-class Tensor4_ddg_and_Tensor2_symmetric_01
-{
-  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim01,i,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-		    const int N4) const
-  {
-    return iterA(N1,N2,N3,N4)*iterB(N1,N2);
-  }
-
-  Tensor4_ddg_and_Tensor2_symmetric_01
-  (const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor4_ddg_Expr
-<const Tensor4_ddg_and_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-operator&(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b)
-{
-  typedef const Tensor4_ddg_and_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim23,i,j,k,l>
-    TensorExpr;
-  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-    (TensorExpr(a,b));
-}
-
-/* B(i,j) & A(i,j,k,l) -> Tensor4_ddg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor4_ddg_Expr
-<const Tensor4_ddg_and_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-operator&(const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b,
-	  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
-{
-  typedef const Tensor4_ddg_and_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim23,i,j,k,l>
-    TensorExpr;
-  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k,l) & B(k,l) -> Tensor4_ddg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-class Tensor4_ddg_and_Tensor2_symmetric_23
-{
-  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim01,k,l> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-		    const int N4) const
-  {
-    return iterA(N1,N2,N3,N4)*iterB(N3,N4);
-  }
-
-  Tensor4_ddg_and_Tensor2_symmetric_23
-  (const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim01,k,l> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor4_ddg_Expr
-<const Tensor4_ddg_and_Tensor2_symmetric_23<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-operator&(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim01,k,l> &b)
-{
-  typedef const Tensor4_ddg_and_Tensor2_symmetric_23<A,B,T,U,Dim01,Dim23,i,j,k,l>
-    TensorExpr;
-  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-    (TensorExpr(a,b));
-}
-
-/* B(k,l) & A(i,j,k,l) -> Tensor4_ddg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor4_ddg_Expr
-<const Tensor4_ddg_and_Tensor2_symmetric_23<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-operator&(const Tensor2_symmetric_Expr<B,U,Dim01,k,l> &b,
-	  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
-{
-  typedef const Tensor4_ddg_and_Tensor2_symmetric_23<A,B,T,U,Dim01,Dim23,i,j,k,l>
-    TensorExpr;
-  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-    (TensorExpr(a,b));
-}
-
-/* I originally put these declarations for unknown reasons, but they
-   won't work because the result is not a Tensor4_ddg.  The
-   multiplication messes up the symmetries. */
-
-//  /* A(i,j,k,l) & B(j,l) -> Tensor4_ddg */
-
-//  template<class A, class B, class T, class U, int Dim,
-//    char i, char j, char k, char l>
-//  class Tensor4_ddg_and_Tensor2_symmetric_13
-//  {
-//    const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> iterA;
-//    const Tensor2_symmetric_Expr<B,U,Dim,j,l> iterB;
-//  public:
-//    typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-//  		    const int N4) const
-//    {
-//      return iterA(N1,N2,N3,N4)*iterB(N2,N4);
-//    }
-
-//    Tensor4_ddg_and_Tensor2_symmetric_13
-//    (const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-//     const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b): iterA(a), iterB(b) {}
-//  };
-
-//  template<class A, class B, class T, class U, int Dim,
-//    char i, char j, char k, char l>
-//  inline const Tensor4_ddg_Expr
-//  <const Tensor4_ddg_and_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>,
-//    typename promote<T,U>::V,Dim,Dim,i,j,k,l>
-//  operator&(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-//  	  const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b)
-//  {
-//    typedef const Tensor4_ddg_and_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>
-//      TensorExpr;
-//    return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j,k,l>
-//      (TensorExpr(a,b));
-//  }
-
-//  /* B(j,l) & A(i,j,k,l) -> Tensor4_ddg */
-
-//  template<class A, class B, class T, class U, int Dim,
-//    char i, char j, char k, char l>
-//  inline const Tensor4_ddg_Expr
-//  <const Tensor4_ddg_and_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>,
-//    typename promote<T,U>::V,Dim,Dim,i,j,k,l>
-//  operator&(const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b,
-//  	  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a)
-//  {
-//    typedef const Tensor4_ddg_and_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>
-//      TensorExpr;
-//    return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j,k,l>
-//      (TensorExpr(a,b));
-//  }
-
-//  /* A(i,j,k,l) & B(l,j) -> Tensor4_ddg */
-
-//  template<class A, class B, class T, class U, int Dim,
-//    char i, char j, char k, char l>
-//  class Tensor4_ddg_and_Tensor2_symmetric_31
-//  {
-//    const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> iterA;
-//    const Tensor2_symmetric_Expr<B,U,Dim,l,j> iterB;
-//  public:
-//    typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-//  		    const int N4) const
-//    {
-//      return iterA(N1,N2,N3,N4)*iterB(N2,N4);
-//    }
-
-//    Tensor4_ddg_and_Tensor2_symmetric_31
-//    (const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-//     const Tensor2_symmetric_Expr<B,U,Dim,l,j> &b): iterA(a), iterB(b) {}
-//  };
-
-//  template<class A, class B, class T, class U, int Dim,
-//    char i, char j, char k, char l>
-//  inline const Tensor4_ddg_Expr
-//  <const Tensor4_ddg_and_Tensor2_symmetric_31<A,B,T,U,Dim,i,j,k,l>,
-//    typename promote<T,U>::V,Dim,Dim,i,j,k,l>
-//  operator&(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-//  	  const Tensor2_symmetric_Expr<B,U,Dim,l,j> &b)
-//  {
-//    typedef const Tensor4_ddg_and_Tensor2_symmetric_31<A,B,T,U,Dim,i,j,k,l>
-//      TensorExpr;
-//    return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j,k,l>
-//      (TensorExpr(a,b));
-//  }
-
-//  /* B(l,j) & A(i,j,k,l) -> Tensor4_ddg */
-
-//  template<class A, class B, class T, class U, int Dim,
-//    char i, char j, char k, char l>
-//  inline const Tensor4_ddg_Expr
-//  <const Tensor4_ddg_and_Tensor2_symmetric_31<A,B,T,U,Dim,i,j,k,l>,
-//    typename promote<T,U>::V,Dim,Dim,i,j,k,l>
-//  operator&(const Tensor2_symmetric_Expr<B,U,Dim,l,j> &b,
-//  	  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a)
-//  {
-//    typedef const Tensor4_ddg_and_Tensor2_symmetric_31<A,B,T,U,Dim,i,j,k,l>
-//      TensorExpr;
-//    return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j,k,l>
-//      (TensorExpr(a,b));
-//  }
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_and_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_and_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,206 @@
+/* Multiply a Tensor2_symmetric and a Tensor4_ddg together but don't
+   contract, yielding a Tensor4_ddg. */
+
+/* A(i,j,k,l) & B(i,j) -> Tensor4_ddg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+class Tensor4_ddg_and_Tensor2_symmetric_01
+{
+  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim01,i,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+		    const int N4) const
+  {
+    return iterA(N1,N2,N3,N4)*iterB(N1,N2);
+  }
+
+  Tensor4_ddg_and_Tensor2_symmetric_01
+  (const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor4_ddg_Expr
+<const Tensor4_ddg_and_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+operator&(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b)
+{
+  typedef const Tensor4_ddg_and_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim23,i,j,k,l>
+    TensorExpr;
+  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+    (TensorExpr(a,b));
+}
+
+/* B(i,j) & A(i,j,k,l) -> Tensor4_ddg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor4_ddg_Expr
+<const Tensor4_ddg_and_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+operator&(const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b,
+	  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
+{
+  typedef const Tensor4_ddg_and_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim23,i,j,k,l>
+    TensorExpr;
+  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k,l) & B(k,l) -> Tensor4_ddg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+class Tensor4_ddg_and_Tensor2_symmetric_23
+{
+  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim01,k,l> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+		    const int N4) const
+  {
+    return iterA(N1,N2,N3,N4)*iterB(N3,N4);
+  }
+
+  Tensor4_ddg_and_Tensor2_symmetric_23
+  (const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim01,k,l> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor4_ddg_Expr
+<const Tensor4_ddg_and_Tensor2_symmetric_23<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+operator&(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim01,k,l> &b)
+{
+  typedef const Tensor4_ddg_and_Tensor2_symmetric_23<A,B,T,U,Dim01,Dim23,i,j,k,l>
+    TensorExpr;
+  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+    (TensorExpr(a,b));
+}
+
+/* B(k,l) & A(i,j,k,l) -> Tensor4_ddg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor4_ddg_Expr
+<const Tensor4_ddg_and_Tensor2_symmetric_23<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+operator&(const Tensor2_symmetric_Expr<B,U,Dim01,k,l> &b,
+	  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
+{
+  typedef const Tensor4_ddg_and_Tensor2_symmetric_23<A,B,T,U,Dim01,Dim23,i,j,k,l>
+    TensorExpr;
+  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+    (TensorExpr(a,b));
+}
+
+/* I originally put these declarations for unknown reasons, but they
+   won't work because the result is not a Tensor4_ddg.  The
+   multiplication messes up the symmetries. */
+
+//  /* A(i,j,k,l) & B(j,l) -> Tensor4_ddg */
+
+//  template<class A, class B, class T, class U, int Dim,
+//    char i, char j, char k, char l>
+//  class Tensor4_ddg_and_Tensor2_symmetric_13
+//  {
+//    const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> iterA;
+//    const Tensor2_symmetric_Expr<B,U,Dim,j,l> iterB;
+//  public:
+//    typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+//  		    const int N4) const
+//    {
+//      return iterA(N1,N2,N3,N4)*iterB(N2,N4);
+//    }
+
+//    Tensor4_ddg_and_Tensor2_symmetric_13
+//    (const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+//     const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b): iterA(a), iterB(b) {}
+//  };
+
+//  template<class A, class B, class T, class U, int Dim,
+//    char i, char j, char k, char l>
+//  inline const Tensor4_ddg_Expr
+//  <const Tensor4_ddg_and_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>,
+//    typename promote<T,U>::V,Dim,Dim,i,j,k,l>
+//  operator&(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+//  	  const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b)
+//  {
+//    typedef const Tensor4_ddg_and_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>
+//      TensorExpr;
+//    return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j,k,l>
+//      (TensorExpr(a,b));
+//  }
+
+//  /* B(j,l) & A(i,j,k,l) -> Tensor4_ddg */
+
+//  template<class A, class B, class T, class U, int Dim,
+//    char i, char j, char k, char l>
+//  inline const Tensor4_ddg_Expr
+//  <const Tensor4_ddg_and_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>,
+//    typename promote<T,U>::V,Dim,Dim,i,j,k,l>
+//  operator&(const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b,
+//  	  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a)
+//  {
+//    typedef const Tensor4_ddg_and_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>
+//      TensorExpr;
+//    return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j,k,l>
+//      (TensorExpr(a,b));
+//  }
+
+//  /* A(i,j,k,l) & B(l,j) -> Tensor4_ddg */
+
+//  template<class A, class B, class T, class U, int Dim,
+//    char i, char j, char k, char l>
+//  class Tensor4_ddg_and_Tensor2_symmetric_31
+//  {
+//    const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> iterA;
+//    const Tensor2_symmetric_Expr<B,U,Dim,l,j> iterB;
+//  public:
+//    typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+//  		    const int N4) const
+//    {
+//      return iterA(N1,N2,N3,N4)*iterB(N2,N4);
+//    }
+
+//    Tensor4_ddg_and_Tensor2_symmetric_31
+//    (const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+//     const Tensor2_symmetric_Expr<B,U,Dim,l,j> &b): iterA(a), iterB(b) {}
+//  };
+
+//  template<class A, class B, class T, class U, int Dim,
+//    char i, char j, char k, char l>
+//  inline const Tensor4_ddg_Expr
+//  <const Tensor4_ddg_and_Tensor2_symmetric_31<A,B,T,U,Dim,i,j,k,l>,
+//    typename promote<T,U>::V,Dim,Dim,i,j,k,l>
+//  operator&(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+//  	  const Tensor2_symmetric_Expr<B,U,Dim,l,j> &b)
+//  {
+//    typedef const Tensor4_ddg_and_Tensor2_symmetric_31<A,B,T,U,Dim,i,j,k,l>
+//      TensorExpr;
+//    return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j,k,l>
+//      (TensorExpr(a,b));
+//  }
+
+//  /* B(l,j) & A(i,j,k,l) -> Tensor4_ddg */
+
+//  template<class A, class B, class T, class U, int Dim,
+//    char i, char j, char k, char l>
+//  inline const Tensor4_ddg_Expr
+//  <const Tensor4_ddg_and_Tensor2_symmetric_31<A,B,T,U,Dim,i,j,k,l>,
+//    typename promote<T,U>::V,Dim,Dim,i,j,k,l>
+//  operator&(const Tensor2_symmetric_Expr<B,U,Dim,l,j> &b,
+//  	  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a)
+//  {
+//    typedef const Tensor4_ddg_and_Tensor2_symmetric_31<A,B,T,U,Dim,i,j,k,l>
+//      TensorExpr;
+//    return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,j,k,l>
+//      (TensorExpr(a,b));
+//  }
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_and_Tensor4_ddg.h
--- a/Tensor4_ddg/Tensor4_ddg_and_Tensor4_ddg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-/* Subtracts Tensor4_ddg-Tensor4_ddg -> Tensor4_Riemann */
-
-/* A(i,j,k,l) - B(i,l,k,j) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-class Tensor4_ddg_and_Tensor4_ddg0321
-{
-  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,k,j,l> iterA;
-  const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-			     const int N4) const
-  {
-    return iterA(N1,N3,N2,N4)-iterB(N1,N4,N3,N2);
-  }
-
-  Tensor4_ddg_and_Tensor4_ddg0321
-  (const Tensor4_ddg_Expr<A,T,Dim,Dim,i,k,j,l> &a,
-   const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const Tensor4_Riemann_Expr
-<const Tensor4_ddg_and_Tensor4_ddg0321<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,i,j,k,l>
-operator&&(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,k,j,l> &a,
-	  const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> &b)
-{
-  typedef const Tensor4_ddg_and_Tensor4_ddg0321<A,B,T,U,Dim,i,j,k,l> TensorExpr;
-  return Tensor4_Riemann_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j,k,l>
-    (TensorExpr(a,b));
-}
-
-/* A(i,k,l,j) - B(i,l,k,j) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-class Tensor4_ddg_and_Tensor4_ddg0213
-{
-  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,k,l,j> iterA;
-  const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-			     const int N4) const
-  {
-    return iterA(N1,N3,N4,N2)-iterB(N1,N4,N3,N2);
-  }
-
-  Tensor4_ddg_and_Tensor4_ddg0213
-  (const Tensor4_ddg_Expr<A,T,Dim,Dim,i,k,l,j> &a,
-   const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const Tensor4_Riemann_Expr
-<const Tensor4_ddg_and_Tensor4_ddg0213<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,i,j,k,l>
-operator&&(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,k,l,j> &a,
-	  const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> &b)
-{
-  typedef const Tensor4_ddg_and_Tensor4_ddg0213<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor4_Riemann_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j,k,l>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_and_Tensor4_ddg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_and_Tensor4_ddg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,68 @@
+/* Subtracts Tensor4_ddg-Tensor4_ddg -> Tensor4_Riemann */
+
+/* A(i,j,k,l) - B(i,l,k,j) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+class Tensor4_ddg_and_Tensor4_ddg0321
+{
+  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,k,j,l> iterA;
+  const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+			     const int N4) const
+  {
+    return iterA(N1,N3,N2,N4)-iterB(N1,N4,N3,N2);
+  }
+
+  Tensor4_ddg_and_Tensor4_ddg0321
+  (const Tensor4_ddg_Expr<A,T,Dim,Dim,i,k,j,l> &a,
+   const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const Tensor4_Riemann_Expr
+<const Tensor4_ddg_and_Tensor4_ddg0321<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,i,j,k,l>
+operator&&(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,k,j,l> &a,
+	  const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> &b)
+{
+  typedef const Tensor4_ddg_and_Tensor4_ddg0321<A,B,T,U,Dim,i,j,k,l> TensorExpr;
+  return Tensor4_Riemann_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j,k,l>
+    (TensorExpr(a,b));
+}
+
+/* A(i,k,l,j) - B(i,l,k,j) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+class Tensor4_ddg_and_Tensor4_ddg0213
+{
+  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,k,l,j> iterA;
+  const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+			     const int N4) const
+  {
+    return iterA(N1,N3,N4,N2)-iterB(N1,N4,N3,N2);
+  }
+
+  Tensor4_ddg_and_Tensor4_ddg0213
+  (const Tensor4_ddg_Expr<A,T,Dim,Dim,i,k,l,j> &a,
+   const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const Tensor4_Riemann_Expr
+<const Tensor4_ddg_and_Tensor4_ddg0213<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,i,j,k,l>
+operator&&(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,k,l,j> &a,
+	  const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> &b)
+{
+  typedef const Tensor4_ddg_and_Tensor4_ddg0213<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor4_Riemann_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j,k,l>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_carat_Tensor2_symmetric.h
--- a/Tensor4_ddg/Tensor4_ddg_carat_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-/* This file has all of the declarations for expressions like
-   Tensor4_ddg^Tensor2_symmetric and Tensor2_symmetric^Tensor4_ddg,
-   yielding a Tensor2_symmetric. */
-
-/* A(i,j,k,l)*B(j,l) */
-
-template<class A, class B, class T, class U, int Dim, 
-  char i, char j, char k, char l>
-class Tensor4_ddg_carat_Tensor2_symmetric_13
-{
-  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,j,l> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,N1,Current_Dim1-1,N2)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,N1,Current_Dim1-1,N2)*iterB(0,Current_Dim1-1)
-      + eval(N1,N2,Number<Dim>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,N1,0,N2)*iterB(0,0);
-  }
-public:
-  Tensor4_ddg_carat_Tensor2_symmetric_13
-  (const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim>(),Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim, 
-  char i, char j, char k, char l>
-inline const Tensor2_symmetric_Expr
-<const Tensor4_ddg_carat_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,i,k>
-operator^(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b)
-{
-  typedef const Tensor4_ddg_carat_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
-    (TensorExpr(a,b));
-}
-
-/* B(j,l)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim, 
-  char i, char j, char k, char l>
-inline const Tensor2_symmetric_Expr
-<const Tensor4_ddg_carat_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,i,k>
-operator^(const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b,
-	  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a)
-{
-  typedef const Tensor4_ddg_carat_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
-    (TensorExpr(a,b));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_carat_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_carat_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,76 @@
+/* This file has all of the declarations for expressions like
+   Tensor4_ddg^Tensor2_symmetric and Tensor2_symmetric^Tensor4_ddg,
+   yielding a Tensor2_symmetric. */
+
+/* A(i,j,k,l)*B(j,l) */
+
+template<class A, class B, class T, class U, int Dim, 
+  char i, char j, char k, char l>
+class Tensor4_ddg_carat_Tensor2_symmetric_13
+{
+  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,j,l> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,N1,Current_Dim1-1,N2)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,N1,Current_Dim1-1,N2)*iterB(0,Current_Dim1-1)
+      + eval(N1,N2,Number<Dim>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,N1,0,N2)*iterB(0,0);
+  }
+public:
+  Tensor4_ddg_carat_Tensor2_symmetric_13
+  (const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim>(),Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim, 
+  char i, char j, char k, char l>
+inline const Tensor2_symmetric_Expr
+<const Tensor4_ddg_carat_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,i,k>
+operator^(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b)
+{
+  typedef const Tensor4_ddg_carat_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
+    (TensorExpr(a,b));
+}
+
+/* B(j,l)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim, 
+  char i, char j, char k, char l>
+inline const Tensor2_symmetric_Expr
+<const Tensor4_ddg_carat_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,i,k>
+operator^(const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b,
+	  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a)
+{
+  typedef const Tensor4_ddg_carat_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
+    (TensorExpr(a,b));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_carat_Tensor4_ddg.h
--- a/Tensor4_ddg/Tensor4_ddg_carat_Tensor4_ddg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-/* This file has all of the declarations for expressions like
-   Tensor4_ddg^Tensor4_ddg, yielding a Tensor4_ddg. */
-
-/* A(i,j,k,l)*B(j,l,m,n) */
-
-template<class A, class B, class T, class U, int Dim, int Dim23,
-  char i, char j, char k, char l, char m, char n>
-class Tensor4_ddg_carat_Tensor4_ddg_13
-{
-  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> iterA;
-  const Tensor4_ddg_Expr<B,U,Dim,Dim23,j,l,m,n> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const int N3, const int N4,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,N1,Current_Dim1-1,N2)
-      *iterB(Current_Dim0-1,Current_Dim1-1,N3,N4)
-      + eval(N1,N2,N3,N4,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const int N3, const int N4,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,N1,Current_Dim1-1,N2)*iterB(0,Current_Dim1-1,N3,N4)
-      + eval(N1,N2,N3,N4,Number<Dim>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const int N3, const int N4,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,N1,0,N2)*iterB(0,0,N3,N4);
-  }
-public:
-  Tensor4_ddg_carat_Tensor4_ddg_13
-  (const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-   const Tensor4_ddg_Expr<B,U,Dim,Dim23,j,l,m,n> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2,
-			     const int N3, const int N4) const
-  {
-    return eval(N1,N2,N3,N4,Number<Dim>(),Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim, int Dim23,
-  char i, char j, char k, char l, char m, char n>
-inline const Tensor4_ddg_Expr
-<const Tensor4_ddg_carat_Tensor4_ddg_13<A,B,T,U,Dim,Dim23,i,j,k,l,m,n>,
-  typename promote<T,U>::V,Dim,Dim23,i,k,m,n>
-operator^(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-	  const Tensor4_ddg_Expr<B,U,Dim,Dim23,j,l,m,n> &b)
-{
-  typedef const Tensor4_ddg_carat_Tensor4_ddg_13<A,B,T,U,Dim,Dim23,i,j,k,l,m,n>
-    TensorExpr;
-  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim23,i,k,m,n>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_carat_Tensor4_ddg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_carat_Tensor4_ddg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,62 @@
+/* This file has all of the declarations for expressions like
+   Tensor4_ddg^Tensor4_ddg, yielding a Tensor4_ddg. */
+
+/* A(i,j,k,l)*B(j,l,m,n) */
+
+template<class A, class B, class T, class U, int Dim, int Dim23,
+  char i, char j, char k, char l, char m, char n>
+class Tensor4_ddg_carat_Tensor4_ddg_13
+{
+  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> iterA;
+  const Tensor4_ddg_Expr<B,U,Dim,Dim23,j,l,m,n> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const int N3, const int N4,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,N1,Current_Dim1-1,N2)
+      *iterB(Current_Dim0-1,Current_Dim1-1,N3,N4)
+      + eval(N1,N2,N3,N4,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const int N3, const int N4,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,N1,Current_Dim1-1,N2)*iterB(0,Current_Dim1-1,N3,N4)
+      + eval(N1,N2,N3,N4,Number<Dim>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const int N3, const int N4,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,N1,0,N2)*iterB(0,0,N3,N4);
+  }
+public:
+  Tensor4_ddg_carat_Tensor4_ddg_13
+  (const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+   const Tensor4_ddg_Expr<B,U,Dim,Dim23,j,l,m,n> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2,
+			     const int N3, const int N4) const
+  {
+    return eval(N1,N2,N3,N4,Number<Dim>(),Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim, int Dim23,
+  char i, char j, char k, char l, char m, char n>
+inline const Tensor4_ddg_Expr
+<const Tensor4_ddg_carat_Tensor4_ddg_13<A,B,T,U,Dim,Dim23,i,j,k,l,m,n>,
+  typename promote<T,U>::V,Dim,Dim23,i,k,m,n>
+operator^(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+	  const Tensor4_ddg_Expr<B,U,Dim,Dim23,j,l,m,n> &b)
+{
+  typedef const Tensor4_ddg_carat_Tensor4_ddg_13<A,B,T,U,Dim,Dim23,i,j,k,l,m,n>
+    TensorExpr;
+  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim23,i,k,m,n>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_minus_Tensor4_ddg.h
--- a/Tensor4_ddg/Tensor4_ddg_minus_Tensor4_ddg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-/* Subtracts Tensor4_ddg-Tensor4_ddg -> Tensor4_ddg */
-
-/* A(i,j,k,l) - B(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-class Tensor4_ddg_minus_Tensor4_ddg
-{
-  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
-  const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-			     const int N4) const
-  {
-    return iterA(N1,N2,N3,N4)-iterB(N1,N2,N3,N4);
-  }
-
-  Tensor4_ddg_minus_Tensor4_ddg(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a, const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor4_ddg_Expr
-<const Tensor4_ddg_minus_Tensor4_ddg<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-operator-(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-	  const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &b)
-{
-  typedef const Tensor4_ddg_minus_Tensor4_ddg<A,B,T,U,Dim01,Dim23,i,j,k,l>
-    TensorExpr;
-  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_minus_Tensor4_ddg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_minus_Tensor4_ddg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,34 @@
+/* Subtracts Tensor4_ddg-Tensor4_ddg -> Tensor4_ddg */
+
+/* A(i,j,k,l) - B(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+class Tensor4_ddg_minus_Tensor4_ddg
+{
+  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
+  const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+			     const int N4) const
+  {
+    return iterA(N1,N2,N3,N4)-iterB(N1,N2,N3,N4);
+  }
+
+  Tensor4_ddg_minus_Tensor4_ddg(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a, const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor4_ddg_Expr
+<const Tensor4_ddg_minus_Tensor4_ddg<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+operator-(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+	  const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &b)
+{
+  typedef const Tensor4_ddg_minus_Tensor4_ddg<A,B,T,U,Dim01,Dim23,i,j,k,l>
+    TensorExpr;
+  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_mod_Tensor2_symmetric.h
--- a/Tensor4_ddg/Tensor4_ddg_mod_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,102 +0,0 @@
-/* Divide a Tensor4_ddg by a Tensor2_symmetric without contracting, yielding a
-   Tensor4_ddg. */
-
-/* A(i,j,k,l) % B(i,j) -> Tensor4_ddg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-class Tensor4_ddg_mod_Tensor2_symmetric_01
-{
-  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim01,i,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-		    const int N4) const
-  {
-    return iterA(N1,N2,N3,N4)/iterB(N1,N2);
-  }
-
-  Tensor4_ddg_mod_Tensor2_symmetric_01
-  (const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor4_ddg_Expr
-<const Tensor4_ddg_mod_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-operator%(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b)
-{
-  typedef const Tensor4_ddg_mod_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim23,i,j,k,l>
-    TensorExpr;
-  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-    (TensorExpr(a,b));
-}
-
-/* B(i,j) % A(i,j,k,l) -> Tensor4_ddg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor4_ddg_Expr
-<const Tensor4_ddg_mod_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-operator%(const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b,
-	  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
-{
-  typedef const Tensor4_ddg_mod_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim23,i,j,k,l>
-    TensorExpr;
-  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k,l) % B(k,l) -> Tensor4_ddg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-class Tensor4_ddg_mod_Tensor2_symmetric_23
-{
-  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim01,k,l> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-		    const int N4) const
-  {
-    return iterA(N1,N2,N3,N4)/iterB(N3,N4);
-  }
-
-  Tensor4_ddg_mod_Tensor2_symmetric_23
-  (const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim01,k,l> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor4_ddg_Expr
-<const Tensor4_ddg_mod_Tensor2_symmetric_23<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-operator%(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim01,k,l> &b)
-{
-  typedef const Tensor4_ddg_mod_Tensor2_symmetric_23<A,B,T,U,Dim01,Dim23,i,j,k,l>
-    TensorExpr;
-  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-    (TensorExpr(a,b));
-}
-
-/* B(k,l) % A(i,j,k,l) -> Tensor4_ddg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor4_ddg_Expr
-<const Tensor4_ddg_mod_Tensor2_symmetric_23<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-operator%(const Tensor2_symmetric_Expr<B,U,Dim01,k,l> &b,
-	  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
-{
-  typedef const Tensor4_ddg_mod_Tensor2_symmetric_23<A,B,T,U,Dim01,Dim23,i,j,k,l>
-    TensorExpr;
-  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_mod_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_mod_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,102 @@
+/* Divide a Tensor4_ddg by a Tensor2_symmetric without contracting, yielding a
+   Tensor4_ddg. */
+
+/* A(i,j,k,l) % B(i,j) -> Tensor4_ddg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+class Tensor4_ddg_mod_Tensor2_symmetric_01
+{
+  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim01,i,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+		    const int N4) const
+  {
+    return iterA(N1,N2,N3,N4)/iterB(N1,N2);
+  }
+
+  Tensor4_ddg_mod_Tensor2_symmetric_01
+  (const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor4_ddg_Expr
+<const Tensor4_ddg_mod_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+operator%(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b)
+{
+  typedef const Tensor4_ddg_mod_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim23,i,j,k,l>
+    TensorExpr;
+  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+    (TensorExpr(a,b));
+}
+
+/* B(i,j) % A(i,j,k,l) -> Tensor4_ddg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor4_ddg_Expr
+<const Tensor4_ddg_mod_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+operator%(const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b,
+	  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
+{
+  typedef const Tensor4_ddg_mod_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim23,i,j,k,l>
+    TensorExpr;
+  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k,l) % B(k,l) -> Tensor4_ddg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+class Tensor4_ddg_mod_Tensor2_symmetric_23
+{
+  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim01,k,l> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+		    const int N4) const
+  {
+    return iterA(N1,N2,N3,N4)/iterB(N3,N4);
+  }
+
+  Tensor4_ddg_mod_Tensor2_symmetric_23
+  (const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim01,k,l> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor4_ddg_Expr
+<const Tensor4_ddg_mod_Tensor2_symmetric_23<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+operator%(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim01,k,l> &b)
+{
+  typedef const Tensor4_ddg_mod_Tensor2_symmetric_23<A,B,T,U,Dim01,Dim23,i,j,k,l>
+    TensorExpr;
+  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+    (TensorExpr(a,b));
+}
+
+/* B(k,l) % A(i,j,k,l) -> Tensor4_ddg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor4_ddg_Expr
+<const Tensor4_ddg_mod_Tensor2_symmetric_23<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+operator%(const Tensor2_symmetric_Expr<B,U,Dim01,k,l> &b,
+	  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
+{
+  typedef const Tensor4_ddg_mod_Tensor2_symmetric_23<A,B,T,U,Dim01,Dim23,i,j,k,l>
+    TensorExpr;
+  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_mod_Tensor4_ddg.h
--- a/Tensor4_ddg/Tensor4_ddg_mod_Tensor4_ddg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-/* Subtracts Tensor4_ddg-Tensor4_ddg -> Tensor4_Riemann */
-
-/* A(i,j,k,l) - B(i,l,k,j) */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-class Tensor4_ddg_mod_Tensor4_ddg
-{
-  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> iterA;
-  const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-			     const int N4) const
-  {
-    return iterA(N1,N2,N3,N4)-iterB(N1,N4,N3,N2);
-  }
-
-  Tensor4_ddg_mod_Tensor4_ddg
-  (const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-   const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const Tensor4_Riemann_Expr
-<const Tensor4_ddg_mod_Tensor4_ddg<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,i,j,k,l>
-operator%(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-	  const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> &b)
-{
-  typedef const Tensor4_ddg_mod_Tensor4_ddg<A,B,T,U,Dim,i,j,k,l> TensorExpr;
-  return Tensor4_Riemann_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j,k,l>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_mod_Tensor4_ddg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_mod_Tensor4_ddg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,34 @@
+/* Subtracts Tensor4_ddg-Tensor4_ddg -> Tensor4_Riemann */
+
+/* A(i,j,k,l) - B(i,l,k,j) */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+class Tensor4_ddg_mod_Tensor4_ddg
+{
+  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> iterA;
+  const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+			     const int N4) const
+  {
+    return iterA(N1,N2,N3,N4)-iterB(N1,N4,N3,N2);
+  }
+
+  Tensor4_ddg_mod_Tensor4_ddg
+  (const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+   const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const Tensor4_Riemann_Expr
+<const Tensor4_ddg_mod_Tensor4_ddg<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,i,j,k,l>
+operator%(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+	  const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> &b)
+{
+  typedef const Tensor4_ddg_mod_Tensor4_ddg<A,B,T,U,Dim,i,j,k,l> TensorExpr;
+  return Tensor4_Riemann_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,j,k,l>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_number.h
--- a/Tensor4_ddg/Tensor4_ddg_number.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/* This is for expressions where a number is used for one or more
-   slots, and an index for the others, yielding a
-   Tensor2_symmetric_Expr or Tensor3_dg_Expr. */
-
-/* First and second slot. */
-
-template<class A, class T, int N1, int N2>
-class Tensor4_ddg_number_01
-{
-  A iterA;
-public:
-  T operator()(const int N3, const int N4) const
-  {
-    return iterA(N1,N2,N3,N4);
-  }
-  Tensor4_ddg_number_01(const A &a):iterA(a) {}
-};
-
-template<class A, class T, int N0, int N1>
-class Tensor4_ddg_number_rhs_01
-{};
-
-/* Only first slot */
-
-template<class A, class T, int N1>
-class Tensor4_ddg_number_0
-{
-  A iterA;
-public:
-  T operator()(const int N2, const int N3, const int N4) const
-  {
-    return iterA(N1,N2,N3,N4);
-  }
-  Tensor4_ddg_number_0(const A &a):iterA(a) {}
-};
-
-template<class A, class T, int N0>
-class Tensor4_ddg_number_rhs_0
-{};
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_number.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_number.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+/* This is for expressions where a number is used for one or more
+   slots, and an index for the others, yielding a
+   Tensor2_symmetric_Expr or Tensor3_dg_Expr. */
+
+/* First and second slot. */
+
+template<class A, class T, int N1, int N2>
+class Tensor4_ddg_number_01
+{
+  A iterA;
+public:
+  T operator()(const int N3, const int N4) const
+  {
+    return iterA(N1,N2,N3,N4);
+  }
+  Tensor4_ddg_number_01(const A &a):iterA(a) {}
+};
+
+template<class A, class T, int N0, int N1>
+class Tensor4_ddg_number_rhs_01
+{};
+
+/* Only first slot */
+
+template<class A, class T, int N1>
+class Tensor4_ddg_number_0
+{
+  A iterA;
+public:
+  T operator()(const int N2, const int N3, const int N4) const
+  {
+    return iterA(N1,N2,N3,N4);
+  }
+  Tensor4_ddg_number_0(const A &a):iterA(a) {}
+};
+
+template<class A, class T, int N0>
+class Tensor4_ddg_number_rhs_0
+{};
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_numeral.h
--- a/Tensor4_ddg/Tensor4_ddg_numeral.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-/* This is for expressions where a number is used for one or more
-   slots, and an index for the others, yielding a
-   Tensor2_symmetric_Expr or Tensor3_dg_Expr. */
-
-/* First and second slot. */
-
-template<class A, class T>
-class Tensor4_ddg_numeral_01
-{
-  A iterA;
-  const int N1, N2;
-public:
-  T operator()(const int N3, const int N4) const
-  {
-    return iterA(N1,N2,N3,N4);
-  }
-  Tensor4_ddg_numeral_01(const A &a, const int NN1, const int NN2)
-    :iterA(a), N1(NN1), N2(NN2) {}
-};
-
-/* Third and fourth slot. */
-
-template<class A, class T>
-class Tensor4_ddg_numeral_23
-{
-  A iterA;
-  const int N3, N4;
-public:
-  T operator()(const int N1, const int N2) const
-  {
-    return iterA(N1,N2,N3,N4);
-  }
-  Tensor4_ddg_numeral_23(const A &a, const int NN3, const int NN4)
-    :iterA(a), N3(NN3), N4(NN4) {}
-};
-
-/* First and third slot. */
-
-template<class A, class T>
-class Tensor4_ddg_numeral_02
-{
-  A iterA;
-  const int N1, N3;
-public:
-  T operator()(const int N2, const int N4) const
-  {
-    return iterA(N1,N2,N3,N4);
-  }
-  Tensor4_ddg_numeral_02(const A &a, const int NN1, const int NN3)
-    :iterA(a), N1(NN1), N3(NN3) {}
-};
-
-/* Only first slot */
-
-/* I think I have to be careful to make sure that the indices are
-   matched correctly, because the expression that calls it is a
-   Tensor3_dg. */
-
-template<class A, class T>
-class Tensor4_ddg_numeral_0
-{
-  A iterA;
-  const int N1;
-public:
-  T operator()(const int N2, const int N3, const int N4) const
-  {
-    return iterA(N1,N4,N2,N3);
-  }
-  Tensor4_ddg_numeral_0(const A &a, const int NN1):iterA(a), N1(NN1) {}
-};
-
-/* Second, third and fourth slot. */
-
-template<class A, class T>
-class Tensor4_ddg_numeral_123
-{
-  A iterA;
-  const int N1,N2,N3;
-public:
-  T operator()(const int N0) const
-  {
-    return iterA(N0,N1,N2,N3);
-  }
-  Tensor4_ddg_numeral_123(const A &a, const int NN1, const int NN2,
-			  const int NN3) : iterA(a), N1(NN1), N2(NN2), N3(NN3)
-  {}
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_numeral.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_numeral.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,87 @@
+/* This is for expressions where a number is used for one or more
+   slots, and an index for the others, yielding a
+   Tensor2_symmetric_Expr or Tensor3_dg_Expr. */
+
+/* First and second slot. */
+
+template<class A, class T>
+class Tensor4_ddg_numeral_01
+{
+  A iterA;
+  const int N1, N2;
+public:
+  T operator()(const int N3, const int N4) const
+  {
+    return iterA(N1,N2,N3,N4);
+  }
+  Tensor4_ddg_numeral_01(const A &a, const int NN1, const int NN2)
+    :iterA(a), N1(NN1), N2(NN2) {}
+};
+
+/* Third and fourth slot. */
+
+template<class A, class T>
+class Tensor4_ddg_numeral_23
+{
+  A iterA;
+  const int N3, N4;
+public:
+  T operator()(const int N1, const int N2) const
+  {
+    return iterA(N1,N2,N3,N4);
+  }
+  Tensor4_ddg_numeral_23(const A &a, const int NN3, const int NN4)
+    :iterA(a), N3(NN3), N4(NN4) {}
+};
+
+/* First and third slot. */
+
+template<class A, class T>
+class Tensor4_ddg_numeral_02
+{
+  A iterA;
+  const int N1, N3;
+public:
+  T operator()(const int N2, const int N4) const
+  {
+    return iterA(N1,N2,N3,N4);
+  }
+  Tensor4_ddg_numeral_02(const A &a, const int NN1, const int NN3)
+    :iterA(a), N1(NN1), N3(NN3) {}
+};
+
+/* Only first slot */
+
+/* I think I have to be careful to make sure that the indices are
+   matched correctly, because the expression that calls it is a
+   Tensor3_dg. */
+
+template<class A, class T>
+class Tensor4_ddg_numeral_0
+{
+  A iterA;
+  const int N1;
+public:
+  T operator()(const int N2, const int N3, const int N4) const
+  {
+    return iterA(N1,N4,N2,N3);
+  }
+  Tensor4_ddg_numeral_0(const A &a, const int NN1):iterA(a), N1(NN1) {}
+};
+
+/* Second, third and fourth slot. */
+
+template<class A, class T>
+class Tensor4_ddg_numeral_123
+{
+  A iterA;
+  const int N1,N2,N3;
+public:
+  T operator()(const int N0) const
+  {
+    return iterA(N0,N1,N2,N3);
+  }
+  Tensor4_ddg_numeral_123(const A &a, const int NN1, const int NN2,
+			  const int NN3) : iterA(a), N1(NN1), N2(NN2), N3(NN3)
+  {}
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_or_Tensor2_symmetric.h
--- a/Tensor4_ddg/Tensor4_ddg_or_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-/* This file has all of the declarations for expressions like
-   Tensor4_ddg|Tensor2_symmetric and Tensor2_symmetric|Tensor4_ddg,
-   yielding a Tensor2_symmetric. */
-
-/* A(i,j,k,l)*B(j,l) */
-
-template<class A, class B, class T, class U, int Dim, 
-  char i, char j, char k, char l>
-class Tensor4_ddg_or_Tensor2_symmetric_13
-{
-  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,j,l> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,N1,Current_Dim1-1,N2)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,N1,Current_Dim1-1,N2)*iterB(0,Current_Dim1-1)
-      + eval(N1,N2,Number<Dim>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,N1,0,N2)*iterB(0,0);
-  }
-public:
-  Tensor4_ddg_or_Tensor2_symmetric_13
-  (const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim>(),Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim, 
-  char i, char j, char k, char l>
-inline const Tensor2_symmetric_Expr
-<const Tensor4_ddg_or_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,i,k>
-operator|(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b)
-{
-  typedef const Tensor4_ddg_or_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
-    (TensorExpr(a,b));
-}
-
-/* B(j,l)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim, 
-  char i, char j, char k, char l>
-inline const Tensor2_symmetric_Expr
-<const Tensor4_ddg_or_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,i,k>
-operator|(const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b,
-	  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a)
-{
-  typedef const Tensor4_ddg_or_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
-    (TensorExpr(a,b));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_or_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_or_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,76 @@
+/* This file has all of the declarations for expressions like
+   Tensor4_ddg|Tensor2_symmetric and Tensor2_symmetric|Tensor4_ddg,
+   yielding a Tensor2_symmetric. */
+
+/* A(i,j,k,l)*B(j,l) */
+
+template<class A, class B, class T, class U, int Dim, 
+  char i, char j, char k, char l>
+class Tensor4_ddg_or_Tensor2_symmetric_13
+{
+  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,j,l> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,N1,Current_Dim1-1,N2)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,N1,Current_Dim1-1,N2)*iterB(0,Current_Dim1-1)
+      + eval(N1,N2,Number<Dim>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,N1,0,N2)*iterB(0,0);
+  }
+public:
+  Tensor4_ddg_or_Tensor2_symmetric_13
+  (const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim>(),Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim, 
+  char i, char j, char k, char l>
+inline const Tensor2_symmetric_Expr
+<const Tensor4_ddg_or_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,i,k>
+operator|(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b)
+{
+  typedef const Tensor4_ddg_or_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
+    (TensorExpr(a,b));
+}
+
+/* B(j,l)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim, 
+  char i, char j, char k, char l>
+inline const Tensor2_symmetric_Expr
+<const Tensor4_ddg_or_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,i,k>
+operator|(const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b,
+	  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a)
+{
+  typedef const Tensor4_ddg_or_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim,i,k>
+    (TensorExpr(a,b));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_or_Tensor4_ddg.h
--- a/Tensor4_ddg/Tensor4_ddg_or_Tensor4_ddg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-/* Declares expressions of Tensor4_ddg || Tensor4_ddg.  This adds them in
-   a different way, but still ending up with a Tensor4_ddg. */
-
-/* A(i,j,k,l)+B(i,l,k,j) -> Tensor4_ddg */
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-class Tensor4_ddg_or_Tensor4_ddg
-{
-  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> iterA;
-  const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-			     const int N4) const
-  {
-    return iterA(N1,N3,N2,N4)+iterB(N1,N4,N2,N3);
-  }
-  Tensor4_ddg_or_Tensor4_ddg(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-			     const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> &b)
-    : iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const Tensor4_ddg_Expr
-<const Tensor4_ddg_or_Tensor4_ddg<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,Dim,i,k,j,l>
-operator||(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-	   const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> &b)
-{
-  typedef const Tensor4_ddg_or_Tensor4_ddg<A,B,T,U,Dim,i,j,k,l> TensorExpr;
-  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,k,j,l>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_or_Tensor4_ddg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_or_Tensor4_ddg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,34 @@
+/* Declares expressions of Tensor4_ddg || Tensor4_ddg.  This adds them in
+   a different way, but still ending up with a Tensor4_ddg. */
+
+/* A(i,j,k,l)+B(i,l,k,j) -> Tensor4_ddg */
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+class Tensor4_ddg_or_Tensor4_ddg
+{
+  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> iterA;
+  const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+			     const int N4) const
+  {
+    return iterA(N1,N3,N2,N4)+iterB(N1,N4,N2,N3);
+  }
+  Tensor4_ddg_or_Tensor4_ddg(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+			     const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> &b)
+    : iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const Tensor4_ddg_Expr
+<const Tensor4_ddg_or_Tensor4_ddg<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,Dim,i,k,j,l>
+operator||(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+	   const Tensor4_ddg_Expr<B,U,Dim,Dim,i,l,k,j> &b)
+{
+  typedef const Tensor4_ddg_or_Tensor4_ddg<A,B,T,U,Dim,i,j,k,l> TensorExpr;
+  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,k,j,l>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_plus_Tensor4_ddg.h
--- a/Tensor4_ddg/Tensor4_ddg_plus_Tensor4_ddg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-/* Adds Tensor4_ddg+Tensor4_ddg -> Tensor4_ddg */
-
-/* A(i,j,k,l)+B(i,j,k,l) -> Tensor4_ddg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-class Tensor4_ddg_plus_Tensor4_ddg
-{
-  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
-  const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-			     const int N4) const
-  {
-    return iterA(N1,N2,N3,N4)+iterB(N1,N2,N3,N4);
-  }
-
-  Tensor4_ddg_plus_Tensor4_ddg(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a, const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &b):
-    iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor4_ddg_Expr
-<const Tensor4_ddg_plus_Tensor4_ddg<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-operator+(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-	  const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &b)
-{
-  typedef const Tensor4_ddg_plus_Tensor4_ddg<A,B,T,U,Dim01,Dim23,i,j,k,l>
-    TensorExpr;
-  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k,l)+B(k,l,i,j) -> Tensor4_ddg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-class Tensor4_ddg_plus_Tensor4_ddg_2301
-{
-  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
-  const Tensor4_ddg_Expr<B,U,Dim23,Dim01,k,l,i,j> iterB;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-			     const int N4) const
-  {
-    return iterA(N1,N2,N3,N4)+iterB(N3,N4,N1,N2);
-  }
-
-  Tensor4_ddg_plus_Tensor4_ddg_2301
-  (const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-   const Tensor4_ddg_Expr<B,U,Dim23,Dim01,k,l,i,j> &b): iterA(a), iterB(b) {}
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor4_ddg_Expr
-<const Tensor4_ddg_plus_Tensor4_ddg_2301<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-operator+(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-	  const Tensor4_ddg_Expr<B,U,Dim23,Dim01,k,l,i,j> &b)
-{
-  typedef const Tensor4_ddg_plus_Tensor4_ddg_2301<A,B,T,U,Dim01,Dim23,i,j,k,l>
-    TensorExpr;
-  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_plus_Tensor4_ddg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_plus_Tensor4_ddg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,68 @@
+/* Adds Tensor4_ddg+Tensor4_ddg -> Tensor4_ddg */
+
+/* A(i,j,k,l)+B(i,j,k,l) -> Tensor4_ddg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+class Tensor4_ddg_plus_Tensor4_ddg
+{
+  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
+  const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+			     const int N4) const
+  {
+    return iterA(N1,N2,N3,N4)+iterB(N1,N2,N3,N4);
+  }
+
+  Tensor4_ddg_plus_Tensor4_ddg(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a, const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &b):
+    iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor4_ddg_Expr
+<const Tensor4_ddg_plus_Tensor4_ddg<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+operator+(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+	  const Tensor4_ddg_Expr<B,U,Dim01,Dim23,i,j,k,l> &b)
+{
+  typedef const Tensor4_ddg_plus_Tensor4_ddg<A,B,T,U,Dim01,Dim23,i,j,k,l>
+    TensorExpr;
+  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k,l)+B(k,l,i,j) -> Tensor4_ddg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+class Tensor4_ddg_plus_Tensor4_ddg_2301
+{
+  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
+  const Tensor4_ddg_Expr<B,U,Dim23,Dim01,k,l,i,j> iterB;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+			     const int N4) const
+  {
+    return iterA(N1,N2,N3,N4)+iterB(N3,N4,N1,N2);
+  }
+
+  Tensor4_ddg_plus_Tensor4_ddg_2301
+  (const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+   const Tensor4_ddg_Expr<B,U,Dim23,Dim01,k,l,i,j> &b): iterA(a), iterB(b) {}
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor4_ddg_Expr
+<const Tensor4_ddg_plus_Tensor4_ddg_2301<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+operator+(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+	  const Tensor4_ddg_Expr<B,U,Dim23,Dim01,k,l,i,j> &b)
+{
+  typedef const Tensor4_ddg_plus_Tensor4_ddg_2301<A,B,T,U,Dim01,Dim23,i,j,k,l>
+    TensorExpr;
+  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_pointer.h
--- a/Tensor4_ddg/Tensor4_ddg_pointer.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,242 +0,0 @@
-/* A version for pointers. */
-
-template <class T, int Tensor_Dim01, int Tensor_Dim23>
-class Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>
-{
-  mutable T * restrict data[(Tensor_Dim01*(Tensor_Dim01+1))/2][(Tensor_Dim23*(Tensor_Dim23+1))/2];
-public:
-  /* There are two operator(int,int,int,int)'s, one for non-consts
-     that lets you change the value, and one for consts that
-     doesn't. */
-
-  T & operator()(const int N1, const int N2, const int N3, const int N4)
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim01 || N1<0 || N2>=Tensor_Dim01 || N2<0
-       || N3>=Tensor_Dim23 || N3<0 || N4>=Tensor_Dim23 || N4<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor3_dg<T*,"
-          << Tensor_Dim01 << "," << Tensor_Dim23
-          << ">.operator("
-          << N1 << "," << N2 << "," << N3 << "," << N4 << ")"
-          << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N1>N2 ? (N3>N4 ? *data[N1+(N2*(2*Tensor_Dim01-N2-1))/2]
-		    [N3+(N4*(2*Tensor_Dim23-N4-1))/2]
-		    : *data[N1+(N2*(2*Tensor_Dim01-N2-1))/2]
-		    [N4+(N3*(2*Tensor_Dim23-N3-1))/2])
-      : (N3>N4 ? *data[N2+(N1*(2*Tensor_Dim01-N1-1))/2]
-	 [N3+(N4*(2*Tensor_Dim23-N4-1))/2]
-	 : *data[N2+(N1*(2*Tensor_Dim01-N1-1))/2]
-	 [N4+(N3*(2*Tensor_Dim23-N3-1))/2]);
-  }
-
-  T operator()(const int N1, const int N2, const int N3, const int N4)
-    const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim01 || N1<0 || N2>=Tensor_Dim01 || N2<0
-       || N3>=Tensor_Dim23 || N3<0 || N4>=Tensor_Dim23 || N4<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor3_dg<T*,"
-          << Tensor_Dim01 << "," << Tensor_Dim23
-          << ">.operator("
-          << N1 << "," << N2 << "," << N3 << "," << N4
-          << ") const"
-          << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N1>N2 ? (N3>N4 ? *data[N1+(N2*(2*Tensor_Dim01-N2-1))/2]
-		    [N3+(N4*(2*Tensor_Dim23-N4-1))/2]
-		    : *data[N1+(N2*(2*Tensor_Dim01-N2-1))/2]
-		    [N4+(N3*(2*Tensor_Dim23-N3-1))/2])
-      : (N3>N4 ? *data[N2+(N1*(2*Tensor_Dim01-N1-1))/2]
-	 [N3+(N4*(2*Tensor_Dim23-N4-1))/2]
-	 : *data[N2+(N1*(2*Tensor_Dim01-N1-1))/2]
-	 [N4+(N3*(2*Tensor_Dim23-N3-1))/2]);
-  }
-
-  T* ptr(const int N1, const int N2, const int N3, const int N4) const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim01 || N1<0 || N2>=Tensor_Dim01 || N2<0
-       || N3>=Tensor_Dim23 || N3<0 || N4>=Tensor_Dim23 || N4<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor3_dg<T,"
-          << Tensor_Dim01 << "," << Tensor_Dim23 << ">.ptr("
-          << N1 << "," << N2 << "," << N3 << "," << N4 << ")"
-          << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N1>N2 ? (N3>N4 ? data[N1+(N2*(2*Tensor_Dim01-N2-1))/2]
-		    [N3+(N4*(2*Tensor_Dim23-N4-1))/2]
-		    : data[N1+(N2*(2*Tensor_Dim01-N2-1))/2]
-		    [N4+(N3*(2*Tensor_Dim23-N3-1))/2])
-      : (N3>N4 ? data[N2+(N1*(2*Tensor_Dim01-N1-1))/2]
-	 [N3+(N4*(2*Tensor_Dim23-N4-1))/2]
-	 : data[N2+(N1*(2*Tensor_Dim01-N1-1))/2]
-	 [N4+(N3*(2*Tensor_Dim23-N3-1))/2]);
-  }
-
-  /* These operator()'s are the first part in constructing template
-     expressions.  They can be used to slice off lower dimensional
-     parts. They are not entirely safe, since you can accidently use a
-     higher dimension than what is really allowed (like Dim=5). */
-
-  template<char i, char j, char k, char l, int Dim01, int Dim23>
-  Tensor4_ddg_Expr<Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,
-    T,Dim01,Dim23,i,j,k,l> operator()
-    (const Index<i,Dim01> index1, const Index<j,Dim01> index2,
-     const Index<k,Dim23> index3, const Index<l,Dim23> index4)
-  {
-    return Tensor4_ddg_Expr<Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,
-      T,Dim01,Dim23,i,j,k,l> (*this);
-  }
-
-
-  template<char i, char j, char k, char l, int Dim01, int Dim23>
-  const Tensor4_ddg_Expr<const Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,
-    T,Dim01,Dim23,i,j,k,l> operator()
-    (const Index<i,Dim01> index1, const Index<j,Dim01> index2,
-     const Index<k,Dim23> index3, const Index<l,Dim23> index4) const
-  {
-    return Tensor4_ddg_Expr<const Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,
-      T,Dim01,Dim23,i,j,k,l> (*this);
-  }
-
-  /* This is for expressions where a number is used for two slots, and
-     an index for the other two, yielding a Tensor2_symmetric_Expr. */
-
-  template<char i, char j, int N0, int N1, int Dim>
-  const Tensor2_symmetric_Expr<const Tensor4_ddg_number_01
-  <const Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,T,N0,N1>,T,Dim,i,j>
-  operator()(const Number<N0> n1, const Number<N1> n2,
-	     const Index<i,Dim> index1, const Index<j,Dim> index2) const
-  {
-    typedef const Tensor4_ddg_number_01<const Tensor4_ddg
-      <T*,Tensor_Dim01,Tensor_Dim23>,T,N0,N1> TensorExpr;
-    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(TensorExpr(*this));
-  }
-
-  template<char i, char j, int N0, int N1, int Dim>
-  Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01
-  <Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,T,N0,N1>,T,Dim,i,j>
-  operator()(const Number<N0> n1, const Number<N1> n2,
-	     const Index<i,Dim> index1, const Index<j,Dim> index2)
-  {
-    typedef Tensor4_ddg_number_rhs_01<Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,
-      T,N0,N1> TensorExpr;
-    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(*this);
-  }
-
-  /* This is for expressions where a number is used for one slot, and
-     an index for the other three, yielding a Tensor3_dg_Expr. */
-
-  template<char i, char j, char k, int N0, int Dim1, int Dim23>
-  const Tensor3_dg_Expr<const Tensor4_ddg_number_0
-  <const Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,T,N0>,T,Dim23,Dim1,i,j,k>
-  operator()(const Number<N0> n1, const Index<k,Dim1> index3,
-	     const Index<i,Dim23> index1, const Index<j,Dim23> index2) const
-  {
-    typedef const Tensor4_ddg_number_0<const Tensor4_ddg
-      <T*,Tensor_Dim01,Tensor_Dim23>,T,N0> TensorExpr;
-    return Tensor3_dg_Expr<TensorExpr,T,Dim23,Dim1,i,j,k>(TensorExpr(*this));
-  }
-
-  template<char i, char j, char k, int N0, int Dim1, int Dim23>
-  Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0
-  <Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,T,N0>,T,Dim23,Dim1,i,j,k>
-  operator()(const Number<N0> n1, const Index<k,Dim1> index3,
-	     const Index<i,Dim23> index1, const Index<j,Dim23> index2)
-  {
-    typedef Tensor4_ddg_number_rhs_0<Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,
-      T,N0> TensorExpr;
-    return Tensor3_dg_Expr<TensorExpr,T,Dim23,Dim1,i,j,k>(*this);
-  }
-
-  /* This is for expressions where an int (not a Number) is used for
-     two slots, and an index for the other two, yielding a
-     Tensor2_symmetric_Expr. */
-
-  template<char i, char j, int Dim>
-  const Tensor2_symmetric_Expr<const Tensor4_ddg_numeral_01
-  <const Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim,i,j>
-  operator()(const int N0, const int N1,
-	     const Index<i,Dim> index1, const Index<j,Dim> index2) const
-  {
-    typedef const Tensor4_ddg_numeral_01<const Tensor4_ddg
-      <T*,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
-    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>
-      (TensorExpr(*this,N0,N1));
-  }
-
-  template<char i, char j, int Dim>
-  const Tensor2_symmetric_Expr<const Tensor4_ddg_numeral_23
-  <const Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim,i,j>
-  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
-	     const int N2, const int N3) const
-  {
-    typedef const Tensor4_ddg_numeral_23<const Tensor4_ddg
-      <T*,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
-    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>
-      (TensorExpr(*this,N2,N3));
-  }
-
-  /* int in three slots, Index in the other yielding a Tensor1_Expr. */
-
-  template<char i, int Dim>
-  const Tensor1_Expr<const Tensor4_ddg_numeral_123<const Tensor4_ddg
-  <T*,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim,i>
-  operator()(const Index<i,Dim> index1, const int N1, const int N2,
-	     const int N3)
-  {
-    typedef const Tensor4_ddg_numeral_123<const Tensor4_ddg
-      <T*,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2,N3));
-  }
-
-  template<char i, int Dim>
-  const Tensor1_Expr<const Tensor4_ddg_numeral_123<const Tensor4_ddg
-  <T*,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim,i>
-  operator()(const int N1, const Index<i,Dim> index1, const int N2,
-	     const int N3)
-  {
-    typedef const Tensor4_ddg_numeral_123<const Tensor4_ddg
-      <T*,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2,N3));
-  }
-
-  /* This is for expressions where an int (not a Number) is used for
-     one slot, and an index for the other three, yielding a
-     Tensor3_dg_Expr. */
-
-  template<char i, char j, char k, int Dim1, int Dim23>
-  const Tensor3_dg_Expr<const Tensor4_ddg_numeral_0
-  <const Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim23,Dim1,i,j,k>
-  operator()(const int N0, const Index<k,Dim1> index3,
-	     const Index<i,Dim23> index1, const Index<j,Dim23> index2) const
-  {
-    typedef const Tensor4_ddg_numeral_0<const Tensor4_ddg
-      <T*,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
-    return Tensor3_dg_Expr<TensorExpr,T,Dim23,Dim1,i,j,k>
-      (TensorExpr(*this,N0));
-  }
-
-  /* The ++ operator increments the pointer, not the number that the
-     pointer points to.  This allows iterating over a grid. */
-  
-  const Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23> & operator++() const
-  {
-    for(int i=0;i<(Tensor_Dim01*(Tensor_Dim01+1))/2;++i)
-      for(int j=0;j<(Tensor_Dim01*(Tensor_Dim01+1))/2;++j)
-	++data[i][j];
-    return *this;
-  }
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_pointer.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_pointer.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,242 @@
+/* A version for pointers. */
+
+template <class T, int Tensor_Dim01, int Tensor_Dim23>
+class Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>
+{
+  mutable T * restrict data[(Tensor_Dim01*(Tensor_Dim01+1))/2][(Tensor_Dim23*(Tensor_Dim23+1))/2];
+public:
+  /* There are two operator(int,int,int,int)'s, one for non-consts
+     that lets you change the value, and one for consts that
+     doesn't. */
+
+  T & operator()(const int N1, const int N2, const int N3, const int N4)
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim01 || N1<0 || N2>=Tensor_Dim01 || N2<0
+       || N3>=Tensor_Dim23 || N3<0 || N4>=Tensor_Dim23 || N4<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor3_dg<T*,"
+          << Tensor_Dim01 << "," << Tensor_Dim23
+          << ">.operator("
+          << N1 << "," << N2 << "," << N3 << "," << N4 << ")"
+          << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N1>N2 ? (N3>N4 ? *data[N1+(N2*(2*Tensor_Dim01-N2-1))/2]
+		    [N3+(N4*(2*Tensor_Dim23-N4-1))/2]
+		    : *data[N1+(N2*(2*Tensor_Dim01-N2-1))/2]
+		    [N4+(N3*(2*Tensor_Dim23-N3-1))/2])
+      : (N3>N4 ? *data[N2+(N1*(2*Tensor_Dim01-N1-1))/2]
+	 [N3+(N4*(2*Tensor_Dim23-N4-1))/2]
+	 : *data[N2+(N1*(2*Tensor_Dim01-N1-1))/2]
+	 [N4+(N3*(2*Tensor_Dim23-N3-1))/2]);
+  }
+
+  T operator()(const int N1, const int N2, const int N3, const int N4)
+    const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim01 || N1<0 || N2>=Tensor_Dim01 || N2<0
+       || N3>=Tensor_Dim23 || N3<0 || N4>=Tensor_Dim23 || N4<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor3_dg<T*,"
+          << Tensor_Dim01 << "," << Tensor_Dim23
+          << ">.operator("
+          << N1 << "," << N2 << "," << N3 << "," << N4
+          << ") const"
+          << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N1>N2 ? (N3>N4 ? *data[N1+(N2*(2*Tensor_Dim01-N2-1))/2]
+		    [N3+(N4*(2*Tensor_Dim23-N4-1))/2]
+		    : *data[N1+(N2*(2*Tensor_Dim01-N2-1))/2]
+		    [N4+(N3*(2*Tensor_Dim23-N3-1))/2])
+      : (N3>N4 ? *data[N2+(N1*(2*Tensor_Dim01-N1-1))/2]
+	 [N3+(N4*(2*Tensor_Dim23-N4-1))/2]
+	 : *data[N2+(N1*(2*Tensor_Dim01-N1-1))/2]
+	 [N4+(N3*(2*Tensor_Dim23-N3-1))/2]);
+  }
+
+  T* ptr(const int N1, const int N2, const int N3, const int N4) const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim01 || N1<0 || N2>=Tensor_Dim01 || N2<0
+       || N3>=Tensor_Dim23 || N3<0 || N4>=Tensor_Dim23 || N4<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor3_dg<T,"
+          << Tensor_Dim01 << "," << Tensor_Dim23 << ">.ptr("
+          << N1 << "," << N2 << "," << N3 << "," << N4 << ")"
+          << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N1>N2 ? (N3>N4 ? data[N1+(N2*(2*Tensor_Dim01-N2-1))/2]
+		    [N3+(N4*(2*Tensor_Dim23-N4-1))/2]
+		    : data[N1+(N2*(2*Tensor_Dim01-N2-1))/2]
+		    [N4+(N3*(2*Tensor_Dim23-N3-1))/2])
+      : (N3>N4 ? data[N2+(N1*(2*Tensor_Dim01-N1-1))/2]
+	 [N3+(N4*(2*Tensor_Dim23-N4-1))/2]
+	 : data[N2+(N1*(2*Tensor_Dim01-N1-1))/2]
+	 [N4+(N3*(2*Tensor_Dim23-N3-1))/2]);
+  }
+
+  /* These operator()'s are the first part in constructing template
+     expressions.  They can be used to slice off lower dimensional
+     parts. They are not entirely safe, since you can accidently use a
+     higher dimension than what is really allowed (like Dim=5). */
+
+  template<char i, char j, char k, char l, int Dim01, int Dim23>
+  Tensor4_ddg_Expr<Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,
+    T,Dim01,Dim23,i,j,k,l> operator()
+    (const Index<i,Dim01> index1, const Index<j,Dim01> index2,
+     const Index<k,Dim23> index3, const Index<l,Dim23> index4)
+  {
+    return Tensor4_ddg_Expr<Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,
+      T,Dim01,Dim23,i,j,k,l> (*this);
+  }
+
+
+  template<char i, char j, char k, char l, int Dim01, int Dim23>
+  const Tensor4_ddg_Expr<const Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,
+    T,Dim01,Dim23,i,j,k,l> operator()
+    (const Index<i,Dim01> index1, const Index<j,Dim01> index2,
+     const Index<k,Dim23> index3, const Index<l,Dim23> index4) const
+  {
+    return Tensor4_ddg_Expr<const Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,
+      T,Dim01,Dim23,i,j,k,l> (*this);
+  }
+
+  /* This is for expressions where a number is used for two slots, and
+     an index for the other two, yielding a Tensor2_symmetric_Expr. */
+
+  template<char i, char j, int N0, int N1, int Dim>
+  const Tensor2_symmetric_Expr<const Tensor4_ddg_number_01
+  <const Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,T,N0,N1>,T,Dim,i,j>
+  operator()(const Number<N0> n1, const Number<N1> n2,
+	     const Index<i,Dim> index1, const Index<j,Dim> index2) const
+  {
+    typedef const Tensor4_ddg_number_01<const Tensor4_ddg
+      <T*,Tensor_Dim01,Tensor_Dim23>,T,N0,N1> TensorExpr;
+    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(TensorExpr(*this));
+  }
+
+  template<char i, char j, int N0, int N1, int Dim>
+  Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01
+  <Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,T,N0,N1>,T,Dim,i,j>
+  operator()(const Number<N0> n1, const Number<N1> n2,
+	     const Index<i,Dim> index1, const Index<j,Dim> index2)
+  {
+    typedef Tensor4_ddg_number_rhs_01<Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,
+      T,N0,N1> TensorExpr;
+    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(*this);
+  }
+
+  /* This is for expressions where a number is used for one slot, and
+     an index for the other three, yielding a Tensor3_dg_Expr. */
+
+  template<char i, char j, char k, int N0, int Dim1, int Dim23>
+  const Tensor3_dg_Expr<const Tensor4_ddg_number_0
+  <const Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,T,N0>,T,Dim23,Dim1,i,j,k>
+  operator()(const Number<N0> n1, const Index<k,Dim1> index3,
+	     const Index<i,Dim23> index1, const Index<j,Dim23> index2) const
+  {
+    typedef const Tensor4_ddg_number_0<const Tensor4_ddg
+      <T*,Tensor_Dim01,Tensor_Dim23>,T,N0> TensorExpr;
+    return Tensor3_dg_Expr<TensorExpr,T,Dim23,Dim1,i,j,k>(TensorExpr(*this));
+  }
+
+  template<char i, char j, char k, int N0, int Dim1, int Dim23>
+  Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0
+  <Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,T,N0>,T,Dim23,Dim1,i,j,k>
+  operator()(const Number<N0> n1, const Index<k,Dim1> index3,
+	     const Index<i,Dim23> index1, const Index<j,Dim23> index2)
+  {
+    typedef Tensor4_ddg_number_rhs_0<Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,
+      T,N0> TensorExpr;
+    return Tensor3_dg_Expr<TensorExpr,T,Dim23,Dim1,i,j,k>(*this);
+  }
+
+  /* This is for expressions where an int (not a Number) is used for
+     two slots, and an index for the other two, yielding a
+     Tensor2_symmetric_Expr. */
+
+  template<char i, char j, int Dim>
+  const Tensor2_symmetric_Expr<const Tensor4_ddg_numeral_01
+  <const Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim,i,j>
+  operator()(const int N0, const int N1,
+	     const Index<i,Dim> index1, const Index<j,Dim> index2) const
+  {
+    typedef const Tensor4_ddg_numeral_01<const Tensor4_ddg
+      <T*,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
+    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>
+      (TensorExpr(*this,N0,N1));
+  }
+
+  template<char i, char j, int Dim>
+  const Tensor2_symmetric_Expr<const Tensor4_ddg_numeral_23
+  <const Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim,i,j>
+  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
+	     const int N2, const int N3) const
+  {
+    typedef const Tensor4_ddg_numeral_23<const Tensor4_ddg
+      <T*,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
+    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>
+      (TensorExpr(*this,N2,N3));
+  }
+
+  /* int in three slots, Index in the other yielding a Tensor1_Expr. */
+
+  template<char i, int Dim>
+  const Tensor1_Expr<const Tensor4_ddg_numeral_123<const Tensor4_ddg
+  <T*,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim,i>
+  operator()(const Index<i,Dim> index1, const int N1, const int N2,
+	     const int N3)
+  {
+    typedef const Tensor4_ddg_numeral_123<const Tensor4_ddg
+      <T*,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2,N3));
+  }
+
+  template<char i, int Dim>
+  const Tensor1_Expr<const Tensor4_ddg_numeral_123<const Tensor4_ddg
+  <T*,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim,i>
+  operator()(const int N1, const Index<i,Dim> index1, const int N2,
+	     const int N3)
+  {
+    typedef const Tensor4_ddg_numeral_123<const Tensor4_ddg
+      <T*,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2,N3));
+  }
+
+  /* This is for expressions where an int (not a Number) is used for
+     one slot, and an index for the other three, yielding a
+     Tensor3_dg_Expr. */
+
+  template<char i, char j, char k, int Dim1, int Dim23>
+  const Tensor3_dg_Expr<const Tensor4_ddg_numeral_0
+  <const Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim23,Dim1,i,j,k>
+  operator()(const int N0, const Index<k,Dim1> index3,
+	     const Index<i,Dim23> index1, const Index<j,Dim23> index2) const
+  {
+    typedef const Tensor4_ddg_numeral_0<const Tensor4_ddg
+      <T*,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
+    return Tensor3_dg_Expr<TensorExpr,T,Dim23,Dim1,i,j,k>
+      (TensorExpr(*this,N0));
+  }
+
+  /* The ++ operator increments the pointer, not the number that the
+     pointer points to.  This allows iterating over a grid. */
+  
+  const Tensor4_ddg<T*,Tensor_Dim01,Tensor_Dim23> & operator++() const
+  {
+    for(int i=0;i<(Tensor_Dim01*(Tensor_Dim01+1))/2;++i)
+      for(int j=0;j<(Tensor_Dim01*(Tensor_Dim01+1))/2;++j)
+	++data[i][j];
+    return *this;
+  }
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_times_Tensor1.h
--- a/Tensor4_ddg/Tensor4_ddg_times_Tensor1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-/* This file has all of the declarations for expressions like
-   Tensor4_ddg*Tensor1 and Tensor1*Tensor4_ddg, yielding a
-   Tensor3_dg. */
-
-/* A(i,j,k,l)*B(k)->Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23, 
-  char i, char j, char k, char l>
-class Tensor4_ddg_times_Tensor1_2
-{
-  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
-  const Tensor1_Expr<B,U,Dim23,k> iterB;
-
-  template<int Current_Dim>
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
-		       const Number<Current_Dim> &N)  const
-  {
-    return iterA(N1,N2,Current_Dim-1,N3)*iterB(Current_Dim-1)
-      + eval(N1,N2,N3,Number<Current_Dim-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
-		       const Number<1> &N) const
-  {
-    return iterA(N1,N2,0,N3)*iterB(0);
-  }
-public:
-  Tensor4_ddg_times_Tensor1_2
-  (const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-   const Tensor1_Expr<B,U,Dim23,k> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
-  {
-    return eval(N1,N2,N3,Number<Dim23>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim23, 
-  char i, char j, char k, char l>
-inline const Tensor3_dg_Expr
-<const Tensor4_ddg_times_Tensor1_2<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim23,i,j,l>
-operator*(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-	  const Tensor1_Expr<B,U,Dim23,k> &b)
-{
-  typedef const Tensor4_ddg_times_Tensor1_2<A,B,T,U,Dim01,Dim23,i,j,k,l>
-    TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,l>
-    (TensorExpr(a,b));
-}
-
-/* B(k)*A(i,j,k,l)->Tensor3_dg */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23, 
-  char i, char j, char k, char l>
-inline const Tensor3_dg_Expr
-<const Tensor4_ddg_times_Tensor1_2<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,Dim23,i,j,l>
-operator*(const Tensor1_Expr<B,U,Dim23,k> &b,
-	  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
-{
-  typedef const Tensor4_ddg_times_Tensor1_2<A,B,T,U,Dim01,Dim23,i,j,k,l>
-    TensorExpr;
-  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,l>
-    (TensorExpr(a,b));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_times_Tensor1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_times_Tensor1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,65 @@
+/* This file has all of the declarations for expressions like
+   Tensor4_ddg*Tensor1 and Tensor1*Tensor4_ddg, yielding a
+   Tensor3_dg. */
+
+/* A(i,j,k,l)*B(k)->Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23, 
+  char i, char j, char k, char l>
+class Tensor4_ddg_times_Tensor1_2
+{
+  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
+  const Tensor1_Expr<B,U,Dim23,k> iterB;
+
+  template<int Current_Dim>
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
+		       const Number<Current_Dim> &N)  const
+  {
+    return iterA(N1,N2,Current_Dim-1,N3)*iterB(Current_Dim-1)
+      + eval(N1,N2,N3,Number<Current_Dim-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2, const int N3,
+		       const Number<1> &N) const
+  {
+    return iterA(N1,N2,0,N3)*iterB(0);
+  }
+public:
+  Tensor4_ddg_times_Tensor1_2
+  (const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+   const Tensor1_Expr<B,U,Dim23,k> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3) const
+  {
+    return eval(N1,N2,N3,Number<Dim23>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim23, 
+  char i, char j, char k, char l>
+inline const Tensor3_dg_Expr
+<const Tensor4_ddg_times_Tensor1_2<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim23,i,j,l>
+operator*(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+	  const Tensor1_Expr<B,U,Dim23,k> &b)
+{
+  typedef const Tensor4_ddg_times_Tensor1_2<A,B,T,U,Dim01,Dim23,i,j,k,l>
+    TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,l>
+    (TensorExpr(a,b));
+}
+
+/* B(k)*A(i,j,k,l)->Tensor3_dg */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23, 
+  char i, char j, char k, char l>
+inline const Tensor3_dg_Expr
+<const Tensor4_ddg_times_Tensor1_2<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,Dim23,i,j,l>
+operator*(const Tensor1_Expr<B,U,Dim23,k> &b,
+	  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
+{
+  typedef const Tensor4_ddg_times_Tensor1_2<A,B,T,U,Dim01,Dim23,i,j,k,l>
+    TensorExpr;
+  return Tensor3_dg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,l>
+    (TensorExpr(a,b));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_times_Tensor2.h
--- a/Tensor4_ddg/Tensor4_ddg_times_Tensor2.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,147 +0,0 @@
-/* This file has all of the declarations for expressions like
-   Tensor4_ddg*Tensor2 and Tensor2*Tensor4_ddg, yielding a
-   Tensor2_symmetric. */
-
-/* A(i,j,k,l)*B(k,l) */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-class Tensor4_ddg_times_Tensor2_23
-{
-  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
-  const Tensor2_Expr<B,U,Dim23,Dim23,k,l> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,N2,Current_Dim0-1,Current_Dim1-1)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,N2,0,Current_Dim1-1)*iterB(0,Current_Dim1-1)
-      + eval(N1,N2,Number<Dim23>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(N1,N2,0,0)*iterB(0,0);
-  }
-public:
-  Tensor4_ddg_times_Tensor2_23
-  (const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-   const Tensor2_Expr<B,U,Dim23,Dim23,k,l> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim23>(),Number<Dim23>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor2_symmetric_Expr
-<const Tensor4_ddg_times_Tensor2_23<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,i,j>
-operator*(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-	  const Tensor2_Expr<B,U,Dim23,Dim23,k,l> &b)
-{
-  typedef const Tensor4_ddg_times_Tensor2_23
-    <A,B,T,U,Dim01,Dim23,i,j,k,l> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i,j>
-    (TensorExpr(a,b));
-}
-
-/* B(k,l)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor2_symmetric_Expr
-<const Tensor4_ddg_times_Tensor2_23<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,i,j>
-operator*(const Tensor2_Expr<B,U,Dim23,Dim23,k,l> &b,
-	  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
-{
-  typedef const Tensor4_ddg_times_Tensor2_23
-    <A,B,T,U,Dim01,Dim23,i,j,k,l> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i,j>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k,l)*B(l,k) */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-class Tensor4_ddg_times_Tensor2_32
-{
-  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
-  const Tensor2_Expr<B,U,Dim23,Dim23,l,k> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,N2,Current_Dim0-1,Current_Dim1-1)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,N2,0,Current_Dim1-1)*iterB(0,Current_Dim1-1)
-      + eval(N1,N2,Number<Dim23>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(N1,N2,0,0)*iterB(0,0);
-  }
-public:
-  Tensor4_ddg_times_Tensor2_32
-  (const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-   const Tensor2_Expr<B,U,Dim23,Dim23,l,k> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim23>(),Number<Dim23>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor2_symmetric_Expr
-<const Tensor4_ddg_times_Tensor2_32<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,i,j>
-operator*(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-	  const Tensor2_Expr<B,U,Dim23,Dim23,l,k> &b)
-{
-  typedef const Tensor4_ddg_times_Tensor2_32
-    <A,B,T,U,Dim01,Dim23,i,j,k,l> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i,j>
-    (TensorExpr(a,b));
-}
-
-/* B(l,k)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor2_symmetric_Expr
-<const Tensor4_ddg_times_Tensor2_32<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,i,j>
-operator*(const Tensor2_Expr<B,U,Dim23,Dim23,l,k> &b,
-	  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
-{
-  typedef const Tensor4_ddg_times_Tensor2_32
-    <A,B,T,U,Dim01,Dim23,i,j,k,l> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i,j>
-    (TensorExpr(a,b));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_times_Tensor2.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_times_Tensor2.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,147 @@
+/* This file has all of the declarations for expressions like
+   Tensor4_ddg*Tensor2 and Tensor2*Tensor4_ddg, yielding a
+   Tensor2_symmetric. */
+
+/* A(i,j,k,l)*B(k,l) */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+class Tensor4_ddg_times_Tensor2_23
+{
+  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
+  const Tensor2_Expr<B,U,Dim23,Dim23,k,l> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,N2,Current_Dim0-1,Current_Dim1-1)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,N2,0,Current_Dim1-1)*iterB(0,Current_Dim1-1)
+      + eval(N1,N2,Number<Dim23>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(N1,N2,0,0)*iterB(0,0);
+  }
+public:
+  Tensor4_ddg_times_Tensor2_23
+  (const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+   const Tensor2_Expr<B,U,Dim23,Dim23,k,l> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim23>(),Number<Dim23>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor2_symmetric_Expr
+<const Tensor4_ddg_times_Tensor2_23<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,i,j>
+operator*(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+	  const Tensor2_Expr<B,U,Dim23,Dim23,k,l> &b)
+{
+  typedef const Tensor4_ddg_times_Tensor2_23
+    <A,B,T,U,Dim01,Dim23,i,j,k,l> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i,j>
+    (TensorExpr(a,b));
+}
+
+/* B(k,l)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor2_symmetric_Expr
+<const Tensor4_ddg_times_Tensor2_23<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,i,j>
+operator*(const Tensor2_Expr<B,U,Dim23,Dim23,k,l> &b,
+	  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
+{
+  typedef const Tensor4_ddg_times_Tensor2_23
+    <A,B,T,U,Dim01,Dim23,i,j,k,l> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i,j>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k,l)*B(l,k) */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+class Tensor4_ddg_times_Tensor2_32
+{
+  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
+  const Tensor2_Expr<B,U,Dim23,Dim23,l,k> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,N2,Current_Dim0-1,Current_Dim1-1)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,N2,0,Current_Dim1-1)*iterB(0,Current_Dim1-1)
+      + eval(N1,N2,Number<Dim23>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(N1,N2,0,0)*iterB(0,0);
+  }
+public:
+  Tensor4_ddg_times_Tensor2_32
+  (const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+   const Tensor2_Expr<B,U,Dim23,Dim23,l,k> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim23>(),Number<Dim23>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor2_symmetric_Expr
+<const Tensor4_ddg_times_Tensor2_32<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,i,j>
+operator*(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+	  const Tensor2_Expr<B,U,Dim23,Dim23,l,k> &b)
+{
+  typedef const Tensor4_ddg_times_Tensor2_32
+    <A,B,T,U,Dim01,Dim23,i,j,k,l> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i,j>
+    (TensorExpr(a,b));
+}
+
+/* B(l,k)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor2_symmetric_Expr
+<const Tensor4_ddg_times_Tensor2_32<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,i,j>
+operator*(const Tensor2_Expr<B,U,Dim23,Dim23,l,k> &b,
+	  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
+{
+  typedef const Tensor4_ddg_times_Tensor2_32
+    <A,B,T,U,Dim01,Dim23,i,j,k,l> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i,j>
+    (TensorExpr(a,b));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_times_Tensor2_symmetric.h
--- a/Tensor4_ddg/Tensor4_ddg_times_Tensor2_symmetric.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,218 +0,0 @@
-/* This file has all of the declarations for expressions like
-   Tensor4_ddg*Tensor2_symmetric and Tensor2_symmetric*Tensor4_ddg,
-   yielding a Tensor2 or Tensor2_symmetric. */
-
-/* A(i,j,k,l)*B(j,l) */
-
-template<class A, class B, class T, class U, int Dim, 
-  char i, char j, char k, char l>
-class Tensor4_ddg_times_Tensor2_symmetric_13
-{
-  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim,j,l> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,N1,Current_Dim1-1,N2)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,N1,Current_Dim1-1,N2)*iterB(0,Current_Dim1-1)
-      + eval(N1,N2,Number<Dim>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,N1,0,N2)*iterB(0,0);
-  }
-public:
-  Tensor4_ddg_times_Tensor2_symmetric_13
-  (const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim>(),Number<Dim>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim, 
-  char i, char j, char k, char l>
-inline const Tensor2_Expr
-<const Tensor4_ddg_times_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,Dim,i,k>
-operator*(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b)
-{
-  typedef const Tensor4_ddg_times_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,k>(TensorExpr(a,b));
-}
-
-/* B(j,l)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim, 
-  char i, char j, char k, char l>
-inline const Tensor2_Expr
-<const Tensor4_ddg_times_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>,
-  typename promote<T,U>::V,Dim,Dim,i,k>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b,
-	  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a)
-{
-  typedef const Tensor4_ddg_times_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>
-    TensorExpr;
-  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,k>(TensorExpr(a,b));
-}
-
-/* A(i,j,k,l)*B(i,j) */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-class Tensor4_ddg_times_Tensor2_symmetric_01
-{
-  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim01,i,j> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(Current_Dim0-1,Current_Dim1-1,N1,N2)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(0,Current_Dim1-1,N1,N2)*iterB(0,Current_Dim1-1)
-      + eval(N1,N2,Number<Dim01>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(0,0,N1,N2)*iterB(0,0);
-  }
-public:
-  Tensor4_ddg_times_Tensor2_symmetric_01
-  (const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim01>(),Number<Dim01>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor2_symmetric_Expr
-<const Tensor4_ddg_times_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim23,k,l>
-operator*(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b)
-{
-  typedef const Tensor4_ddg_times_Tensor2_symmetric_01
-    <A,B,T,U,Dim01,Dim23,i,j,k,l> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim23,k,l>
-    (TensorExpr(a,b));
-}
-
-/* B(i,j)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor2_symmetric_Expr
-<const Tensor4_ddg_times_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim23,k,l>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b,
-	  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
-{
-  typedef const Tensor4_ddg_times_Tensor2_symmetric_01
-    <A,B,T,U,Dim01,Dim23,i,j,k,l> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim23,k,l>
-    (TensorExpr(a,b));
-}
-
-/* A(i,j,k,l)*B(k,l) */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-class Tensor4_ddg_times_Tensor2_symmetric_23
-{
-  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
-  const Tensor2_symmetric_Expr<B,U,Dim23,k,l> iterB;
-
-  template<int Current_Dim0, int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<Current_Dim0> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,N2,Current_Dim0-1,Current_Dim1-1)
-      *iterB(Current_Dim0-1,Current_Dim1-1)
-      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
-  }
-  template<int Current_Dim1>
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<Current_Dim1> &ND1)  const
-  {
-    return iterA(N1,N2,0,Current_Dim1-1)*iterB(0,Current_Dim1-1)
-      + eval(N1,N2,Number<Dim23>(),Number<Current_Dim1-1>());
-  }
-  typename promote<T,U>::V eval(const int N1, const int N2,
-		       const Number<1> &ND0,
-		       const Number<1> &ND1)  const
-  {
-    return iterA(N1,N2,0,0)*iterB(0,0);
-  }
-public:
-  Tensor4_ddg_times_Tensor2_symmetric_23
-  (const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-   const Tensor2_symmetric_Expr<B,U,Dim23,k,l> &b): iterA(a), iterB(b) {}
-  typename promote<T,U>::V operator()(const int N1, const int N2) const
-  {
-    return eval(N1,N2,Number<Dim23>(),Number<Dim23>());
-  }
-};
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor2_symmetric_Expr
-<const Tensor4_ddg_times_Tensor2_symmetric_23<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,i,j>
-operator*(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-	  const Tensor2_symmetric_Expr<B,U,Dim23,k,l> &b)
-{
-  typedef const Tensor4_ddg_times_Tensor2_symmetric_23
-    <A,B,T,U,Dim01,Dim23,i,j,k,l> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i,j>
-    (TensorExpr(a,b));
-}
-
-/* B(k,l)*A(i,j,k,l) */
-
-template<class A, class B, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor2_symmetric_Expr
-<const Tensor4_ddg_times_Tensor2_symmetric_23<A,B,T,U,Dim01,Dim23,i,j,k,l>,
-  typename promote<T,U>::V,Dim01,i,j>
-operator*(const Tensor2_symmetric_Expr<B,U,Dim23,k,l> &b,
-	  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
-{
-  typedef const Tensor4_ddg_times_Tensor2_symmetric_23
-    <A,B,T,U,Dim01,Dim23,i,j,k,l> TensorExpr;
-  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i,j>
-    (TensorExpr(a,b));
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_times_Tensor2_symmetric.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_times_Tensor2_symmetric.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,218 @@
+/* This file has all of the declarations for expressions like
+   Tensor4_ddg*Tensor2_symmetric and Tensor2_symmetric*Tensor4_ddg,
+   yielding a Tensor2 or Tensor2_symmetric. */
+
+/* A(i,j,k,l)*B(j,l) */
+
+template<class A, class B, class T, class U, int Dim, 
+  char i, char j, char k, char l>
+class Tensor4_ddg_times_Tensor2_symmetric_13
+{
+  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim,j,l> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,N1,Current_Dim1-1,N2)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,N1,Current_Dim1-1,N2)*iterB(0,Current_Dim1-1)
+      + eval(N1,N2,Number<Dim>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,N1,0,N2)*iterB(0,0);
+  }
+public:
+  Tensor4_ddg_times_Tensor2_symmetric_13
+  (const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim>(),Number<Dim>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim, 
+  char i, char j, char k, char l>
+inline const Tensor2_Expr
+<const Tensor4_ddg_times_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,Dim,i,k>
+operator*(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b)
+{
+  typedef const Tensor4_ddg_times_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,k>(TensorExpr(a,b));
+}
+
+/* B(j,l)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim, 
+  char i, char j, char k, char l>
+inline const Tensor2_Expr
+<const Tensor4_ddg_times_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>,
+  typename promote<T,U>::V,Dim,Dim,i,k>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim,j,l> &b,
+	  const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a)
+{
+  typedef const Tensor4_ddg_times_Tensor2_symmetric_13<A,B,T,U,Dim,i,j,k,l>
+    TensorExpr;
+  return Tensor2_Expr<TensorExpr,typename promote<T,U>::V,Dim,Dim,i,k>(TensorExpr(a,b));
+}
+
+/* A(i,j,k,l)*B(i,j) */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+class Tensor4_ddg_times_Tensor2_symmetric_01
+{
+  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim01,i,j> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(Current_Dim0-1,Current_Dim1-1,N1,N2)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(0,Current_Dim1-1,N1,N2)*iterB(0,Current_Dim1-1)
+      + eval(N1,N2,Number<Dim01>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(0,0,N1,N2)*iterB(0,0);
+  }
+public:
+  Tensor4_ddg_times_Tensor2_symmetric_01
+  (const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim01>(),Number<Dim01>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor2_symmetric_Expr
+<const Tensor4_ddg_times_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim23,k,l>
+operator*(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b)
+{
+  typedef const Tensor4_ddg_times_Tensor2_symmetric_01
+    <A,B,T,U,Dim01,Dim23,i,j,k,l> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim23,k,l>
+    (TensorExpr(a,b));
+}
+
+/* B(i,j)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor2_symmetric_Expr
+<const Tensor4_ddg_times_Tensor2_symmetric_01<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim23,k,l>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim01,i,j> &b,
+	  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
+{
+  typedef const Tensor4_ddg_times_Tensor2_symmetric_01
+    <A,B,T,U,Dim01,Dim23,i,j,k,l> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim23,k,l>
+    (TensorExpr(a,b));
+}
+
+/* A(i,j,k,l)*B(k,l) */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+class Tensor4_ddg_times_Tensor2_symmetric_23
+{
+  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
+  const Tensor2_symmetric_Expr<B,U,Dim23,k,l> iterB;
+
+  template<int Current_Dim0, int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<Current_Dim0> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,N2,Current_Dim0-1,Current_Dim1-1)
+      *iterB(Current_Dim0-1,Current_Dim1-1)
+      + eval(N1,N2,Number<Current_Dim0-1>(),Number<Current_Dim1>());
+  }
+  template<int Current_Dim1>
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<Current_Dim1> &ND1)  const
+  {
+    return iterA(N1,N2,0,Current_Dim1-1)*iterB(0,Current_Dim1-1)
+      + eval(N1,N2,Number<Dim23>(),Number<Current_Dim1-1>());
+  }
+  typename promote<T,U>::V eval(const int N1, const int N2,
+		       const Number<1> &ND0,
+		       const Number<1> &ND1)  const
+  {
+    return iterA(N1,N2,0,0)*iterB(0,0);
+  }
+public:
+  Tensor4_ddg_times_Tensor2_symmetric_23
+  (const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+   const Tensor2_symmetric_Expr<B,U,Dim23,k,l> &b): iterA(a), iterB(b) {}
+  typename promote<T,U>::V operator()(const int N1, const int N2) const
+  {
+    return eval(N1,N2,Number<Dim23>(),Number<Dim23>());
+  }
+};
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor2_symmetric_Expr
+<const Tensor4_ddg_times_Tensor2_symmetric_23<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,i,j>
+operator*(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+	  const Tensor2_symmetric_Expr<B,U,Dim23,k,l> &b)
+{
+  typedef const Tensor4_ddg_times_Tensor2_symmetric_23
+    <A,B,T,U,Dim01,Dim23,i,j,k,l> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i,j>
+    (TensorExpr(a,b));
+}
+
+/* B(k,l)*A(i,j,k,l) */
+
+template<class A, class B, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor2_symmetric_Expr
+<const Tensor4_ddg_times_Tensor2_symmetric_23<A,B,T,U,Dim01,Dim23,i,j,k,l>,
+  typename promote<T,U>::V,Dim01,i,j>
+operator*(const Tensor2_symmetric_Expr<B,U,Dim23,k,l> &b,
+	  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
+{
+  typedef const Tensor4_ddg_times_Tensor2_symmetric_23
+    <A,B,T,U,Dim01,Dim23,i,j,k,l> TensorExpr;
+  return Tensor2_symmetric_Expr<TensorExpr,typename promote<T,U>::V,Dim01,i,j>
+    (TensorExpr(a,b));
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_times_Tensor4_ddg.h
--- a/Tensor4_ddg/Tensor4_ddg_times_Tensor4_ddg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-/* Fully contract a Tensor4_ddg with a Tensor4_ddg. */
-
-/* A(i,j,k,l)*B(i,k,j,l) */
-
-template<class A, class B, class T, class U, int Dim, char i, char j,
-  char k, char l,
-  int Current_Dim0, int Current_Dim1, int Current_Dim2, int Current_Dim3>
-inline const typename promote<T,U>::V
-T4ddg_times_T4ddg_0213(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-	      const Tensor4_ddg_Expr<B,U,Dim,Dim,i,k,j,l> &b,
-	      const Number<Current_Dim0> &N0,
-	      const Number<Current_Dim1> &N1,
-	      const Number<Current_Dim2> &N2,
-	      const Number<Current_Dim3> &N3)
-{
-  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1,Current_Dim3-1)
-    *b(Current_Dim0-1,Current_Dim2-1,Current_Dim1-1,Current_Dim3-1)
-    + T4ddg_times_T4ddg_0213(a,b,Number<Current_Dim0-1>(),
-			     Number<Current_Dim1>(),Number<Current_Dim2>(),
-			     Number<Current_Dim3>());
-}
-
-template<class A, class B, class T, class U, int Dim, char i, char j,
-  char k, char l, int Current_Dim1, int Current_Dim2, int Current_Dim3>
-inline const typename promote<T,U>::V
-T4ddg_times_T4ddg_0213(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-	      const Tensor4_ddg_Expr<B,U,Dim,Dim,i,k,j,l> &b,
-	      const Number<1> &N0,
-	      const Number<Current_Dim1> &N1,
-	      const Number<Current_Dim2> &N2,
-	      const Number<Current_Dim3> &N3)
-{
-  return a(0,Current_Dim1-1,Current_Dim2-1,Current_Dim3-1)
-    *b(0,Current_Dim2-1,Current_Dim1-1,Current_Dim3-1)
-    + T4ddg_times_T4ddg_0213(a,b,Number<Dim>(),
-			     Number<Current_Dim1-1>(),Number<Current_Dim2>(),
-			     Number<Current_Dim3>());
-}
-
-template<class A, class B, class T, class U, int Dim, char i, char j,
-  char k, char l, int Current_Dim2, int Current_Dim3>
-inline const typename promote<T,U>::V
-T4ddg_times_T4ddg_0213(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-		       const Tensor4_ddg_Expr<B,U,Dim,Dim,i,k,j,l> &b,
-		       const Number<1> &N0,
-		       const Number<1> &N1,
-		       const Number<Current_Dim2> &N2,
-		       const Number<Current_Dim3> &N3)
-{
-  return a(0,0,Current_Dim2-1,Current_Dim3-1)
-    *b(0,Current_Dim2-1,0,Current_Dim3-1)
-    + T4ddg_times_T4ddg_0213(a,b,Number<Dim>(),
-			     Number<Dim>(),Number<Current_Dim2-1>(),
-			     Number<Current_Dim3>());
-}
-
-template<class A, class B, class T, class U, int Dim, char i, char j,
-  char k, char l, int Current_Dim3>
-inline const typename promote<T,U>::V
-T4ddg_times_T4ddg_0213(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-		       const Tensor4_ddg_Expr<B,U,Dim,Dim,i,k,j,l> &b,
-		       const Number<1> &N0,
-		       const Number<1> &N1,
-		       const Number<1> &N2,
-		       const Number<Current_Dim3> &N3)
-{
-  return a(0,0,0,Current_Dim3-1)
-    *b(0,0,0,Current_Dim3-1)
-    + T4ddg_times_T4ddg_0213(a,b,Number<Dim>(),
-			     Number<Dim>(),Number<Dim>(),
-			     Number<Current_Dim3-1>());
-}
-
-template<class A, class B, class T, class U, int Dim, char i, char j,
-  char k, char l>
-inline const typename promote<T,U>::V
-T4ddg_times_T4ddg_0213(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-		       const Tensor4_ddg_Expr<B,U,Dim,Dim,i,k,j,l> &b,
-		       const Number<1> &N0,
-		       const Number<1> &N1,
-		       const Number<1> &N2,
-		       const Number<1> &N3)
-{
-  return a(0,0,0,0)*b(0,0,0,0);
-}
-
-template<class A, class B, class T, class U, int Dim,
-  char i, char j, char k, char l>
-inline const typename promote<T,U>::V
-operator*(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
-	  const Tensor4_ddg_Expr<B,U,Dim,Dim,i,k,j,l> &b)
-{
-  return T4ddg_times_T4ddg_0213(a,b,Number<Dim>(),Number<Dim>(),Number<Dim>(),
-				Number<Dim>());
-}
-
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_times_Tensor4_ddg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_times_Tensor4_ddg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,96 @@
+/* Fully contract a Tensor4_ddg with a Tensor4_ddg. */
+
+/* A(i,j,k,l)*B(i,k,j,l) */
+
+template<class A, class B, class T, class U, int Dim, char i, char j,
+  char k, char l,
+  int Current_Dim0, int Current_Dim1, int Current_Dim2, int Current_Dim3>
+inline const typename promote<T,U>::V
+T4ddg_times_T4ddg_0213(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+	      const Tensor4_ddg_Expr<B,U,Dim,Dim,i,k,j,l> &b,
+	      const Number<Current_Dim0> &N0,
+	      const Number<Current_Dim1> &N1,
+	      const Number<Current_Dim2> &N2,
+	      const Number<Current_Dim3> &N3)
+{
+  return a(Current_Dim0-1,Current_Dim1-1,Current_Dim2-1,Current_Dim3-1)
+    *b(Current_Dim0-1,Current_Dim2-1,Current_Dim1-1,Current_Dim3-1)
+    + T4ddg_times_T4ddg_0213(a,b,Number<Current_Dim0-1>(),
+			     Number<Current_Dim1>(),Number<Current_Dim2>(),
+			     Number<Current_Dim3>());
+}
+
+template<class A, class B, class T, class U, int Dim, char i, char j,
+  char k, char l, int Current_Dim1, int Current_Dim2, int Current_Dim3>
+inline const typename promote<T,U>::V
+T4ddg_times_T4ddg_0213(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+	      const Tensor4_ddg_Expr<B,U,Dim,Dim,i,k,j,l> &b,
+	      const Number<1> &N0,
+	      const Number<Current_Dim1> &N1,
+	      const Number<Current_Dim2> &N2,
+	      const Number<Current_Dim3> &N3)
+{
+  return a(0,Current_Dim1-1,Current_Dim2-1,Current_Dim3-1)
+    *b(0,Current_Dim2-1,Current_Dim1-1,Current_Dim3-1)
+    + T4ddg_times_T4ddg_0213(a,b,Number<Dim>(),
+			     Number<Current_Dim1-1>(),Number<Current_Dim2>(),
+			     Number<Current_Dim3>());
+}
+
+template<class A, class B, class T, class U, int Dim, char i, char j,
+  char k, char l, int Current_Dim2, int Current_Dim3>
+inline const typename promote<T,U>::V
+T4ddg_times_T4ddg_0213(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+		       const Tensor4_ddg_Expr<B,U,Dim,Dim,i,k,j,l> &b,
+		       const Number<1> &N0,
+		       const Number<1> &N1,
+		       const Number<Current_Dim2> &N2,
+		       const Number<Current_Dim3> &N3)
+{
+  return a(0,0,Current_Dim2-1,Current_Dim3-1)
+    *b(0,Current_Dim2-1,0,Current_Dim3-1)
+    + T4ddg_times_T4ddg_0213(a,b,Number<Dim>(),
+			     Number<Dim>(),Number<Current_Dim2-1>(),
+			     Number<Current_Dim3>());
+}
+
+template<class A, class B, class T, class U, int Dim, char i, char j,
+  char k, char l, int Current_Dim3>
+inline const typename promote<T,U>::V
+T4ddg_times_T4ddg_0213(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+		       const Tensor4_ddg_Expr<B,U,Dim,Dim,i,k,j,l> &b,
+		       const Number<1> &N0,
+		       const Number<1> &N1,
+		       const Number<1> &N2,
+		       const Number<Current_Dim3> &N3)
+{
+  return a(0,0,0,Current_Dim3-1)
+    *b(0,0,0,Current_Dim3-1)
+    + T4ddg_times_T4ddg_0213(a,b,Number<Dim>(),
+			     Number<Dim>(),Number<Dim>(),
+			     Number<Current_Dim3-1>());
+}
+
+template<class A, class B, class T, class U, int Dim, char i, char j,
+  char k, char l>
+inline const typename promote<T,U>::V
+T4ddg_times_T4ddg_0213(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+		       const Tensor4_ddg_Expr<B,U,Dim,Dim,i,k,j,l> &b,
+		       const Number<1> &N0,
+		       const Number<1> &N1,
+		       const Number<1> &N2,
+		       const Number<1> &N3)
+{
+  return a(0,0,0,0)*b(0,0,0,0);
+}
+
+template<class A, class B, class T, class U, int Dim,
+  char i, char j, char k, char l>
+inline const typename promote<T,U>::V
+operator*(const Tensor4_ddg_Expr<A,T,Dim,Dim,i,j,k,l> &a,
+	  const Tensor4_ddg_Expr<B,U,Dim,Dim,i,k,j,l> &b)
+{
+  return T4ddg_times_T4ddg_0213(a,b,Number<Dim>(),Number<Dim>(),Number<Dim>(),
+				Number<Dim>());
+}
+
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_times_generic.h
--- a/Tensor4_ddg/Tensor4_ddg_times_generic.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/* Multiplies a Tensor4_ddg with a generic, yielding a
-   Tensor4_ddg. */
-
-template<class A, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-class Tensor4_ddg_times_generic
-{
-  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
-  const U d;
-public:
-  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
-			     const int N4) const
-  {
-    return iterA(N1,N2,N3,N4)*d;
-  }
-
-  Tensor4_ddg_times_generic(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
-				  const U &d0): iterA(a), d(d0) {}
-};
-
-template<class A, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor4_ddg_Expr
-<const Tensor4_ddg_times_generic<A,T,U,Dim01,Dim23,i,j,k,l>,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-operator*(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a, const U &d0)
-{
-  typedef const Tensor4_ddg_times_generic<A,T,U,Dim01,Dim23,i,j,k,l>
-    TensorExpr;
-  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-    (TensorExpr(a,d0));
-}
-
-template<class A, class T, class U, int Dim01, int Dim23,
-  char i, char j, char k, char l>
-inline const Tensor4_ddg_Expr
-<const Tensor4_ddg_times_generic<A,T,U,Dim01,Dim23,i,j,k,l>,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-operator*(const U &d0, const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
-{
-  typedef const Tensor4_ddg_times_generic<A,T,U,Dim01,Dim23,i,j,k,l>
-    TensorExpr;
-  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
-    (TensorExpr(a,d0));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_times_generic.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_times_generic.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,43 @@
+/* Multiplies a Tensor4_ddg with a generic, yielding a
+   Tensor4_ddg. */
+
+template<class A, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+class Tensor4_ddg_times_generic
+{
+  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
+  const U d;
+public:
+  typename promote<T,U>::V operator()(const int N1, const int N2, const int N3,
+			     const int N4) const
+  {
+    return iterA(N1,N2,N3,N4)*d;
+  }
+
+  Tensor4_ddg_times_generic(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a,
+				  const U &d0): iterA(a), d(d0) {}
+};
+
+template<class A, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor4_ddg_Expr
+<const Tensor4_ddg_times_generic<A,T,U,Dim01,Dim23,i,j,k,l>,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+operator*(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a, const U &d0)
+{
+  typedef const Tensor4_ddg_times_generic<A,T,U,Dim01,Dim23,i,j,k,l>
+    TensorExpr;
+  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+    (TensorExpr(a,d0));
+}
+
+template<class A, class T, class U, int Dim01, int Dim23,
+  char i, char j, char k, char l>
+inline const Tensor4_ddg_Expr
+<const Tensor4_ddg_times_generic<A,T,U,Dim01,Dim23,i,j,k,l>,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+operator*(const U &d0, const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
+{
+  typedef const Tensor4_ddg_times_generic<A,T,U,Dim01,Dim23,i,j,k,l>
+    TensorExpr;
+  return Tensor4_ddg_Expr<TensorExpr,typename promote<T,U>::V,Dim01,Dim23,i,j,k,l>
+    (TensorExpr(a,d0));
+}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_value.h
--- a/Tensor4_ddg/Tensor4_ddg_value.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,221 +0,0 @@
-/* A general version, not for pointers. */
-
-template <class T, int Tensor_Dim01, int Tensor_Dim23>
-class Tensor4_ddg
-{
-  T data[(Tensor_Dim01*(Tensor_Dim01+1))/2][(Tensor_Dim23*(Tensor_Dim23+1))/2];
-public:
-  /* There are two operator(int,int,int,int)'s, one for non-consts
-     that lets you change the value, and one for consts that
-     doesn't. */
-
-  T & operator()(const int N1, const int N2, const int N3, const int N4)
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim01 || N1<0 || N2>=Tensor_Dim01 || N2<0
-       || N3>=Tensor_Dim23 || N3<0 || N4>=Tensor_Dim23 || N4<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor3_dg<T,"
-          << Tensor_Dim01 << "," << Tensor_Dim23
-          << ">.operator("
-          << N1 << "," << N2 << "," << N3 << "," << N4 << ")"
-          << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N1>N2 ? (N3>N4 ? data[N1+(N2*(2*Tensor_Dim01-N2-1))/2]
-		    [N3+(N4*(2*Tensor_Dim23-N4-1))/2]
-		    : data[N1+(N2*(2*Tensor_Dim01-N2-1))/2]
-		    [N4+(N3*(2*Tensor_Dim23-N3-1))/2])
-      : (N3>N4 ? data[N2+(N1*(2*Tensor_Dim01-N1-1))/2]
-	 [N3+(N4*(2*Tensor_Dim23-N4-1))/2]
-	 : data[N2+(N1*(2*Tensor_Dim01-N1-1))/2]
-	 [N4+(N3*(2*Tensor_Dim23-N3-1))/2]);
-  }
-
-  T operator()(const int N1, const int N2, const int N3, const int N4)
-    const
-  {
-#ifdef FTENSOR_DEBUG
-    if(N1>=Tensor_Dim01 || N1<0 || N2>=Tensor_Dim01 || N2<0
-       || N3>=Tensor_Dim23 || N3<0 || N4>=Tensor_Dim23 || N4<0)
-      {
-        std::stringstream s;
-        s << "Bad index in Tensor3_dg<T,"
-          << Tensor_Dim01 << "," << Tensor_Dim23
-          << ">.operator("
-          << N1 << "," << N2 << "," << N3 << "," << N4
-          << ") const"
-          << std::endl;
-        throw std::runtime_error(s.str());
-      }
-#endif
-    return N1>N2 ? (N3>N4 ? data[N1+(N2*(2*Tensor_Dim01-N2-1))/2]
-		    [N3+(N4*(2*Tensor_Dim23-N4-1))/2]
-		    : data[N1+(N2*(2*Tensor_Dim01-N2-1))/2]
-		    [N4+(N3*(2*Tensor_Dim23-N3-1))/2])
-      : (N3>N4 ? data[N2+(N1*(2*Tensor_Dim01-N1-1))/2]
-	 [N3+(N4*(2*Tensor_Dim23-N4-1))/2]
-	 : data[N2+(N1*(2*Tensor_Dim01-N1-1))/2]
-	 [N4+(N3*(2*Tensor_Dim23-N3-1))/2]);
-  }
-
-  /* These operator()'s are the first part in constructing template
-     expressions.  They can be used to slice off lower dimensional
-     parts. They are not entirely safe, since you can accidently use a
-     higher dimension than what is really allowed (like Dim=5). */
-
-  template<char i, char j, char k, char l, int Dim01, int Dim23>
-  Tensor4_ddg_Expr<Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,
-    T,Dim01,Dim23,i,j,k,l> operator()
-    (const Index<i,Dim01> index1, const Index<j,Dim01> index2,
-     const Index<k,Dim23> index3, const Index<l,Dim23> index4)
-  {
-    return Tensor4_ddg_Expr<Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,
-      T,Dim01,Dim23,i,j,k,l> (*this);
-  }
-
-
-  template<char i, char j, char k, char l, int Dim01, int Dim23>
-  const Tensor4_ddg_Expr<const Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,
-    T,Dim01,Dim23,i,j,k,l> operator()
-    (const Index<i,Dim01> index1, const Index<j,Dim01> index2,
-     const Index<k,Dim23> index3, const Index<l,Dim23> index4) const
-  {
-    return Tensor4_ddg_Expr<const Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,
-      T,Dim01,Dim23,i,j,k,l> (*this);
-  }
-
-  /* This is for expressions where a number is used for two slots, and
-     an index for the other two, yielding a Tensor2_symmetric_Expr. */
-
-  template<char i, char j, int N0, int N1, int Dim>
-  const Tensor2_symmetric_Expr<const Tensor4_ddg_number_01
-  <const Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,T,N0,N1>,T,Dim,i,j>
-  operator()(const Number<N0> n1, const Number<N1> n2,
-	     const Index<i,Dim> index1, const Index<j,Dim> index2) const
-  {
-    typedef const Tensor4_ddg_number_01<const Tensor4_ddg
-      <T,Tensor_Dim01,Tensor_Dim23>,T,N0,N1> TensorExpr;
-    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(TensorExpr(*this));
-  }
-
-  template<char i, char j, int N0, int N1, int Dim>
-  Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01
-  <Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,T,N0,N1>,T,Dim,i,j>
-  operator()(const Number<N0> n1, const Number<N1> n2,
-	     const Index<i,Dim> index1, const Index<j,Dim> index2)
-  {
-    typedef Tensor4_ddg_number_rhs_01<Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,
-      T,N0,N1> TensorExpr;
-    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(*this);
-  }
-
-  /* This is for expressions where a number is used for one slot, and
-     an index for the other three, yielding a Tensor3_dg_Expr. */
-
-  template<char i, char j, char k, int N0, int Dim1, int Dim23>
-  const Tensor3_dg_Expr<const Tensor4_ddg_number_0
-  <const Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,T,N0>,T,Dim23,Dim1,i,j,k>
-  operator()(const Number<N0> n1, const Index<k,Dim1> index3,
-	     const Index<i,Dim23> index1, const Index<j,Dim23> index2) const
-  {
-    typedef const Tensor4_ddg_number_0<const Tensor4_ddg
-      <T,Tensor_Dim01,Tensor_Dim23>,T,N0> TensorExpr;
-    return Tensor3_dg_Expr<TensorExpr,T,Dim23,Dim1,i,j,k>(TensorExpr(*this));
-  }
-
-  template<char i, char j, char k, int N0, int Dim1, int Dim23>
-  Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0
-  <Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,T,N0>,T,Dim23,Dim1,i,j,k>
-  operator()(const Number<N0> n1, const Index<k,Dim1> index3,
-	     const Index<i,Dim23> index1, const Index<j,Dim23> index2)
-  {
-    typedef Tensor4_ddg_number_rhs_0<Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,
-      T,N0> TensorExpr;
-    return Tensor3_dg_Expr<TensorExpr,T,Dim23,Dim1,i,j,k>(*this);
-  }
-
-  /* This is for expressions where an int (not a Number) is used for
-     two slots, and an index for the other two, yielding a
-     Tensor2_symmetric_Expr. */
-
-  template<char i, char j, int Dim>
-  const Tensor2_symmetric_Expr<const Tensor4_ddg_numeral_01
-  <const Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim,i,j>
-  operator()(const int N0, const int N1,
-	     const Index<i,Dim> index1, const Index<j,Dim> index2) const
-  {
-    typedef const Tensor4_ddg_numeral_01<const Tensor4_ddg
-      <T,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
-    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>
-      (TensorExpr(*this,N0,N1));
-  }
-
-  template<char i, char j, int Dim>
-  const Tensor2_symmetric_Expr<const Tensor4_ddg_numeral_23
-  <const Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim,i,j>
-  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
-	     const int N2, const int N3) const
-  {
-    typedef const Tensor4_ddg_numeral_23<const Tensor4_ddg
-      <T,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
-    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>
-      (TensorExpr(*this,N2,N3));
-  }
-
-  /* int in two slots but yielding a Tensor2 */
-
-  template<char i, char j, int Dim1, int Dim3>
-  const Tensor2_Expr<const Tensor4_ddg_numeral_02
-  <const Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim1,Dim3,i,j>
-  operator()(const int N0, const Index<i,Dim1> index1,
-	     const int N2, const Index<j,Dim3> index3) const
-  {
-    typedef const Tensor4_ddg_numeral_02<const Tensor4_ddg
-      <T,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
-    return Tensor2_Expr<TensorExpr,T,Dim1,Dim3,i,j>
-      (TensorExpr(*this,N0,N2));
-  }
-
-  /* int in three slots, Index in the other yielding a Tensor1_Expr. */
-
-  template<char i, int Dim>
-  const Tensor1_Expr<const Tensor4_ddg_numeral_123<const Tensor4_ddg
-  <T,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim,i>
-  operator()(const Index<i,Dim> index1, const int N1, const int N2,
-	     const int N3)
-  {
-    typedef const Tensor4_ddg_numeral_123<const Tensor4_ddg
-      <T,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2,N3));
-  }
-
-  template<char i, int Dim>
-  const Tensor1_Expr<const Tensor4_ddg_numeral_123<const Tensor4_ddg
-  <T,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim,i>
-  operator()(const int N1, const Index<i,Dim> index1, const int N2,
-	     const int N3)
-  {
-    typedef const Tensor4_ddg_numeral_123<const Tensor4_ddg
-      <T,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
-    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2,N3));
-  }
-
-  /* This is for expressions where an int (not a Number) is used for
-     one slot, and an index for the other three, yielding a
-     Tensor3_dg_Expr. */
-
-  template<char i, char j, char k, int Dim1, int Dim23>
-  const Tensor3_dg_Expr<const Tensor4_ddg_numeral_0
-  <const Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim23,Dim1,i,j,k>
-  operator()(const int N0, const Index<k,Dim1> index3,
-	     const Index<i,Dim23> index1, const Index<j,Dim23> index2) const
-  {
-    typedef const Tensor4_ddg_numeral_0<const Tensor4_ddg
-      <T,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
-    return Tensor3_dg_Expr<TensorExpr,T,Dim23,Dim1,i,j,k>
-      (TensorExpr(*this,N0));
-  }
-};
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/Tensor4_ddg_value.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/Tensor4_ddg_value.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,221 @@
+/* A general version, not for pointers. */
+
+template <class T, int Tensor_Dim01, int Tensor_Dim23>
+class Tensor4_ddg
+{
+  T data[(Tensor_Dim01*(Tensor_Dim01+1))/2][(Tensor_Dim23*(Tensor_Dim23+1))/2];
+public:
+  /* There are two operator(int,int,int,int)'s, one for non-consts
+     that lets you change the value, and one for consts that
+     doesn't. */
+
+  T & operator()(const int N1, const int N2, const int N3, const int N4)
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim01 || N1<0 || N2>=Tensor_Dim01 || N2<0
+       || N3>=Tensor_Dim23 || N3<0 || N4>=Tensor_Dim23 || N4<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor3_dg<T,"
+          << Tensor_Dim01 << "," << Tensor_Dim23
+          << ">.operator("
+          << N1 << "," << N2 << "," << N3 << "," << N4 << ")"
+          << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N1>N2 ? (N3>N4 ? data[N1+(N2*(2*Tensor_Dim01-N2-1))/2]
+		    [N3+(N4*(2*Tensor_Dim23-N4-1))/2]
+		    : data[N1+(N2*(2*Tensor_Dim01-N2-1))/2]
+		    [N4+(N3*(2*Tensor_Dim23-N3-1))/2])
+      : (N3>N4 ? data[N2+(N1*(2*Tensor_Dim01-N1-1))/2]
+	 [N3+(N4*(2*Tensor_Dim23-N4-1))/2]
+	 : data[N2+(N1*(2*Tensor_Dim01-N1-1))/2]
+	 [N4+(N3*(2*Tensor_Dim23-N3-1))/2]);
+  }
+
+  T operator()(const int N1, const int N2, const int N3, const int N4)
+    const
+  {
+#ifdef FTENSOR_DEBUG
+    if(N1>=Tensor_Dim01 || N1<0 || N2>=Tensor_Dim01 || N2<0
+       || N3>=Tensor_Dim23 || N3<0 || N4>=Tensor_Dim23 || N4<0)
+      {
+        std::stringstream s;
+        s << "Bad index in Tensor3_dg<T,"
+          << Tensor_Dim01 << "," << Tensor_Dim23
+          << ">.operator("
+          << N1 << "," << N2 << "," << N3 << "," << N4
+          << ") const"
+          << std::endl;
+        throw std::runtime_error(s.str());
+      }
+#endif
+    return N1>N2 ? (N3>N4 ? data[N1+(N2*(2*Tensor_Dim01-N2-1))/2]
+		    [N3+(N4*(2*Tensor_Dim23-N4-1))/2]
+		    : data[N1+(N2*(2*Tensor_Dim01-N2-1))/2]
+		    [N4+(N3*(2*Tensor_Dim23-N3-1))/2])
+      : (N3>N4 ? data[N2+(N1*(2*Tensor_Dim01-N1-1))/2]
+	 [N3+(N4*(2*Tensor_Dim23-N4-1))/2]
+	 : data[N2+(N1*(2*Tensor_Dim01-N1-1))/2]
+	 [N4+(N3*(2*Tensor_Dim23-N3-1))/2]);
+  }
+
+  /* These operator()'s are the first part in constructing template
+     expressions.  They can be used to slice off lower dimensional
+     parts. They are not entirely safe, since you can accidently use a
+     higher dimension than what is really allowed (like Dim=5). */
+
+  template<char i, char j, char k, char l, int Dim01, int Dim23>
+  Tensor4_ddg_Expr<Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,
+    T,Dim01,Dim23,i,j,k,l> operator()
+    (const Index<i,Dim01> index1, const Index<j,Dim01> index2,
+     const Index<k,Dim23> index3, const Index<l,Dim23> index4)
+  {
+    return Tensor4_ddg_Expr<Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,
+      T,Dim01,Dim23,i,j,k,l> (*this);
+  }
+
+
+  template<char i, char j, char k, char l, int Dim01, int Dim23>
+  const Tensor4_ddg_Expr<const Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,
+    T,Dim01,Dim23,i,j,k,l> operator()
+    (const Index<i,Dim01> index1, const Index<j,Dim01> index2,
+     const Index<k,Dim23> index3, const Index<l,Dim23> index4) const
+  {
+    return Tensor4_ddg_Expr<const Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,
+      T,Dim01,Dim23,i,j,k,l> (*this);
+  }
+
+  /* This is for expressions where a number is used for two slots, and
+     an index for the other two, yielding a Tensor2_symmetric_Expr. */
+
+  template<char i, char j, int N0, int N1, int Dim>
+  const Tensor2_symmetric_Expr<const Tensor4_ddg_number_01
+  <const Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,T,N0,N1>,T,Dim,i,j>
+  operator()(const Number<N0> n1, const Number<N1> n2,
+	     const Index<i,Dim> index1, const Index<j,Dim> index2) const
+  {
+    typedef const Tensor4_ddg_number_01<const Tensor4_ddg
+      <T,Tensor_Dim01,Tensor_Dim23>,T,N0,N1> TensorExpr;
+    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(TensorExpr(*this));
+  }
+
+  template<char i, char j, int N0, int N1, int Dim>
+  Tensor2_symmetric_Expr<Tensor4_ddg_number_rhs_01
+  <Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,T,N0,N1>,T,Dim,i,j>
+  operator()(const Number<N0> n1, const Number<N1> n2,
+	     const Index<i,Dim> index1, const Index<j,Dim> index2)
+  {
+    typedef Tensor4_ddg_number_rhs_01<Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,
+      T,N0,N1> TensorExpr;
+    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>(*this);
+  }
+
+  /* This is for expressions where a number is used for one slot, and
+     an index for the other three, yielding a Tensor3_dg_Expr. */
+
+  template<char i, char j, char k, int N0, int Dim1, int Dim23>
+  const Tensor3_dg_Expr<const Tensor4_ddg_number_0
+  <const Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,T,N0>,T,Dim23,Dim1,i,j,k>
+  operator()(const Number<N0> n1, const Index<k,Dim1> index3,
+	     const Index<i,Dim23> index1, const Index<j,Dim23> index2) const
+  {
+    typedef const Tensor4_ddg_number_0<const Tensor4_ddg
+      <T,Tensor_Dim01,Tensor_Dim23>,T,N0> TensorExpr;
+    return Tensor3_dg_Expr<TensorExpr,T,Dim23,Dim1,i,j,k>(TensorExpr(*this));
+  }
+
+  template<char i, char j, char k, int N0, int Dim1, int Dim23>
+  Tensor3_dg_Expr<Tensor4_ddg_number_rhs_0
+  <Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,T,N0>,T,Dim23,Dim1,i,j,k>
+  operator()(const Number<N0> n1, const Index<k,Dim1> index3,
+	     const Index<i,Dim23> index1, const Index<j,Dim23> index2)
+  {
+    typedef Tensor4_ddg_number_rhs_0<Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,
+      T,N0> TensorExpr;
+    return Tensor3_dg_Expr<TensorExpr,T,Dim23,Dim1,i,j,k>(*this);
+  }
+
+  /* This is for expressions where an int (not a Number) is used for
+     two slots, and an index for the other two, yielding a
+     Tensor2_symmetric_Expr. */
+
+  template<char i, char j, int Dim>
+  const Tensor2_symmetric_Expr<const Tensor4_ddg_numeral_01
+  <const Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim,i,j>
+  operator()(const int N0, const int N1,
+	     const Index<i,Dim> index1, const Index<j,Dim> index2) const
+  {
+    typedef const Tensor4_ddg_numeral_01<const Tensor4_ddg
+      <T,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
+    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>
+      (TensorExpr(*this,N0,N1));
+  }
+
+  template<char i, char j, int Dim>
+  const Tensor2_symmetric_Expr<const Tensor4_ddg_numeral_23
+  <const Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim,i,j>
+  operator()(const Index<i,Dim> index1, const Index<j,Dim> index2,
+	     const int N2, const int N3) const
+  {
+    typedef const Tensor4_ddg_numeral_23<const Tensor4_ddg
+      <T,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
+    return Tensor2_symmetric_Expr<TensorExpr,T,Dim,i,j>
+      (TensorExpr(*this,N2,N3));
+  }
+
+  /* int in two slots but yielding a Tensor2 */
+
+  template<char i, char j, int Dim1, int Dim3>
+  const Tensor2_Expr<const Tensor4_ddg_numeral_02
+  <const Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim1,Dim3,i,j>
+  operator()(const int N0, const Index<i,Dim1> index1,
+	     const int N2, const Index<j,Dim3> index3) const
+  {
+    typedef const Tensor4_ddg_numeral_02<const Tensor4_ddg
+      <T,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
+    return Tensor2_Expr<TensorExpr,T,Dim1,Dim3,i,j>
+      (TensorExpr(*this,N0,N2));
+  }
+
+  /* int in three slots, Index in the other yielding a Tensor1_Expr. */
+
+  template<char i, int Dim>
+  const Tensor1_Expr<const Tensor4_ddg_numeral_123<const Tensor4_ddg
+  <T,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim,i>
+  operator()(const Index<i,Dim> index1, const int N1, const int N2,
+	     const int N3)
+  {
+    typedef const Tensor4_ddg_numeral_123<const Tensor4_ddg
+      <T,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2,N3));
+  }
+
+  template<char i, int Dim>
+  const Tensor1_Expr<const Tensor4_ddg_numeral_123<const Tensor4_ddg
+  <T,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim,i>
+  operator()(const int N1, const Index<i,Dim> index1, const int N2,
+	     const int N3)
+  {
+    typedef const Tensor4_ddg_numeral_123<const Tensor4_ddg
+      <T,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
+    return Tensor1_Expr<TensorExpr,T,Dim,i>(TensorExpr(*this,N1,N2,N3));
+  }
+
+  /* This is for expressions where an int (not a Number) is used for
+     one slot, and an index for the other three, yielding a
+     Tensor3_dg_Expr. */
+
+  template<char i, char j, char k, int Dim1, int Dim23>
+  const Tensor3_dg_Expr<const Tensor4_ddg_numeral_0
+  <const Tensor4_ddg<T,Tensor_Dim01,Tensor_Dim23>,T>,T,Dim23,Dim1,i,j,k>
+  operator()(const int N0, const Index<k,Dim1> index3,
+	     const Index<i,Dim23> index1, const Index<j,Dim23> index2) const
+  {
+    typedef const Tensor4_ddg_numeral_0<const Tensor4_ddg
+      <T,Tensor_Dim01,Tensor_Dim23>,T> TensorExpr;
+    return Tensor3_dg_Expr<TensorExpr,T,Dim23,Dim1,i,j,k>
+      (TensorExpr(*this,N0));
+  }
+};
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/minus_Tensor4_ddg.h
--- a/Tensor4_ddg/minus_Tensor4_ddg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-/* Unary minus operator. */
-
-template<class A, class T, int Dim01, int Dim23, char i, char j, char k, char l>
-class minus_Tensor4_ddg
-{
-public:
-  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
-public:
-  T operator()(const int N1, const int N2, const int N3, const int N4) const
-  {
-    return -iterA(N1,N2,N3,N4);
-  }
-  minus_Tensor4_ddg(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a):
-    iterA(a) {}
-};
-
-template<class A, class T, int Dim01, int Dim23, char i, char j, char k, char l>
-inline const Tensor4_ddg_Expr<const minus_Tensor4_ddg<A,T,Dim01,Dim23,i,j,k,l>,
-  T,Dim01,Dim23,i,j,k,l>
-operator-(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
-{
-  typedef const minus_Tensor4_ddg<A,T,Dim01,Dim23,i,j,k,l> TensorExpr;
-  return Tensor4_ddg_Expr<TensorExpr,T,Dim01,Dim23,i,j,k,l>(TensorExpr(a));
-}
diff -r dd991b426d75 -r 1042a48dad5a Tensor4_ddg/minus_Tensor4_ddg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tensor4_ddg/minus_Tensor4_ddg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,24 @@
+/* Unary minus operator. */
+
+template<class A, class T, int Dim01, int Dim23, char i, char j, char k, char l>
+class minus_Tensor4_ddg
+{
+public:
+  const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> iterA;
+public:
+  T operator()(const int N1, const int N2, const int N3, const int N4) const
+  {
+    return -iterA(N1,N2,N3,N4);
+  }
+  minus_Tensor4_ddg(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a):
+    iterA(a) {}
+};
+
+template<class A, class T, int Dim01, int Dim23, char i, char j, char k, char l>
+inline const Tensor4_ddg_Expr<const minus_Tensor4_ddg<A,T,Dim01,Dim23,i,j,k,l>,
+  T,Dim01,Dim23,i,j,k,l>
+operator-(const Tensor4_ddg_Expr<A,T,Dim01,Dim23,i,j,k,l> &a)
+{
+  typedef const minus_Tensor4_ddg<A,T,Dim01,Dim23,i,j,k,l> TensorExpr;
+  return Tensor4_ddg_Expr<TensorExpr,T,Dim01,Dim23,i,j,k,l>(TensorExpr(a));
+}
diff -r dd991b426d75 -r 1042a48dad5a derivative_delta.h
--- a/derivative_delta.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-template <int Dim>
-class derivative_delta
-{
-public:
-  Tensor1<int,Dim> d_ijk_plus, d_ijk_minus;
-  Tensor1<double,Dim> d_xyz;
-  
-  derivative_delta(double dx, double dy, double dz, int di, int dj, int dk)
-    : d_ijk_plus(di,dj,dk), d_ijk_minus(di,dj,dk), d_xyz(dx,dy,dz) {}
-
-  derivative_delta(double dx, double dy, double dz,
-		   int di_plus, int dj_plus, int dk_plus,
-		   int di_minus, int dj_minus, int dk_minus)
-    : d_ijk_plus(di_plus,dj_plus,dk_plus),
-      d_ijk_minus(di_minus,dj_minus,dk_minus), d_xyz(dx,dy,dz) {}
-};
diff -r dd991b426d75 -r 1042a48dad5a derivative_delta.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/derivative_delta.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,16 @@
+template <int Dim>
+class derivative_delta
+{
+public:
+  Tensor1<int,Dim> d_ijk_plus, d_ijk_minus;
+  Tensor1<double,Dim> d_xyz;
+  
+  derivative_delta(double dx, double dy, double dz, int di, int dj, int dk)
+    : d_ijk_plus(di,dj,dk), d_ijk_minus(di,dj,dk), d_xyz(dx,dy,dz) {}
+
+  derivative_delta(double dx, double dy, double dz,
+		   int di_plus, int dj_plus, int dk_plus,
+		   int di_minus, int dj_minus, int dk_minus)
+    : d_ijk_plus(di_plus,dj_plus,dk_plus),
+      d_ijk_minus(di_minus,dj_minus,dk_minus), d_xyz(dx,dy,dz) {}
+};
diff -r dd991b426d75 -r 1042a48dad5a promote.h
--- a/promote.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/* Traits that allow auto-promotion of int's to double's, double's to
-   complex, etc.  Shamelessly stolen from
-   
-   http://extreme.indiana.edu/~tveldhui/papers/techniques/
-   
-   For now, only int, double, and complex<double> are covered.  If you
-   want more, just insert a DECLARE_PROMOTE(A,B,C), where A and B are
-   the two types, and C is what they should be coerced to.  */
-
-template<class T1, class T2>
-class promote {
-public:
-  typedef T1 V;
-};
-
-#define DECLARE_PROMOTE(A,B,C) \
-template<> class promote<A,B > { public: typedef C V; }
-
-DECLARE_PROMOTE(int,double,double);
-DECLARE_PROMOTE(double,int,double);
-DECLARE_PROMOTE(int,std::complex<double>,std::complex<double>);
-DECLARE_PROMOTE(std::complex<double>,int,std::complex<double>);
-DECLARE_PROMOTE(double,std::complex<double>,std::complex<double>);
-DECLARE_PROMOTE(std::complex<double>,double,std::complex<double>);
-
-#undef DECLARE_PROMOTE
diff -r dd991b426d75 -r 1042a48dad5a promote.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/promote.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,26 @@
+/* Traits that allow auto-promotion of int's to double's, double's to
+   complex, etc.  Shamelessly stolen from
+   
+   http://extreme.indiana.edu/~tveldhui/papers/techniques/
+   
+   For now, only int, double, and complex<double> are covered.  If you
+   want more, just insert a DECLARE_PROMOTE(A,B,C), where A and B are
+   the two types, and C is what they should be coerced to.  */
+
+template<class T1, class T2>
+class promote {
+public:
+  typedef T1 V;
+};
+
+#define DECLARE_PROMOTE(A,B,C) \
+template<> class promote<A,B > { public: typedef C V; }
+
+DECLARE_PROMOTE(int,double,double);
+DECLARE_PROMOTE(double,int,double);
+DECLARE_PROMOTE(int,std::complex<double>,std::complex<double>);
+DECLARE_PROMOTE(std::complex<double>,int,std::complex<double>);
+DECLARE_PROMOTE(double,std::complex<double>,std::complex<double>);
+DECLARE_PROMOTE(std::complex<double>,double,std::complex<double>);
+
+#undef DECLARE_PROMOTE
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2.C
--- a/tests/conformance/T2/test_T2.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,415 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-extern
-void test_T2I(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2II(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2III(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2IV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2V(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2VI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2VII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2VIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2IX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2X(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XXX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XXXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XXXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XXXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XXXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XXXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XXXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XXXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XXXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2XXXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2IXL(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
-
-void test_T2(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  test_T2I(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2II(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2III(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2IV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2V(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2VI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2VII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2VIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2IX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2X(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XXI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XXII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XXIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XXIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XXV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XXVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XXVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XXVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XXIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XXX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XXXI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XXXII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XXXIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XXXIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XXXV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XXXVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XXXVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2XXXVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-//   test_T2XXXIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-//   test_T2XL(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,415 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+extern
+void test_T2I(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2II(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2III(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2IV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2V(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2VI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2VII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2VIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2IX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2X(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XXX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XXXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XXXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XXXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XXXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XXXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XXXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XXXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XXXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2XXXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2IXL(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
+
+void test_T2(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  test_T2I(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2II(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2III(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2IV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2V(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2VI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2VII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2VIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2IX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2X(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XXI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XXII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XXIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XXIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XXV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XXVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XXVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XXVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XXIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XXX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XXXI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XXXII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XXXIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XXXIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XXXV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XXXVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XXXVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2XXXVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+//   test_T2XXXIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+//   test_T2XL(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2I.C
--- a/tests/conformance/T2/test_T2I.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2I(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  t2_1(i,j)=t1_1(i)*t1_2(j);
-  test_for_zero(t2_1(0,0)-t1_1(0)*t1_2(0),"T2(i,j)=T1(i)*T1(j)(0,0)");
-  test_for_zero(t2_1(0,1)-t1_1(0)*t1_2(1),"T2(i,j)=T1(i)*T1(j)(0,1)");
-  test_for_zero(t2_1(0,2)-t1_1(0)*t1_2(2),"T2(i,j)=T1(i)*T1(j)(0,2)");
-  test_for_zero(t2_1(1,0)-t1_1(1)*t1_2(0),"T2(i,j)=T1(i)*T1(j)(1,0)");
-  test_for_zero(t2_1(1,1)-t1_1(1)*t1_2(1),"T2(i,j)=T1(i)*T1(j)(1,1)");
-  test_for_zero(t2_1(1,2)-t1_1(1)*t1_2(2),"T2(i,j)=T1(i)*T1(j)(1,2)");
-  test_for_zero(t2_1(2,0)-t1_1(2)*t1_2(0),"T2(i,j)=T1(i)*T1(j)(2,0)");
-  test_for_zero(t2_1(2,1)-t1_1(2)*t1_2(1),"T2(i,j)=T1(i)*T1(j)(2,1)");
-  test_for_zero(t2_1(2,2)-t1_1(2)*t1_2(2),"T2(i,j)=T1(i)*T1(j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2I.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2I.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,38 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2I(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  t2_1(i,j)=t1_1(i)*t1_2(j);
+  test_for_zero(t2_1(0,0)-t1_1(0)*t1_2(0),"T2(i,j)=T1(i)*T1(j)(0,0)");
+  test_for_zero(t2_1(0,1)-t1_1(0)*t1_2(1),"T2(i,j)=T1(i)*T1(j)(0,1)");
+  test_for_zero(t2_1(0,2)-t1_1(0)*t1_2(2),"T2(i,j)=T1(i)*T1(j)(0,2)");
+  test_for_zero(t2_1(1,0)-t1_1(1)*t1_2(0),"T2(i,j)=T1(i)*T1(j)(1,0)");
+  test_for_zero(t2_1(1,1)-t1_1(1)*t1_2(1),"T2(i,j)=T1(i)*T1(j)(1,1)");
+  test_for_zero(t2_1(1,2)-t1_1(1)*t1_2(2),"T2(i,j)=T1(i)*T1(j)(1,2)");
+  test_for_zero(t2_1(2,0)-t1_1(2)*t1_2(0),"T2(i,j)=T1(i)*T1(j)(2,0)");
+  test_for_zero(t2_1(2,1)-t1_1(2)*t1_2(1),"T2(i,j)=T1(i)*T1(j)(2,1)");
+  test_for_zero(t2_1(2,2)-t1_1(2)*t1_2(2),"T2(i,j)=T1(i)*T1(j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2II.C
--- a/tests/conformance/T2/test_T2II.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2II(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  t2_1(N0,i)=t1_1(i);
-  t2_1(N1,i)=t1_1(i);
-  t2_1(N2,i)=t1_1(i);
-  test_for_zero(t2_1(0,0)-t1_1(0),"T2(N,i)=T1(i)(0,0)");
-  test_for_zero(t2_1(0,1)-t1_1(1),"T2(N,i)=T1(i)(0,1)");
-  test_for_zero(t2_1(0,2)-t1_1(2),"T2(N,i)=T1(i)(0,2)");
-  test_for_zero(t2_1(1,0)-t1_1(0),"T2(N,i)=T1(i)(1,0)");
-  test_for_zero(t2_1(1,1)-t1_1(1),"T2(N,i)=T1(i)(1,1)");
-  test_for_zero(t2_1(1,2)-t1_1(2),"T2(N,i)=T1(i)(1,2)");
-  test_for_zero(t2_1(2,0)-t1_1(0),"T2(N,i)=T1(i)(2,0)");
-  test_for_zero(t2_1(2,1)-t1_1(1),"T2(N,i)=T1(i)(2,1)");
-  test_for_zero(t2_1(2,2)-t1_1(2),"T2(N,i)=T1(i)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2II.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2II.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2II(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  t2_1(N0,i)=t1_1(i);
+  t2_1(N1,i)=t1_1(i);
+  t2_1(N2,i)=t1_1(i);
+  test_for_zero(t2_1(0,0)-t1_1(0),"T2(N,i)=T1(i)(0,0)");
+  test_for_zero(t2_1(0,1)-t1_1(1),"T2(N,i)=T1(i)(0,1)");
+  test_for_zero(t2_1(0,2)-t1_1(2),"T2(N,i)=T1(i)(0,2)");
+  test_for_zero(t2_1(1,0)-t1_1(0),"T2(N,i)=T1(i)(1,0)");
+  test_for_zero(t2_1(1,1)-t1_1(1),"T2(N,i)=T1(i)(1,1)");
+  test_for_zero(t2_1(1,2)-t1_1(2),"T2(N,i)=T1(i)(1,2)");
+  test_for_zero(t2_1(2,0)-t1_1(0),"T2(N,i)=T1(i)(2,0)");
+  test_for_zero(t2_1(2,1)-t1_1(1),"T2(N,i)=T1(i)(2,1)");
+  test_for_zero(t2_1(2,2)-t1_1(2),"T2(N,i)=T1(i)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2III.C
--- a/tests/conformance/T2/test_T2III.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2III(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  t2_1(N0,i)=10;
-  t2_1(N1,i)=11;
-  t2_1(N2,i)=12;
-  test_for_zero(t2_1(0,0)-10,"T2(N,i)=T(0,0)");
-  test_for_zero(t2_1(0,1)-10,"T2(N,i)=T(0,1)");
-  test_for_zero(t2_1(0,2)-10,"T2(N,i)=T(0,2)");
-  test_for_zero(t2_1(1,0)-11,"T2(N,i)=T(1,0)");
-  test_for_zero(t2_1(1,1)-11,"T2(N,i)=T(1,1)");
-  test_for_zero(t2_1(1,2)-11,"T2(N,i)=T(1,2)");
-  test_for_zero(t2_1(2,0)-12,"T2(N,i)=T(2,0)");
-  test_for_zero(t2_1(2,1)-12,"T2(N,i)=T(2,1)");
-  test_for_zero(t2_1(2,2)-12,"T2(N,i)=T(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2III.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2III.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2III(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  t2_1(N0,i)=10;
+  t2_1(N1,i)=11;
+  t2_1(N2,i)=12;
+  test_for_zero(t2_1(0,0)-10,"T2(N,i)=T(0,0)");
+  test_for_zero(t2_1(0,1)-10,"T2(N,i)=T(0,1)");
+  test_for_zero(t2_1(0,2)-10,"T2(N,i)=T(0,2)");
+  test_for_zero(t2_1(1,0)-11,"T2(N,i)=T(1,0)");
+  test_for_zero(t2_1(1,1)-11,"T2(N,i)=T(1,1)");
+  test_for_zero(t2_1(1,2)-11,"T2(N,i)=T(1,2)");
+  test_for_zero(t2_1(2,0)-12,"T2(N,i)=T(2,0)");
+  test_for_zero(t2_1(2,1)-12,"T2(N,i)=T(2,1)");
+  test_for_zero(t2_1(2,2)-12,"T2(N,i)=T(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2IV.C
--- a/tests/conformance/T2/test_T2IV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2IV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  t2_1(N0,i)+=10;
-  t2_1(N1,i)+=29;
-  t2_1(N2,i)+=48;
-  test_for_zero(t2_1(0,0)-20,"T2(N,i)+=T(0,0)");
-  test_for_zero(t2_1(0,1)-20,"T2(N,i)+=T(0,1)");
-  test_for_zero(t2_1(0,2)-20,"T2(N,i)+=T(0,2)");
-  test_for_zero(t2_1(1,0)-40,"T2(N,i)+=T(1,0)");
-  test_for_zero(t2_1(1,1)-40,"T2(N,i)+=T(1,1)");
-  test_for_zero(t2_1(1,2)-40,"T2(N,i)+=T(1,2)");
-  test_for_zero(t2_1(2,0)-60,"T2(N,i)+=T(2,0)");
-  test_for_zero(t2_1(2,1)-60,"T2(N,i)+=T(2,1)");
-  test_for_zero(t2_1(2,2)-60,"T2(N,i)+=T(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2IV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2IV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2IV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  t2_1(N0,i)+=10;
+  t2_1(N1,i)+=29;
+  t2_1(N2,i)+=48;
+  test_for_zero(t2_1(0,0)-20,"T2(N,i)+=T(0,0)");
+  test_for_zero(t2_1(0,1)-20,"T2(N,i)+=T(0,1)");
+  test_for_zero(t2_1(0,2)-20,"T2(N,i)+=T(0,2)");
+  test_for_zero(t2_1(1,0)-40,"T2(N,i)+=T(1,0)");
+  test_for_zero(t2_1(1,1)-40,"T2(N,i)+=T(1,1)");
+  test_for_zero(t2_1(1,2)-40,"T2(N,i)+=T(1,2)");
+  test_for_zero(t2_1(2,0)-60,"T2(N,i)+=T(2,0)");
+  test_for_zero(t2_1(2,1)-60,"T2(N,i)+=T(2,1)");
+  test_for_zero(t2_1(2,2)-60,"T2(N,i)+=T(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2IX.C
--- a/tests/conformance/T2/test_T2IX.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2IX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  t2_1(i,N0)=10;
-  t2_1(i,N1)=11;
-  t2_1(i,N2)=12;
-  test_for_zero(t2_1(0,0)-10,"T2(i,N)=T(0,0)");
-  test_for_zero(t2_1(1,0)-10,"T2(i,N)=T(1,0)");
-  test_for_zero(t2_1(2,0)-10,"T2(i,N)=T(2,0)");
-  test_for_zero(t2_1(0,1)-11,"T2(i,N)=T(0,1)");
-  test_for_zero(t2_1(1,1)-11,"T2(i,N)=T(1,1)");
-  test_for_zero(t2_1(2,1)-11,"T2(i,N)=T(2,1)");
-  test_for_zero(t2_1(0,2)-12,"T2(i,N)=T(0,2)");
-  test_for_zero(t2_1(1,2)-12,"T2(i,N)=T(1,2)");
-  test_for_zero(t2_1(2,2)-12,"T2(i,N)=T(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2IX.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2IX.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2IX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  t2_1(i,N0)=10;
+  t2_1(i,N1)=11;
+  t2_1(i,N2)=12;
+  test_for_zero(t2_1(0,0)-10,"T2(i,N)=T(0,0)");
+  test_for_zero(t2_1(1,0)-10,"T2(i,N)=T(1,0)");
+  test_for_zero(t2_1(2,0)-10,"T2(i,N)=T(2,0)");
+  test_for_zero(t2_1(0,1)-11,"T2(i,N)=T(0,1)");
+  test_for_zero(t2_1(1,1)-11,"T2(i,N)=T(1,1)");
+  test_for_zero(t2_1(2,1)-11,"T2(i,N)=T(2,1)");
+  test_for_zero(t2_1(0,2)-12,"T2(i,N)=T(0,2)");
+  test_for_zero(t2_1(1,2)-12,"T2(i,N)=T(1,2)");
+  test_for_zero(t2_1(2,2)-12,"T2(i,N)=T(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2V.C
--- a/tests/conformance/T2/test_T2V.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2V(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  t2_1(N0,i)-=10;
-  t2_1(N1,i)-=29;
-  t2_1(N2,i)-=48;
-  test_for_zero(t2_1(0,0)-10,"T2(N,i)-=T(0,0)");
-  test_for_zero(t2_1(0,1)-10,"T2(N,i)-=T(0,1)");
-  test_for_zero(t2_1(0,2)-10,"T2(N,i)-=T(0,2)");
-  test_for_zero(t2_1(1,0)-11,"T2(N,i)-=T(1,0)");
-  test_for_zero(t2_1(1,1)-11,"T2(N,i)-=T(1,1)");
-  test_for_zero(t2_1(1,2)-11,"T2(N,i)-=T(1,2)");
-  test_for_zero(t2_1(2,0)-12,"T2(N,i)-=T(2,0)");
-  test_for_zero(t2_1(2,1)-12,"T2(N,i)-=T(2,1)");
-  test_for_zero(t2_1(2,2)-12,"T2(N,i)-=T(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2V.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2V.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2V(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  t2_1(N0,i)-=10;
+  t2_1(N1,i)-=29;
+  t2_1(N2,i)-=48;
+  test_for_zero(t2_1(0,0)-10,"T2(N,i)-=T(0,0)");
+  test_for_zero(t2_1(0,1)-10,"T2(N,i)-=T(0,1)");
+  test_for_zero(t2_1(0,2)-10,"T2(N,i)-=T(0,2)");
+  test_for_zero(t2_1(1,0)-11,"T2(N,i)-=T(1,0)");
+  test_for_zero(t2_1(1,1)-11,"T2(N,i)-=T(1,1)");
+  test_for_zero(t2_1(1,2)-11,"T2(N,i)-=T(1,2)");
+  test_for_zero(t2_1(2,0)-12,"T2(N,i)-=T(2,0)");
+  test_for_zero(t2_1(2,1)-12,"T2(N,i)-=T(2,1)");
+  test_for_zero(t2_1(2,2)-12,"T2(N,i)-=T(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2VI.C
--- a/tests/conformance/T2/test_T2VI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2VI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  t2_1(N0,i)*=4;
-  t2_1(N1,i)*=6;
-  t2_1(N2,i)*=8;
-  test_for_zero(t2_1(0,0)-40,"T2(N,i)*=T(0,0)");
-  test_for_zero(t2_1(0,1)-40,"T2(N,i)*=T(0,1)");
-  test_for_zero(t2_1(0,2)-40,"T2(N,i)*=T(0,2)");
-  test_for_zero(t2_1(1,0)-66,"T2(N,i)*=T(1,0)");
-  test_for_zero(t2_1(1,1)-66,"T2(N,i)*=T(1,1)");
-  test_for_zero(t2_1(1,2)-66,"T2(N,i)*=T(1,2)");
-  test_for_zero(t2_1(2,0)-96,"T2(N,i)*=T(2,0)");
-  test_for_zero(t2_1(2,1)-96,"T2(N,i)*=T(2,1)");
-  test_for_zero(t2_1(2,2)-96,"T2(N,i)*=T(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2VI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2VI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2VI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  t2_1(N0,i)*=4;
+  t2_1(N1,i)*=6;
+  t2_1(N2,i)*=8;
+  test_for_zero(t2_1(0,0)-40,"T2(N,i)*=T(0,0)");
+  test_for_zero(t2_1(0,1)-40,"T2(N,i)*=T(0,1)");
+  test_for_zero(t2_1(0,2)-40,"T2(N,i)*=T(0,2)");
+  test_for_zero(t2_1(1,0)-66,"T2(N,i)*=T(1,0)");
+  test_for_zero(t2_1(1,1)-66,"T2(N,i)*=T(1,1)");
+  test_for_zero(t2_1(1,2)-66,"T2(N,i)*=T(1,2)");
+  test_for_zero(t2_1(2,0)-96,"T2(N,i)*=T(2,0)");
+  test_for_zero(t2_1(2,1)-96,"T2(N,i)*=T(2,1)");
+  test_for_zero(t2_1(2,2)-96,"T2(N,i)*=T(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2VII.C
--- a/tests/conformance/T2/test_T2VII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2VII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  t2_1(N0,i)/=2;
-  t2_1(N1,i)/=3;
-  t2_1(N2,i)/=4;
-  test_for_zero(t2_1(0,0)-20,"T2(N,i)/=T(0,0)");
-  test_for_zero(t2_1(0,1)-20,"T2(N,i)/=T(0,1)");
-  test_for_zero(t2_1(0,2)-20,"T2(N,i)/=T(0,2)");
-  test_for_zero(t2_1(1,0)-22,"T2(N,i)/=T(1,0)");
-  test_for_zero(t2_1(1,1)-22,"T2(N,i)/=T(1,1)");
-  test_for_zero(t2_1(1,2)-22,"T2(N,i)/=T(1,2)");
-  test_for_zero(t2_1(2,0)-24,"T2(N,i)/=T(2,0)");
-  test_for_zero(t2_1(2,1)-24,"T2(N,i)/=T(2,1)");
-  test_for_zero(t2_1(2,2)-24,"T2(N,i)/=T(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2VII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2VII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2VII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  t2_1(N0,i)/=2;
+  t2_1(N1,i)/=3;
+  t2_1(N2,i)/=4;
+  test_for_zero(t2_1(0,0)-20,"T2(N,i)/=T(0,0)");
+  test_for_zero(t2_1(0,1)-20,"T2(N,i)/=T(0,1)");
+  test_for_zero(t2_1(0,2)-20,"T2(N,i)/=T(0,2)");
+  test_for_zero(t2_1(1,0)-22,"T2(N,i)/=T(1,0)");
+  test_for_zero(t2_1(1,1)-22,"T2(N,i)/=T(1,1)");
+  test_for_zero(t2_1(1,2)-22,"T2(N,i)/=T(1,2)");
+  test_for_zero(t2_1(2,0)-24,"T2(N,i)/=T(2,0)");
+  test_for_zero(t2_1(2,1)-24,"T2(N,i)/=T(2,1)");
+  test_for_zero(t2_1(2,2)-24,"T2(N,i)/=T(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2VIII.C
--- a/tests/conformance/T2/test_T2VIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2VIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  t2_1(i,N0)=t1_2(i);
-  t2_1(i,N1)=t1_2(i);
-  t2_1(i,N2)=t1_2(i);
-  test_for_zero(t2_1(0,0)-t1_2(0),"T2(i,N)=T1(i)(0,0)");
-  test_for_zero(t2_1(0,1)-t1_2(0),"T2(i,N)=T1(i)(0,1)");
-  test_for_zero(t2_1(0,2)-t1_2(0),"T2(i,N)=T1(i)(0,2)");
-  test_for_zero(t2_1(1,0)-t1_2(1),"T2(i,N)=T1(i)(1,0)");
-  test_for_zero(t2_1(1,1)-t1_2(1),"T2(i,N)=T1(i)(1,1)");
-  test_for_zero(t2_1(1,2)-t1_2(1),"T2(i,N)=T1(i)(1,2)");
-  test_for_zero(t2_1(2,0)-t1_2(2),"T2(i,N)=T1(i)(2,0)");
-  test_for_zero(t2_1(2,1)-t1_2(2),"T2(i,N)=T1(i)(2,1)");
-  test_for_zero(t2_1(2,2)-t1_2(2),"T2(i,N)=T1(i)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2VIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2VIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2VIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  t2_1(i,N0)=t1_2(i);
+  t2_1(i,N1)=t1_2(i);
+  t2_1(i,N2)=t1_2(i);
+  test_for_zero(t2_1(0,0)-t1_2(0),"T2(i,N)=T1(i)(0,0)");
+  test_for_zero(t2_1(0,1)-t1_2(0),"T2(i,N)=T1(i)(0,1)");
+  test_for_zero(t2_1(0,2)-t1_2(0),"T2(i,N)=T1(i)(0,2)");
+  test_for_zero(t2_1(1,0)-t1_2(1),"T2(i,N)=T1(i)(1,0)");
+  test_for_zero(t2_1(1,1)-t1_2(1),"T2(i,N)=T1(i)(1,1)");
+  test_for_zero(t2_1(1,2)-t1_2(1),"T2(i,N)=T1(i)(1,2)");
+  test_for_zero(t2_1(2,0)-t1_2(2),"T2(i,N)=T1(i)(2,0)");
+  test_for_zero(t2_1(2,1)-t1_2(2),"T2(i,N)=T1(i)(2,1)");
+  test_for_zero(t2_1(2,2)-t1_2(2),"T2(i,N)=T1(i)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2X.C
--- a/tests/conformance/T2/test_T2X.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2X(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  t2_1(i,N0)+=10;
-  t2_1(i,N1)+=29;
-  t2_1(i,N2)+=48;
-  test_for_zero(t2_1(0,0)-20,"T2(i,N)+=T(0,0)");
-  test_for_zero(t2_1(1,0)-20,"T2(i,N)+=T(1,0)");
-  test_for_zero(t2_1(2,0)-20,"T2(i,N)+=T(2,0)");
-  test_for_zero(t2_1(0,1)-40,"T2(i,N)+=T(0,1)");
-  test_for_zero(t2_1(1,1)-40,"T2(i,N)+=T(1,1)");
-  test_for_zero(t2_1(2,1)-40,"T2(i,N)+=T(2,1)");
-  test_for_zero(t2_1(0,2)-60,"T2(i,N)+=T(0,2)");
-  test_for_zero(t2_1(1,2)-60,"T2(i,N)+=T(1,2)");
-  test_for_zero(t2_1(2,2)-60,"T2(i,N)+=T(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2X.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2X.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2X(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  t2_1(i,N0)+=10;
+  t2_1(i,N1)+=29;
+  t2_1(i,N2)+=48;
+  test_for_zero(t2_1(0,0)-20,"T2(i,N)+=T(0,0)");
+  test_for_zero(t2_1(1,0)-20,"T2(i,N)+=T(1,0)");
+  test_for_zero(t2_1(2,0)-20,"T2(i,N)+=T(2,0)");
+  test_for_zero(t2_1(0,1)-40,"T2(i,N)+=T(0,1)");
+  test_for_zero(t2_1(1,1)-40,"T2(i,N)+=T(1,1)");
+  test_for_zero(t2_1(2,1)-40,"T2(i,N)+=T(2,1)");
+  test_for_zero(t2_1(0,2)-60,"T2(i,N)+=T(0,2)");
+  test_for_zero(t2_1(1,2)-60,"T2(i,N)+=T(1,2)");
+  test_for_zero(t2_1(2,2)-60,"T2(i,N)+=T(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XI.C
--- a/tests/conformance/T2/test_T2XI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  t2_1(i,N0)-=10;
-  t2_1(i,N1)-=29;
-  t2_1(i,N2)-=48;
-  test_for_zero(t2_1(0,0)-10,"T2(i,N)-=T(0,0)");
-  test_for_zero(t2_1(1,0)-10,"T2(i,N)-=T(1,0)");
-  test_for_zero(t2_1(2,0)-10,"T2(i,N)-=T(2,0)");
-  test_for_zero(t2_1(0,1)-11,"T2(i,N)-=T(0,1)");
-  test_for_zero(t2_1(1,1)-11,"T2(i,N)-=T(1,1)");
-  test_for_zero(t2_1(2,1)-11,"T2(i,N)-=T(2,1)");
-  test_for_zero(t2_1(0,2)-12,"T2(i,N)-=T(0,2)");
-  test_for_zero(t2_1(1,2)-12,"T2(i,N)-=T(1,2)");
-  test_for_zero(t2_1(2,2)-12,"T2(i,N)-=T(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  t2_1(i,N0)-=10;
+  t2_1(i,N1)-=29;
+  t2_1(i,N2)-=48;
+  test_for_zero(t2_1(0,0)-10,"T2(i,N)-=T(0,0)");
+  test_for_zero(t2_1(1,0)-10,"T2(i,N)-=T(1,0)");
+  test_for_zero(t2_1(2,0)-10,"T2(i,N)-=T(2,0)");
+  test_for_zero(t2_1(0,1)-11,"T2(i,N)-=T(0,1)");
+  test_for_zero(t2_1(1,1)-11,"T2(i,N)-=T(1,1)");
+  test_for_zero(t2_1(2,1)-11,"T2(i,N)-=T(2,1)");
+  test_for_zero(t2_1(0,2)-12,"T2(i,N)-=T(0,2)");
+  test_for_zero(t2_1(1,2)-12,"T2(i,N)-=T(1,2)");
+  test_for_zero(t2_1(2,2)-12,"T2(i,N)-=T(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XII.C
--- a/tests/conformance/T2/test_T2XII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  t2_1(i,N0)*=4;
-  t2_1(i,N1)*=6;
-  t2_1(i,N2)*=8;
-  test_for_zero(t2_1(0,0)-40,"T2(i,N)*=T(0,0)");
-  test_for_zero(t2_1(1,0)-40,"T2(i,N)*=T(1,0)");
-  test_for_zero(t2_1(2,0)-40,"T2(i,N)*=T(2,0)");
-  test_for_zero(t2_1(0,1)-66,"T2(i,N)*=T(0,1)");
-  test_for_zero(t2_1(1,1)-66,"T2(i,N)*=T(1,1)");
-  test_for_zero(t2_1(2,1)-66,"T2(i,N)*=T(2,1)");
-  test_for_zero(t2_1(0,2)-96,"T2(i,N)*=T(0,2)");
-  test_for_zero(t2_1(1,2)-96,"T2(i,N)*=T(1,2)");
-  test_for_zero(t2_1(2,2)-96,"T2(i,N)*=T(2,2)");
-
-  t2_1(i,N0)/=2;
-  t2_1(i,N1)/=3;
-  t2_1(i,N2)/=4;
-  test_for_zero(t2_1(0,0)-20,"T2(i,N)/=T(0,0)");
-  test_for_zero(t2_1(1,0)-20,"T2(i,N)/=T(1,0)");
-  test_for_zero(t2_1(2,0)-20,"T2(i,N)/=T(2,0)");
-  test_for_zero(t2_1(0,1)-22,"T2(i,N)/=T(0,1)");
-  test_for_zero(t2_1(1,1)-22,"T2(i,N)/=T(1,1)");
-  test_for_zero(t2_1(2,1)-22,"T2(i,N)/=T(2,1)");
-  test_for_zero(t2_1(0,2)-24,"T2(i,N)/=T(0,2)");
-  test_for_zero(t2_1(1,2)-24,"T2(i,N)/=T(1,2)");
-  test_for_zero(t2_1(2,2)-24,"T2(i,N)/=T(2,2)");
-  test_for_zero(t2_1(i,i)-(20+22+24),"T2(i,i)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,54 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  t2_1(i,N0)*=4;
+  t2_1(i,N1)*=6;
+  t2_1(i,N2)*=8;
+  test_for_zero(t2_1(0,0)-40,"T2(i,N)*=T(0,0)");
+  test_for_zero(t2_1(1,0)-40,"T2(i,N)*=T(1,0)");
+  test_for_zero(t2_1(2,0)-40,"T2(i,N)*=T(2,0)");
+  test_for_zero(t2_1(0,1)-66,"T2(i,N)*=T(0,1)");
+  test_for_zero(t2_1(1,1)-66,"T2(i,N)*=T(1,1)");
+  test_for_zero(t2_1(2,1)-66,"T2(i,N)*=T(2,1)");
+  test_for_zero(t2_1(0,2)-96,"T2(i,N)*=T(0,2)");
+  test_for_zero(t2_1(1,2)-96,"T2(i,N)*=T(1,2)");
+  test_for_zero(t2_1(2,2)-96,"T2(i,N)*=T(2,2)");
+
+  t2_1(i,N0)/=2;
+  t2_1(i,N1)/=3;
+  t2_1(i,N2)/=4;
+  test_for_zero(t2_1(0,0)-20,"T2(i,N)/=T(0,0)");
+  test_for_zero(t2_1(1,0)-20,"T2(i,N)/=T(1,0)");
+  test_for_zero(t2_1(2,0)-20,"T2(i,N)/=T(2,0)");
+  test_for_zero(t2_1(0,1)-22,"T2(i,N)/=T(0,1)");
+  test_for_zero(t2_1(1,1)-22,"T2(i,N)/=T(1,1)");
+  test_for_zero(t2_1(2,1)-22,"T2(i,N)/=T(2,1)");
+  test_for_zero(t2_1(0,2)-24,"T2(i,N)/=T(0,2)");
+  test_for_zero(t2_1(1,2)-24,"T2(i,N)/=T(1,2)");
+  test_for_zero(t2_1(2,2)-24,"T2(i,N)/=T(2,2)");
+  test_for_zero(t2_1(i,i)-(20+22+24),"T2(i,i)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XIII.C
--- a/tests/conformance/T2/test_T2XIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  /* Test of actual numerals as an index. */
-
-  t1_1(i)=t2_1(0,i);
-  test_for_zero(t2_1(0,0)-t1_1(0),"T1(i)=T2(Num,i)(0,0)");
-  test_for_zero(t2_1(0,1)-t1_1(1),"T1(i)=T2(Num,i)(0,1)");
-  test_for_zero(t2_1(0,2)-t1_1(2),"T1(i)=T2(Num,i)(0,2)");
-  t1_1(i)=t2_1(1,i);
-  test_for_zero(t2_1(1,0)-t1_1(0),"T1(i)=T2(Num,i)(1,0)");
-  test_for_zero(t2_1(1,1)-t1_1(1),"T1(i)=T2(Num,i)(1,1)");
-  test_for_zero(t2_1(1,2)-t1_1(2),"T1(i)=T2(Num,i)(1,2)");
-  t1_1(i)=t2_1(2,i);
-  test_for_zero(t2_1(2,0)-t1_1(0),"T1(i)=T2(Num,i)(2,0)");
-  test_for_zero(t2_1(2,1)-t1_1(1),"T1(i)=T2(Num,i)(2,1)");
-  test_for_zero(t2_1(2,2)-t1_1(2),"T1(i)=T2(Num,i)(2,2)");
-
-  t1_1(i)=t2_1(i,0);
-  test_for_zero(t2_1(0,0)-t1_1(0),"T1(i)=T2(i,Num)(0,0)");
-  test_for_zero(t2_1(1,0)-t1_1(1),"T1(i)=T2(i,Num)(1,0)");
-  test_for_zero(t2_1(2,0)-t1_1(2),"T1(i)=T2(i,Num)(2,0)");
-  t1_1(i)=t2_1(i,1);
-  test_for_zero(t2_1(0,1)-t1_1(0),"T1(i)=T2(i,Num)(0,1)");
-  test_for_zero(t2_1(1,1)-t1_1(1),"T1(i)=T2(i,Num)(1,1)");
-  test_for_zero(t2_1(2,1)-t1_1(2),"T1(i)=T2(i,Num)(2,1)");
-  t1_1(i)=t2_1(i,2);
-  test_for_zero(t2_1(0,2)-t1_1(0),"T1(i)=T2(i,Num)(0,2)");
-  test_for_zero(t2_1(1,2)-t1_1(1),"T1(i)=T2(i,Num)(1,2)");
-  test_for_zero(t2_1(2,2)-t1_1(2),"T1(i)=T2(i,Num)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,55 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  /* Test of actual numerals as an index. */
+
+  t1_1(i)=t2_1(0,i);
+  test_for_zero(t2_1(0,0)-t1_1(0),"T1(i)=T2(Num,i)(0,0)");
+  test_for_zero(t2_1(0,1)-t1_1(1),"T1(i)=T2(Num,i)(0,1)");
+  test_for_zero(t2_1(0,2)-t1_1(2),"T1(i)=T2(Num,i)(0,2)");
+  t1_1(i)=t2_1(1,i);
+  test_for_zero(t2_1(1,0)-t1_1(0),"T1(i)=T2(Num,i)(1,0)");
+  test_for_zero(t2_1(1,1)-t1_1(1),"T1(i)=T2(Num,i)(1,1)");
+  test_for_zero(t2_1(1,2)-t1_1(2),"T1(i)=T2(Num,i)(1,2)");
+  t1_1(i)=t2_1(2,i);
+  test_for_zero(t2_1(2,0)-t1_1(0),"T1(i)=T2(Num,i)(2,0)");
+  test_for_zero(t2_1(2,1)-t1_1(1),"T1(i)=T2(Num,i)(2,1)");
+  test_for_zero(t2_1(2,2)-t1_1(2),"T1(i)=T2(Num,i)(2,2)");
+
+  t1_1(i)=t2_1(i,0);
+  test_for_zero(t2_1(0,0)-t1_1(0),"T1(i)=T2(i,Num)(0,0)");
+  test_for_zero(t2_1(1,0)-t1_1(1),"T1(i)=T2(i,Num)(1,0)");
+  test_for_zero(t2_1(2,0)-t1_1(2),"T1(i)=T2(i,Num)(2,0)");
+  t1_1(i)=t2_1(i,1);
+  test_for_zero(t2_1(0,1)-t1_1(0),"T1(i)=T2(i,Num)(0,1)");
+  test_for_zero(t2_1(1,1)-t1_1(1),"T1(i)=T2(i,Num)(1,1)");
+  test_for_zero(t2_1(2,1)-t1_1(2),"T1(i)=T2(i,Num)(2,1)");
+  t1_1(i)=t2_1(i,2);
+  test_for_zero(t2_1(0,2)-t1_1(0),"T1(i)=T2(i,Num)(0,2)");
+  test_for_zero(t2_1(1,2)-t1_1(1),"T1(i)=T2(i,Num)(1,2)");
+  test_for_zero(t2_1(2,2)-t1_1(2),"T1(i)=T2(i,Num)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XIV.C
--- a/tests/conformance/T2/test_T2XIV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  /* add/subtract */
-  
-  t2_1(i,j)=t2_2(i,j)-t1_1(i)*t1_2(j);
-  test_for_zero(t2_1(0,0)-(t2_2(0,0)-t1_1(0)*t1_2(0)),"T2(i,j)-T2(i,j)(0,0)");
-  test_for_zero(t2_1(0,1)-(t2_2(0,1)-t1_1(0)*t1_2(1)),"T2(i,j)-T2(i,j)(0,1)");
-  test_for_zero(t2_1(0,2)-(t2_2(0,2)-t1_1(0)*t1_2(2)),"T2(i,j)-T2(i,j)(0,2)");
-  test_for_zero(t2_1(1,0)-(t2_2(1,0)-t1_1(1)*t1_2(0)),"T2(i,j)-T2(i,j)(1,0)");
-  test_for_zero(t2_1(1,1)-(t2_2(1,1)-t1_1(1)*t1_2(1)),"T2(i,j)-T2(i,j)(1,1)");
-  test_for_zero(t2_1(1,2)-(t2_2(1,2)-t1_1(1)*t1_2(2)),"T2(i,j)-T2(i,j)(1,2)");
-  test_for_zero(t2_1(2,0)-(t2_2(2,0)-t1_1(2)*t1_2(0)),"T2(i,j)-T2(i,j)(2,0)");
-  test_for_zero(t2_1(2,1)-(t2_2(2,1)-t1_1(2)*t1_2(1)),"T2(i,j)-T2(i,j)(2,1)");
-  test_for_zero(t2_1(2,2)-(t2_2(2,2)-t1_1(2)*t1_2(2)),"T2(i,j)-T2(i,j)(2,2)");
-
-  t2_1(i,j)=t2_2(i,j)-t1_1(j)*t1_2(i);
-  test_for_zero(t2_1(0,0)-(t2_2(0,0)-t1_2(0)*t1_1(0)),"T2(i,j)-T2(j,i)(0,0)");
-  test_for_zero(t2_1(0,1)-(t2_2(0,1)-t1_2(0)*t1_1(1)),"T2(i,j)-T2(j,i)(0,1)");
-  test_for_zero(t2_1(0,2)-(t2_2(0,2)-t1_2(0)*t1_1(2)),"T2(i,j)-T2(j,i)(0,2)");
-  test_for_zero(t2_1(1,0)-(t2_2(1,0)-t1_2(1)*t1_1(0)),"T2(i,j)-T2(j,i)(1,0)");
-  test_for_zero(t2_1(1,1)-(t2_2(1,1)-t1_2(1)*t1_1(1)),"T2(i,j)-T2(j,i)(1,1)");
-  test_for_zero(t2_1(1,2)-(t2_2(1,2)-t1_2(1)*t1_1(2)),"T2(i,j)-T2(j,i)(1,2)");
-  test_for_zero(t2_1(2,0)-(t2_2(2,0)-t1_2(2)*t1_1(0)),"T2(i,j)-T2(j,i)(2,0)");
-  test_for_zero(t2_1(2,1)-(t2_2(2,1)-t1_2(2)*t1_1(1)),"T2(i,j)-T2(j,i)(2,1)");
-  test_for_zero(t2_1(2,2)-(t2_2(2,2)-t1_2(2)*t1_1(2)),"T2(i,j)-T2(j,i)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XIV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XIV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,51 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  /* add/subtract */
+  
+  t2_1(i,j)=t2_2(i,j)-t1_1(i)*t1_2(j);
+  test_for_zero(t2_1(0,0)-(t2_2(0,0)-t1_1(0)*t1_2(0)),"T2(i,j)-T2(i,j)(0,0)");
+  test_for_zero(t2_1(0,1)-(t2_2(0,1)-t1_1(0)*t1_2(1)),"T2(i,j)-T2(i,j)(0,1)");
+  test_for_zero(t2_1(0,2)-(t2_2(0,2)-t1_1(0)*t1_2(2)),"T2(i,j)-T2(i,j)(0,2)");
+  test_for_zero(t2_1(1,0)-(t2_2(1,0)-t1_1(1)*t1_2(0)),"T2(i,j)-T2(i,j)(1,0)");
+  test_for_zero(t2_1(1,1)-(t2_2(1,1)-t1_1(1)*t1_2(1)),"T2(i,j)-T2(i,j)(1,1)");
+  test_for_zero(t2_1(1,2)-(t2_2(1,2)-t1_1(1)*t1_2(2)),"T2(i,j)-T2(i,j)(1,2)");
+  test_for_zero(t2_1(2,0)-(t2_2(2,0)-t1_1(2)*t1_2(0)),"T2(i,j)-T2(i,j)(2,0)");
+  test_for_zero(t2_1(2,1)-(t2_2(2,1)-t1_1(2)*t1_2(1)),"T2(i,j)-T2(i,j)(2,1)");
+  test_for_zero(t2_1(2,2)-(t2_2(2,2)-t1_1(2)*t1_2(2)),"T2(i,j)-T2(i,j)(2,2)");
+
+  t2_1(i,j)=t2_2(i,j)-t1_1(j)*t1_2(i);
+  test_for_zero(t2_1(0,0)-(t2_2(0,0)-t1_2(0)*t1_1(0)),"T2(i,j)-T2(j,i)(0,0)");
+  test_for_zero(t2_1(0,1)-(t2_2(0,1)-t1_2(0)*t1_1(1)),"T2(i,j)-T2(j,i)(0,1)");
+  test_for_zero(t2_1(0,2)-(t2_2(0,2)-t1_2(0)*t1_1(2)),"T2(i,j)-T2(j,i)(0,2)");
+  test_for_zero(t2_1(1,0)-(t2_2(1,0)-t1_2(1)*t1_1(0)),"T2(i,j)-T2(j,i)(1,0)");
+  test_for_zero(t2_1(1,1)-(t2_2(1,1)-t1_2(1)*t1_1(1)),"T2(i,j)-T2(j,i)(1,1)");
+  test_for_zero(t2_1(1,2)-(t2_2(1,2)-t1_2(1)*t1_1(2)),"T2(i,j)-T2(j,i)(1,2)");
+  test_for_zero(t2_1(2,0)-(t2_2(2,0)-t1_2(2)*t1_1(0)),"T2(i,j)-T2(j,i)(2,0)");
+  test_for_zero(t2_1(2,1)-(t2_2(2,1)-t1_2(2)*t1_1(1)),"T2(i,j)-T2(j,i)(2,1)");
+  test_for_zero(t2_1(2,2)-(t2_2(2,2)-t1_2(2)*t1_1(2)),"T2(i,j)-T2(j,i)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XIX.C
--- a/tests/conformance/T2/test_T2XIX.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  /* Equals */
-
-  /* Switch indices */
-
-  t2_1(j,i)=t2_2(i,j)+t1_1(j)*t1_2(i);
-  test_for_zero(t2_1(0,0)-(t2_2(0,0)+t1_2(0)*t1_1(0)),
-		"T2(j,i)=T2(i,j)(0,0)");
-  test_for_zero(t2_1(1,0)-(t2_2(0,1)+t1_2(0)*t1_1(1)),
-		"T2(j,i)=T2(i,j)(0,1)");
-  test_for_zero(t2_1(2,0)-(t2_2(0,2)+t1_2(0)*t1_1(2)),
-		"T2(j,i)=T2(i,j)(0,2)");
-  test_for_zero(t2_1(0,1)-(t2_2(1,0)+t1_2(1)*t1_1(0)),
-		"T2(j,i)=T2(i,j)(1,0)");
-  test_for_zero(t2_1(1,1)-(t2_2(1,1)+t1_2(1)*t1_1(1)),
-		"T2(j,i)=T2(i,j)(1,1)");
-  test_for_zero(t2_1(2,1)-(t2_2(1,2)+t1_2(1)*t1_1(2)),
-		"T2(j,i)=T2(i,j)(1,2)");
-  test_for_zero(t2_1(0,2)-(t2_2(2,0)+t1_2(2)*t1_1(0)),
-		"T2(j,i)=T2(i,j)(2,0)");
-  test_for_zero(t2_1(1,2)-(t2_2(2,1)+t1_2(2)*t1_1(1)),
-		"T2(j,i)=T2(i,j)(2,1)");
-  test_for_zero(t2_1(2,2)-(t2_2(2,2)+t1_2(2)*t1_1(2)),
-		"T2(j,i)=T2(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XIX.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XIX.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,51 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  /* Equals */
+
+  /* Switch indices */
+
+  t2_1(j,i)=t2_2(i,j)+t1_1(j)*t1_2(i);
+  test_for_zero(t2_1(0,0)-(t2_2(0,0)+t1_2(0)*t1_1(0)),
+		"T2(j,i)=T2(i,j)(0,0)");
+  test_for_zero(t2_1(1,0)-(t2_2(0,1)+t1_2(0)*t1_1(1)),
+		"T2(j,i)=T2(i,j)(0,1)");
+  test_for_zero(t2_1(2,0)-(t2_2(0,2)+t1_2(0)*t1_1(2)),
+		"T2(j,i)=T2(i,j)(0,2)");
+  test_for_zero(t2_1(0,1)-(t2_2(1,0)+t1_2(1)*t1_1(0)),
+		"T2(j,i)=T2(i,j)(1,0)");
+  test_for_zero(t2_1(1,1)-(t2_2(1,1)+t1_2(1)*t1_1(1)),
+		"T2(j,i)=T2(i,j)(1,1)");
+  test_for_zero(t2_1(2,1)-(t2_2(1,2)+t1_2(1)*t1_1(2)),
+		"T2(j,i)=T2(i,j)(1,2)");
+  test_for_zero(t2_1(0,2)-(t2_2(2,0)+t1_2(2)*t1_1(0)),
+		"T2(j,i)=T2(i,j)(2,0)");
+  test_for_zero(t2_1(1,2)-(t2_2(2,1)+t1_2(2)*t1_1(1)),
+		"T2(j,i)=T2(i,j)(2,1)");
+  test_for_zero(t2_1(2,2)-(t2_2(2,2)+t1_2(2)*t1_1(2)),
+		"T2(j,i)=T2(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XV.C
--- a/tests/conformance/T2/test_T2XV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  /* add/subtract */
-
-  t2_1(i,j)=t2_2(i,j)+t1_1(i)*t1_2(j);
-  test_for_zero(t2_1(0,0)-(t2_2(0,0)+t1_1(0)*t1_2(0)),"T2(i,j)+T2(i,j)(0,0)");
-  test_for_zero(t2_1(0,1)-(t2_2(0,1)+t1_1(0)*t1_2(1)),"T2(i,j)+T2(i,j)(0,1)");
-  test_for_zero(t2_1(0,2)-(t2_2(0,2)+t1_1(0)*t1_2(2)),"T2(i,j)+T2(i,j)(0,2)");
-  test_for_zero(t2_1(1,0)-(t2_2(1,0)+t1_1(1)*t1_2(0)),"T2(i,j)+T2(i,j)(1,0)");
-  test_for_zero(t2_1(1,1)-(t2_2(1,1)+t1_1(1)*t1_2(1)),"T2(i,j)+T2(i,j)(1,1)");
-  test_for_zero(t2_1(1,2)-(t2_2(1,2)+t1_1(1)*t1_2(2)),"T2(i,j)+T2(i,j)(1,2)");
-  test_for_zero(t2_1(2,0)-(t2_2(2,0)+t1_1(2)*t1_2(0)),"T2(i,j)+T2(i,j)(2,0)");
-  test_for_zero(t2_1(2,1)-(t2_2(2,1)+t1_1(2)*t1_2(1)),"T2(i,j)+T2(i,j)(2,1)");
-  test_for_zero(t2_1(2,2)-(t2_2(2,2)+t1_1(2)*t1_2(2)),"T2(i,j)+T2(i,j)(2,2)");
-
-  t2_1(i,j)=t2_2(i,j)+t1_1(j)*t1_2(i);
-  test_for_zero(t2_1(0,0)-(t2_2(0,0)+t1_1(0)*t1_2(0)),"T2(i,j)+T2(j,i)(0,0)");
-  test_for_zero(t2_1(1,0)-(t2_2(1,0)+t1_1(0)*t1_2(1)),"T2(i,j)+T2(j,i)(0,1)");
-  test_for_zero(t2_1(2,0)-(t2_2(2,0)+t1_1(0)*t1_2(2)),"T2(i,j)+T2(j,i)(0,2)");
-  test_for_zero(t2_1(0,1)-(t2_2(0,1)+t1_1(1)*t1_2(0)),"T2(i,j)+T2(j,i)(1,0)");
-  test_for_zero(t2_1(1,1)-(t2_2(1,1)+t1_1(1)*t1_2(1)),"T2(i,j)+T2(j,i)(1,1)");
-  test_for_zero(t2_1(2,1)-(t2_2(2,1)+t1_1(1)*t1_2(2)),"T2(i,j)+T2(j,i)(1,2)");
-  test_for_zero(t2_1(0,2)-(t2_2(0,2)+t1_1(2)*t1_2(0)),"T2(i,j)+T2(j,i)(2,0)");
-  test_for_zero(t2_1(1,2)-(t2_2(1,2)+t1_1(2)*t1_2(1)),"T2(i,j)+T2(j,i)(2,1)");
-  test_for_zero(t2_1(2,2)-(t2_2(2,2)+t1_1(2)*t1_2(2)),"T2(i,j)+T2(j,i)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,51 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  /* add/subtract */
+
+  t2_1(i,j)=t2_2(i,j)+t1_1(i)*t1_2(j);
+  test_for_zero(t2_1(0,0)-(t2_2(0,0)+t1_1(0)*t1_2(0)),"T2(i,j)+T2(i,j)(0,0)");
+  test_for_zero(t2_1(0,1)-(t2_2(0,1)+t1_1(0)*t1_2(1)),"T2(i,j)+T2(i,j)(0,1)");
+  test_for_zero(t2_1(0,2)-(t2_2(0,2)+t1_1(0)*t1_2(2)),"T2(i,j)+T2(i,j)(0,2)");
+  test_for_zero(t2_1(1,0)-(t2_2(1,0)+t1_1(1)*t1_2(0)),"T2(i,j)+T2(i,j)(1,0)");
+  test_for_zero(t2_1(1,1)-(t2_2(1,1)+t1_1(1)*t1_2(1)),"T2(i,j)+T2(i,j)(1,1)");
+  test_for_zero(t2_1(1,2)-(t2_2(1,2)+t1_1(1)*t1_2(2)),"T2(i,j)+T2(i,j)(1,2)");
+  test_for_zero(t2_1(2,0)-(t2_2(2,0)+t1_1(2)*t1_2(0)),"T2(i,j)+T2(i,j)(2,0)");
+  test_for_zero(t2_1(2,1)-(t2_2(2,1)+t1_1(2)*t1_2(1)),"T2(i,j)+T2(i,j)(2,1)");
+  test_for_zero(t2_1(2,2)-(t2_2(2,2)+t1_1(2)*t1_2(2)),"T2(i,j)+T2(i,j)(2,2)");
+
+  t2_1(i,j)=t2_2(i,j)+t1_1(j)*t1_2(i);
+  test_for_zero(t2_1(0,0)-(t2_2(0,0)+t1_1(0)*t1_2(0)),"T2(i,j)+T2(j,i)(0,0)");
+  test_for_zero(t2_1(1,0)-(t2_2(1,0)+t1_1(0)*t1_2(1)),"T2(i,j)+T2(j,i)(0,1)");
+  test_for_zero(t2_1(2,0)-(t2_2(2,0)+t1_1(0)*t1_2(2)),"T2(i,j)+T2(j,i)(0,2)");
+  test_for_zero(t2_1(0,1)-(t2_2(0,1)+t1_1(1)*t1_2(0)),"T2(i,j)+T2(j,i)(1,0)");
+  test_for_zero(t2_1(1,1)-(t2_2(1,1)+t1_1(1)*t1_2(1)),"T2(i,j)+T2(j,i)(1,1)");
+  test_for_zero(t2_1(2,1)-(t2_2(2,1)+t1_1(1)*t1_2(2)),"T2(i,j)+T2(j,i)(1,2)");
+  test_for_zero(t2_1(0,2)-(t2_2(0,2)+t1_1(2)*t1_2(0)),"T2(i,j)+T2(j,i)(2,0)");
+  test_for_zero(t2_1(1,2)-(t2_2(1,2)+t1_1(2)*t1_2(1)),"T2(i,j)+T2(j,i)(2,1)");
+  test_for_zero(t2_1(2,2)-(t2_2(2,2)+t1_1(2)*t1_2(2)),"T2(i,j)+T2(j,i)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XVI.C
--- a/tests/conformance/T2/test_T2XVI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  /* Equals */
-
-  t2_1(i,j)=t2_2(i,j)+t1_1(j)*t1_2(i);
-  test_for_zero(t2_1(0,0)-(t2_2(0,0)+t1_2(0)*t1_1(0)),"T2(i,j)=T2(i,j)(0,0)");
-  test_for_zero(t2_1(0,1)-(t2_2(0,1)+t1_2(0)*t1_1(1)),"T2(i,j)=T2(i,j)(0,1)");
-  test_for_zero(t2_1(0,2)-(t2_2(0,2)+t1_2(0)*t1_1(2)),"T2(i,j)=T2(i,j)(0,2)");
-  test_for_zero(t2_1(1,0)-(t2_2(1,0)+t1_2(1)*t1_1(0)),"T2(i,j)=T2(i,j)(1,0)");
-  test_for_zero(t2_1(1,1)-(t2_2(1,1)+t1_2(1)*t1_1(1)),"T2(i,j)=T2(i,j)(1,1)");
-  test_for_zero(t2_1(1,2)-(t2_2(1,2)+t1_2(1)*t1_1(2)),"T2(i,j)=T2(i,j)(1,2)");
-  test_for_zero(t2_1(2,0)-(t2_2(2,0)+t1_2(2)*t1_1(0)),"T2(i,j)=T2(i,j)(2,0)");
-  test_for_zero(t2_1(2,1)-(t2_2(2,1)+t1_2(2)*t1_1(1)),"T2(i,j)=T2(i,j)(2,1)");
-  test_for_zero(t2_1(2,2)-(t2_2(2,2)+t1_2(2)*t1_1(2)),"T2(i,j)=T2(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XVI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XVI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  /* Equals */
+
+  t2_1(i,j)=t2_2(i,j)+t1_1(j)*t1_2(i);
+  test_for_zero(t2_1(0,0)-(t2_2(0,0)+t1_2(0)*t1_1(0)),"T2(i,j)=T2(i,j)(0,0)");
+  test_for_zero(t2_1(0,1)-(t2_2(0,1)+t1_2(0)*t1_1(1)),"T2(i,j)=T2(i,j)(0,1)");
+  test_for_zero(t2_1(0,2)-(t2_2(0,2)+t1_2(0)*t1_1(2)),"T2(i,j)=T2(i,j)(0,2)");
+  test_for_zero(t2_1(1,0)-(t2_2(1,0)+t1_2(1)*t1_1(0)),"T2(i,j)=T2(i,j)(1,0)");
+  test_for_zero(t2_1(1,1)-(t2_2(1,1)+t1_2(1)*t1_1(1)),"T2(i,j)=T2(i,j)(1,1)");
+  test_for_zero(t2_1(1,2)-(t2_2(1,2)+t1_2(1)*t1_1(2)),"T2(i,j)=T2(i,j)(1,2)");
+  test_for_zero(t2_1(2,0)-(t2_2(2,0)+t1_2(2)*t1_1(0)),"T2(i,j)=T2(i,j)(2,0)");
+  test_for_zero(t2_1(2,1)-(t2_2(2,1)+t1_2(2)*t1_1(1)),"T2(i,j)=T2(i,j)(2,1)");
+  test_for_zero(t2_1(2,2)-(t2_2(2,2)+t1_2(2)*t1_1(2)),"T2(i,j)=T2(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XVII.C
--- a/tests/conformance/T2/test_T2XVII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  /* Equals */
-
-  t2_1(i,j)+=t2_2(i,j);
-  test_for_zero(t2_1(0,0)-(2*t2_2(0,0)+t1_2(0)*t1_1(0)),"T2(i,j)+=T2(i,j)(0,0)");
-  test_for_zero(t2_1(0,1)-(2*t2_2(0,1)+t1_2(0)*t1_1(1)),"T2(i,j)+=T2(i,j)(0,1)");
-  test_for_zero(t2_1(0,2)-(2*t2_2(0,2)+t1_2(0)*t1_1(2)),"T2(i,j)+=T2(i,j)(0,2)");
-  test_for_zero(t2_1(1,0)-(2*t2_2(1,0)+t1_2(1)*t1_1(0)),"T2(i,j)+=T2(i,j)(1,0)");
-  test_for_zero(t2_1(1,1)-(2*t2_2(1,1)+t1_2(1)*t1_1(1)),"T2(i,j)+=T2(i,j)(1,1)");
-  test_for_zero(t2_1(1,2)-(2*t2_2(1,2)+t1_2(1)*t1_1(2)),"T2(i,j)+=T2(i,j)(1,2)");
-  test_for_zero(t2_1(2,0)-(2*t2_2(2,0)+t1_2(2)*t1_1(0)),"T2(i,j)+=T2(i,j)(2,0)");
-  test_for_zero(t2_1(2,1)-(2*t2_2(2,1)+t1_2(2)*t1_1(1)),"T2(i,j)+=T2(i,j)(2,1)");
-  test_for_zero(t2_1(2,2)-(2*t2_2(2,2)+t1_2(2)*t1_1(2)),"T2(i,j)+=T2(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XVII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XVII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  /* Equals */
+
+  t2_1(i,j)+=t2_2(i,j);
+  test_for_zero(t2_1(0,0)-(2*t2_2(0,0)+t1_2(0)*t1_1(0)),"T2(i,j)+=T2(i,j)(0,0)");
+  test_for_zero(t2_1(0,1)-(2*t2_2(0,1)+t1_2(0)*t1_1(1)),"T2(i,j)+=T2(i,j)(0,1)");
+  test_for_zero(t2_1(0,2)-(2*t2_2(0,2)+t1_2(0)*t1_1(2)),"T2(i,j)+=T2(i,j)(0,2)");
+  test_for_zero(t2_1(1,0)-(2*t2_2(1,0)+t1_2(1)*t1_1(0)),"T2(i,j)+=T2(i,j)(1,0)");
+  test_for_zero(t2_1(1,1)-(2*t2_2(1,1)+t1_2(1)*t1_1(1)),"T2(i,j)+=T2(i,j)(1,1)");
+  test_for_zero(t2_1(1,2)-(2*t2_2(1,2)+t1_2(1)*t1_1(2)),"T2(i,j)+=T2(i,j)(1,2)");
+  test_for_zero(t2_1(2,0)-(2*t2_2(2,0)+t1_2(2)*t1_1(0)),"T2(i,j)+=T2(i,j)(2,0)");
+  test_for_zero(t2_1(2,1)-(2*t2_2(2,1)+t1_2(2)*t1_1(1)),"T2(i,j)+=T2(i,j)(2,1)");
+  test_for_zero(t2_1(2,2)-(2*t2_2(2,2)+t1_2(2)*t1_1(2)),"T2(i,j)+=T2(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XVIII.C
--- a/tests/conformance/T2/test_T2XVIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  /* Equals */
-
-  t2_1(i,j)-=5*t2_2(i,j);
-  test_for_zero(t2_1(0,0)-(-3*t2_2(0,0)+t1_2(0)*t1_1(0)),"T2(i,j)-=T2(i,j)(0,0)");
-  test_for_zero(t2_1(0,1)-(-3*t2_2(0,1)+t1_2(0)*t1_1(1)),"T2(i,j)-=T2(i,j)(0,1)");
-  test_for_zero(t2_1(0,2)-(-3*t2_2(0,2)+t1_2(0)*t1_1(2)),"T2(i,j)-=T2(i,j)(0,2)");
-  test_for_zero(t2_1(1,0)-(-3*t2_2(1,0)+t1_2(1)*t1_1(0)),"T2(i,j)-=T2(i,j)(1,0)");
-  test_for_zero(t2_1(1,1)-(-3*t2_2(1,1)+t1_2(1)*t1_1(1)),"T2(i,j)-=T2(i,j)(1,1)");
-  test_for_zero(t2_1(1,2)-(-3*t2_2(1,2)+t1_2(1)*t1_1(2)),"T2(i,j)-=T2(i,j)(1,2)");
-  test_for_zero(t2_1(2,0)-(-3*t2_2(2,0)+t1_2(2)*t1_1(0)),"T2(i,j)-=T2(i,j)(2,0)");
-  test_for_zero(t2_1(2,1)-(-3*t2_2(2,1)+t1_2(2)*t1_1(1)),"T2(i,j)-=T2(i,j)(2,1)");
-  test_for_zero(t2_1(2,2)-(-3*t2_2(2,2)+t1_2(2)*t1_1(2)),"T2(i,j)-=T2(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XVIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XVIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  /* Equals */
+
+  t2_1(i,j)-=5*t2_2(i,j);
+  test_for_zero(t2_1(0,0)-(-3*t2_2(0,0)+t1_2(0)*t1_1(0)),"T2(i,j)-=T2(i,j)(0,0)");
+  test_for_zero(t2_1(0,1)-(-3*t2_2(0,1)+t1_2(0)*t1_1(1)),"T2(i,j)-=T2(i,j)(0,1)");
+  test_for_zero(t2_1(0,2)-(-3*t2_2(0,2)+t1_2(0)*t1_1(2)),"T2(i,j)-=T2(i,j)(0,2)");
+  test_for_zero(t2_1(1,0)-(-3*t2_2(1,0)+t1_2(1)*t1_1(0)),"T2(i,j)-=T2(i,j)(1,0)");
+  test_for_zero(t2_1(1,1)-(-3*t2_2(1,1)+t1_2(1)*t1_1(1)),"T2(i,j)-=T2(i,j)(1,1)");
+  test_for_zero(t2_1(1,2)-(-3*t2_2(1,2)+t1_2(1)*t1_1(2)),"T2(i,j)-=T2(i,j)(1,2)");
+  test_for_zero(t2_1(2,0)-(-3*t2_2(2,0)+t1_2(2)*t1_1(0)),"T2(i,j)-=T2(i,j)(2,0)");
+  test_for_zero(t2_1(2,1)-(-3*t2_2(2,1)+t1_2(2)*t1_1(1)),"T2(i,j)-=T2(i,j)(2,1)");
+  test_for_zero(t2_1(2,2)-(-3*t2_2(2,2)+t1_2(2)*t1_1(2)),"T2(i,j)-=T2(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XX.C
--- a/tests/conformance/T2/test_T2XX.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  /* Equals */
-
-  /* Switch indices */
-
-  t2_1(j,i)+=t2_2(i,j);
-  test_for_zero(t2_1(0,0)-(2*t2_2(0,0)+t1_2(0)*t1_1(0)),
-		"T2(j,i)+=T2(i,j)(0,0)");
-  test_for_zero(t2_1(1,0)-(2*t2_2(0,1)+t1_2(0)*t1_1(1)),
-		"T2(j,i)+=T2(i,j)(0,1)");
-  test_for_zero(t2_1(2,0)-(2*t2_2(0,2)+t1_2(0)*t1_1(2)),
-		"T2(j,i)+=T2(i,j)(0,2)");
-  test_for_zero(t2_1(0,1)-(2*t2_2(1,0)+t1_2(1)*t1_1(0)),
-		"T2(j,i)+=T2(i,j)(1,0)");
-  test_for_zero(t2_1(1,1)-(2*t2_2(1,1)+t1_2(1)*t1_1(1)),
-		"T2(j,i)+=T2(i,j)(1,1)");
-  test_for_zero(t2_1(2,1)-(2*t2_2(1,2)+t1_2(1)*t1_1(2)),
-		"T2(j,i)+=T2(i,j)(1,2)");
-  test_for_zero(t2_1(0,2)-(2*t2_2(2,0)+t1_2(2)*t1_1(0)),
-		"T2(j,i)+=T2(i,j)(2,0)");
-  test_for_zero(t2_1(1,2)-(2*t2_2(2,1)+t1_2(2)*t1_1(1)),
-		"T2(j,i)+=T2(i,j)(2,1)");
-  test_for_zero(t2_1(2,2)-(2*t2_2(2,2)+t1_2(2)*t1_1(2)),
-		"T2(j,i)+=T2(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XX.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XX.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,51 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  /* Equals */
+
+  /* Switch indices */
+
+  t2_1(j,i)+=t2_2(i,j);
+  test_for_zero(t2_1(0,0)-(2*t2_2(0,0)+t1_2(0)*t1_1(0)),
+		"T2(j,i)+=T2(i,j)(0,0)");
+  test_for_zero(t2_1(1,0)-(2*t2_2(0,1)+t1_2(0)*t1_1(1)),
+		"T2(j,i)+=T2(i,j)(0,1)");
+  test_for_zero(t2_1(2,0)-(2*t2_2(0,2)+t1_2(0)*t1_1(2)),
+		"T2(j,i)+=T2(i,j)(0,2)");
+  test_for_zero(t2_1(0,1)-(2*t2_2(1,0)+t1_2(1)*t1_1(0)),
+		"T2(j,i)+=T2(i,j)(1,0)");
+  test_for_zero(t2_1(1,1)-(2*t2_2(1,1)+t1_2(1)*t1_1(1)),
+		"T2(j,i)+=T2(i,j)(1,1)");
+  test_for_zero(t2_1(2,1)-(2*t2_2(1,2)+t1_2(1)*t1_1(2)),
+		"T2(j,i)+=T2(i,j)(1,2)");
+  test_for_zero(t2_1(0,2)-(2*t2_2(2,0)+t1_2(2)*t1_1(0)),
+		"T2(j,i)+=T2(i,j)(2,0)");
+  test_for_zero(t2_1(1,2)-(2*t2_2(2,1)+t1_2(2)*t1_1(1)),
+		"T2(j,i)+=T2(i,j)(2,1)");
+  test_for_zero(t2_1(2,2)-(2*t2_2(2,2)+t1_2(2)*t1_1(2)),
+		"T2(j,i)+=T2(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXI.C
--- a/tests/conformance/T2/test_T2XXI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  /* Equals */
-
-  /* Switch indices */
-
-  t2_1(j,i)-=5*t2_2(i,j);
-  test_for_zero(t2_1(0,0)-(-3*t2_2(0,0)+t1_2(0)*t1_1(0)),
-		"T2(j,i)-=T2(i,j)(0,0)");
-  test_for_zero(t2_1(1,0)-(-3*t2_2(0,1)+t1_2(0)*t1_1(1)),
-		"T2(j,i)-=T2(i,j)(0,1)");
-  test_for_zero(t2_1(2,0)-(-3*t2_2(0,2)+t1_2(0)*t1_1(2)),
-		"T2(j,i)-=T2(i,j)(0,2)");
-  test_for_zero(t2_1(0,1)-(-3*t2_2(1,0)+t1_2(1)*t1_1(0)),
-		"T2(j,i)-=T2(i,j)(1,0)");
-  test_for_zero(t2_1(1,1)-(-3*t2_2(1,1)+t1_2(1)*t1_1(1)),
-		"T2(j,i)-=T2(i,j)(1,1)");
-  test_for_zero(t2_1(2,1)-(-3*t2_2(1,2)+t1_2(1)*t1_1(2)),
-		"T2(j,i)-=T2(i,j)(1,2)");
-  test_for_zero(t2_1(0,2)-(-3*t2_2(2,0)+t1_2(2)*t1_1(0)),
-		"T2(j,i)-=T2(i,j)(2,0)");
-  test_for_zero(t2_1(1,2)-(-3*t2_2(2,1)+t1_2(2)*t1_1(1)),
-		"T2(j,i)-=T2(i,j)(2,1)");
-  test_for_zero(t2_1(2,2)-(-3*t2_2(2,2)+t1_2(2)*t1_1(2)),
-		"T2(j,i)-=T2(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XXI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,51 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  /* Equals */
+
+  /* Switch indices */
+
+  t2_1(j,i)-=5*t2_2(i,j);
+  test_for_zero(t2_1(0,0)-(-3*t2_2(0,0)+t1_2(0)*t1_1(0)),
+		"T2(j,i)-=T2(i,j)(0,0)");
+  test_for_zero(t2_1(1,0)-(-3*t2_2(0,1)+t1_2(0)*t1_1(1)),
+		"T2(j,i)-=T2(i,j)(0,1)");
+  test_for_zero(t2_1(2,0)-(-3*t2_2(0,2)+t1_2(0)*t1_1(2)),
+		"T2(j,i)-=T2(i,j)(0,2)");
+  test_for_zero(t2_1(0,1)-(-3*t2_2(1,0)+t1_2(1)*t1_1(0)),
+		"T2(j,i)-=T2(i,j)(1,0)");
+  test_for_zero(t2_1(1,1)-(-3*t2_2(1,1)+t1_2(1)*t1_1(1)),
+		"T2(j,i)-=T2(i,j)(1,1)");
+  test_for_zero(t2_1(2,1)-(-3*t2_2(1,2)+t1_2(1)*t1_1(2)),
+		"T2(j,i)-=T2(i,j)(1,2)");
+  test_for_zero(t2_1(0,2)-(-3*t2_2(2,0)+t1_2(2)*t1_1(0)),
+		"T2(j,i)-=T2(i,j)(2,0)");
+  test_for_zero(t2_1(1,2)-(-3*t2_2(2,1)+t1_2(2)*t1_1(1)),
+		"T2(j,i)-=T2(i,j)(2,1)");
+  test_for_zero(t2_1(2,2)-(-3*t2_2(2,2)+t1_2(2)*t1_1(2)),
+		"T2(j,i)-=T2(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXII.C
--- a/tests/conformance/T2/test_T2XXII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  /* Equals */
-
-  t2_1(i,j)+=10;
-  test_for_zero(t2_1(0,0)-(-3*t2_2(0,0)+t1_2(0)*t1_1(0)+10),"T2+=T(0,0)");
-  test_for_zero(t2_1(1,0)-(-3*t2_2(0,1)+t1_2(0)*t1_1(1)+10),"T2+=T(0,1)");
-  test_for_zero(t2_1(2,0)-(-3*t2_2(0,2)+t1_2(0)*t1_1(2)+10),"T2+=T(0,2)");
-  test_for_zero(t2_1(0,1)-(-3*t2_2(1,0)+t1_2(1)*t1_1(0)+10),"T2+=T(1,0)");
-  test_for_zero(t2_1(1,1)-(-3*t2_2(1,1)+t1_2(1)*t1_1(1)+10),"T2+=T(1,1)");
-  test_for_zero(t2_1(2,1)-(-3*t2_2(1,2)+t1_2(1)*t1_1(2)+10),"T2+=T(1,2)");
-  test_for_zero(t2_1(0,2)-(-3*t2_2(2,0)+t1_2(2)*t1_1(0)+10),"T2+=T(2,0)");
-  test_for_zero(t2_1(1,2)-(-3*t2_2(2,1)+t1_2(2)*t1_1(1)+10),"T2+=T(2,1)");
-  test_for_zero(t2_1(2,2)-(-3*t2_2(2,2)+t1_2(2)*t1_1(2)+10),"T2+=T(2,2)");
-
-  t2_1(i,j)-=7;
-  test_for_zero(t2_1(0,0)-(-3*t2_2(0,0)+t1_2(0)*t1_1(0)+3),"T2-=T(0,0)");
-  test_for_zero(t2_1(1,0)-(-3*t2_2(0,1)+t1_2(0)*t1_1(1)+3),"T2-=T(0,1)");
-  test_for_zero(t2_1(2,0)-(-3*t2_2(0,2)+t1_2(0)*t1_1(2)+3),"T2-=T(0,2)");
-  test_for_zero(t2_1(0,1)-(-3*t2_2(1,0)+t1_2(1)*t1_1(0)+3),"T2-=T(1,0)");
-  test_for_zero(t2_1(1,1)-(-3*t2_2(1,1)+t1_2(1)*t1_1(1)+3),"T2-=T(1,1)");
-  test_for_zero(t2_1(2,1)-(-3*t2_2(1,2)+t1_2(1)*t1_1(2)+3),"T2-=T(1,2)");
-  test_for_zero(t2_1(0,2)-(-3*t2_2(2,0)+t1_2(2)*t1_1(0)+3),"T2-=T(2,0)");
-  test_for_zero(t2_1(1,2)-(-3*t2_2(2,1)+t1_2(2)*t1_1(1)+3),"T2-=T(2,1)");
-  test_for_zero(t2_1(2,2)-(-3*t2_2(2,2)+t1_2(2)*t1_1(2)+3),"T2-=T(2,2)");
-
-  t2_1(i,j)*=12;
-  test_for_zero(t2_1(0,0)-(-3*t2_2(0,0)+t1_2(0)*t1_1(0)+3)*12,"T2*=T(0,0)");
-  test_for_zero(t2_1(1,0)-(-3*t2_2(0,1)+t1_2(0)*t1_1(1)+3)*12,"T2*=T(0,1)");
-  test_for_zero(t2_1(2,0)-(-3*t2_2(0,2)+t1_2(0)*t1_1(2)+3)*12,"T2*=T(0,2)");
-  test_for_zero(t2_1(0,1)-(-3*t2_2(1,0)+t1_2(1)*t1_1(0)+3)*12,"T2*=T(1,0)");
-  test_for_zero(t2_1(1,1)-(-3*t2_2(1,1)+t1_2(1)*t1_1(1)+3)*12,"T2*=T(1,1)");
-  test_for_zero(t2_1(2,1)-(-3*t2_2(1,2)+t1_2(1)*t1_1(2)+3)*12,"T2*=T(1,2)");
-  test_for_zero(t2_1(0,2)-(-3*t2_2(2,0)+t1_2(2)*t1_1(0)+3)*12,"T2*=T(2,0)");
-  test_for_zero(t2_1(1,2)-(-3*t2_2(2,1)+t1_2(2)*t1_1(1)+3)*12,"T2*=T(2,1)");
-  test_for_zero(t2_1(2,2)-(-3*t2_2(2,2)+t1_2(2)*t1_1(2)+3)*12,"T2*=T(2,2)");
-
-  t2_1(i,j)/=4;
-  test_for_zero(t2_1(0,0)-(-3*t2_2(0,0)+t1_2(0)*t1_1(0)+3)*3,"T2/=T(0,0)");
-  test_for_zero(t2_1(1,0)-(-3*t2_2(0,1)+t1_2(0)*t1_1(1)+3)*3,"T2/=T(0,1)");
-  test_for_zero(t2_1(2,0)-(-3*t2_2(0,2)+t1_2(0)*t1_1(2)+3)*3,"T2/=T(0,2)");
-  test_for_zero(t2_1(0,1)-(-3*t2_2(1,0)+t1_2(1)*t1_1(0)+3)*3,"T2/=T(1,0)");
-  test_for_zero(t2_1(1,1)-(-3*t2_2(1,1)+t1_2(1)*t1_1(1)+3)*3,"T2/=T(1,1)");
-  test_for_zero(t2_1(2,1)-(-3*t2_2(1,2)+t1_2(1)*t1_1(2)+3)*3,"T2/=T(1,2)");
-  test_for_zero(t2_1(0,2)-(-3*t2_2(2,0)+t1_2(2)*t1_1(0)+3)*3,"T2/=T(2,0)");
-  test_for_zero(t2_1(1,2)-(-3*t2_2(2,1)+t1_2(2)*t1_1(1)+3)*3,"T2/=T(2,1)");
-  test_for_zero(t2_1(2,2)-(-3*t2_2(2,2)+t1_2(2)*t1_1(2)+3)*3,"T2/=T(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XXII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,73 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  /* Equals */
+
+  t2_1(i,j)+=10;
+  test_for_zero(t2_1(0,0)-(-3*t2_2(0,0)+t1_2(0)*t1_1(0)+10),"T2+=T(0,0)");
+  test_for_zero(t2_1(1,0)-(-3*t2_2(0,1)+t1_2(0)*t1_1(1)+10),"T2+=T(0,1)");
+  test_for_zero(t2_1(2,0)-(-3*t2_2(0,2)+t1_2(0)*t1_1(2)+10),"T2+=T(0,2)");
+  test_for_zero(t2_1(0,1)-(-3*t2_2(1,0)+t1_2(1)*t1_1(0)+10),"T2+=T(1,0)");
+  test_for_zero(t2_1(1,1)-(-3*t2_2(1,1)+t1_2(1)*t1_1(1)+10),"T2+=T(1,1)");
+  test_for_zero(t2_1(2,1)-(-3*t2_2(1,2)+t1_2(1)*t1_1(2)+10),"T2+=T(1,2)");
+  test_for_zero(t2_1(0,2)-(-3*t2_2(2,0)+t1_2(2)*t1_1(0)+10),"T2+=T(2,0)");
+  test_for_zero(t2_1(1,2)-(-3*t2_2(2,1)+t1_2(2)*t1_1(1)+10),"T2+=T(2,1)");
+  test_for_zero(t2_1(2,2)-(-3*t2_2(2,2)+t1_2(2)*t1_1(2)+10),"T2+=T(2,2)");
+
+  t2_1(i,j)-=7;
+  test_for_zero(t2_1(0,0)-(-3*t2_2(0,0)+t1_2(0)*t1_1(0)+3),"T2-=T(0,0)");
+  test_for_zero(t2_1(1,0)-(-3*t2_2(0,1)+t1_2(0)*t1_1(1)+3),"T2-=T(0,1)");
+  test_for_zero(t2_1(2,0)-(-3*t2_2(0,2)+t1_2(0)*t1_1(2)+3),"T2-=T(0,2)");
+  test_for_zero(t2_1(0,1)-(-3*t2_2(1,0)+t1_2(1)*t1_1(0)+3),"T2-=T(1,0)");
+  test_for_zero(t2_1(1,1)-(-3*t2_2(1,1)+t1_2(1)*t1_1(1)+3),"T2-=T(1,1)");
+  test_for_zero(t2_1(2,1)-(-3*t2_2(1,2)+t1_2(1)*t1_1(2)+3),"T2-=T(1,2)");
+  test_for_zero(t2_1(0,2)-(-3*t2_2(2,0)+t1_2(2)*t1_1(0)+3),"T2-=T(2,0)");
+  test_for_zero(t2_1(1,2)-(-3*t2_2(2,1)+t1_2(2)*t1_1(1)+3),"T2-=T(2,1)");
+  test_for_zero(t2_1(2,2)-(-3*t2_2(2,2)+t1_2(2)*t1_1(2)+3),"T2-=T(2,2)");
+
+  t2_1(i,j)*=12;
+  test_for_zero(t2_1(0,0)-(-3*t2_2(0,0)+t1_2(0)*t1_1(0)+3)*12,"T2*=T(0,0)");
+  test_for_zero(t2_1(1,0)-(-3*t2_2(0,1)+t1_2(0)*t1_1(1)+3)*12,"T2*=T(0,1)");
+  test_for_zero(t2_1(2,0)-(-3*t2_2(0,2)+t1_2(0)*t1_1(2)+3)*12,"T2*=T(0,2)");
+  test_for_zero(t2_1(0,1)-(-3*t2_2(1,0)+t1_2(1)*t1_1(0)+3)*12,"T2*=T(1,0)");
+  test_for_zero(t2_1(1,1)-(-3*t2_2(1,1)+t1_2(1)*t1_1(1)+3)*12,"T2*=T(1,1)");
+  test_for_zero(t2_1(2,1)-(-3*t2_2(1,2)+t1_2(1)*t1_1(2)+3)*12,"T2*=T(1,2)");
+  test_for_zero(t2_1(0,2)-(-3*t2_2(2,0)+t1_2(2)*t1_1(0)+3)*12,"T2*=T(2,0)");
+  test_for_zero(t2_1(1,2)-(-3*t2_2(2,1)+t1_2(2)*t1_1(1)+3)*12,"T2*=T(2,1)");
+  test_for_zero(t2_1(2,2)-(-3*t2_2(2,2)+t1_2(2)*t1_1(2)+3)*12,"T2*=T(2,2)");
+
+  t2_1(i,j)/=4;
+  test_for_zero(t2_1(0,0)-(-3*t2_2(0,0)+t1_2(0)*t1_1(0)+3)*3,"T2/=T(0,0)");
+  test_for_zero(t2_1(1,0)-(-3*t2_2(0,1)+t1_2(0)*t1_1(1)+3)*3,"T2/=T(0,1)");
+  test_for_zero(t2_1(2,0)-(-3*t2_2(0,2)+t1_2(0)*t1_1(2)+3)*3,"T2/=T(0,2)");
+  test_for_zero(t2_1(0,1)-(-3*t2_2(1,0)+t1_2(1)*t1_1(0)+3)*3,"T2/=T(1,0)");
+  test_for_zero(t2_1(1,1)-(-3*t2_2(1,1)+t1_2(1)*t1_1(1)+3)*3,"T2/=T(1,1)");
+  test_for_zero(t2_1(2,1)-(-3*t2_2(1,2)+t1_2(1)*t1_1(2)+3)*3,"T2/=T(1,2)");
+  test_for_zero(t2_1(0,2)-(-3*t2_2(2,0)+t1_2(2)*t1_1(0)+3)*3,"T2/=T(2,0)");
+  test_for_zero(t2_1(1,2)-(-3*t2_2(2,1)+t1_2(2)*t1_1(1)+3)*3,"T2/=T(2,1)");
+  test_for_zero(t2_1(2,2)-(-3*t2_2(2,2)+t1_2(2)*t1_1(2)+3)*3,"T2/=T(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXIII.C
--- a/tests/conformance/T2/test_T2XXIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  /* Tensor2*Tensor1 */
-
-  t1_1(i)=t2_2(i,j)*t1_2(j);
-  test_for_zero(t1_1(0)-(t2_2(0,0)*t1_2(0) + t2_2(0,1)*t1_2(1)
-			 + t2_2(0,2)*t1_2(2)),"T2(i,j)*T1(j)(0)");
-  test_for_zero(t1_1(1)-(t2_2(1,0)*t1_2(0) + t2_2(1,1)*t1_2(1)
-			 + t2_2(1,2)*t1_2(2)),"T2(i,j)*T1(j)(1)");
-  test_for_zero(t1_1(2)-(t2_2(2,0)*t1_2(0) + t2_2(2,1)*t1_2(1)
-			 + t2_2(2,2)*t1_2(2)),"T2(i,j)*T1(j)(2)");
-
-  t1_1(i)=t1_2(j)*t2_2(i,j);
-  test_for_zero(t1_1(0)-(t2_2(0,0)*t1_2(0) + t2_2(0,1)*t1_2(1)
-			 + t2_2(0,2)*t1_2(2)),"T1(j)*T2(i,j)(0)");
-  test_for_zero(t1_1(1)-(t2_2(1,0)*t1_2(0) + t2_2(1,1)*t1_2(1)
-			 + t2_2(1,2)*t1_2(2)),"T1(j)*T2(i,j)(1)");
-  test_for_zero(t1_1(2)-(t2_2(2,0)*t1_2(0) + t2_2(2,1)*t1_2(1)
-			 + t2_2(2,2)*t1_2(2)),"T1(j)*T2(i,j)(2)");
-
-  t1_1(j)=t2_2(i,j)*t1_2(i);
-  test_for_zero(t1_1(0)-(t2_2(0,0)*t1_2(0) + t2_2(1,0)*t1_2(1)
-			 + t2_2(2,0)*t1_2(2)),"T2(i,j)*T1(i)(0)");
-  test_for_zero(t1_1(1)-(t2_2(0,1)*t1_2(0) + t2_2(1,1)*t1_2(1)
-			 + t2_2(2,1)*t1_2(2)),"T2(i,j)*T1(i)(1)");
-  test_for_zero(t1_1(2)-(t2_2(0,2)*t1_2(0) + t2_2(1,2)*t1_2(1)
-			 + t2_2(2,2)*t1_2(2)),"T2(i,j)*T1(i)(2)");
-
-  t1_1(j)=t1_2(i)*t2_2(i,j);
-  test_for_zero(t1_1(0)-(t2_2(0,0)*t1_2(0) + t2_2(1,0)*t1_2(1)
-			 + t2_2(2,0)*t1_2(2)),"T1(i)*T2(i,j)(0)");
-  test_for_zero(t1_1(1)-(t2_2(0,1)*t1_2(0) + t2_2(1,1)*t1_2(1)
-			 + t2_2(2,1)*t1_2(2)),"T1(i)*T2(i,j)(1)");
-  test_for_zero(t1_1(2)-(t2_2(0,2)*t1_2(0) + t2_2(1,2)*t1_2(1)
-			 + t2_2(2,2)*t1_2(2)),"T1(i)*T2(i,j)(2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XXIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,61 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  /* Tensor2*Tensor1 */
+
+  t1_1(i)=t2_2(i,j)*t1_2(j);
+  test_for_zero(t1_1(0)-(t2_2(0,0)*t1_2(0) + t2_2(0,1)*t1_2(1)
+			 + t2_2(0,2)*t1_2(2)),"T2(i,j)*T1(j)(0)");
+  test_for_zero(t1_1(1)-(t2_2(1,0)*t1_2(0) + t2_2(1,1)*t1_2(1)
+			 + t2_2(1,2)*t1_2(2)),"T2(i,j)*T1(j)(1)");
+  test_for_zero(t1_1(2)-(t2_2(2,0)*t1_2(0) + t2_2(2,1)*t1_2(1)
+			 + t2_2(2,2)*t1_2(2)),"T2(i,j)*T1(j)(2)");
+
+  t1_1(i)=t1_2(j)*t2_2(i,j);
+  test_for_zero(t1_1(0)-(t2_2(0,0)*t1_2(0) + t2_2(0,1)*t1_2(1)
+			 + t2_2(0,2)*t1_2(2)),"T1(j)*T2(i,j)(0)");
+  test_for_zero(t1_1(1)-(t2_2(1,0)*t1_2(0) + t2_2(1,1)*t1_2(1)
+			 + t2_2(1,2)*t1_2(2)),"T1(j)*T2(i,j)(1)");
+  test_for_zero(t1_1(2)-(t2_2(2,0)*t1_2(0) + t2_2(2,1)*t1_2(1)
+			 + t2_2(2,2)*t1_2(2)),"T1(j)*T2(i,j)(2)");
+
+  t1_1(j)=t2_2(i,j)*t1_2(i);
+  test_for_zero(t1_1(0)-(t2_2(0,0)*t1_2(0) + t2_2(1,0)*t1_2(1)
+			 + t2_2(2,0)*t1_2(2)),"T2(i,j)*T1(i)(0)");
+  test_for_zero(t1_1(1)-(t2_2(0,1)*t1_2(0) + t2_2(1,1)*t1_2(1)
+			 + t2_2(2,1)*t1_2(2)),"T2(i,j)*T1(i)(1)");
+  test_for_zero(t1_1(2)-(t2_2(0,2)*t1_2(0) + t2_2(1,2)*t1_2(1)
+			 + t2_2(2,2)*t1_2(2)),"T2(i,j)*T1(i)(2)");
+
+  t1_1(j)=t1_2(i)*t2_2(i,j);
+  test_for_zero(t1_1(0)-(t2_2(0,0)*t1_2(0) + t2_2(1,0)*t1_2(1)
+			 + t2_2(2,0)*t1_2(2)),"T1(i)*T2(i,j)(0)");
+  test_for_zero(t1_1(1)-(t2_2(0,1)*t1_2(0) + t2_2(1,1)*t1_2(1)
+			 + t2_2(2,1)*t1_2(2)),"T1(i)*T2(i,j)(1)");
+  test_for_zero(t1_1(2)-(t2_2(0,2)*t1_2(0) + t2_2(1,2)*t1_2(1)
+			 + t2_2(2,2)*t1_2(2)),"T1(i)*T2(i,j)(2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXIV.C
--- a/tests/conformance/T2/test_T2XXIV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,139 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  /* Tensor2*Tensor1 */
-
-  test_for_zero((t2_2(i,j)*t1_2(k))(0,0,0) - t2_2(0,0)*t1_2(0),
-		"T2(i,j)*T1(k)(0,0,0)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(0,0,1) - t2_2(0,0)*t1_2(1),
-		"T2(i,j)*T1(k)(0,0,1)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(0,0,2) - t2_2(0,0)*t1_2(2),
-		"T2(i,j)*T1(k)(0,0,2)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(0,1,0) - t2_2(0,1)*t1_2(0),
-		"T2(i,j)*T1(k)(0,1,0)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(0,1,1) - t2_2(0,1)*t1_2(1),
-		"T2(i,j)*T1(k)(0,1,1)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(0,1,2) - t2_2(0,1)*t1_2(2),
-		"T2(i,j)*T1(k)(0,1,2)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(0,2,0) - t2_2(0,2)*t1_2(0),
-		"T2(i,j)*T1(k)(0,2,0)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(0,2,1) - t2_2(0,2)*t1_2(1),
-		"T2(i,j)*T1(k)(0,2,1)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(0,2,2) - t2_2(0,2)*t1_2(2),
-		"T2(i,j)*T1(k)(0,2,2)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(1,0,0) - t2_2(1,0)*t1_2(0),
-		"T2(i,j)*T1(k)(1,0,0)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(1,0,1) - t2_2(1,0)*t1_2(1),
-		"T2(i,j)*T1(k)(1,0,1)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(1,0,2) - t2_2(1,0)*t1_2(2),
-		"T2(i,j)*T1(k)(1,0,2)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(1,1,0) - t2_2(1,1)*t1_2(0),
-		"T2(i,j)*T1(k)(1,1,0)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(1,1,1) - t2_2(1,1)*t1_2(1),
-		"T2(i,j)*T1(k)(1,1,1)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(1,1,2) - t2_2(1,1)*t1_2(2),
-		"T2(i,j)*T1(k)(1,1,2)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(1,2,0) - t2_2(1,2)*t1_2(0),
-		"T2(i,j)*T1(k)(1,2,0)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(1,2,1) - t2_2(1,2)*t1_2(1),
-		"T2(i,j)*T1(k)(1,2,1)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(1,2,2) - t2_2(1,2)*t1_2(2),
-		"T2(i,j)*T1(k)(1,2,2)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(2,0,0) - t2_2(2,0)*t1_2(0),
-		"T2(i,j)*T1(k)(2,0,0)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(2,0,1) - t2_2(2,0)*t1_2(1),
-		"T2(i,j)*T1(k)(2,0,1)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(2,0,2) - t2_2(2,0)*t1_2(2),
-		"T2(i,j)*T1(k)(2,0,2)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(2,1,0) - t2_2(2,1)*t1_2(0),
-		"T2(i,j)*T1(k)(2,1,0)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(2,1,1) - t2_2(2,1)*t1_2(1),
-		"T2(i,j)*T1(k)(2,1,1)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(2,1,2) - t2_2(2,1)*t1_2(2),
-		"T2(i,j)*T1(k)(2,1,2)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(2,2,0) - t2_2(2,2)*t1_2(0),
-		"T2(i,j)*T1(k)(2,2,0)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(2,2,1) - t2_2(2,2)*t1_2(1),
-		"T2(i,j)*T1(k)(2,2,1)");
-  test_for_zero((t2_2(i,j)*t1_2(k))(2,2,2) - t2_2(2,2)*t1_2(2),
-		"T2(i,j)*T1(k)(2,2,2)");
-
-  test_for_zero((t1_2(k)*t2_2(i,j))(0,0,0) - t2_2(0,0)*t1_2(0),
-		"T1(k)*T2(i,j)(0,0,0)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(0,0,1) - t2_2(0,0)*t1_2(1),
-		"T1(k)*T2(i,j)(0,0,1)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(0,0,2) - t2_2(0,0)*t1_2(2),
-		"T1(k)*T2(i,j)(0,0,2)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(0,1,0) - t2_2(0,1)*t1_2(0),
-		"T1(k)*T2(i,j)(0,1,0)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(0,1,1) - t2_2(0,1)*t1_2(1),
-		"T1(k)*T2(i,j)(0,1,1)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(0,1,2) - t2_2(0,1)*t1_2(2),
-		"T1(k)*T2(i,j)(0,1,2)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(0,2,0) - t2_2(0,2)*t1_2(0),
-		"T1(k)*T2(i,j)(0,2,0)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(0,2,1) - t2_2(0,2)*t1_2(1),
-		"T1(k)*T2(i,j)(0,2,1)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(0,2,2) - t2_2(0,2)*t1_2(2),
-		"T1(k)*T2(i,j)(0,2,2)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(1,0,0) - t2_2(1,0)*t1_2(0),
-		"T1(k)*T2(i,j)(1,0,0)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(1,0,1) - t2_2(1,0)*t1_2(1),
-		"T1(k)*T2(i,j)(1,0,1)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(1,0,2) - t2_2(1,0)*t1_2(2),
-		"T1(k)*T2(i,j)(1,0,2)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(1,1,0) - t2_2(1,1)*t1_2(0),
-		"T1(k)*T2(i,j)(1,1,0)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(1,1,1) - t2_2(1,1)*t1_2(1),
-		"T1(k)*T2(i,j)(1,1,1)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(1,1,2) - t2_2(1,1)*t1_2(2),
-		"T1(k)*T2(i,j)(1,1,2)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(1,2,0) - t2_2(1,2)*t1_2(0),
-		"T1(k)*T2(i,j)(1,2,0)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(1,2,1) - t2_2(1,2)*t1_2(1),
-		"T1(k)*T2(i,j)(1,2,1)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(1,2,2) - t2_2(1,2)*t1_2(2),
-		"T1(k)*T2(i,j)(1,2,2)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(2,0,0) - t2_2(2,0)*t1_2(0),
-		"T1(k)*T2(i,j)(2,0,0)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(2,0,1) - t2_2(2,0)*t1_2(1),
-		"T1(k)*T2(i,j)(2,0,1)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(2,0,2) - t2_2(2,0)*t1_2(2),
-		"T1(k)*T2(i,j)(2,0,2)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(2,1,0) - t2_2(2,1)*t1_2(0),
-		"T1(k)*T2(i,j)(2,1,0)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(2,1,1) - t2_2(2,1)*t1_2(1),
-		"T1(k)*T2(i,j)(2,1,1)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(2,1,2) - t2_2(2,1)*t1_2(2),
-		"T1(k)*T2(i,j)(2,1,2)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(2,2,0) - t2_2(2,2)*t1_2(0),
-		"T1(k)*T2(i,j)(2,2,0)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(2,2,1) - t2_2(2,2)*t1_2(1),
-		"T1(k)*T2(i,j)(2,2,1)");
-  test_for_zero((t1_2(k)*t2_2(i,j))(2,2,2) - t2_2(2,2)*t1_2(2),
-		"T1(k)*T2(i,j)(2,2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXIV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XXIV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,139 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  /* Tensor2*Tensor1 */
+
+  test_for_zero((t2_2(i,j)*t1_2(k))(0,0,0) - t2_2(0,0)*t1_2(0),
+		"T2(i,j)*T1(k)(0,0,0)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(0,0,1) - t2_2(0,0)*t1_2(1),
+		"T2(i,j)*T1(k)(0,0,1)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(0,0,2) - t2_2(0,0)*t1_2(2),
+		"T2(i,j)*T1(k)(0,0,2)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(0,1,0) - t2_2(0,1)*t1_2(0),
+		"T2(i,j)*T1(k)(0,1,0)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(0,1,1) - t2_2(0,1)*t1_2(1),
+		"T2(i,j)*T1(k)(0,1,1)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(0,1,2) - t2_2(0,1)*t1_2(2),
+		"T2(i,j)*T1(k)(0,1,2)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(0,2,0) - t2_2(0,2)*t1_2(0),
+		"T2(i,j)*T1(k)(0,2,0)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(0,2,1) - t2_2(0,2)*t1_2(1),
+		"T2(i,j)*T1(k)(0,2,1)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(0,2,2) - t2_2(0,2)*t1_2(2),
+		"T2(i,j)*T1(k)(0,2,2)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(1,0,0) - t2_2(1,0)*t1_2(0),
+		"T2(i,j)*T1(k)(1,0,0)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(1,0,1) - t2_2(1,0)*t1_2(1),
+		"T2(i,j)*T1(k)(1,0,1)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(1,0,2) - t2_2(1,0)*t1_2(2),
+		"T2(i,j)*T1(k)(1,0,2)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(1,1,0) - t2_2(1,1)*t1_2(0),
+		"T2(i,j)*T1(k)(1,1,0)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(1,1,1) - t2_2(1,1)*t1_2(1),
+		"T2(i,j)*T1(k)(1,1,1)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(1,1,2) - t2_2(1,1)*t1_2(2),
+		"T2(i,j)*T1(k)(1,1,2)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(1,2,0) - t2_2(1,2)*t1_2(0),
+		"T2(i,j)*T1(k)(1,2,0)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(1,2,1) - t2_2(1,2)*t1_2(1),
+		"T2(i,j)*T1(k)(1,2,1)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(1,2,2) - t2_2(1,2)*t1_2(2),
+		"T2(i,j)*T1(k)(1,2,2)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(2,0,0) - t2_2(2,0)*t1_2(0),
+		"T2(i,j)*T1(k)(2,0,0)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(2,0,1) - t2_2(2,0)*t1_2(1),
+		"T2(i,j)*T1(k)(2,0,1)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(2,0,2) - t2_2(2,0)*t1_2(2),
+		"T2(i,j)*T1(k)(2,0,2)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(2,1,0) - t2_2(2,1)*t1_2(0),
+		"T2(i,j)*T1(k)(2,1,0)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(2,1,1) - t2_2(2,1)*t1_2(1),
+		"T2(i,j)*T1(k)(2,1,1)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(2,1,2) - t2_2(2,1)*t1_2(2),
+		"T2(i,j)*T1(k)(2,1,2)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(2,2,0) - t2_2(2,2)*t1_2(0),
+		"T2(i,j)*T1(k)(2,2,0)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(2,2,1) - t2_2(2,2)*t1_2(1),
+		"T2(i,j)*T1(k)(2,2,1)");
+  test_for_zero((t2_2(i,j)*t1_2(k))(2,2,2) - t2_2(2,2)*t1_2(2),
+		"T2(i,j)*T1(k)(2,2,2)");
+
+  test_for_zero((t1_2(k)*t2_2(i,j))(0,0,0) - t2_2(0,0)*t1_2(0),
+		"T1(k)*T2(i,j)(0,0,0)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(0,0,1) - t2_2(0,0)*t1_2(1),
+		"T1(k)*T2(i,j)(0,0,1)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(0,0,2) - t2_2(0,0)*t1_2(2),
+		"T1(k)*T2(i,j)(0,0,2)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(0,1,0) - t2_2(0,1)*t1_2(0),
+		"T1(k)*T2(i,j)(0,1,0)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(0,1,1) - t2_2(0,1)*t1_2(1),
+		"T1(k)*T2(i,j)(0,1,1)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(0,1,2) - t2_2(0,1)*t1_2(2),
+		"T1(k)*T2(i,j)(0,1,2)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(0,2,0) - t2_2(0,2)*t1_2(0),
+		"T1(k)*T2(i,j)(0,2,0)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(0,2,1) - t2_2(0,2)*t1_2(1),
+		"T1(k)*T2(i,j)(0,2,1)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(0,2,2) - t2_2(0,2)*t1_2(2),
+		"T1(k)*T2(i,j)(0,2,2)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(1,0,0) - t2_2(1,0)*t1_2(0),
+		"T1(k)*T2(i,j)(1,0,0)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(1,0,1) - t2_2(1,0)*t1_2(1),
+		"T1(k)*T2(i,j)(1,0,1)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(1,0,2) - t2_2(1,0)*t1_2(2),
+		"T1(k)*T2(i,j)(1,0,2)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(1,1,0) - t2_2(1,1)*t1_2(0),
+		"T1(k)*T2(i,j)(1,1,0)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(1,1,1) - t2_2(1,1)*t1_2(1),
+		"T1(k)*T2(i,j)(1,1,1)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(1,1,2) - t2_2(1,1)*t1_2(2),
+		"T1(k)*T2(i,j)(1,1,2)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(1,2,0) - t2_2(1,2)*t1_2(0),
+		"T1(k)*T2(i,j)(1,2,0)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(1,2,1) - t2_2(1,2)*t1_2(1),
+		"T1(k)*T2(i,j)(1,2,1)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(1,2,2) - t2_2(1,2)*t1_2(2),
+		"T1(k)*T2(i,j)(1,2,2)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(2,0,0) - t2_2(2,0)*t1_2(0),
+		"T1(k)*T2(i,j)(2,0,0)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(2,0,1) - t2_2(2,0)*t1_2(1),
+		"T1(k)*T2(i,j)(2,0,1)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(2,0,2) - t2_2(2,0)*t1_2(2),
+		"T1(k)*T2(i,j)(2,0,2)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(2,1,0) - t2_2(2,1)*t1_2(0),
+		"T1(k)*T2(i,j)(2,1,0)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(2,1,1) - t2_2(2,1)*t1_2(1),
+		"T1(k)*T2(i,j)(2,1,1)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(2,1,2) - t2_2(2,1)*t1_2(2),
+		"T1(k)*T2(i,j)(2,1,2)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(2,2,0) - t2_2(2,2)*t1_2(0),
+		"T1(k)*T2(i,j)(2,2,0)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(2,2,1) - t2_2(2,2)*t1_2(1),
+		"T1(k)*T2(i,j)(2,2,1)");
+  test_for_zero((t1_2(k)*t2_2(i,j))(2,2,2) - t2_2(2,2)*t1_2(2),
+		"T1(k)*T2(i,j)(2,2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXIX.C
--- a/tests/conformance/T2/test_T2XXIX.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  /* Tensor2*Tensor2 */
-
-  t2_1(j,k)=t2_2(i,j)*t2_3(k,i);
-  test_for_zero(t2_1(0,0) - (t2_2(0,0)*t2_3(0,0) + t2_2(1,0)*t2_3(0,1)
-			     + t2_2(2,0)*t2_3(0,2)),"T2(i,j)*T2(k,i)(0,0)");
-  test_for_zero(t2_1(0,1) - (t2_2(0,0)*t2_3(1,0) + t2_2(1,0)*t2_3(1,1)
-			     + t2_2(2,0)*t2_3(1,2)),"T2(i,j)*T2(k,i)(0,1)");
-  test_for_zero(t2_1(0,2) - (t2_2(0,0)*t2_3(2,0) + t2_2(1,0)*t2_3(2,1)
-			     + t2_2(2,0)*t2_3(2,2)),"T2(i,j)*T2(k,i)(0,2)");
-  test_for_zero(t2_1(1,0) - (t2_2(0,1)*t2_3(0,0) + t2_2(1,1)*t2_3(0,1)
-			     + t2_2(2,1)*t2_3(0,2)),"T2(i,j)*T2(k,i)(1,0)");
-  test_for_zero(t2_1(1,1) - (t2_2(0,1)*t2_3(1,0) + t2_2(1,1)*t2_3(1,1)
-			     + t2_2(2,1)*t2_3(1,2)),"T2(i,j)*T2(k,i)(1,1)");
-  test_for_zero(t2_1(1,2) - (t2_2(0,1)*t2_3(2,0) + t2_2(1,1)*t2_3(2,1)
-			     + t2_2(2,1)*t2_3(2,2)),"T2(i,j)*T2(k,i)(1,2)");
-  test_for_zero(t2_1(2,0) - (t2_2(0,2)*t2_3(0,0) + t2_2(1,2)*t2_3(0,1)
-			     + t2_2(2,2)*t2_3(0,2)),"T2(i,j)*T2(k,i)(2,0)");
-  test_for_zero(t2_1(2,1) - (t2_2(0,2)*t2_3(1,0) + t2_2(1,2)*t2_3(1,1)
-			     + t2_2(2,2)*t2_3(1,2)),"T2(i,j)*T2(k,i)(2,1)");
-  test_for_zero(t2_1(2,2) - (t2_2(0,2)*t2_3(2,0) + t2_2(1,2)*t2_3(2,1)
-			     + t2_2(2,2)*t2_3(2,2)),"T2(i,j)*T2(k,i)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXIX.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XXIX.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,49 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  /* Tensor2*Tensor2 */
+
+  t2_1(j,k)=t2_2(i,j)*t2_3(k,i);
+  test_for_zero(t2_1(0,0) - (t2_2(0,0)*t2_3(0,0) + t2_2(1,0)*t2_3(0,1)
+			     + t2_2(2,0)*t2_3(0,2)),"T2(i,j)*T2(k,i)(0,0)");
+  test_for_zero(t2_1(0,1) - (t2_2(0,0)*t2_3(1,0) + t2_2(1,0)*t2_3(1,1)
+			     + t2_2(2,0)*t2_3(1,2)),"T2(i,j)*T2(k,i)(0,1)");
+  test_for_zero(t2_1(0,2) - (t2_2(0,0)*t2_3(2,0) + t2_2(1,0)*t2_3(2,1)
+			     + t2_2(2,0)*t2_3(2,2)),"T2(i,j)*T2(k,i)(0,2)");
+  test_for_zero(t2_1(1,0) - (t2_2(0,1)*t2_3(0,0) + t2_2(1,1)*t2_3(0,1)
+			     + t2_2(2,1)*t2_3(0,2)),"T2(i,j)*T2(k,i)(1,0)");
+  test_for_zero(t2_1(1,1) - (t2_2(0,1)*t2_3(1,0) + t2_2(1,1)*t2_3(1,1)
+			     + t2_2(2,1)*t2_3(1,2)),"T2(i,j)*T2(k,i)(1,1)");
+  test_for_zero(t2_1(1,2) - (t2_2(0,1)*t2_3(2,0) + t2_2(1,1)*t2_3(2,1)
+			     + t2_2(2,1)*t2_3(2,2)),"T2(i,j)*T2(k,i)(1,2)");
+  test_for_zero(t2_1(2,0) - (t2_2(0,2)*t2_3(0,0) + t2_2(1,2)*t2_3(0,1)
+			     + t2_2(2,2)*t2_3(0,2)),"T2(i,j)*T2(k,i)(2,0)");
+  test_for_zero(t2_1(2,1) - (t2_2(0,2)*t2_3(1,0) + t2_2(1,2)*t2_3(1,1)
+			     + t2_2(2,2)*t2_3(1,2)),"T2(i,j)*T2(k,i)(2,1)");
+  test_for_zero(t2_1(2,2) - (t2_2(0,2)*t2_3(2,0) + t2_2(1,2)*t2_3(2,1)
+			     + t2_2(2,2)*t2_3(2,2)),"T2(i,j)*T2(k,i)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXV.C
--- a/tests/conformance/T2/test_T2XXV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  /* Tensor2*Tensor2 */
-
-  test_for_zero
-    (t2_1(i,j)*t2_2(i,j)
-     -(t2_1(0,0)*t2_2(0,0) + t2_1(0,1)*t2_2(0,1) + t2_1(0,2)*t2_2(0,2)
-       + t2_1(1,0)*t2_2(1,0) + t2_1(1,1)*t2_2(1,1) + t2_1(1,2)*t2_2(1,2)
-       + t2_1(2,0)*t2_2(2,0) + t2_1(2,1)*t2_2(2,1) + t2_1(2,2)*t2_2(2,2)),
-     "T2(i,j)*T2(i,j)");
-  
-  test_for_zero
-    (t2_1(i,j)*t2_2(j,i)
-     -(t2_1(0,0)*t2_2(0,0) + t2_1(0,1)*t2_2(1,0) + t2_1(0,2)*t2_2(2,0)
-       + t2_1(1,0)*t2_2(0,1) + t2_1(1,1)*t2_2(1,1) + t2_1(1,2)*t2_2(2,1)
-       + t2_1(2,0)*t2_2(0,2) + t2_1(2,1)*t2_2(1,2) + t2_1(2,2)*t2_2(2,2)),
-     "T2(i,j)*T2(j,i)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XXV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,43 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  /* Tensor2*Tensor2 */
+
+  test_for_zero
+    (t2_1(i,j)*t2_2(i,j)
+     -(t2_1(0,0)*t2_2(0,0) + t2_1(0,1)*t2_2(0,1) + t2_1(0,2)*t2_2(0,2)
+       + t2_1(1,0)*t2_2(1,0) + t2_1(1,1)*t2_2(1,1) + t2_1(1,2)*t2_2(1,2)
+       + t2_1(2,0)*t2_2(2,0) + t2_1(2,1)*t2_2(2,1) + t2_1(2,2)*t2_2(2,2)),
+     "T2(i,j)*T2(i,j)");
+  
+  test_for_zero
+    (t2_1(i,j)*t2_2(j,i)
+     -(t2_1(0,0)*t2_2(0,0) + t2_1(0,1)*t2_2(1,0) + t2_1(0,2)*t2_2(2,0)
+       + t2_1(1,0)*t2_2(0,1) + t2_1(1,1)*t2_2(1,1) + t2_1(1,2)*t2_2(2,1)
+       + t2_1(2,0)*t2_2(0,2) + t2_1(2,1)*t2_2(1,2) + t2_1(2,2)*t2_2(2,2)),
+     "T2(i,j)*T2(j,i)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXVI.C
--- a/tests/conformance/T2/test_T2XXVI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  /* Tensor2*Tensor2 */
-
-  t2_1(i,k)=t2_2(i,j)*t2_3(j,k);
-  test_for_zero(t2_1(0,0) - (t2_2(0,0)*t2_3(0,0) + t2_2(0,1)*t2_3(1,0)
-			     + t2_2(0,2)*t2_3(2,0)),"T2(i,j)*T2(j,k)(0,0)");
-  test_for_zero(t2_1(0,1) - (t2_2(0,0)*t2_3(0,1) + t2_2(0,1)*t2_3(1,1)
-			     + t2_2(0,2)*t2_3(2,1)),"T2(i,j)*T2(j,k)(0,1)");
-  test_for_zero(t2_1(0,2) - (t2_2(0,0)*t2_3(0,2) + t2_2(0,1)*t2_3(1,2)
-			     + t2_2(0,2)*t2_3(2,2)),"T2(i,j)*T2(j,k)(0,2)");
-  test_for_zero(t2_1(1,0) - (t2_2(1,0)*t2_3(0,0) + t2_2(1,1)*t2_3(1,0)
-			     + t2_2(1,2)*t2_3(2,0)),"T2(i,j)*T2(j,k)(1,0)");
-  test_for_zero(t2_1(1,1) - (t2_2(1,0)*t2_3(0,1) + t2_2(1,1)*t2_3(1,1)
-			     + t2_2(1,2)*t2_3(2,1)),"T2(i,j)*T2(j,k)(1,1)");
-  test_for_zero(t2_1(1,2) - (t2_2(1,0)*t2_3(0,2) + t2_2(1,1)*t2_3(1,2)
-			     + t2_2(1,2)*t2_3(2,2)),"T2(i,j)*T2(j,k)(1,2)");
-  test_for_zero(t2_1(2,0) - (t2_2(2,0)*t2_3(0,0) + t2_2(2,1)*t2_3(1,0)
-			     + t2_2(2,2)*t2_3(2,0)),"T2(i,j)*T2(j,k)(2,0)");
-  test_for_zero(t2_1(2,1) - (t2_2(2,0)*t2_3(0,1) + t2_2(2,1)*t2_3(1,1)
-			     + t2_2(2,2)*t2_3(2,1)),"T2(i,j)*T2(j,k)(2,1)");
-  test_for_zero(t2_1(2,2) - (t2_2(2,0)*t2_3(0,2) + t2_2(2,1)*t2_3(1,2)
-			     + t2_2(2,2)*t2_3(2,2)),"T2(i,j)*T2(j,k)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXVI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XXVI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,49 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  /* Tensor2*Tensor2 */
+
+  t2_1(i,k)=t2_2(i,j)*t2_3(j,k);
+  test_for_zero(t2_1(0,0) - (t2_2(0,0)*t2_3(0,0) + t2_2(0,1)*t2_3(1,0)
+			     + t2_2(0,2)*t2_3(2,0)),"T2(i,j)*T2(j,k)(0,0)");
+  test_for_zero(t2_1(0,1) - (t2_2(0,0)*t2_3(0,1) + t2_2(0,1)*t2_3(1,1)
+			     + t2_2(0,2)*t2_3(2,1)),"T2(i,j)*T2(j,k)(0,1)");
+  test_for_zero(t2_1(0,2) - (t2_2(0,0)*t2_3(0,2) + t2_2(0,1)*t2_3(1,2)
+			     + t2_2(0,2)*t2_3(2,2)),"T2(i,j)*T2(j,k)(0,2)");
+  test_for_zero(t2_1(1,0) - (t2_2(1,0)*t2_3(0,0) + t2_2(1,1)*t2_3(1,0)
+			     + t2_2(1,2)*t2_3(2,0)),"T2(i,j)*T2(j,k)(1,0)");
+  test_for_zero(t2_1(1,1) - (t2_2(1,0)*t2_3(0,1) + t2_2(1,1)*t2_3(1,1)
+			     + t2_2(1,2)*t2_3(2,1)),"T2(i,j)*T2(j,k)(1,1)");
+  test_for_zero(t2_1(1,2) - (t2_2(1,0)*t2_3(0,2) + t2_2(1,1)*t2_3(1,2)
+			     + t2_2(1,2)*t2_3(2,2)),"T2(i,j)*T2(j,k)(1,2)");
+  test_for_zero(t2_1(2,0) - (t2_2(2,0)*t2_3(0,0) + t2_2(2,1)*t2_3(1,0)
+			     + t2_2(2,2)*t2_3(2,0)),"T2(i,j)*T2(j,k)(2,0)");
+  test_for_zero(t2_1(2,1) - (t2_2(2,0)*t2_3(0,1) + t2_2(2,1)*t2_3(1,1)
+			     + t2_2(2,2)*t2_3(2,1)),"T2(i,j)*T2(j,k)(2,1)");
+  test_for_zero(t2_1(2,2) - (t2_2(2,0)*t2_3(0,2) + t2_2(2,1)*t2_3(1,2)
+			     + t2_2(2,2)*t2_3(2,2)),"T2(i,j)*T2(j,k)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXVII.C
--- a/tests/conformance/T2/test_T2XXVII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  /* Tensor2*Tensor2 */
-
-  t2_1(i,k)=t2_2(i,j)*t2_3(k,j);
-  test_for_zero(t2_1(0,0) - (t2_2(0,0)*t2_3(0,0) + t2_2(0,1)*t2_3(0,1)
-			     + t2_2(0,2)*t2_3(0,2)),"T2(i,j)*T2(k,j)(0,0)");
-  test_for_zero(t2_1(0,1) - (t2_2(0,0)*t2_3(1,0) + t2_2(0,1)*t2_3(1,1)
-			     + t2_2(0,2)*t2_3(1,2)),"T2(i,j)*T2(k,j)(0,1)");
-  test_for_zero(t2_1(0,2) - (t2_2(0,0)*t2_3(2,0) + t2_2(0,1)*t2_3(2,1)
-			     + t2_2(0,2)*t2_3(2,2)),"T2(i,j)*T2(k,j)(0,2)");
-  test_for_zero(t2_1(1,0) - (t2_2(1,0)*t2_3(0,0) + t2_2(1,1)*t2_3(0,1)
-			     + t2_2(1,2)*t2_3(0,2)),"T2(i,j)*T2(k,j)(1,0)");
-  test_for_zero(t2_1(1,1) - (t2_2(1,0)*t2_3(1,0) + t2_2(1,1)*t2_3(1,1)
-			     + t2_2(1,2)*t2_3(1,2)),"T2(i,j)*T2(k,j)(1,1)");
-  test_for_zero(t2_1(1,2) - (t2_2(1,0)*t2_3(2,0) + t2_2(1,1)*t2_3(2,1)
-			     + t2_2(1,2)*t2_3(2,2)),"T2(i,j)*T2(k,j)(1,2)");
-  test_for_zero(t2_1(2,0) - (t2_2(2,0)*t2_3(0,0) + t2_2(2,1)*t2_3(0,1)
-			     + t2_2(2,2)*t2_3(0,2)),"T2(i,j)*T2(k,j)(2,0)");
-  test_for_zero(t2_1(2,1) - (t2_2(2,0)*t2_3(1,0) + t2_2(2,1)*t2_3(1,1)
-			     + t2_2(2,2)*t2_3(1,2)),"T2(i,j)*T2(k,j)(2,1)");
-  test_for_zero(t2_1(2,2) - (t2_2(2,0)*t2_3(2,0) + t2_2(2,1)*t2_3(2,1)
-			     + t2_2(2,2)*t2_3(2,2)),"T2(i,j)*T2(k,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXVII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XXVII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,49 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  /* Tensor2*Tensor2 */
+
+  t2_1(i,k)=t2_2(i,j)*t2_3(k,j);
+  test_for_zero(t2_1(0,0) - (t2_2(0,0)*t2_3(0,0) + t2_2(0,1)*t2_3(0,1)
+			     + t2_2(0,2)*t2_3(0,2)),"T2(i,j)*T2(k,j)(0,0)");
+  test_for_zero(t2_1(0,1) - (t2_2(0,0)*t2_3(1,0) + t2_2(0,1)*t2_3(1,1)
+			     + t2_2(0,2)*t2_3(1,2)),"T2(i,j)*T2(k,j)(0,1)");
+  test_for_zero(t2_1(0,2) - (t2_2(0,0)*t2_3(2,0) + t2_2(0,1)*t2_3(2,1)
+			     + t2_2(0,2)*t2_3(2,2)),"T2(i,j)*T2(k,j)(0,2)");
+  test_for_zero(t2_1(1,0) - (t2_2(1,0)*t2_3(0,0) + t2_2(1,1)*t2_3(0,1)
+			     + t2_2(1,2)*t2_3(0,2)),"T2(i,j)*T2(k,j)(1,0)");
+  test_for_zero(t2_1(1,1) - (t2_2(1,0)*t2_3(1,0) + t2_2(1,1)*t2_3(1,1)
+			     + t2_2(1,2)*t2_3(1,2)),"T2(i,j)*T2(k,j)(1,1)");
+  test_for_zero(t2_1(1,2) - (t2_2(1,0)*t2_3(2,0) + t2_2(1,1)*t2_3(2,1)
+			     + t2_2(1,2)*t2_3(2,2)),"T2(i,j)*T2(k,j)(1,2)");
+  test_for_zero(t2_1(2,0) - (t2_2(2,0)*t2_3(0,0) + t2_2(2,1)*t2_3(0,1)
+			     + t2_2(2,2)*t2_3(0,2)),"T2(i,j)*T2(k,j)(2,0)");
+  test_for_zero(t2_1(2,1) - (t2_2(2,0)*t2_3(1,0) + t2_2(2,1)*t2_3(1,1)
+			     + t2_2(2,2)*t2_3(1,2)),"T2(i,j)*T2(k,j)(2,1)");
+  test_for_zero(t2_1(2,2) - (t2_2(2,0)*t2_3(2,0) + t2_2(2,1)*t2_3(2,1)
+			     + t2_2(2,2)*t2_3(2,2)),"T2(i,j)*T2(k,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXVIII.C
--- a/tests/conformance/T2/test_T2XXVIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  /* Tensor2*Tensor2 */
-
-  t2_1(j,k)=t2_2(i,j)*t2_3(i,k);
-  test_for_zero(t2_1(0,0) - (t2_2(0,0)*t2_3(0,0) + t2_2(1,0)*t2_3(1,0)
-			     + t2_2(2,0)*t2_3(2,0)),"T2(i,j)*T2(i,k)(0,0)");
-  test_for_zero(t2_1(0,1) - (t2_2(0,0)*t2_3(0,1) + t2_2(1,0)*t2_3(1,1)
-			     + t2_2(2,0)*t2_3(2,1)),"T2(i,j)*T2(i,k)(0,1)");
-  test_for_zero(t2_1(0,2) - (t2_2(0,0)*t2_3(0,2) + t2_2(1,0)*t2_3(1,2)
-			     + t2_2(2,0)*t2_3(2,2)),"T2(i,j)*T2(i,k)(0,2)");
-  test_for_zero(t2_1(1,0) - (t2_2(0,1)*t2_3(0,0) + t2_2(1,1)*t2_3(1,0)
-			     + t2_2(2,1)*t2_3(2,0)),"T2(i,j)*T2(i,k)(1,0)");
-  test_for_zero(t2_1(1,1) - (t2_2(0,1)*t2_3(0,1) + t2_2(1,1)*t2_3(1,1)
-			     + t2_2(2,1)*t2_3(2,1)),"T2(i,j)*T2(i,k)(1,1)");
-  test_for_zero(t2_1(1,2) - (t2_2(0,1)*t2_3(0,2) + t2_2(1,1)*t2_3(1,2)
-			     + t2_2(2,1)*t2_3(2,2)),"T2(i,j)*T2(i,k)(1,2)");
-  test_for_zero(t2_1(2,0) - (t2_2(0,2)*t2_3(0,0) + t2_2(1,2)*t2_3(1,0)
-			     + t2_2(2,2)*t2_3(2,0)),"T2(i,j)*T2(i,k)(2,0)");
-  test_for_zero(t2_1(2,1) - (t2_2(0,2)*t2_3(0,1) + t2_2(1,2)*t2_3(1,1)
-			     + t2_2(2,2)*t2_3(2,1)),"T2(i,j)*T2(i,k)(2,1)");
-  test_for_zero(t2_1(2,2) - (t2_2(0,2)*t2_3(0,2) + t2_2(1,2)*t2_3(1,2)
-			     + t2_2(2,2)*t2_3(2,2)),"T2(i,j)*T2(i,k)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXVIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XXVIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,49 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  /* Tensor2*Tensor2 */
+
+  t2_1(j,k)=t2_2(i,j)*t2_3(i,k);
+  test_for_zero(t2_1(0,0) - (t2_2(0,0)*t2_3(0,0) + t2_2(1,0)*t2_3(1,0)
+			     + t2_2(2,0)*t2_3(2,0)),"T2(i,j)*T2(i,k)(0,0)");
+  test_for_zero(t2_1(0,1) - (t2_2(0,0)*t2_3(0,1) + t2_2(1,0)*t2_3(1,1)
+			     + t2_2(2,0)*t2_3(2,1)),"T2(i,j)*T2(i,k)(0,1)");
+  test_for_zero(t2_1(0,2) - (t2_2(0,0)*t2_3(0,2) + t2_2(1,0)*t2_3(1,2)
+			     + t2_2(2,0)*t2_3(2,2)),"T2(i,j)*T2(i,k)(0,2)");
+  test_for_zero(t2_1(1,0) - (t2_2(0,1)*t2_3(0,0) + t2_2(1,1)*t2_3(1,0)
+			     + t2_2(2,1)*t2_3(2,0)),"T2(i,j)*T2(i,k)(1,0)");
+  test_for_zero(t2_1(1,1) - (t2_2(0,1)*t2_3(0,1) + t2_2(1,1)*t2_3(1,1)
+			     + t2_2(2,1)*t2_3(2,1)),"T2(i,j)*T2(i,k)(1,1)");
+  test_for_zero(t2_1(1,2) - (t2_2(0,1)*t2_3(0,2) + t2_2(1,1)*t2_3(1,2)
+			     + t2_2(2,1)*t2_3(2,2)),"T2(i,j)*T2(i,k)(1,2)");
+  test_for_zero(t2_1(2,0) - (t2_2(0,2)*t2_3(0,0) + t2_2(1,2)*t2_3(1,0)
+			     + t2_2(2,2)*t2_3(2,0)),"T2(i,j)*T2(i,k)(2,0)");
+  test_for_zero(t2_1(2,1) - (t2_2(0,2)*t2_3(0,1) + t2_2(1,2)*t2_3(1,1)
+			     + t2_2(2,2)*t2_3(2,1)),"T2(i,j)*T2(i,k)(2,1)");
+  test_for_zero(t2_1(2,2) - (t2_2(0,2)*t2_3(0,2) + t2_2(1,2)*t2_3(1,2)
+			     + t2_2(2,2)*t2_3(2,2)),"T2(i,j)*T2(i,k)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXX.C
--- a/tests/conformance/T2/test_T2XXX.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XXX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-  
-  /* Tensor2&Tensor1 */
-
-  t2_1(i,j)=(t2_2(i,j)&t1_2(j));
-  test_for_zero(t2_1(0,0)-(t2_2(0,0)*t1_2(0)),"T2(i,j)&T2(j)(0,0)");
-  test_for_zero(t2_1(0,1)-(t2_2(0,1)*t1_2(1)),"T2(i,j)&T2(j)(0,1)");
-  test_for_zero(t2_1(0,2)-(t2_2(0,2)*t1_2(2)),"T2(i,j)&T2(j)(0,2)");
-  test_for_zero(t2_1(1,0)-(t2_2(1,0)*t1_2(0)),"T2(i,j)&T2(j)(1,0)");
-  test_for_zero(t2_1(1,1)-(t2_2(1,1)*t1_2(1)),"T2(i,j)&T2(j)(1,1)");
-  test_for_zero(t2_1(1,2)-(t2_2(1,2)*t1_2(2)),"T2(i,j)&T2(j)(1,2)");
-  test_for_zero(t2_1(2,0)-(t2_2(2,0)*t1_2(0)),"T2(i,j)&T2(j)(2,0)");
-  test_for_zero(t2_1(2,1)-(t2_2(2,1)*t1_2(1)),"T2(i,j)&T2(j)(2,1)");
-  test_for_zero(t2_1(2,2)-(t2_2(2,2)*t1_2(2)),"T2(i,j)&T2(j)(2,2)");
-
-  t2_1(i,j)=(t1_2(j)&t2_2(i,j));
-  test_for_zero(t2_1(0,0)-(t2_2(0,0)*t1_2(0)),"T2(j)&T2(i,j)(0,0)");
-  test_for_zero(t2_1(0,1)-(t2_2(0,1)*t1_2(1)),"T2(j)&T2(i,j)(0,1)");
-  test_for_zero(t2_1(0,2)-(t2_2(0,2)*t1_2(2)),"T2(j)&T2(i,j)(0,2)");
-  test_for_zero(t2_1(1,0)-(t2_2(1,0)*t1_2(0)),"T2(j)&T2(i,j)(1,0)");
-  test_for_zero(t2_1(1,1)-(t2_2(1,1)*t1_2(1)),"T2(j)&T2(i,j)(1,1)");
-  test_for_zero(t2_1(1,2)-(t2_2(1,2)*t1_2(2)),"T2(j)&T2(i,j)(1,2)");
-  test_for_zero(t2_1(2,0)-(t2_2(2,0)*t1_2(0)),"T2(j)&T2(i,j)(2,0)");
-  test_for_zero(t2_1(2,1)-(t2_2(2,1)*t1_2(1)),"T2(j)&T2(i,j)(2,1)");
-  test_for_zero(t2_1(2,2)-(t2_2(2,2)*t1_2(2)),"T2(j)&T2(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXX.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XXX.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,51 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XXX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+  
+  /* Tensor2&Tensor1 */
+
+  t2_1(i,j)=(t2_2(i,j)&t1_2(j));
+  test_for_zero(t2_1(0,0)-(t2_2(0,0)*t1_2(0)),"T2(i,j)&T2(j)(0,0)");
+  test_for_zero(t2_1(0,1)-(t2_2(0,1)*t1_2(1)),"T2(i,j)&T2(j)(0,1)");
+  test_for_zero(t2_1(0,2)-(t2_2(0,2)*t1_2(2)),"T2(i,j)&T2(j)(0,2)");
+  test_for_zero(t2_1(1,0)-(t2_2(1,0)*t1_2(0)),"T2(i,j)&T2(j)(1,0)");
+  test_for_zero(t2_1(1,1)-(t2_2(1,1)*t1_2(1)),"T2(i,j)&T2(j)(1,1)");
+  test_for_zero(t2_1(1,2)-(t2_2(1,2)*t1_2(2)),"T2(i,j)&T2(j)(1,2)");
+  test_for_zero(t2_1(2,0)-(t2_2(2,0)*t1_2(0)),"T2(i,j)&T2(j)(2,0)");
+  test_for_zero(t2_1(2,1)-(t2_2(2,1)*t1_2(1)),"T2(i,j)&T2(j)(2,1)");
+  test_for_zero(t2_1(2,2)-(t2_2(2,2)*t1_2(2)),"T2(i,j)&T2(j)(2,2)");
+
+  t2_1(i,j)=(t1_2(j)&t2_2(i,j));
+  test_for_zero(t2_1(0,0)-(t2_2(0,0)*t1_2(0)),"T2(j)&T2(i,j)(0,0)");
+  test_for_zero(t2_1(0,1)-(t2_2(0,1)*t1_2(1)),"T2(j)&T2(i,j)(0,1)");
+  test_for_zero(t2_1(0,2)-(t2_2(0,2)*t1_2(2)),"T2(j)&T2(i,j)(0,2)");
+  test_for_zero(t2_1(1,0)-(t2_2(1,0)*t1_2(0)),"T2(j)&T2(i,j)(1,0)");
+  test_for_zero(t2_1(1,1)-(t2_2(1,1)*t1_2(1)),"T2(j)&T2(i,j)(1,1)");
+  test_for_zero(t2_1(1,2)-(t2_2(1,2)*t1_2(2)),"T2(j)&T2(i,j)(1,2)");
+  test_for_zero(t2_1(2,0)-(t2_2(2,0)*t1_2(0)),"T2(j)&T2(i,j)(2,0)");
+  test_for_zero(t2_1(2,1)-(t2_2(2,1)*t1_2(1)),"T2(j)&T2(i,j)(2,1)");
+  test_for_zero(t2_1(2,2)-(t2_2(2,2)*t1_2(2)),"T2(j)&T2(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXXI.C
--- a/tests/conformance/T2/test_T2XXXI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XXXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-  
-  /* Tensor2&Tensor1 */
-	     
-  t2_1(i,j)=(t2_2(i,j)&t1_2(i));
-  test_for_zero(t2_1(0,0)-(t2_2(0,0)*t1_2(0)),"T2(i,j)&T2(i)(0,0)");
-  test_for_zero(t2_1(0,1)-(t2_2(0,1)*t1_2(0)),"T2(i,j)&T2(i)(0,1)");
-  test_for_zero(t2_1(0,2)-(t2_2(0,2)*t1_2(0)),"T2(i,j)&T2(i)(0,2)");
-  test_for_zero(t2_1(1,0)-(t2_2(1,0)*t1_2(1)),"T2(i,j)&T2(i)(1,0)");
-  test_for_zero(t2_1(1,1)-(t2_2(1,1)*t1_2(1)),"T2(i,j)&T2(i)(1,1)");
-  test_for_zero(t2_1(1,2)-(t2_2(1,2)*t1_2(1)),"T2(i,j)&T2(i)(1,2)");
-  test_for_zero(t2_1(2,0)-(t2_2(2,0)*t1_2(2)),"T2(i,j)&T2(i)(2,0)");
-  test_for_zero(t2_1(2,1)-(t2_2(2,1)*t1_2(2)),"T2(i,j)&T2(i)(2,1)");
-  test_for_zero(t2_1(2,2)-(t2_2(2,2)*t1_2(2)),"T2(i,j)&T2(i)(2,2)");
-
-  t2_1(i,j)=(t1_2(i)&t2_2(i,j));
-  test_for_zero(t2_1(0,0)-(t2_2(0,0)*t1_2(0)),"T2(i)&T2(i,j)(0,0)");
-  test_for_zero(t2_1(0,1)-(t2_2(0,1)*t1_2(0)),"T2(i)&T2(i,j)(0,1)");
-  test_for_zero(t2_1(0,2)-(t2_2(0,2)*t1_2(0)),"T2(i)&T2(i,j)(0,2)");
-  test_for_zero(t2_1(1,0)-(t2_2(1,0)*t1_2(1)),"T2(i)&T2(i,j)(1,0)");
-  test_for_zero(t2_1(1,1)-(t2_2(1,1)*t1_2(1)),"T2(i)&T2(i,j)(1,1)");
-  test_for_zero(t2_1(1,2)-(t2_2(1,2)*t1_2(1)),"T2(i)&T2(i,j)(1,2)");
-  test_for_zero(t2_1(2,0)-(t2_2(2,0)*t1_2(2)),"T2(i)&T2(i,j)(2,0)");
-  test_for_zero(t2_1(2,1)-(t2_2(2,1)*t1_2(2)),"T2(i)&T2(i,j)(2,1)");
-  test_for_zero(t2_1(2,2)-(t2_2(2,2)*t1_2(2)),"T2(i)&T2(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXXI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XXXI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,51 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XXXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+  
+  /* Tensor2&Tensor1 */
+	     
+  t2_1(i,j)=(t2_2(i,j)&t1_2(i));
+  test_for_zero(t2_1(0,0)-(t2_2(0,0)*t1_2(0)),"T2(i,j)&T2(i)(0,0)");
+  test_for_zero(t2_1(0,1)-(t2_2(0,1)*t1_2(0)),"T2(i,j)&T2(i)(0,1)");
+  test_for_zero(t2_1(0,2)-(t2_2(0,2)*t1_2(0)),"T2(i,j)&T2(i)(0,2)");
+  test_for_zero(t2_1(1,0)-(t2_2(1,0)*t1_2(1)),"T2(i,j)&T2(i)(1,0)");
+  test_for_zero(t2_1(1,1)-(t2_2(1,1)*t1_2(1)),"T2(i,j)&T2(i)(1,1)");
+  test_for_zero(t2_1(1,2)-(t2_2(1,2)*t1_2(1)),"T2(i,j)&T2(i)(1,2)");
+  test_for_zero(t2_1(2,0)-(t2_2(2,0)*t1_2(2)),"T2(i,j)&T2(i)(2,0)");
+  test_for_zero(t2_1(2,1)-(t2_2(2,1)*t1_2(2)),"T2(i,j)&T2(i)(2,1)");
+  test_for_zero(t2_1(2,2)-(t2_2(2,2)*t1_2(2)),"T2(i,j)&T2(i)(2,2)");
+
+  t2_1(i,j)=(t1_2(i)&t2_2(i,j));
+  test_for_zero(t2_1(0,0)-(t2_2(0,0)*t1_2(0)),"T2(i)&T2(i,j)(0,0)");
+  test_for_zero(t2_1(0,1)-(t2_2(0,1)*t1_2(0)),"T2(i)&T2(i,j)(0,1)");
+  test_for_zero(t2_1(0,2)-(t2_2(0,2)*t1_2(0)),"T2(i)&T2(i,j)(0,2)");
+  test_for_zero(t2_1(1,0)-(t2_2(1,0)*t1_2(1)),"T2(i)&T2(i,j)(1,0)");
+  test_for_zero(t2_1(1,1)-(t2_2(1,1)*t1_2(1)),"T2(i)&T2(i,j)(1,1)");
+  test_for_zero(t2_1(1,2)-(t2_2(1,2)*t1_2(1)),"T2(i)&T2(i,j)(1,2)");
+  test_for_zero(t2_1(2,0)-(t2_2(2,0)*t1_2(2)),"T2(i)&T2(i,j)(2,0)");
+  test_for_zero(t2_1(2,1)-(t2_2(2,1)*t1_2(2)),"T2(i)&T2(i,j)(2,1)");
+  test_for_zero(t2_1(2,2)-(t2_2(2,2)*t1_2(2)),"T2(i)&T2(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXXII.C
--- a/tests/conformance/T2/test_T2XXXII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XXXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  /* Tensor2*T or /T */
-  
-  t2_1(i,j)=t2_2(i,j)*10;
-  test_for_zero(t2_1(0,0)-(t2_2(0,0)*10),"T2(i,j)*T(0,0)");
-  test_for_zero(t2_1(0,1)-(t2_2(0,1)*10),"T2(i,j)*T(0,1)");
-  test_for_zero(t2_1(0,2)-(t2_2(0,2)*10),"T2(i,j)*T(0,2)");
-  test_for_zero(t2_1(1,0)-(t2_2(1,0)*10),"T2(i,j)*T(1,0)");
-  test_for_zero(t2_1(1,1)-(t2_2(1,1)*10),"T2(i,j)*T(1,1)");
-  test_for_zero(t2_1(1,2)-(t2_2(1,2)*10),"T2(i,j)*T(1,2)");
-  test_for_zero(t2_1(2,0)-(t2_2(2,0)*10),"T2(i,j)*T(2,0)");
-  test_for_zero(t2_1(2,1)-(t2_2(2,1)*10),"T2(i,j)*T(2,1)");
-  test_for_zero(t2_1(2,2)-(t2_2(2,2)*10),"T2(i,j)*T(2,2)");
-
-  t2_1(i,j)=10*t2_2(i,j);
-  test_for_zero(t2_1(0,0)-(t2_2(0,0)*10),"T*T2(i,j)(0,0)");
-  test_for_zero(t2_1(0,1)-(t2_2(0,1)*10),"T*T2(i,j)(0,1)");
-  test_for_zero(t2_1(0,2)-(t2_2(0,2)*10),"T*T2(i,j)(0,2)");
-  test_for_zero(t2_1(1,0)-(t2_2(1,0)*10),"T*T2(i,j)(1,0)");
-  test_for_zero(t2_1(1,1)-(t2_2(1,1)*10),"T*T2(i,j)(1,1)");
-  test_for_zero(t2_1(1,2)-(t2_2(1,2)*10),"T*T2(i,j)(1,2)");
-  test_for_zero(t2_1(2,0)-(t2_2(2,0)*10),"T*T2(i,j)(2,0)");
-  test_for_zero(t2_1(2,1)-(t2_2(2,1)*10),"T*T2(i,j)(2,1)");
-  test_for_zero(t2_1(2,2)-(t2_2(2,2)*10),"T*T2(i,j)(2,2)");
-  
-  t2_1(i,j)=t2_2(i,j)/10;
-  test_for_zero(t2_1(0,0)-(t2_2(0,0)/10),"T2(i,j)/T(0,0)");
-  test_for_zero(t2_1(0,1)-(t2_2(0,1)/10),"T2(i,j)/T(0,1)");
-  test_for_zero(t2_1(0,2)-(t2_2(0,2)/10),"T2(i,j)/T(0,2)");
-  test_for_zero(t2_1(1,0)-(t2_2(1,0)/10),"T2(i,j)/T(1,0)");
-  test_for_zero(t2_1(1,1)-(t2_2(1,1)/10),"T2(i,j)/T(1,1)");
-  test_for_zero(t2_1(1,2)-(t2_2(1,2)/10),"T2(i,j)/T(1,2)");
-  test_for_zero(t2_1(2,0)-(t2_2(2,0)/10),"T2(i,j)/T(2,0)");
-  test_for_zero(t2_1(2,1)-(t2_2(2,1)/10),"T2(i,j)/T(2,1)");
-  test_for_zero(t2_1(2,2)-(t2_2(2,2)/10),"T2(i,j)/T(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXXII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XXXII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,62 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XXXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  /* Tensor2*T or /T */
+  
+  t2_1(i,j)=t2_2(i,j)*10;
+  test_for_zero(t2_1(0,0)-(t2_2(0,0)*10),"T2(i,j)*T(0,0)");
+  test_for_zero(t2_1(0,1)-(t2_2(0,1)*10),"T2(i,j)*T(0,1)");
+  test_for_zero(t2_1(0,2)-(t2_2(0,2)*10),"T2(i,j)*T(0,2)");
+  test_for_zero(t2_1(1,0)-(t2_2(1,0)*10),"T2(i,j)*T(1,0)");
+  test_for_zero(t2_1(1,1)-(t2_2(1,1)*10),"T2(i,j)*T(1,1)");
+  test_for_zero(t2_1(1,2)-(t2_2(1,2)*10),"T2(i,j)*T(1,2)");
+  test_for_zero(t2_1(2,0)-(t2_2(2,0)*10),"T2(i,j)*T(2,0)");
+  test_for_zero(t2_1(2,1)-(t2_2(2,1)*10),"T2(i,j)*T(2,1)");
+  test_for_zero(t2_1(2,2)-(t2_2(2,2)*10),"T2(i,j)*T(2,2)");
+
+  t2_1(i,j)=10*t2_2(i,j);
+  test_for_zero(t2_1(0,0)-(t2_2(0,0)*10),"T*T2(i,j)(0,0)");
+  test_for_zero(t2_1(0,1)-(t2_2(0,1)*10),"T*T2(i,j)(0,1)");
+  test_for_zero(t2_1(0,2)-(t2_2(0,2)*10),"T*T2(i,j)(0,2)");
+  test_for_zero(t2_1(1,0)-(t2_2(1,0)*10),"T*T2(i,j)(1,0)");
+  test_for_zero(t2_1(1,1)-(t2_2(1,1)*10),"T*T2(i,j)(1,1)");
+  test_for_zero(t2_1(1,2)-(t2_2(1,2)*10),"T*T2(i,j)(1,2)");
+  test_for_zero(t2_1(2,0)-(t2_2(2,0)*10),"T*T2(i,j)(2,0)");
+  test_for_zero(t2_1(2,1)-(t2_2(2,1)*10),"T*T2(i,j)(2,1)");
+  test_for_zero(t2_1(2,2)-(t2_2(2,2)*10),"T*T2(i,j)(2,2)");
+  
+  t2_1(i,j)=t2_2(i,j)/10;
+  test_for_zero(t2_1(0,0)-(t2_2(0,0)/10),"T2(i,j)/T(0,0)");
+  test_for_zero(t2_1(0,1)-(t2_2(0,1)/10),"T2(i,j)/T(0,1)");
+  test_for_zero(t2_1(0,2)-(t2_2(0,2)/10),"T2(i,j)/T(0,2)");
+  test_for_zero(t2_1(1,0)-(t2_2(1,0)/10),"T2(i,j)/T(1,0)");
+  test_for_zero(t2_1(1,1)-(t2_2(1,1)/10),"T2(i,j)/T(1,1)");
+  test_for_zero(t2_1(1,2)-(t2_2(1,2)/10),"T2(i,j)/T(1,2)");
+  test_for_zero(t2_1(2,0)-(t2_2(2,0)/10),"T2(i,j)/T(2,0)");
+  test_for_zero(t2_1(2,1)-(t2_2(2,1)/10),"T2(i,j)/T(2,1)");
+  test_for_zero(t2_1(2,2)-(t2_2(2,2)/10),"T2(i,j)/T(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXXIII.C
--- a/tests/conformance/T2/test_T2XXXIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XXXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  /* -Tensor2 */
-
-  t2_1(i,j)=-t2_2(i,j);
-  test_for_zero(t2_1(0,0)+(t2_2(0,0)),"-T2(i,j)(0,0)");
-  test_for_zero(t2_1(0,1)+(t2_2(0,1)),"-T2(i,j)(0,1)");
-  test_for_zero(t2_1(0,2)+(t2_2(0,2)),"-T2(i,j)(0,2)");
-  test_for_zero(t2_1(1,0)+(t2_2(1,0)),"-T2(i,j)(1,0)");
-  test_for_zero(t2_1(1,1)+(t2_2(1,1)),"-T2(i,j)(1,1)");
-  test_for_zero(t2_1(1,2)+(t2_2(1,2)),"-T2(i,j)(1,2)");
-  test_for_zero(t2_1(2,0)+(t2_2(2,0)),"-T2(i,j)(2,0)");
-  test_for_zero(t2_1(2,1)+(t2_2(2,1)),"-T2(i,j)(2,1)");
-  test_for_zero(t2_1(2,2)+(t2_2(2,2)),"-T2(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXXIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XXXIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XXXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  /* -Tensor2 */
+
+  t2_1(i,j)=-t2_2(i,j);
+  test_for_zero(t2_1(0,0)+(t2_2(0,0)),"-T2(i,j)(0,0)");
+  test_for_zero(t2_1(0,1)+(t2_2(0,1)),"-T2(i,j)(0,1)");
+  test_for_zero(t2_1(0,2)+(t2_2(0,2)),"-T2(i,j)(0,2)");
+  test_for_zero(t2_1(1,0)+(t2_2(1,0)),"-T2(i,j)(1,0)");
+  test_for_zero(t2_1(1,1)+(t2_2(1,1)),"-T2(i,j)(1,1)");
+  test_for_zero(t2_1(1,2)+(t2_2(1,2)),"-T2(i,j)(1,2)");
+  test_for_zero(t2_1(2,0)+(t2_2(2,0)),"-T2(i,j)(2,0)");
+  test_for_zero(t2_1(2,1)+(t2_2(2,1)),"-T2(i,j)(2,1)");
+  test_for_zero(t2_1(2,2)+(t2_2(2,2)),"-T2(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXXIV.C
--- a/tests/conformance/T2/test_T2XXXIV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XXXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  t2_1(i,j)=t2_2(i,j);
-  t2s_1(i,j)=t2_1(i,k)^t2_2(j,k);
-  test_for_zero(t2s_1(0,0) - (t2_1(0,0)*t2_2(0,0) + t2_1(0,1)*t2_2(0,1)
-			      + t2_1(0,2)*t2_2(0,2)),"T2(i,k)^T2(j,k)(0,0)");
-  test_for_zero(t2s_1(1,0) - (t2_1(1,0)*t2_2(0,0) + t2_1(1,1)*t2_2(0,1)
-			      + t2_1(1,2)*t2_2(0,2)),"T2(i,k)^T2(j,k)(1,0)");
-  test_for_zero(t2s_1(2,0) - (t2_1(2,0)*t2_2(0,0) + t2_1(2,1)*t2_2(0,1)
-			      + t2_1(2,2)*t2_2(0,2)),"T2(i,k)^T2(j,k)(2,0)");
-  test_for_zero(t2s_1(0,1) - (t2_1(0,0)*t2_2(1,0) + t2_1(0,1)*t2_2(1,1)
-			      + t2_1(0,2)*t2_2(1,2)),"T2(i,k)^T2(j,k)(0,1)");
-  test_for_zero(t2s_1(1,1) - (t2_1(1,0)*t2_2(1,0) + t2_1(1,1)*t2_2(1,1)
-			      + t2_1(1,2)*t2_2(1,2)),"T2(i,k)^T2(j,k)(1,1)");
-  test_for_zero(t2s_1(2,1) - (t2_1(2,0)*t2_2(1,0) + t2_1(2,1)*t2_2(1,1)
-			      + t2_1(2,2)*t2_2(1,2)),"T2(i,k)^T2(j,k)(2,1)");
-  test_for_zero(t2s_1(0,2) - (t2_1(0,0)*t2_2(2,0) + t2_1(0,1)*t2_2(2,1)
-			      + t2_1(0,2)*t2_2(2,2)),"T2(i,k)^T2(j,k)(0,2)");
-  test_for_zero(t2s_1(1,2) - (t2_1(1,0)*t2_2(2,0) + t2_1(1,1)*t2_2(2,1)
-			      + t2_1(1,2)*t2_2(2,2)),"T2(i,k)^T2(j,k)(1,2)");
-  test_for_zero(t2s_1(2,2) - (t2_1(2,0)*t2_2(2,0) + t2_1(2,1)*t2_2(2,1)
-			      + t2_1(2,2)*t2_2(2,2)),"T2(i,k)^T2(j,k)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXXIV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XXXIV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,48 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XXXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  t2_1(i,j)=t2_2(i,j);
+  t2s_1(i,j)=t2_1(i,k)^t2_2(j,k);
+  test_for_zero(t2s_1(0,0) - (t2_1(0,0)*t2_2(0,0) + t2_1(0,1)*t2_2(0,1)
+			      + t2_1(0,2)*t2_2(0,2)),"T2(i,k)^T2(j,k)(0,0)");
+  test_for_zero(t2s_1(1,0) - (t2_1(1,0)*t2_2(0,0) + t2_1(1,1)*t2_2(0,1)
+			      + t2_1(1,2)*t2_2(0,2)),"T2(i,k)^T2(j,k)(1,0)");
+  test_for_zero(t2s_1(2,0) - (t2_1(2,0)*t2_2(0,0) + t2_1(2,1)*t2_2(0,1)
+			      + t2_1(2,2)*t2_2(0,2)),"T2(i,k)^T2(j,k)(2,0)");
+  test_for_zero(t2s_1(0,1) - (t2_1(0,0)*t2_2(1,0) + t2_1(0,1)*t2_2(1,1)
+			      + t2_1(0,2)*t2_2(1,2)),"T2(i,k)^T2(j,k)(0,1)");
+  test_for_zero(t2s_1(1,1) - (t2_1(1,0)*t2_2(1,0) + t2_1(1,1)*t2_2(1,1)
+			      + t2_1(1,2)*t2_2(1,2)),"T2(i,k)^T2(j,k)(1,1)");
+  test_for_zero(t2s_1(2,1) - (t2_1(2,0)*t2_2(1,0) + t2_1(2,1)*t2_2(1,1)
+			      + t2_1(2,2)*t2_2(1,2)),"T2(i,k)^T2(j,k)(2,1)");
+  test_for_zero(t2s_1(0,2) - (t2_1(0,0)*t2_2(2,0) + t2_1(0,1)*t2_2(2,1)
+			      + t2_1(0,2)*t2_2(2,2)),"T2(i,k)^T2(j,k)(0,2)");
+  test_for_zero(t2s_1(1,2) - (t2_1(1,0)*t2_2(2,0) + t2_1(1,1)*t2_2(2,1)
+			      + t2_1(1,2)*t2_2(2,2)),"T2(i,k)^T2(j,k)(1,2)");
+  test_for_zero(t2s_1(2,2) - (t2_1(2,0)*t2_2(2,0) + t2_1(2,1)*t2_2(2,1)
+			      + t2_1(2,2)*t2_2(2,2)),"T2(i,k)^T2(j,k)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXXV.C
--- a/tests/conformance/T2/test_T2XXXV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XXXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  t2_1(i,j)=t2_2(i,j);
-
-  t2s_1(i,j)=t2_1(k,i)^t2_2(k,j);
-  test_for_zero(t2s_1(0,0) - (t2_1(0,0)*t2_2(0,0) + t2_1(1,0)*t2_2(1,0)
-			      + t2_1(2,0)*t2_2(2,0)),"T2(k,i)^T2(k,j)(0,0)");
-  test_for_zero(t2s_1(1,0) - (t2_1(0,1)*t2_2(0,0) + t2_1(1,1)*t2_2(1,0)
-			      + t2_1(2,1)*t2_2(2,0)),"T2(k,i)^T2(k,j)(1,0)");
-  test_for_zero(t2s_1(2,0) - (t2_1(0,2)*t2_2(0,0) + t2_1(1,2)*t2_2(1,0)
-			      + t2_1(2,2)*t2_2(2,0)),"T2(k,i)^T2(k,j)(2,0)");
-  test_for_zero(t2s_1(0,1) - (t2_1(0,0)*t2_2(0,1) + t2_1(1,0)*t2_2(1,1)
-			      + t2_1(2,0)*t2_2(2,1)),"T2(k,i)^T2(k,j)(0,1)");
-  test_for_zero(t2s_1(1,1) - (t2_1(0,1)*t2_2(0,1) + t2_1(1,1)*t2_2(1,1)
-			      + t2_1(2,1)*t2_2(2,1)),"T2(k,i)^T2(k,j)(1,1)");
-  test_for_zero(t2s_1(2,1) - (t2_1(0,2)*t2_2(0,1) + t2_1(1,2)*t2_2(1,1)
-			      + t2_1(2,2)*t2_2(2,1)),"T2(k,i)^T2(k,j)(2,1)");
-  test_for_zero(t2s_1(0,2) - (t2_1(0,0)*t2_2(0,2) + t2_1(1,0)*t2_2(1,2)
-			      + t2_1(2,0)*t2_2(2,2)),"T2(k,i)^T2(k,j)(0,2)");
-  test_for_zero(t2s_1(1,2) - (t2_1(0,1)*t2_2(0,2) + t2_1(1,1)*t2_2(1,2)
-			      + t2_1(2,1)*t2_2(2,2)),"T2(k,i)^T2(k,j)(1,2)");
-  test_for_zero(t2s_1(2,2) - (t2_1(0,2)*t2_2(0,2) + t2_1(1,2)*t2_2(1,2)
-			      + t2_1(2,2)*t2_2(2,2)),"T2(k,i)^T2(k,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXXV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XXXV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,49 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XXXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  t2_1(i,j)=t2_2(i,j);
+
+  t2s_1(i,j)=t2_1(k,i)^t2_2(k,j);
+  test_for_zero(t2s_1(0,0) - (t2_1(0,0)*t2_2(0,0) + t2_1(1,0)*t2_2(1,0)
+			      + t2_1(2,0)*t2_2(2,0)),"T2(k,i)^T2(k,j)(0,0)");
+  test_for_zero(t2s_1(1,0) - (t2_1(0,1)*t2_2(0,0) + t2_1(1,1)*t2_2(1,0)
+			      + t2_1(2,1)*t2_2(2,0)),"T2(k,i)^T2(k,j)(1,0)");
+  test_for_zero(t2s_1(2,0) - (t2_1(0,2)*t2_2(0,0) + t2_1(1,2)*t2_2(1,0)
+			      + t2_1(2,2)*t2_2(2,0)),"T2(k,i)^T2(k,j)(2,0)");
+  test_for_zero(t2s_1(0,1) - (t2_1(0,0)*t2_2(0,1) + t2_1(1,0)*t2_2(1,1)
+			      + t2_1(2,0)*t2_2(2,1)),"T2(k,i)^T2(k,j)(0,1)");
+  test_for_zero(t2s_1(1,1) - (t2_1(0,1)*t2_2(0,1) + t2_1(1,1)*t2_2(1,1)
+			      + t2_1(2,1)*t2_2(2,1)),"T2(k,i)^T2(k,j)(1,1)");
+  test_for_zero(t2s_1(2,1) - (t2_1(0,2)*t2_2(0,1) + t2_1(1,2)*t2_2(1,1)
+			      + t2_1(2,2)*t2_2(2,1)),"T2(k,i)^T2(k,j)(2,1)");
+  test_for_zero(t2s_1(0,2) - (t2_1(0,0)*t2_2(0,2) + t2_1(1,0)*t2_2(1,2)
+			      + t2_1(2,0)*t2_2(2,2)),"T2(k,i)^T2(k,j)(0,2)");
+  test_for_zero(t2s_1(1,2) - (t2_1(0,1)*t2_2(0,2) + t2_1(1,1)*t2_2(1,2)
+			      + t2_1(2,1)*t2_2(2,2)),"T2(k,i)^T2(k,j)(1,2)");
+  test_for_zero(t2s_1(2,2) - (t2_1(0,2)*t2_2(0,2) + t2_1(1,2)*t2_2(1,2)
+			      + t2_1(2,2)*t2_2(2,2)),"T2(k,i)^T2(k,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXXVI.C
--- a/tests/conformance/T2/test_T2XXXVI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XXXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  t2_1(i,j)=t2_2(j,i);
-  t2s_1(i,j)=t2_1(k,i)^t2_2(j,k);
-  test_for_zero(t2s_1(0,0) - (t2_1(0,0)*t2_2(0,0) + t2_1(1,0)*t2_2(0,1)
-			      + t2_1(2,0)*t2_2(0,2)),"T2(k,i)^T2(j,k)(0,0)");
-  test_for_zero(t2s_1(1,0) - (t2_1(0,1)*t2_2(0,0) + t2_1(1,1)*t2_2(0,1)
-			      + t2_1(2,1)*t2_2(0,2)),"T2(k,i)^T2(j,k)(1,0)");
-  test_for_zero(t2s_1(2,0) - (t2_1(0,2)*t2_2(0,0) + t2_1(1,2)*t2_2(0,1)
-			      + t2_1(2,2)*t2_2(0,2)),"T2(k,i)^T2(j,k)(2,0)");
-  test_for_zero(t2s_1(0,1) - (t2_1(0,0)*t2_2(1,0) + t2_1(1,0)*t2_2(1,1)
-			      + t2_1(2,0)*t2_2(1,2)),"T2(k,i)^T2(j,k)(0,1)");
-  test_for_zero(t2s_1(1,1) - (t2_1(0,1)*t2_2(1,0) + t2_1(1,1)*t2_2(1,1)
-			      + t2_1(2,1)*t2_2(1,2)),"T2(k,i)^T2(j,k)(1,1)");
-  test_for_zero(t2s_1(2,1) - (t2_1(0,2)*t2_2(1,0) + t2_1(1,2)*t2_2(1,1)
-			      + t2_1(2,2)*t2_2(1,2)),"T2(k,i)^T2(j,k)(2,1)");
-  test_for_zero(t2s_1(0,2) - (t2_1(0,0)*t2_2(2,0) + t2_1(1,0)*t2_2(2,1)
-			      + t2_1(2,0)*t2_2(2,2)),"T2(k,i)^T2(j,k)(0,2)");
-  test_for_zero(t2s_1(1,2) - (t2_1(0,1)*t2_2(2,0) + t2_1(1,1)*t2_2(2,1)
-			      + t2_1(2,1)*t2_2(2,2)),"T2(k,i)^T2(j,k)(1,2)");
-  test_for_zero(t2s_1(2,2) - (t2_1(0,2)*t2_2(2,0) + t2_1(1,2)*t2_2(2,1)
-			      + t2_1(2,2)*t2_2(2,2)),"T2(k,i)^T2(j,k)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXXVI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XXXVI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,48 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XXXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  t2_1(i,j)=t2_2(j,i);
+  t2s_1(i,j)=t2_1(k,i)^t2_2(j,k);
+  test_for_zero(t2s_1(0,0) - (t2_1(0,0)*t2_2(0,0) + t2_1(1,0)*t2_2(0,1)
+			      + t2_1(2,0)*t2_2(0,2)),"T2(k,i)^T2(j,k)(0,0)");
+  test_for_zero(t2s_1(1,0) - (t2_1(0,1)*t2_2(0,0) + t2_1(1,1)*t2_2(0,1)
+			      + t2_1(2,1)*t2_2(0,2)),"T2(k,i)^T2(j,k)(1,0)");
+  test_for_zero(t2s_1(2,0) - (t2_1(0,2)*t2_2(0,0) + t2_1(1,2)*t2_2(0,1)
+			      + t2_1(2,2)*t2_2(0,2)),"T2(k,i)^T2(j,k)(2,0)");
+  test_for_zero(t2s_1(0,1) - (t2_1(0,0)*t2_2(1,0) + t2_1(1,0)*t2_2(1,1)
+			      + t2_1(2,0)*t2_2(1,2)),"T2(k,i)^T2(j,k)(0,1)");
+  test_for_zero(t2s_1(1,1) - (t2_1(0,1)*t2_2(1,0) + t2_1(1,1)*t2_2(1,1)
+			      + t2_1(2,1)*t2_2(1,2)),"T2(k,i)^T2(j,k)(1,1)");
+  test_for_zero(t2s_1(2,1) - (t2_1(0,2)*t2_2(1,0) + t2_1(1,2)*t2_2(1,1)
+			      + t2_1(2,2)*t2_2(1,2)),"T2(k,i)^T2(j,k)(2,1)");
+  test_for_zero(t2s_1(0,2) - (t2_1(0,0)*t2_2(2,0) + t2_1(1,0)*t2_2(2,1)
+			      + t2_1(2,0)*t2_2(2,2)),"T2(k,i)^T2(j,k)(0,2)");
+  test_for_zero(t2s_1(1,2) - (t2_1(0,1)*t2_2(2,0) + t2_1(1,1)*t2_2(2,1)
+			      + t2_1(2,1)*t2_2(2,2)),"T2(k,i)^T2(j,k)(1,2)");
+  test_for_zero(t2s_1(2,2) - (t2_1(0,2)*t2_2(2,0) + t2_1(1,2)*t2_2(2,1)
+			      + t2_1(2,2)*t2_2(2,2)),"T2(k,i)^T2(j,k)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXXVII.C
--- a/tests/conformance/T2/test_T2XXXVII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XXXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  t2_1(i,j)=t2_2(j,i);
-
-  t2s_1(i,j)=t2_1(i,k)^t2_2(k,j);
-  test_for_zero(t2s_1(0,0) - (t2_1(0,0)*t2_2(0,0) + t2_1(0,1)*t2_2(1,0)
-			      + t2_1(0,2)*t2_2(2,0)),"T2(i,k)^T2(k,j)(0,0)");
-  test_for_zero(t2s_1(1,0) - (t2_1(1,0)*t2_2(0,0) + t2_1(1,1)*t2_2(1,0)
-			      + t2_1(1,2)*t2_2(2,0)),"T2(i,k)^T2(k,j)(1,0)");
-  test_for_zero(t2s_1(2,0) - (t2_1(2,0)*t2_2(0,0) + t2_1(2,1)*t2_2(1,0)
-			      + t2_1(2,2)*t2_2(2,0)),"T2(i,k)^T2(k,j)(2,0)");
-  test_for_zero(t2s_1(0,1) - (t2_1(0,0)*t2_2(0,1) + t2_1(0,1)*t2_2(1,1)
-			      + t2_1(0,2)*t2_2(2,1)),"T2(i,k)^T2(k,j)(0,1)");
-  test_for_zero(t2s_1(1,1) - (t2_1(1,0)*t2_2(0,1) + t2_1(1,1)*t2_2(1,1)
-			      + t2_1(1,2)*t2_2(2,1)),"T2(i,k)^T2(k,j)(1,1)");
-  test_for_zero(t2s_1(2,1) - (t2_1(2,0)*t2_2(0,1) + t2_1(2,1)*t2_2(1,1)
-			      + t2_1(2,2)*t2_2(2,1)),"T2(i,k)^T2(k,j)(2,1)");
-  test_for_zero(t2s_1(0,2) - (t2_1(0,0)*t2_2(0,2) + t2_1(0,1)*t2_2(1,2)
-			      + t2_1(0,2)*t2_2(2,2)),"T2(i,k)^T2(k,j)(0,2)");
-  test_for_zero(t2s_1(1,2) - (t2_1(1,0)*t2_2(0,2) + t2_1(1,1)*t2_2(1,2)
-			      + t2_1(1,2)*t2_2(2,2)),"T2(i,k)^T2(k,j)(1,2)");
-  test_for_zero(t2s_1(2,2) - (t2_1(2,0)*t2_2(0,2) + t2_1(2,1)*t2_2(1,2)
-			      + t2_1(2,2)*t2_2(2,2)),"T2(i,k)^T2(k,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXXVII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XXXVII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,49 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XXXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  t2_1(i,j)=t2_2(j,i);
+
+  t2s_1(i,j)=t2_1(i,k)^t2_2(k,j);
+  test_for_zero(t2s_1(0,0) - (t2_1(0,0)*t2_2(0,0) + t2_1(0,1)*t2_2(1,0)
+			      + t2_1(0,2)*t2_2(2,0)),"T2(i,k)^T2(k,j)(0,0)");
+  test_for_zero(t2s_1(1,0) - (t2_1(1,0)*t2_2(0,0) + t2_1(1,1)*t2_2(1,0)
+			      + t2_1(1,2)*t2_2(2,0)),"T2(i,k)^T2(k,j)(1,0)");
+  test_for_zero(t2s_1(2,0) - (t2_1(2,0)*t2_2(0,0) + t2_1(2,1)*t2_2(1,0)
+			      + t2_1(2,2)*t2_2(2,0)),"T2(i,k)^T2(k,j)(2,0)");
+  test_for_zero(t2s_1(0,1) - (t2_1(0,0)*t2_2(0,1) + t2_1(0,1)*t2_2(1,1)
+			      + t2_1(0,2)*t2_2(2,1)),"T2(i,k)^T2(k,j)(0,1)");
+  test_for_zero(t2s_1(1,1) - (t2_1(1,0)*t2_2(0,1) + t2_1(1,1)*t2_2(1,1)
+			      + t2_1(1,2)*t2_2(2,1)),"T2(i,k)^T2(k,j)(1,1)");
+  test_for_zero(t2s_1(2,1) - (t2_1(2,0)*t2_2(0,1) + t2_1(2,1)*t2_2(1,1)
+			      + t2_1(2,2)*t2_2(2,1)),"T2(i,k)^T2(k,j)(2,1)");
+  test_for_zero(t2s_1(0,2) - (t2_1(0,0)*t2_2(0,2) + t2_1(0,1)*t2_2(1,2)
+			      + t2_1(0,2)*t2_2(2,2)),"T2(i,k)^T2(k,j)(0,2)");
+  test_for_zero(t2s_1(1,2) - (t2_1(1,0)*t2_2(0,2) + t2_1(1,1)*t2_2(1,2)
+			      + t2_1(1,2)*t2_2(2,2)),"T2(i,k)^T2(k,j)(1,2)");
+  test_for_zero(t2s_1(2,2) - (t2_1(2,0)*t2_2(0,2) + t2_1(2,1)*t2_2(1,2)
+			      + t2_1(2,2)*t2_2(2,2)),"T2(i,k)^T2(k,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXXVIII.C
--- a/tests/conformance/T2/test_T2XXXVIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2XXXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-  
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2 tests */
-
-  /* Checking whether functors work */
-
-  Tensor2<complex<double>,2,2> t1(complex<double>(1,2),complex<double>(3,4),
-				  complex<double>(5,6),complex<double>(7,8));
-  
-  Index<'a',2> a;
-  Index<'b',2> b;
-
-  /* I have this function pointer defined here because I can't seem to
-     make the compiler understand what kind of function I have.
-     Unless I do casts, which are ugly. It seems to have something to
-     do with conj being a templated function. */
-
-  complex<double> (*cj)(const complex<double> &);
-  cj=&(conj<double>);
-
-  test_for_zero(conj(t1(0,0))-transform(t1(a,b),static_cast<complex<double>
-					(*)(const complex<double> &)>
-					(&(conj<double>)))(0,0),
-		"transform(T2)(0,0) cast");
-  test_for_zero(conj(t1(0,1))-transform(t1(a,b),static_cast<complex<double>
-				  (*)(const complex<double> &)>
-					(&(conj<double>)))(0,1),
-		"transform(T2)(0,1) cast");
-  test_for_zero(conj(t1(1,0))-transform(t1(a,b),static_cast<complex<double>
-					(*)(const complex<double> &)>
-					(&(conj<double>)))(1,0),
-		"transform(T2)(1,0) cast");
-  test_for_zero(conj(t1(1,1))-transform(t1(a,b),static_cast<complex<double>
-					(*)(const complex<double> &)>
-					(&(conj<double>)))(1,1),
-		"transform(T2)(1,1) cast");
-  test_for_zero(conj(t1(0,0))-transform(t1(a,b),cj)(0,0),"transform(T2)(0,0)");
-  test_for_zero(conj(t1(0,1))-transform(t1(a,b),cj)(0,1),"transform(T2)(0,1)");
-  test_for_zero(conj(t1(1,0))-transform(t1(a,b),cj)(1,0),"transform(T2)(1,0)");
-  test_for_zero(conj(t1(1,1))-transform(t1(a,b),cj)(1,1),"transform(T2)(1,1)");
-
-  /* Check plain old conj */
-
-  test_for_zero(conj(t1(0,0))-conj(t1(a,b))(0,0),"conj(T2)(0,0)");
-  test_for_zero(conj(t1(0,1))-conj(t1(a,b))(0,1),"conj(T2)(0,1)");
-  test_for_zero(conj(t1(1,0))-conj(t1(a,b))(1,0),"conj(T2)(1,0)");
-  test_for_zero(conj(t1(1,1))-conj(t1(a,b))(1,1),"conj(T2)(1,1)");
-
-  cout << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2/test_T2XXXVIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2/test_T2XXXVIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,73 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2XXXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+  
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2 tests */
+
+  /* Checking whether functors work */
+
+  Tensor2<complex<double>,2,2> t1(complex<double>(1,2),complex<double>(3,4),
+				  complex<double>(5,6),complex<double>(7,8));
+  
+  Index<'a',2> a;
+  Index<'b',2> b;
+
+  /* I have this function pointer defined here because I can't seem to
+     make the compiler understand what kind of function I have.
+     Unless I do casts, which are ugly. It seems to have something to
+     do with conj being a templated function. */
+
+  complex<double> (*cj)(const complex<double> &);
+  cj=&(conj<double>);
+
+  test_for_zero(conj(t1(0,0))-transform(t1(a,b),static_cast<complex<double>
+					(*)(const complex<double> &)>
+					(&(conj<double>)))(0,0),
+		"transform(T2)(0,0) cast");
+  test_for_zero(conj(t1(0,1))-transform(t1(a,b),static_cast<complex<double>
+				  (*)(const complex<double> &)>
+					(&(conj<double>)))(0,1),
+		"transform(T2)(0,1) cast");
+  test_for_zero(conj(t1(1,0))-transform(t1(a,b),static_cast<complex<double>
+					(*)(const complex<double> &)>
+					(&(conj<double>)))(1,0),
+		"transform(T2)(1,0) cast");
+  test_for_zero(conj(t1(1,1))-transform(t1(a,b),static_cast<complex<double>
+					(*)(const complex<double> &)>
+					(&(conj<double>)))(1,1),
+		"transform(T2)(1,1) cast");
+  test_for_zero(conj(t1(0,0))-transform(t1(a,b),cj)(0,0),"transform(T2)(0,0)");
+  test_for_zero(conj(t1(0,1))-transform(t1(a,b),cj)(0,1),"transform(T2)(0,1)");
+  test_for_zero(conj(t1(1,0))-transform(t1(a,b),cj)(1,0),"transform(T2)(1,0)");
+  test_for_zero(conj(t1(1,1))-transform(t1(a,b),cj)(1,1),"transform(T2)(1,1)");
+
+  /* Check plain old conj */
+
+  test_for_zero(conj(t1(0,0))-conj(t1(a,b))(0,0),"conj(T2)(0,0)");
+  test_for_zero(conj(t1(0,1))-conj(t1(a,b))(0,1),"conj(T2)(0,1)");
+  test_for_zero(conj(t1(1,0))-conj(t1(a,b))(1,0),"conj(T2)(1,0)");
+  test_for_zero(conj(t1(1,1))-conj(t1(a,b))(1,1),"conj(T2)(1,1)");
+
+  cout << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2s.C
--- a/tests/conformance/T2s/test_T2s.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,457 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-extern
-void test_T2sI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXXX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXXXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXXXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXXXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXXXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXXXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXXXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXXXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXXXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXXXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXL(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXLI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXLII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXLIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-extern
-void test_T2sXLIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
-
-void test_T2s(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  test_T2sI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXXI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXXII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXXIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXXIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXXV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXXVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXXVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXXVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXXIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXXX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXXXI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXXXII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXXXIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXXXIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXXXV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXXXVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXXXVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXXXVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXXXIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXL(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXLI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXLII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXLIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2sXLIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-
-  cout << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2s.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2s.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,457 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+extern
+void test_T2sI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXXX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXXXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXXXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXXXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXXXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXXXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXXXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXXXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXXXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXXXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXL(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXLI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXLII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXLIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+extern
+void test_T2sXLIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
+
+void test_T2s(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  test_T2sI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXXI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXXII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXXIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXXIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXXV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXXVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXXVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXXVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXXIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXXX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXXXI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXXXII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXXXIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXXXIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXXXV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXXXVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXXXVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXXXVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXXXIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXL(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXLI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXLII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXLIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2sXLIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+
+  cout << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sI.C
--- a/tests/conformance/T2s/test_T2sI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  t2s_1(i,j)=t1_2(i) || t1_2(j);
-  test_for_zero(t2s_1(0,0)-(t1_2(0)+t1_2(0)),"T1 || T1(0,0)");
-  test_for_zero(t2s_1(0,1)-(t1_2(0)+t1_2(1)),"T1 || T1(0,1)");
-  test_for_zero(t2s_1(0,2)-(t1_2(0)+t1_2(2)),"T1 || T1(0,2)");
-  test_for_zero(t2s_1(1,0)-(t1_2(1)+t1_2(0)),"T1 || T1(1,0)");
-  test_for_zero(t2s_1(1,1)-(t1_2(1)+t1_2(1)),"T1 || T1(1,1)");
-  test_for_zero(t2s_1(1,2)-(t1_2(1)+t1_2(2)),"T1 || T1(1,2)");
-  test_for_zero(t2s_1(2,0)-(t1_2(2)+t1_2(0)),"T1 || T1(2,0)");
-  test_for_zero(t2s_1(2,1)-(t1_2(2)+t1_2(1)),"T1 || T1(2,1)");
-  test_for_zero(t2s_1(2,2)-(t1_2(2)+t1_2(2)),"T1 || T1(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,38 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  t2s_1(i,j)=t1_2(i) || t1_2(j);
+  test_for_zero(t2s_1(0,0)-(t1_2(0)+t1_2(0)),"T1 || T1(0,0)");
+  test_for_zero(t2s_1(0,1)-(t1_2(0)+t1_2(1)),"T1 || T1(0,1)");
+  test_for_zero(t2s_1(0,2)-(t1_2(0)+t1_2(2)),"T1 || T1(0,2)");
+  test_for_zero(t2s_1(1,0)-(t1_2(1)+t1_2(0)),"T1 || T1(1,0)");
+  test_for_zero(t2s_1(1,1)-(t1_2(1)+t1_2(1)),"T1 || T1(1,1)");
+  test_for_zero(t2s_1(1,2)-(t1_2(1)+t1_2(2)),"T1 || T1(1,2)");
+  test_for_zero(t2s_1(2,0)-(t1_2(2)+t1_2(0)),"T1 || T1(2,0)");
+  test_for_zero(t2s_1(2,1)-(t1_2(2)+t1_2(1)),"T1 || T1(2,1)");
+  test_for_zero(t2s_1(2,2)-(t1_2(2)+t1_2(2)),"T1 || T1(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sII.C
--- a/tests/conformance/T2s/test_T2sII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-
-  t2s_1(i,j)=t1_2(i)^t1_2(j);
-  test_for_zero(t2s_1(0,0)-t1_2(0)*t1_2(0),"T1^T1(0,0)");
-  test_for_zero(t2s_1(0,1)-t1_2(0)*t1_2(1),"T1^T1(0,1)");
-  test_for_zero(t2s_1(0,2)-t1_2(0)*t1_2(2),"T1^T1(0,2)");
-  test_for_zero(t2s_1(1,0)-t1_2(1)*t1_2(0),"T1^T1(1,0)");
-  test_for_zero(t2s_1(1,1)-t1_2(1)*t1_2(1),"T1^T1(1,1)");
-  test_for_zero(t2s_1(1,2)-t1_2(1)*t1_2(2),"T1^T1(1,2)");
-  test_for_zero(t2s_1(2,0)-t1_2(2)*t1_2(0),"T1^T1(2,0)");
-  test_for_zero(t2s_1(2,1)-t1_2(2)*t1_2(1),"T1^T1(2,1)");
-  test_for_zero(t2s_1(2,2)-t1_2(2)*t1_2(2),"T1^T1(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,39 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+
+  t2s_1(i,j)=t1_2(i)^t1_2(j);
+  test_for_zero(t2s_1(0,0)-t1_2(0)*t1_2(0),"T1^T1(0,0)");
+  test_for_zero(t2s_1(0,1)-t1_2(0)*t1_2(1),"T1^T1(0,1)");
+  test_for_zero(t2s_1(0,2)-t1_2(0)*t1_2(2),"T1^T1(0,2)");
+  test_for_zero(t2s_1(1,0)-t1_2(1)*t1_2(0),"T1^T1(1,0)");
+  test_for_zero(t2s_1(1,1)-t1_2(1)*t1_2(1),"T1^T1(1,1)");
+  test_for_zero(t2s_1(1,2)-t1_2(1)*t1_2(2),"T1^T1(1,2)");
+  test_for_zero(t2s_1(2,0)-t1_2(2)*t1_2(0),"T1^T1(2,0)");
+  test_for_zero(t2s_1(2,1)-t1_2(2)*t1_2(1),"T1^T1(2,1)");
+  test_for_zero(t2s_1(2,2)-t1_2(2)*t1_2(2),"T1^T1(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sIII.C
--- a/tests/conformance/T2s/test_T2sIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  t2s_1(i,j)=(t2_2(j,i) || t2_2(i,j));
-  test_for_zero(t2s_1(0,0)-(t2_2(0,0) + t2_2(0,0)),"T2(j,i)||T2(i,j)(0,0)");
-  test_for_zero(t2s_1(0,1)-(t2_2(0,1) + t2_2(1,0)),"T2(j,i)||T2(i,j)(0,1)");
-  test_for_zero(t2s_1(0,2)-(t2_2(0,2) + t2_2(2,0)),"T2(j,i)||T2(i,j)(0,2)");
-  test_for_zero(t2s_1(1,0)-(t2_2(1,0) + t2_2(0,1)),"T2(j,i)||T2(i,j)(1,0)");
-  test_for_zero(t2s_1(1,1)-(t2_2(1,1) + t2_2(1,1)),"T2(j,i)||T2(i,j)(1,1)");
-  test_for_zero(t2s_1(1,2)-(t2_2(1,2) + t2_2(2,1)),"T2(j,i)||T2(i,j)(1,2)");
-  test_for_zero(t2s_1(2,0)-(t2_2(2,0) + t2_2(0,2)),"T2(j,i)||T2(i,j)(2,0)");
-  test_for_zero(t2s_1(2,1)-(t2_2(2,1) + t2_2(1,2)),"T2(j,i)||T2(i,j)(2,1)");
-  test_for_zero(t2s_1(2,2)-(t2_2(2,2) + t2_2(2,2)),"T2(j,i)||T2(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,38 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  t2s_1(i,j)=(t2_2(j,i) || t2_2(i,j));
+  test_for_zero(t2s_1(0,0)-(t2_2(0,0) + t2_2(0,0)),"T2(j,i)||T2(i,j)(0,0)");
+  test_for_zero(t2s_1(0,1)-(t2_2(0,1) + t2_2(1,0)),"T2(j,i)||T2(i,j)(0,1)");
+  test_for_zero(t2s_1(0,2)-(t2_2(0,2) + t2_2(2,0)),"T2(j,i)||T2(i,j)(0,2)");
+  test_for_zero(t2s_1(1,0)-(t2_2(1,0) + t2_2(0,1)),"T2(j,i)||T2(i,j)(1,0)");
+  test_for_zero(t2s_1(1,1)-(t2_2(1,1) + t2_2(1,1)),"T2(j,i)||T2(i,j)(1,1)");
+  test_for_zero(t2s_1(1,2)-(t2_2(1,2) + t2_2(2,1)),"T2(j,i)||T2(i,j)(1,2)");
+  test_for_zero(t2s_1(2,0)-(t2_2(2,0) + t2_2(0,2)),"T2(j,i)||T2(i,j)(2,0)");
+  test_for_zero(t2s_1(2,1)-(t2_2(2,1) + t2_2(1,2)),"T2(j,i)||T2(i,j)(2,1)");
+  test_for_zero(t2s_1(2,2)-(t2_2(2,2) + t2_2(2,2)),"T2(j,i)||T2(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sIV.C
--- a/tests/conformance/T2s/test_T2sIV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  t2_1(i,j)=t2_2(j,i);
-  t2s_1(i,j)=(t2_2(i,j) || t2_1(i,j));
-  test_for_zero(t2s_1(0,0)-(t2_1(0,0) + t2_2(0,0)),"T2(i,j)||T2(i,j)(0,0)");
-  test_for_zero(t2s_1(0,1)-(t2_1(0,1) + t2_2(0,1)),"T2(i,j)||T2(i,j)(0,1)");
-  test_for_zero(t2s_1(0,2)-(t2_1(0,2) + t2_2(0,2)),"T2(i,j)||T2(i,j)(0,2)");
-  test_for_zero(t2s_1(1,0)-(t2_1(1,0) + t2_2(1,0)),"T2(i,j)||T2(i,j)(1,0)");
-  test_for_zero(t2s_1(1,1)-(t2_1(1,1) + t2_2(1,1)),"T2(i,j)||T2(i,j)(1,1)");
-  test_for_zero(t2s_1(1,2)-(t2_1(1,2) + t2_2(1,2)),"T2(i,j)||T2(i,j)(1,2)");
-  test_for_zero(t2s_1(2,0)-(t2_1(2,0) + t2_2(2,0)),"T2(i,j)||T2(i,j)(2,0)");
-  test_for_zero(t2s_1(2,1)-(t2_1(2,1) + t2_2(2,1)),"T2(i,j)||T2(i,j)(2,1)");
-  test_for_zero(t2s_1(2,2)-(t2_1(2,2) + t2_2(2,2)),"T2(i,j)||T2(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sIV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sIV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,39 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  t2_1(i,j)=t2_2(j,i);
+  t2s_1(i,j)=(t2_2(i,j) || t2_1(i,j));
+  test_for_zero(t2s_1(0,0)-(t2_1(0,0) + t2_2(0,0)),"T2(i,j)||T2(i,j)(0,0)");
+  test_for_zero(t2s_1(0,1)-(t2_1(0,1) + t2_2(0,1)),"T2(i,j)||T2(i,j)(0,1)");
+  test_for_zero(t2s_1(0,2)-(t2_1(0,2) + t2_2(0,2)),"T2(i,j)||T2(i,j)(0,2)");
+  test_for_zero(t2s_1(1,0)-(t2_1(1,0) + t2_2(1,0)),"T2(i,j)||T2(i,j)(1,0)");
+  test_for_zero(t2s_1(1,1)-(t2_1(1,1) + t2_2(1,1)),"T2(i,j)||T2(i,j)(1,1)");
+  test_for_zero(t2s_1(1,2)-(t2_1(1,2) + t2_2(1,2)),"T2(i,j)||T2(i,j)(1,2)");
+  test_for_zero(t2s_1(2,0)-(t2_1(2,0) + t2_2(2,0)),"T2(i,j)||T2(i,j)(2,0)");
+  test_for_zero(t2s_1(2,1)-(t2_1(2,1) + t2_2(2,1)),"T2(i,j)||T2(i,j)(2,1)");
+  test_for_zero(t2s_1(2,2)-(t2_1(2,2) + t2_2(2,2)),"T2(i,j)||T2(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sIX.C
--- a/tests/conformance/T2s/test_T2sIX.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* add/subtract */
-
-  t2s_1(i,j)=t2s_2(i,j)-(t1_2(i)^t1_2(j));
-  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)-t1_2(0)*t1_2(0)),"T2s(i,j)-T2s(i,j)(0,0)");
-  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)-t1_2(0)*t1_2(1)),"T2s(i,j)-T2s(i,j)(0,1)");
-  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)-t1_2(0)*t1_2(2)),"T2s(i,j)-T2s(i,j)(0,2)");
-  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)-t1_2(1)*t1_2(1)),"T2s(i,j)-T2s(i,j)(1,1)");
-  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)-t1_2(1)*t1_2(2)),"T2s(i,j)-T2s(i,j)(1,2)");
-  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)-t1_2(2)*t1_2(2)),"T2s(i,j)-T2s(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sIX.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sIX.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,37 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* add/subtract */
+
+  t2s_1(i,j)=t2s_2(i,j)-(t1_2(i)^t1_2(j));
+  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)-t1_2(0)*t1_2(0)),"T2s(i,j)-T2s(i,j)(0,0)");
+  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)-t1_2(0)*t1_2(1)),"T2s(i,j)-T2s(i,j)(0,1)");
+  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)-t1_2(0)*t1_2(2)),"T2s(i,j)-T2s(i,j)(0,2)");
+  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)-t1_2(1)*t1_2(1)),"T2s(i,j)-T2s(i,j)(1,1)");
+  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)-t1_2(1)*t1_2(2)),"T2s(i,j)-T2s(i,j)(1,2)");
+  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)-t1_2(2)*t1_2(2)),"T2s(i,j)-T2s(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sV.C
--- a/tests/conformance/T2s/test_T2sV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* Test of Number<> as an index. */
-
-  t2s_1(N0,i)=t1_2(i);
-  test_for_zero(t2s_1(0,0)-t1_2(0),"T2s(N,i)(0,0)");
-  test_for_zero(t2s_1(0,1)-t1_2(1),"T2s(N,i)(0,1)");
-  test_for_zero(t2s_1(0,2)-t1_2(2),"T2s(N,i)(0,2)");
-  t2s_1(N1,i)=t1_2(i);
-  test_for_zero(t2s_1(1,0)-t1_2(0),"T2s(N,i)(1,0)");
-  test_for_zero(t2s_1(1,1)-t1_2(1),"T2s(N,i)(1,1)");
-  test_for_zero(t2s_1(1,2)-t1_2(2),"T2s(N,i)(1,2)");
-  t2s_1(N2,i)=t1_2(i);
-  test_for_zero(t2s_1(2,0)-t1_2(0),"T2s(N,i)(2,0)");
-  test_for_zero(t2s_1(2,1)-t1_2(1),"T2s(N,i)(2,1)");
-  test_for_zero(t2s_1(2,2)-t1_2(2),"T2s(N,i)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,42 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* Test of Number<> as an index. */
+
+  t2s_1(N0,i)=t1_2(i);
+  test_for_zero(t2s_1(0,0)-t1_2(0),"T2s(N,i)(0,0)");
+  test_for_zero(t2s_1(0,1)-t1_2(1),"T2s(N,i)(0,1)");
+  test_for_zero(t2s_1(0,2)-t1_2(2),"T2s(N,i)(0,2)");
+  t2s_1(N1,i)=t1_2(i);
+  test_for_zero(t2s_1(1,0)-t1_2(0),"T2s(N,i)(1,0)");
+  test_for_zero(t2s_1(1,1)-t1_2(1),"T2s(N,i)(1,1)");
+  test_for_zero(t2s_1(1,2)-t1_2(2),"T2s(N,i)(1,2)");
+  t2s_1(N2,i)=t1_2(i);
+  test_for_zero(t2s_1(2,0)-t1_2(0),"T2s(N,i)(2,0)");
+  test_for_zero(t2s_1(2,1)-t1_2(1),"T2s(N,i)(2,1)");
+  test_for_zero(t2s_1(2,2)-t1_2(2),"T2s(N,i)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sVI.C
--- a/tests/conformance/T2s/test_T2sVI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* Test of Number<> as an index. */
-
-  t2s_1(i,N0)=t1_2(i);
-  test_for_zero(t2s_1(0,0)-t1_2(0),"T2s(i,N)(0,0)");
-  test_for_zero(t2s_1(0,1)-t1_2(1),"T2s(i,N)(0,1)");
-  test_for_zero(t2s_1(0,2)-t1_2(2),"T2s(i,N)(0,2)");
-  t2s_1(i,N1)=t1_2(i);
-  test_for_zero(t2s_1(1,0)-t1_2(0),"T2s(i,N)(1,0)");
-  test_for_zero(t2s_1(1,1)-t1_2(1),"T2s(i,N)(1,1)");
-  test_for_zero(t2s_1(1,2)-t1_2(2),"T2s(i,N)(1,2)");
-  t2s_1(i,N2)=t1_2(i);
-  test_for_zero(t2s_1(2,0)-t1_2(0),"T2s(i,N)(2,0)");
-  test_for_zero(t2s_1(2,1)-t1_2(1),"T2s(i,N)(2,1)");
-  test_for_zero(t2s_1(2,2)-t1_2(2),"T2s(i,N)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sVI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sVI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,42 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* Test of Number<> as an index. */
+
+  t2s_1(i,N0)=t1_2(i);
+  test_for_zero(t2s_1(0,0)-t1_2(0),"T2s(i,N)(0,0)");
+  test_for_zero(t2s_1(0,1)-t1_2(1),"T2s(i,N)(0,1)");
+  test_for_zero(t2s_1(0,2)-t1_2(2),"T2s(i,N)(0,2)");
+  t2s_1(i,N1)=t1_2(i);
+  test_for_zero(t2s_1(1,0)-t1_2(0),"T2s(i,N)(1,0)");
+  test_for_zero(t2s_1(1,1)-t1_2(1),"T2s(i,N)(1,1)");
+  test_for_zero(t2s_1(1,2)-t1_2(2),"T2s(i,N)(1,2)");
+  t2s_1(i,N2)=t1_2(i);
+  test_for_zero(t2s_1(2,0)-t1_2(0),"T2s(i,N)(2,0)");
+  test_for_zero(t2s_1(2,1)-t1_2(1),"T2s(i,N)(2,1)");
+  test_for_zero(t2s_1(2,2)-t1_2(2),"T2s(i,N)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sVII.C
--- a/tests/conformance/T2s/test_T2sVII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* Test of actual numerals as an index. */
-
-  t1_1(i)=t2s_1(0,i);
-  test_for_zero(t2s_1(0,0)-t1_1(0),"T2s(Num,i)(0,0)");
-  test_for_zero(t2s_1(0,1)-t1_1(1),"T2s(Num,i)(0,1)");
-  test_for_zero(t2s_1(0,2)-t1_1(2),"T2s(Num,i)(0,2)");
-  t1_1(i)=t2s_1(1,i);
-  test_for_zero(t2s_1(1,0)-t1_1(0),"T2s(Num,i)(1,0)");
-  test_for_zero(t2s_1(1,1)-t1_1(1),"T2s(Num,i)(1,1)");
-  test_for_zero(t2s_1(1,2)-t1_1(2),"T2s(Num,i)(1,2)");
-  t1_1(i)=t2s_1(2,i);
-  test_for_zero(t2s_1(2,0)-t1_1(0),"T2s(Num,i)(2,0)");
-  test_for_zero(t2s_1(2,1)-t1_1(1),"T2s(Num,i)(2,1)");
-  test_for_zero(t2s_1(2,2)-t1_1(2),"T2s(Num,i)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sVII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sVII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,42 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* Test of actual numerals as an index. */
+
+  t1_1(i)=t2s_1(0,i);
+  test_for_zero(t2s_1(0,0)-t1_1(0),"T2s(Num,i)(0,0)");
+  test_for_zero(t2s_1(0,1)-t1_1(1),"T2s(Num,i)(0,1)");
+  test_for_zero(t2s_1(0,2)-t1_1(2),"T2s(Num,i)(0,2)");
+  t1_1(i)=t2s_1(1,i);
+  test_for_zero(t2s_1(1,0)-t1_1(0),"T2s(Num,i)(1,0)");
+  test_for_zero(t2s_1(1,1)-t1_1(1),"T2s(Num,i)(1,1)");
+  test_for_zero(t2s_1(1,2)-t1_1(2),"T2s(Num,i)(1,2)");
+  t1_1(i)=t2s_1(2,i);
+  test_for_zero(t2s_1(2,0)-t1_1(0),"T2s(Num,i)(2,0)");
+  test_for_zero(t2s_1(2,1)-t1_1(1),"T2s(Num,i)(2,1)");
+  test_for_zero(t2s_1(2,2)-t1_1(2),"T2s(Num,i)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sVIII.C
--- a/tests/conformance/T2s/test_T2sVIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* Test of actual numerals as an index. */
-
-  t1_1(i)=t2s_1(i,0);
-  test_for_zero(t2s_1(0,0)-t1_1(0),"T2s(i,Num)(0,0)");
-  test_for_zero(t2s_1(0,1)-t1_1(1),"T2s(i,Num)(0,1)");
-  test_for_zero(t2s_1(0,2)-t1_1(2),"T2s(i,Num)(0,2)");
-  t1_1(i)=t2s_1(i,1);
-  test_for_zero(t2s_1(1,0)-t1_1(0),"T2s(i,Num)(1,0)");
-  test_for_zero(t2s_1(1,1)-t1_1(1),"T2s(i,Num)(1,1)");
-  test_for_zero(t2s_1(1,2)-t1_1(2),"T2s(i,Num)(1,2)");
-  t1_1(i)=t2s_1(i,2);
-  test_for_zero(t2s_1(2,0)-t1_1(0),"T2s(i,Num)(2,0)");
-  test_for_zero(t2s_1(2,1)-t1_1(1),"T2s(i,Num)(2,1)");
-  test_for_zero(t2s_1(2,2)-t1_1(2),"T2s(i,Num)(2,2)");
-
-  test_for_zero(t2s_1(i,i)-(t1_2(0)+t1_2(1)+t1_2(2)),"T2s(i,i)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sVIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sVIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,44 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* Test of actual numerals as an index. */
+
+  t1_1(i)=t2s_1(i,0);
+  test_for_zero(t2s_1(0,0)-t1_1(0),"T2s(i,Num)(0,0)");
+  test_for_zero(t2s_1(0,1)-t1_1(1),"T2s(i,Num)(0,1)");
+  test_for_zero(t2s_1(0,2)-t1_1(2),"T2s(i,Num)(0,2)");
+  t1_1(i)=t2s_1(i,1);
+  test_for_zero(t2s_1(1,0)-t1_1(0),"T2s(i,Num)(1,0)");
+  test_for_zero(t2s_1(1,1)-t1_1(1),"T2s(i,Num)(1,1)");
+  test_for_zero(t2s_1(1,2)-t1_1(2),"T2s(i,Num)(1,2)");
+  t1_1(i)=t2s_1(i,2);
+  test_for_zero(t2s_1(2,0)-t1_1(0),"T2s(i,Num)(2,0)");
+  test_for_zero(t2s_1(2,1)-t1_1(1),"T2s(i,Num)(2,1)");
+  test_for_zero(t2s_1(2,2)-t1_1(2),"T2s(i,Num)(2,2)");
+
+  test_for_zero(t2s_1(i,i)-(t1_2(0)+t1_2(1)+t1_2(2)),"T2s(i,i)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sX.C
--- a/tests/conformance/T2s/test_T2sX.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* add/subtract */
-
-  t2s_1(i,j)=t2s_2(i,j)-(t1_2(j)^t1_2(i));
-  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)-t1_2(0)*t1_2(0)),"T2s(i,j)-T2s(j,i)(0,0)");
-  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)-t1_2(1)*t1_2(0)),"T2s(i,j)-T2s(j,i)(0,1)");
-  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)-t1_2(2)*t1_2(0)),"T2s(i,j)-T2s(j,i)(0,2)");
-  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)-t1_2(1)*t1_2(1)),"T2s(i,j)-T2s(j,i)(1,1)");
-  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)-t1_2(2)*t1_2(1)),"T2s(i,j)-T2s(j,i)(1,2)");
-  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)-t1_2(2)*t1_2(2)),"T2s(i,j)-T2s(j,i)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sX.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sX.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,37 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* add/subtract */
+
+  t2s_1(i,j)=t2s_2(i,j)-(t1_2(j)^t1_2(i));
+  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)-t1_2(0)*t1_2(0)),"T2s(i,j)-T2s(j,i)(0,0)");
+  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)-t1_2(1)*t1_2(0)),"T2s(i,j)-T2s(j,i)(0,1)");
+  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)-t1_2(2)*t1_2(0)),"T2s(i,j)-T2s(j,i)(0,2)");
+  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)-t1_2(1)*t1_2(1)),"T2s(i,j)-T2s(j,i)(1,1)");
+  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)-t1_2(2)*t1_2(1)),"T2s(i,j)-T2s(j,i)(1,2)");
+  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)-t1_2(2)*t1_2(2)),"T2s(i,j)-T2s(j,i)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXI.C
--- a/tests/conformance/T2s/test_T2sXI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* add/subtract */
-
-  t2s_1(i,j)=t2s_2(i,j)+(t1_2(i)^t1_2(j));
-  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)+t1_2(0)*t1_2(0)),"T2s(i,j)+T2s(i,j)(0,0)");
-  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)+t1_2(0)*t1_2(1)),"T2s(i,j)+T2s(i,j)(0,1)");
-  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)+t1_2(0)*t1_2(2)),"T2s(i,j)+T2s(i,j)(0,2)");
-  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)+t1_2(1)*t1_2(1)),"T2s(i,j)+T2s(i,j)(1,1)");
-  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)+t1_2(1)*t1_2(2)),"T2s(i,j)+T2s(i,j)(1,2)");
-  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)+t1_2(2)*t1_2(2)),"T2s(i,j)+T2s(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,37 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* add/subtract */
+
+  t2s_1(i,j)=t2s_2(i,j)+(t1_2(i)^t1_2(j));
+  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)+t1_2(0)*t1_2(0)),"T2s(i,j)+T2s(i,j)(0,0)");
+  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)+t1_2(0)*t1_2(1)),"T2s(i,j)+T2s(i,j)(0,1)");
+  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)+t1_2(0)*t1_2(2)),"T2s(i,j)+T2s(i,j)(0,2)");
+  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)+t1_2(1)*t1_2(1)),"T2s(i,j)+T2s(i,j)(1,1)");
+  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)+t1_2(1)*t1_2(2)),"T2s(i,j)+T2s(i,j)(1,2)");
+  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)+t1_2(2)*t1_2(2)),"T2s(i,j)+T2s(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXII.C
--- a/tests/conformance/T2s/test_T2sXII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* add/subtract */
-
-  t2s_1(i,j)=t2s_2(i,j)+(t1_2(j)^t1_2(i));
-  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)+t1_2(0)*t1_2(0)),"T2s(i,j)+T2s(j,i)(0,0)");
-  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)+t1_2(1)*t1_2(0)),"T2s(i,j)+T2s(j,i)(0,1)");
-  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)+t1_2(2)*t1_2(0)),"T2s(i,j)+T2s(j,i)(0,2)");
-  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)+t1_2(1)*t1_2(1)),"T2s(i,j)+T2s(j,i)(1,1)");
-  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)+t1_2(2)*t1_2(1)),"T2s(i,j)+T2s(j,i)(1,2)");
-  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)+t1_2(2)*t1_2(2)),"T2s(i,j)+T2s(j,i)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,37 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* add/subtract */
+
+  t2s_1(i,j)=t2s_2(i,j)+(t1_2(j)^t1_2(i));
+  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)+t1_2(0)*t1_2(0)),"T2s(i,j)+T2s(j,i)(0,0)");
+  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)+t1_2(1)*t1_2(0)),"T2s(i,j)+T2s(j,i)(0,1)");
+  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)+t1_2(2)*t1_2(0)),"T2s(i,j)+T2s(j,i)(0,2)");
+  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)+t1_2(1)*t1_2(1)),"T2s(i,j)+T2s(j,i)(1,1)");
+  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)+t1_2(2)*t1_2(1)),"T2s(i,j)+T2s(j,i)(1,2)");
+  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)+t1_2(2)*t1_2(2)),"T2s(i,j)+T2s(j,i)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXIII.C
--- a/tests/conformance/T2s/test_T2sXIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* Equals */
-
-  t2s_1(i,j)=t2s_2(i,j)+(t1_2(j)^t1_2(i));
-  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)+t1_2(0)*t1_2(0)),"T2s(i,j)=T2s(i,j)(0,0)");
-  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)+t1_2(0)*t1_2(1)),"T2s(i,j)=T2s(i,j)(0,1)");
-  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)+t1_2(0)*t1_2(2)),"T2s(i,j)=T2s(i,j)(0,2)");
-  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)+t1_2(1)*t1_2(0)),"T2s(i,j)=T2s(i,j)(1,0)");
-  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)+t1_2(1)*t1_2(1)),"T2s(i,j)=T2s(i,j)(1,1)");
-  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)+t1_2(1)*t1_2(2)),"T2s(i,j)=T2s(i,j)(1,2)");
-  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)+t1_2(2)*t1_2(0)),"T2s(i,j)=T2s(i,j)(2,0)");
-  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)+t1_2(2)*t1_2(1)),"T2s(i,j)=T2s(i,j)(2,1)");
-  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)+t1_2(2)*t1_2(2)),"T2s(i,j)=T2s(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* Equals */
+
+  t2s_1(i,j)=t2s_2(i,j)+(t1_2(j)^t1_2(i));
+  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)+t1_2(0)*t1_2(0)),"T2s(i,j)=T2s(i,j)(0,0)");
+  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)+t1_2(0)*t1_2(1)),"T2s(i,j)=T2s(i,j)(0,1)");
+  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)+t1_2(0)*t1_2(2)),"T2s(i,j)=T2s(i,j)(0,2)");
+  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)+t1_2(1)*t1_2(0)),"T2s(i,j)=T2s(i,j)(1,0)");
+  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)+t1_2(1)*t1_2(1)),"T2s(i,j)=T2s(i,j)(1,1)");
+  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)+t1_2(1)*t1_2(2)),"T2s(i,j)=T2s(i,j)(1,2)");
+  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)+t1_2(2)*t1_2(0)),"T2s(i,j)=T2s(i,j)(2,0)");
+  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)+t1_2(2)*t1_2(1)),"T2s(i,j)=T2s(i,j)(2,1)");
+  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)+t1_2(2)*t1_2(2)),"T2s(i,j)=T2s(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXIV.C
--- a/tests/conformance/T2s/test_T2sXIV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* Equals */
-
-  t2s_1(i,j)+=t2s_2(i,j);
-  test_for_zero(t2s_1(0,0)-(2*t2s_2(0,0)+t1_2(0)*t1_2(0)),"T2s(i,j)+=T2s(i,j)(0,0)");
-  test_for_zero(t2s_1(0,1)-(2*t2s_2(0,1)+t1_2(0)*t1_2(1)),"T2s(i,j)+=T2s(i,j)(0,1)");
-  test_for_zero(t2s_1(0,2)-(2*t2s_2(0,2)+t1_2(0)*t1_2(2)),"T2s(i,j)+=T2s(i,j)(0,2)");
-  test_for_zero(t2s_1(1,0)-(2*t2s_2(1,0)+t1_2(1)*t1_2(0)),"T2s(i,j)+=T2s(i,j)(1,0)");
-  test_for_zero(t2s_1(1,1)-(2*t2s_2(1,1)+t1_2(1)*t1_2(1)),"T2s(i,j)+=T2s(i,j)(1,1)");
-  test_for_zero(t2s_1(1,2)-(2*t2s_2(1,2)+t1_2(1)*t1_2(2)),"T2s(i,j)+=T2s(i,j)(1,2)");
-  test_for_zero(t2s_1(2,0)-(2*t2s_2(2,0)+t1_2(2)*t1_2(0)),"T2s(i,j)+=T2s(i,j)(2,0)");
-  test_for_zero(t2s_1(2,1)-(2*t2s_2(2,1)+t1_2(2)*t1_2(1)),"T2s(i,j)+=T2s(i,j)(2,1)");
-  test_for_zero(t2s_1(2,2)-(2*t2s_2(2,2)+t1_2(2)*t1_2(2)),"T2s(i,j)+=T2s(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXIV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXIV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* Equals */
+
+  t2s_1(i,j)+=t2s_2(i,j);
+  test_for_zero(t2s_1(0,0)-(2*t2s_2(0,0)+t1_2(0)*t1_2(0)),"T2s(i,j)+=T2s(i,j)(0,0)");
+  test_for_zero(t2s_1(0,1)-(2*t2s_2(0,1)+t1_2(0)*t1_2(1)),"T2s(i,j)+=T2s(i,j)(0,1)");
+  test_for_zero(t2s_1(0,2)-(2*t2s_2(0,2)+t1_2(0)*t1_2(2)),"T2s(i,j)+=T2s(i,j)(0,2)");
+  test_for_zero(t2s_1(1,0)-(2*t2s_2(1,0)+t1_2(1)*t1_2(0)),"T2s(i,j)+=T2s(i,j)(1,0)");
+  test_for_zero(t2s_1(1,1)-(2*t2s_2(1,1)+t1_2(1)*t1_2(1)),"T2s(i,j)+=T2s(i,j)(1,1)");
+  test_for_zero(t2s_1(1,2)-(2*t2s_2(1,2)+t1_2(1)*t1_2(2)),"T2s(i,j)+=T2s(i,j)(1,2)");
+  test_for_zero(t2s_1(2,0)-(2*t2s_2(2,0)+t1_2(2)*t1_2(0)),"T2s(i,j)+=T2s(i,j)(2,0)");
+  test_for_zero(t2s_1(2,1)-(2*t2s_2(2,1)+t1_2(2)*t1_2(1)),"T2s(i,j)+=T2s(i,j)(2,1)");
+  test_for_zero(t2s_1(2,2)-(2*t2s_2(2,2)+t1_2(2)*t1_2(2)),"T2s(i,j)+=T2s(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXIX.C
--- a/tests/conformance/T2s/test_T2sXIX.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,84 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* Equals */
-
-  t2s_1(i,j)+=10;
-  test_for_zero(t2s_1(0,0)-(-3*t2s_2(0,0)+t1_2(0)*t1_2(0)+10),"T2s+=T(0,0)");
-  test_for_zero(t2s_1(1,0)-(-3*t2s_2(0,1)+t1_2(0)*t1_2(1)+10),"T2s+=T(0,1)");
-  test_for_zero(t2s_1(2,0)-(-3*t2s_2(0,2)+t1_2(0)*t1_2(2)+10),"T2s+=T(0,2)");
-  test_for_zero(t2s_1(0,1)-(-3*t2s_2(1,0)+t1_2(1)*t1_2(0)+10),"T2s+=T(1,0)");
-  test_for_zero(t2s_1(1,1)-(-3*t2s_2(1,1)+t1_2(1)*t1_2(1)+10),"T2s+=T(1,1)");
-  test_for_zero(t2s_1(2,1)-(-3*t2s_2(1,2)+t1_2(1)*t1_2(2)+10),"T2s+=T(1,2)");
-  test_for_zero(t2s_1(0,2)-(-3*t2s_2(2,0)+t1_2(2)*t1_2(0)+10),"T2s+=T(2,0)");
-  test_for_zero(t2s_1(1,2)-(-3*t2s_2(2,1)+t1_2(2)*t1_2(1)+10),"T2s+=T(2,1)");
-  test_for_zero(t2s_1(2,2)-(-3*t2s_2(2,2)+t1_2(2)*t1_2(2)+10),"T2s+=T(2,2)");
-
-  t2s_1(i,j)-=7;
-  test_for_zero(t2s_1(0,0)-(-3*t2s_2(0,0)+t1_2(0)*t1_2(0)+3),"T2s-=T(0,0)");
-  test_for_zero(t2s_1(1,0)-(-3*t2s_2(0,1)+t1_2(0)*t1_2(1)+3),"T2s-=T(0,1)");
-  test_for_zero(t2s_1(2,0)-(-3*t2s_2(0,2)+t1_2(0)*t1_2(2)+3),"T2s-=T(0,2)");
-  test_for_zero(t2s_1(0,1)-(-3*t2s_2(1,0)+t1_2(1)*t1_2(0)+3),"T2s-=T(1,0)");
-  test_for_zero(t2s_1(1,1)-(-3*t2s_2(1,1)+t1_2(1)*t1_2(1)+3),"T2s-=T(1,1)");
-  test_for_zero(t2s_1(2,1)-(-3*t2s_2(1,2)+t1_2(1)*t1_2(2)+3),"T2s-=T(1,2)");
-  test_for_zero(t2s_1(0,2)-(-3*t2s_2(2,0)+t1_2(2)*t1_2(0)+3),"T2s-=T(2,0)");
-  test_for_zero(t2s_1(1,2)-(-3*t2s_2(2,1)+t1_2(2)*t1_2(1)+3),"T2s-=T(2,1)");
-  test_for_zero(t2s_1(2,2)-(-3*t2s_2(2,2)+t1_2(2)*t1_2(2)+3),"T2s-=T(2,2)");
-
-  t2s_1(i,j)*=12;
-  test_for_zero(t2s_1(0,0)-(-3*t2s_2(0,0)+t1_2(0)*t1_2(0)+3)*12,"T2s*=T(0,0)");
-  test_for_zero(t2s_1(1,0)-(-3*t2s_2(0,1)+t1_2(0)*t1_2(1)+3)*12,"T2s*=T(0,1)");
-  test_for_zero(t2s_1(2,0)-(-3*t2s_2(0,2)+t1_2(0)*t1_2(2)+3)*12,"T2s*=T(0,2)");
-  test_for_zero(t2s_1(0,1)-(-3*t2s_2(1,0)+t1_2(1)*t1_2(0)+3)*12,"T2s*=T(1,0)");
-  test_for_zero(t2s_1(1,1)-(-3*t2s_2(1,1)+t1_2(1)*t1_2(1)+3)*12,"T2s*=T(1,1)");
-  test_for_zero(t2s_1(2,1)-(-3*t2s_2(1,2)+t1_2(1)*t1_2(2)+3)*12,"T2s*=T(1,2)");
-  test_for_zero(t2s_1(0,2)-(-3*t2s_2(2,0)+t1_2(2)*t1_2(0)+3)*12,"T2s*=T(2,0)");
-  test_for_zero(t2s_1(1,2)-(-3*t2s_2(2,1)+t1_2(2)*t1_2(1)+3)*12,"T2s*=T(2,1)");
-  test_for_zero(t2s_1(2,2)-(-3*t2s_2(2,2)+t1_2(2)*t1_2(2)+3)*12,"T2s*=T(2,2)");
-
-  t2s_1(i,j)/=4;
-  test_for_zero(t2s_1(0,0)-(-3*t2s_2(0,0)+t1_2(0)*t1_2(0)+3)*3,"T2s/=T(0,0)");
-  test_for_zero(t2s_1(1,0)-(-3*t2s_2(0,1)+t1_2(0)*t1_2(1)+3)*3,"T2s/=T(0,1)");
-  test_for_zero(t2s_1(2,0)-(-3*t2s_2(0,2)+t1_2(0)*t1_2(2)+3)*3,"T2s/=T(0,2)");
-  test_for_zero(t2s_1(0,1)-(-3*t2s_2(1,0)+t1_2(1)*t1_2(0)+3)*3,"T2s/=T(1,0)");
-  test_for_zero(t2s_1(1,1)-(-3*t2s_2(1,1)+t1_2(1)*t1_2(1)+3)*3,"T2s/=T(1,1)");
-  test_for_zero(t2s_1(2,1)-(-3*t2s_2(1,2)+t1_2(1)*t1_2(2)+3)*3,"T2s/=T(1,2)");
-  test_for_zero(t2s_1(0,2)-(-3*t2s_2(2,0)+t1_2(2)*t1_2(0)+3)*3,"T2s/=T(2,0)");
-  test_for_zero(t2s_1(1,2)-(-3*t2s_2(2,1)+t1_2(2)*t1_2(1)+3)*3,"T2s/=T(2,1)");
-  test_for_zero(t2s_1(2,2)-(-3*t2s_2(2,2)+t1_2(2)*t1_2(2)+3)*3,"T2s/=T(2,2)");
-
-  t2s_1(i,j)=10;
-  test_for_zero(t2s_1(0,0)-10,"T2s=T(0,0)");
-  test_for_zero(t2s_1(1,0)-10,"T2s=T(0,1)");
-  test_for_zero(t2s_1(2,0)-10,"T2s=T(0,2)");
-  test_for_zero(t2s_1(0,1)-10,"T2s=T(1,0)");
-  test_for_zero(t2s_1(1,1)-10,"T2s=T(1,1)");
-  test_for_zero(t2s_1(2,1)-10,"T2s=T(1,2)");
-  test_for_zero(t2s_1(0,2)-10,"T2s=T(2,0)");
-  test_for_zero(t2s_1(1,2)-10,"T2s=T(2,1)");
-  test_for_zero(t2s_1(2,2)-10,"T2s=T(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXIX.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXIX.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,84 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* Equals */
+
+  t2s_1(i,j)+=10;
+  test_for_zero(t2s_1(0,0)-(-3*t2s_2(0,0)+t1_2(0)*t1_2(0)+10),"T2s+=T(0,0)");
+  test_for_zero(t2s_1(1,0)-(-3*t2s_2(0,1)+t1_2(0)*t1_2(1)+10),"T2s+=T(0,1)");
+  test_for_zero(t2s_1(2,0)-(-3*t2s_2(0,2)+t1_2(0)*t1_2(2)+10),"T2s+=T(0,2)");
+  test_for_zero(t2s_1(0,1)-(-3*t2s_2(1,0)+t1_2(1)*t1_2(0)+10),"T2s+=T(1,0)");
+  test_for_zero(t2s_1(1,1)-(-3*t2s_2(1,1)+t1_2(1)*t1_2(1)+10),"T2s+=T(1,1)");
+  test_for_zero(t2s_1(2,1)-(-3*t2s_2(1,2)+t1_2(1)*t1_2(2)+10),"T2s+=T(1,2)");
+  test_for_zero(t2s_1(0,2)-(-3*t2s_2(2,0)+t1_2(2)*t1_2(0)+10),"T2s+=T(2,0)");
+  test_for_zero(t2s_1(1,2)-(-3*t2s_2(2,1)+t1_2(2)*t1_2(1)+10),"T2s+=T(2,1)");
+  test_for_zero(t2s_1(2,2)-(-3*t2s_2(2,2)+t1_2(2)*t1_2(2)+10),"T2s+=T(2,2)");
+
+  t2s_1(i,j)-=7;
+  test_for_zero(t2s_1(0,0)-(-3*t2s_2(0,0)+t1_2(0)*t1_2(0)+3),"T2s-=T(0,0)");
+  test_for_zero(t2s_1(1,0)-(-3*t2s_2(0,1)+t1_2(0)*t1_2(1)+3),"T2s-=T(0,1)");
+  test_for_zero(t2s_1(2,0)-(-3*t2s_2(0,2)+t1_2(0)*t1_2(2)+3),"T2s-=T(0,2)");
+  test_for_zero(t2s_1(0,1)-(-3*t2s_2(1,0)+t1_2(1)*t1_2(0)+3),"T2s-=T(1,0)");
+  test_for_zero(t2s_1(1,1)-(-3*t2s_2(1,1)+t1_2(1)*t1_2(1)+3),"T2s-=T(1,1)");
+  test_for_zero(t2s_1(2,1)-(-3*t2s_2(1,2)+t1_2(1)*t1_2(2)+3),"T2s-=T(1,2)");
+  test_for_zero(t2s_1(0,2)-(-3*t2s_2(2,0)+t1_2(2)*t1_2(0)+3),"T2s-=T(2,0)");
+  test_for_zero(t2s_1(1,2)-(-3*t2s_2(2,1)+t1_2(2)*t1_2(1)+3),"T2s-=T(2,1)");
+  test_for_zero(t2s_1(2,2)-(-3*t2s_2(2,2)+t1_2(2)*t1_2(2)+3),"T2s-=T(2,2)");
+
+  t2s_1(i,j)*=12;
+  test_for_zero(t2s_1(0,0)-(-3*t2s_2(0,0)+t1_2(0)*t1_2(0)+3)*12,"T2s*=T(0,0)");
+  test_for_zero(t2s_1(1,0)-(-3*t2s_2(0,1)+t1_2(0)*t1_2(1)+3)*12,"T2s*=T(0,1)");
+  test_for_zero(t2s_1(2,0)-(-3*t2s_2(0,2)+t1_2(0)*t1_2(2)+3)*12,"T2s*=T(0,2)");
+  test_for_zero(t2s_1(0,1)-(-3*t2s_2(1,0)+t1_2(1)*t1_2(0)+3)*12,"T2s*=T(1,0)");
+  test_for_zero(t2s_1(1,1)-(-3*t2s_2(1,1)+t1_2(1)*t1_2(1)+3)*12,"T2s*=T(1,1)");
+  test_for_zero(t2s_1(2,1)-(-3*t2s_2(1,2)+t1_2(1)*t1_2(2)+3)*12,"T2s*=T(1,2)");
+  test_for_zero(t2s_1(0,2)-(-3*t2s_2(2,0)+t1_2(2)*t1_2(0)+3)*12,"T2s*=T(2,0)");
+  test_for_zero(t2s_1(1,2)-(-3*t2s_2(2,1)+t1_2(2)*t1_2(1)+3)*12,"T2s*=T(2,1)");
+  test_for_zero(t2s_1(2,2)-(-3*t2s_2(2,2)+t1_2(2)*t1_2(2)+3)*12,"T2s*=T(2,2)");
+
+  t2s_1(i,j)/=4;
+  test_for_zero(t2s_1(0,0)-(-3*t2s_2(0,0)+t1_2(0)*t1_2(0)+3)*3,"T2s/=T(0,0)");
+  test_for_zero(t2s_1(1,0)-(-3*t2s_2(0,1)+t1_2(0)*t1_2(1)+3)*3,"T2s/=T(0,1)");
+  test_for_zero(t2s_1(2,0)-(-3*t2s_2(0,2)+t1_2(0)*t1_2(2)+3)*3,"T2s/=T(0,2)");
+  test_for_zero(t2s_1(0,1)-(-3*t2s_2(1,0)+t1_2(1)*t1_2(0)+3)*3,"T2s/=T(1,0)");
+  test_for_zero(t2s_1(1,1)-(-3*t2s_2(1,1)+t1_2(1)*t1_2(1)+3)*3,"T2s/=T(1,1)");
+  test_for_zero(t2s_1(2,1)-(-3*t2s_2(1,2)+t1_2(1)*t1_2(2)+3)*3,"T2s/=T(1,2)");
+  test_for_zero(t2s_1(0,2)-(-3*t2s_2(2,0)+t1_2(2)*t1_2(0)+3)*3,"T2s/=T(2,0)");
+  test_for_zero(t2s_1(1,2)-(-3*t2s_2(2,1)+t1_2(2)*t1_2(1)+3)*3,"T2s/=T(2,1)");
+  test_for_zero(t2s_1(2,2)-(-3*t2s_2(2,2)+t1_2(2)*t1_2(2)+3)*3,"T2s/=T(2,2)");
+
+  t2s_1(i,j)=10;
+  test_for_zero(t2s_1(0,0)-10,"T2s=T(0,0)");
+  test_for_zero(t2s_1(1,0)-10,"T2s=T(0,1)");
+  test_for_zero(t2s_1(2,0)-10,"T2s=T(0,2)");
+  test_for_zero(t2s_1(0,1)-10,"T2s=T(1,0)");
+  test_for_zero(t2s_1(1,1)-10,"T2s=T(1,1)");
+  test_for_zero(t2s_1(2,1)-10,"T2s=T(1,2)");
+  test_for_zero(t2s_1(0,2)-10,"T2s=T(2,0)");
+  test_for_zero(t2s_1(1,2)-10,"T2s=T(2,1)");
+  test_for_zero(t2s_1(2,2)-10,"T2s=T(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXL.C
--- a/tests/conformance/T2s/test_T2sXL.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXL(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  t2_1(i,j)=t2s_2(k,i)*t2_2(j,k);
-  test_for_zero(t2_1(0,0) - (t2s_2(0,0)*t2_2(0,0) + t2s_2(1,0)*t2_2(0,1)
-		       + t2s_2(2,0)*t2_2(0,2)),"T2s(k,i)*T2(j,k)(0,0)");
-  test_for_zero(t2_1(0,1) - (t2s_2(0,0)*t2_2(1,0) + t2s_2(1,0)*t2_2(1,1)
-		       + t2s_2(2,0)*t2_2(1,2)),"T2s(k,i)*T2(j,k)(0,1)");
-  test_for_zero(t2_1(0,2) - (t2s_2(0,0)*t2_2(2,0) + t2s_2(1,0)*t2_2(2,1)
-		       + t2s_2(2,0)*t2_2(2,2)),"T2s(k,i)*T2(j,k)(0,2)");
-  test_for_zero(t2_1(1,0) - (t2s_2(0,1)*t2_2(0,0) + t2s_2(1,1)*t2_2(0,1)
-		       + t2s_2(2,1)*t2_2(0,2)),"T2s(k,i)*T2(j,k)(1,0)");
-  test_for_zero(t2_1(1,1) - (t2s_2(0,1)*t2_2(1,0) + t2s_2(1,1)*t2_2(1,1)
-		       + t2s_2(2,1)*t2_2(1,2)),"T2s(k,i)*T2(j,k)(1,1)");
-  test_for_zero(t2_1(1,2) - (t2s_2(0,1)*t2_2(2,0) + t2s_2(1,1)*t2_2(2,1)
-		       + t2s_2(2,1)*t2_2(2,2)),"T2s(k,i)*T2(j,k)(1,2)");
-  test_for_zero(t2_1(2,0) - (t2s_2(0,2)*t2_2(0,0) + t2s_2(1,2)*t2_2(0,1)
-		       + t2s_2(2,2)*t2_2(0,2)),"T2s(k,i)*T2(j,k)(2,0)");
-  test_for_zero(t2_1(2,1) - (t2s_2(0,2)*t2_2(1,0) + t2s_2(1,2)*t2_2(1,1)
-		       + t2s_2(2,2)*t2_2(1,2)),"T2s(k,i)*T2(j,k)(2,1)");
-  test_for_zero(t2_1(2,2) - (t2s_2(0,2)*t2_2(2,0) + t2s_2(1,2)*t2_2(2,1)
-		       + t2s_2(2,2)*t2_2(2,2)),"T2s(k,i)*T2(j,k)(2,2)");
-  t2_1(i,j)=t2_2(j,k)*t2s_2(k,i);
-  test_for_zero(t2_1(0,0) - (t2s_2(0,0)*t2_2(0,0) + t2s_2(1,0)*t2_2(0,1)
-		       + t2s_2(2,0)*t2_2(0,2)),"T2(j,k)*T2s(k,i)(0,0)");
-  test_for_zero(t2_1(0,1) - (t2s_2(0,0)*t2_2(1,0) + t2s_2(1,0)*t2_2(1,1)
-		       + t2s_2(2,0)*t2_2(1,2)),"T2(j,k)*T2s(k,i)(0,1)");
-  test_for_zero(t2_1(0,2) - (t2s_2(0,0)*t2_2(2,0) + t2s_2(1,0)*t2_2(2,1)
-		       + t2s_2(2,0)*t2_2(2,2)),"T2(j,k)*T2s(k,i)(0,2)");
-  test_for_zero(t2_1(1,0) - (t2s_2(0,1)*t2_2(0,0) + t2s_2(1,1)*t2_2(0,1)
-		       + t2s_2(2,1)*t2_2(0,2)),"T2(j,k)*T2s(k,i)(1,0)");
-  test_for_zero(t2_1(1,1) - (t2s_2(0,1)*t2_2(1,0) + t2s_2(1,1)*t2_2(1,1)
-		       + t2s_2(2,1)*t2_2(1,2)),"T2(j,k)*T2s(k,i)(1,1)");
-  test_for_zero(t2_1(1,2) - (t2s_2(0,1)*t2_2(2,0) + t2s_2(1,1)*t2_2(2,1)
-		       + t2s_2(2,1)*t2_2(2,2)),"T2(j,k)*T2s(k,i)(1,2)");
-  test_for_zero(t2_1(2,0) - (t2s_2(0,2)*t2_2(0,0) + t2s_2(1,2)*t2_2(0,1)
-		       + t2s_2(2,2)*t2_2(0,2)),"T2(j,k)*T2s(k,i)(2,0)");
-  test_for_zero(t2_1(2,1) - (t2s_2(0,2)*t2_2(1,0) + t2s_2(1,2)*t2_2(1,1)
-		       + t2s_2(2,2)*t2_2(1,2)),"T2(j,k)*T2s(k,i)(2,1)");
-  test_for_zero(t2_1(2,2) - (t2s_2(0,2)*t2_2(2,0) + t2s_2(1,2)*t2_2(2,1)
-		       + t2s_2(2,2)*t2_2(2,2)),"T2(j,k)*T2s(k,i)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXL.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXL.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,66 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXL(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  t2_1(i,j)=t2s_2(k,i)*t2_2(j,k);
+  test_for_zero(t2_1(0,0) - (t2s_2(0,0)*t2_2(0,0) + t2s_2(1,0)*t2_2(0,1)
+		       + t2s_2(2,0)*t2_2(0,2)),"T2s(k,i)*T2(j,k)(0,0)");
+  test_for_zero(t2_1(0,1) - (t2s_2(0,0)*t2_2(1,0) + t2s_2(1,0)*t2_2(1,1)
+		       + t2s_2(2,0)*t2_2(1,2)),"T2s(k,i)*T2(j,k)(0,1)");
+  test_for_zero(t2_1(0,2) - (t2s_2(0,0)*t2_2(2,0) + t2s_2(1,0)*t2_2(2,1)
+		       + t2s_2(2,0)*t2_2(2,2)),"T2s(k,i)*T2(j,k)(0,2)");
+  test_for_zero(t2_1(1,0) - (t2s_2(0,1)*t2_2(0,0) + t2s_2(1,1)*t2_2(0,1)
+		       + t2s_2(2,1)*t2_2(0,2)),"T2s(k,i)*T2(j,k)(1,0)");
+  test_for_zero(t2_1(1,1) - (t2s_2(0,1)*t2_2(1,0) + t2s_2(1,1)*t2_2(1,1)
+		       + t2s_2(2,1)*t2_2(1,2)),"T2s(k,i)*T2(j,k)(1,1)");
+  test_for_zero(t2_1(1,2) - (t2s_2(0,1)*t2_2(2,0) + t2s_2(1,1)*t2_2(2,1)
+		       + t2s_2(2,1)*t2_2(2,2)),"T2s(k,i)*T2(j,k)(1,2)");
+  test_for_zero(t2_1(2,0) - (t2s_2(0,2)*t2_2(0,0) + t2s_2(1,2)*t2_2(0,1)
+		       + t2s_2(2,2)*t2_2(0,2)),"T2s(k,i)*T2(j,k)(2,0)");
+  test_for_zero(t2_1(2,1) - (t2s_2(0,2)*t2_2(1,0) + t2s_2(1,2)*t2_2(1,1)
+		       + t2s_2(2,2)*t2_2(1,2)),"T2s(k,i)*T2(j,k)(2,1)");
+  test_for_zero(t2_1(2,2) - (t2s_2(0,2)*t2_2(2,0) + t2s_2(1,2)*t2_2(2,1)
+		       + t2s_2(2,2)*t2_2(2,2)),"T2s(k,i)*T2(j,k)(2,2)");
+  t2_1(i,j)=t2_2(j,k)*t2s_2(k,i);
+  test_for_zero(t2_1(0,0) - (t2s_2(0,0)*t2_2(0,0) + t2s_2(1,0)*t2_2(0,1)
+		       + t2s_2(2,0)*t2_2(0,2)),"T2(j,k)*T2s(k,i)(0,0)");
+  test_for_zero(t2_1(0,1) - (t2s_2(0,0)*t2_2(1,0) + t2s_2(1,0)*t2_2(1,1)
+		       + t2s_2(2,0)*t2_2(1,2)),"T2(j,k)*T2s(k,i)(0,1)");
+  test_for_zero(t2_1(0,2) - (t2s_2(0,0)*t2_2(2,0) + t2s_2(1,0)*t2_2(2,1)
+		       + t2s_2(2,0)*t2_2(2,2)),"T2(j,k)*T2s(k,i)(0,2)");
+  test_for_zero(t2_1(1,0) - (t2s_2(0,1)*t2_2(0,0) + t2s_2(1,1)*t2_2(0,1)
+		       + t2s_2(2,1)*t2_2(0,2)),"T2(j,k)*T2s(k,i)(1,0)");
+  test_for_zero(t2_1(1,1) - (t2s_2(0,1)*t2_2(1,0) + t2s_2(1,1)*t2_2(1,1)
+		       + t2s_2(2,1)*t2_2(1,2)),"T2(j,k)*T2s(k,i)(1,1)");
+  test_for_zero(t2_1(1,2) - (t2s_2(0,1)*t2_2(2,0) + t2s_2(1,1)*t2_2(2,1)
+		       + t2s_2(2,1)*t2_2(2,2)),"T2(j,k)*T2s(k,i)(1,2)");
+  test_for_zero(t2_1(2,0) - (t2s_2(0,2)*t2_2(0,0) + t2s_2(1,2)*t2_2(0,1)
+		       + t2s_2(2,2)*t2_2(0,2)),"T2(j,k)*T2s(k,i)(2,0)");
+  test_for_zero(t2_1(2,1) - (t2s_2(0,2)*t2_2(1,0) + t2s_2(1,2)*t2_2(1,1)
+		       + t2s_2(2,2)*t2_2(1,2)),"T2(j,k)*T2s(k,i)(2,1)");
+  test_for_zero(t2_1(2,2) - (t2s_2(0,2)*t2_2(2,0) + t2s_2(1,2)*t2_2(2,1)
+		       + t2s_2(2,2)*t2_2(2,2)),"T2(j,k)*T2s(k,i)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXLI.C
--- a/tests/conformance/T2s/test_T2sXLI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,77 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXLI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  t2_1(0,0)=t2s_2(0,0);
-  t2_1(0,1)=t2s_2(0,1);
-  t2_1(0,2)=t2s_2(0,2);
-  t2_1(1,0)=t2s_2(1,0);
-  t2_1(1,1)=t2s_2(1,1);
-  t2_1(1,2)=t2s_2(1,2);
-  t2_1(2,0)=t2s_2(2,0);
-  t2_1(2,1)=t2s_2(2,1);
-  t2_1(2,2)=t2s_2(2,2);
-
-  t2s_1(i,j)=t2s_2(i,k)^t2_1(k,j);
-  test_for_zero(t2s_1(0,0) - (t2s_2(0,0)*t2_1(0,0) + t2s_2(0,1)*t2_1(1,0)
-		       + t2s_2(0,2)*t2_1(2,0)),"T2s(i,k)^T2(k,j)(0,0)");
-  test_for_zero(t2s_1(0,1) - (t2s_2(0,0)*t2_1(0,1) + t2s_2(0,1)*t2_1(1,1)
-		       + t2s_2(0,2)*t2_1(2,1)),"T2s(i,k)^T2(k,j)(0,1)");
-  test_for_zero(t2s_1(0,2) - (t2s_2(0,0)*t2_1(0,2) + t2s_2(0,1)*t2_1(1,2)
-		       + t2s_2(0,2)*t2_1(2,2)),"T2s(i,k)^T2(k,j)(0,2)");
-  test_for_zero(t2s_1(1,0) - (t2s_2(1,0)*t2_1(0,0) + t2s_2(1,1)*t2_1(1,0)
-		       + t2s_2(1,2)*t2_1(2,0)),"T2s(i,k)^T2(k,j)(1,0)");
-  test_for_zero(t2s_1(1,1) - (t2s_2(1,0)*t2_1(0,1) + t2s_2(1,1)*t2_1(1,1)
-		       + t2s_2(1,2)*t2_1(2,1)),"T2s(i,k)^T2(k,j)(1,1)");
-  test_for_zero(t2s_1(1,2) - (t2s_2(1,0)*t2_1(0,2) + t2s_2(1,1)*t2_1(1,2)
-		       + t2s_2(1,2)*t2_1(2,2)),"T2s(i,k)^T2(k,j)(1,2)");
-  test_for_zero(t2s_1(2,0) - (t2s_2(2,0)*t2_1(0,0) + t2s_2(2,1)*t2_1(1,0)
-		       + t2s_2(2,2)*t2_1(2,0)),"T2s(i,k)^T2(k,j)(2,0)");
-  test_for_zero(t2s_1(2,1) - (t2s_2(2,0)*t2_1(0,1) + t2s_2(2,1)*t2_1(1,1)
-		       + t2s_2(2,2)*t2_1(2,1)),"T2s(i,k)^T2(k,j)(2,1)");
-  test_for_zero(t2s_1(2,2) - (t2s_2(2,0)*t2_1(0,2) + t2s_2(2,1)*t2_1(1,2)
-		       + t2s_2(2,2)*t2_1(2,2)),"T2s(i,k)^T2(k,j)(2,2)");
-  t2s_1(i,j)=t2_1(k,j)^t2s_2(i,k);
-  test_for_zero(t2s_1(0,0) - (t2s_2(0,0)*t2_1(0,0) + t2s_2(0,1)*t2_1(1,0)
-		       + t2s_2(0,2)*t2_1(2,0)),"T2(k,j)^T2s(i,k)(0,0)");
-  test_for_zero(t2s_1(0,1) - (t2s_2(0,0)*t2_1(0,1) + t2s_2(0,1)*t2_1(1,1)
-		       + t2s_2(0,2)*t2_1(2,1)),"T2(k,j)^T2s(i,k)(0,1)");
-  test_for_zero(t2s_1(0,2) - (t2s_2(0,0)*t2_1(0,2) + t2s_2(0,1)*t2_1(1,2)
-		       + t2s_2(0,2)*t2_1(2,2)),"T2(k,j)^T2s(i,k)(0,2)");
-  test_for_zero(t2s_1(1,0) - (t2s_2(1,0)*t2_1(0,0) + t2s_2(1,1)*t2_1(1,0)
-		       + t2s_2(1,2)*t2_1(2,0)),"T2(k,j)^T2s(i,k)(1,0)");
-  test_for_zero(t2s_1(1,1) - (t2s_2(1,0)*t2_1(0,1) + t2s_2(1,1)*t2_1(1,1)
-		       + t2s_2(1,2)*t2_1(2,1)),"T2(k,j)^T2s(i,k)(1,1)");
-  test_for_zero(t2s_1(1,2) - (t2s_2(1,0)*t2_1(0,2) + t2s_2(1,1)*t2_1(1,2)
-		       + t2s_2(1,2)*t2_1(2,2)),"T2(k,j)^T2s(i,k)(1,2)");
-  test_for_zero(t2s_1(2,0) - (t2s_2(2,0)*t2_1(0,0) + t2s_2(2,1)*t2_1(1,0)
-		       + t2s_2(2,2)*t2_1(2,0)),"T2(k,j)^T2s(i,k)(2,0)");
-  test_for_zero(t2s_1(2,1) - (t2s_2(2,0)*t2_1(0,1) + t2s_2(2,1)*t2_1(1,1)
-		       + t2s_2(2,2)*t2_1(2,1)),"T2(k,j)^T2s(i,k)(2,1)");
-  test_for_zero(t2s_1(2,2) - (t2s_2(2,0)*t2_1(0,2) + t2s_2(2,1)*t2_1(1,2)
-		       + t2s_2(2,2)*t2_1(2,2)),"T2(k,j)^T2s(i,k)(2,2)");
-
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXLI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXLI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,77 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXLI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  t2_1(0,0)=t2s_2(0,0);
+  t2_1(0,1)=t2s_2(0,1);
+  t2_1(0,2)=t2s_2(0,2);
+  t2_1(1,0)=t2s_2(1,0);
+  t2_1(1,1)=t2s_2(1,1);
+  t2_1(1,2)=t2s_2(1,2);
+  t2_1(2,0)=t2s_2(2,0);
+  t2_1(2,1)=t2s_2(2,1);
+  t2_1(2,2)=t2s_2(2,2);
+
+  t2s_1(i,j)=t2s_2(i,k)^t2_1(k,j);
+  test_for_zero(t2s_1(0,0) - (t2s_2(0,0)*t2_1(0,0) + t2s_2(0,1)*t2_1(1,0)
+		       + t2s_2(0,2)*t2_1(2,0)),"T2s(i,k)^T2(k,j)(0,0)");
+  test_for_zero(t2s_1(0,1) - (t2s_2(0,0)*t2_1(0,1) + t2s_2(0,1)*t2_1(1,1)
+		       + t2s_2(0,2)*t2_1(2,1)),"T2s(i,k)^T2(k,j)(0,1)");
+  test_for_zero(t2s_1(0,2) - (t2s_2(0,0)*t2_1(0,2) + t2s_2(0,1)*t2_1(1,2)
+		       + t2s_2(0,2)*t2_1(2,2)),"T2s(i,k)^T2(k,j)(0,2)");
+  test_for_zero(t2s_1(1,0) - (t2s_2(1,0)*t2_1(0,0) + t2s_2(1,1)*t2_1(1,0)
+		       + t2s_2(1,2)*t2_1(2,0)),"T2s(i,k)^T2(k,j)(1,0)");
+  test_for_zero(t2s_1(1,1) - (t2s_2(1,0)*t2_1(0,1) + t2s_2(1,1)*t2_1(1,1)
+		       + t2s_2(1,2)*t2_1(2,1)),"T2s(i,k)^T2(k,j)(1,1)");
+  test_for_zero(t2s_1(1,2) - (t2s_2(1,0)*t2_1(0,2) + t2s_2(1,1)*t2_1(1,2)
+		       + t2s_2(1,2)*t2_1(2,2)),"T2s(i,k)^T2(k,j)(1,2)");
+  test_for_zero(t2s_1(2,0) - (t2s_2(2,0)*t2_1(0,0) + t2s_2(2,1)*t2_1(1,0)
+		       + t2s_2(2,2)*t2_1(2,0)),"T2s(i,k)^T2(k,j)(2,0)");
+  test_for_zero(t2s_1(2,1) - (t2s_2(2,0)*t2_1(0,1) + t2s_2(2,1)*t2_1(1,1)
+		       + t2s_2(2,2)*t2_1(2,1)),"T2s(i,k)^T2(k,j)(2,1)");
+  test_for_zero(t2s_1(2,2) - (t2s_2(2,0)*t2_1(0,2) + t2s_2(2,1)*t2_1(1,2)
+		       + t2s_2(2,2)*t2_1(2,2)),"T2s(i,k)^T2(k,j)(2,2)");
+  t2s_1(i,j)=t2_1(k,j)^t2s_2(i,k);
+  test_for_zero(t2s_1(0,0) - (t2s_2(0,0)*t2_1(0,0) + t2s_2(0,1)*t2_1(1,0)
+		       + t2s_2(0,2)*t2_1(2,0)),"T2(k,j)^T2s(i,k)(0,0)");
+  test_for_zero(t2s_1(0,1) - (t2s_2(0,0)*t2_1(0,1) + t2s_2(0,1)*t2_1(1,1)
+		       + t2s_2(0,2)*t2_1(2,1)),"T2(k,j)^T2s(i,k)(0,1)");
+  test_for_zero(t2s_1(0,2) - (t2s_2(0,0)*t2_1(0,2) + t2s_2(0,1)*t2_1(1,2)
+		       + t2s_2(0,2)*t2_1(2,2)),"T2(k,j)^T2s(i,k)(0,2)");
+  test_for_zero(t2s_1(1,0) - (t2s_2(1,0)*t2_1(0,0) + t2s_2(1,1)*t2_1(1,0)
+		       + t2s_2(1,2)*t2_1(2,0)),"T2(k,j)^T2s(i,k)(1,0)");
+  test_for_zero(t2s_1(1,1) - (t2s_2(1,0)*t2_1(0,1) + t2s_2(1,1)*t2_1(1,1)
+		       + t2s_2(1,2)*t2_1(2,1)),"T2(k,j)^T2s(i,k)(1,1)");
+  test_for_zero(t2s_1(1,2) - (t2s_2(1,0)*t2_1(0,2) + t2s_2(1,1)*t2_1(1,2)
+		       + t2s_2(1,2)*t2_1(2,2)),"T2(k,j)^T2s(i,k)(1,2)");
+  test_for_zero(t2s_1(2,0) - (t2s_2(2,0)*t2_1(0,0) + t2s_2(2,1)*t2_1(1,0)
+		       + t2s_2(2,2)*t2_1(2,0)),"T2(k,j)^T2s(i,k)(2,0)");
+  test_for_zero(t2s_1(2,1) - (t2s_2(2,0)*t2_1(0,1) + t2s_2(2,1)*t2_1(1,1)
+		       + t2s_2(2,2)*t2_1(2,1)),"T2(k,j)^T2s(i,k)(2,1)");
+  test_for_zero(t2s_1(2,2) - (t2s_2(2,0)*t2_1(0,2) + t2s_2(2,1)*t2_1(1,2)
+		       + t2s_2(2,2)*t2_1(2,2)),"T2(k,j)^T2s(i,k)(2,2)");
+
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXLII.C
--- a/tests/conformance/T2s/test_T2sXLII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,77 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXLII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  t2_1(0,0)=t2s_2(0,0);
-  t2_1(0,1)=t2s_2(0,1);
-  t2_1(0,2)=t2s_2(0,2);
-  t2_1(1,0)=t2s_2(1,0);
-  t2_1(1,1)=t2s_2(1,1);
-  t2_1(1,2)=t2s_2(1,2);
-  t2_1(2,0)=t2s_2(2,0);
-  t2_1(2,1)=t2s_2(2,1);
-  t2_1(2,2)=t2s_2(2,2);
-
-  t2s_1(i,j)=t2s_2(i,k)^t2_1(j,k);
-  test_for_zero(t2s_1(0,0) - (t2s_2(0,0)*t2_1(0,0) + t2s_2(0,1)*t2_1(0,1)
-		       + t2s_2(0,2)*t2_1(0,2)),"T2s(i,k)^T2(j,k)(0,0)");
-  test_for_zero(t2s_1(0,1) - (t2s_2(0,0)*t2_1(1,0) + t2s_2(0,1)*t2_1(1,1)
-		       + t2s_2(0,2)*t2_1(1,2)),"T2s(i,k)^T2(j,k)(0,1)");
-  test_for_zero(t2s_1(0,2) - (t2s_2(0,0)*t2_1(2,0) + t2s_2(0,1)*t2_1(2,1)
-		       + t2s_2(0,2)*t2_1(2,2)),"T2s(i,k)^T2(j,k)(0,2)");
-  test_for_zero(t2s_1(1,0) - (t2s_2(1,0)*t2_1(0,0) + t2s_2(1,1)*t2_1(0,1)
-		       + t2s_2(1,2)*t2_1(0,2)),"T2s(i,k)^T2(j,k)(1,0)");
-  test_for_zero(t2s_1(1,1) - (t2s_2(1,0)*t2_1(1,0) + t2s_2(1,1)*t2_1(1,1)
-		       + t2s_2(1,2)*t2_1(1,2)),"T2s(i,k)^T2(j,k)(1,1)");
-  test_for_zero(t2s_1(1,2) - (t2s_2(1,0)*t2_1(2,0) + t2s_2(1,1)*t2_1(2,1)
-		       + t2s_2(1,2)*t2_1(2,2)),"T2s(i,k)^T2(j,k)(1,2)");
-  test_for_zero(t2s_1(2,0) - (t2s_2(2,0)*t2_1(0,0) + t2s_2(2,1)*t2_1(0,1)
-		       + t2s_2(2,2)*t2_1(0,2)),"T2s(i,k)^T2(j,k)(2,0)");
-  test_for_zero(t2s_1(2,1) - (t2s_2(2,0)*t2_1(1,0) + t2s_2(2,1)*t2_1(1,1)
-		       + t2s_2(2,2)*t2_1(1,2)),"T2s(i,k)^T2(j,k)(2,1)");
-  test_for_zero(t2s_1(2,2) - (t2s_2(2,0)*t2_1(2,0) + t2s_2(2,1)*t2_1(2,1)
-		       + t2s_2(2,2)*t2_1(2,2)),"T2s(i,k)^T2(j,k)(2,2)");
-  t2s_1(i,j)=t2_1(j,k)^t2s_2(i,k);
-  test_for_zero(t2s_1(0,0) - (t2s_2(0,0)*t2_1(0,0) + t2s_2(0,1)*t2_1(0,1)
-		       + t2s_2(0,2)*t2_1(0,2)),"T2(j,k)^T2s(i,k)(0,0)");
-  test_for_zero(t2s_1(0,1) - (t2s_2(0,0)*t2_1(1,0) + t2s_2(0,1)*t2_1(1,1)
-		       + t2s_2(0,2)*t2_1(1,2)),"T2(j,k)^T2s(i,k)(0,1)");
-  test_for_zero(t2s_1(0,2) - (t2s_2(0,0)*t2_1(2,0) + t2s_2(0,1)*t2_1(2,1)
-		       + t2s_2(0,2)*t2_1(2,2)),"T2(j,k)^T2s(i,k)(0,2)");
-  test_for_zero(t2s_1(1,0) - (t2s_2(1,0)*t2_1(0,0) + t2s_2(1,1)*t2_1(0,1)
-		       + t2s_2(1,2)*t2_1(0,2)),"T2(j,k)^T2s(i,k)(1,0)");
-  test_for_zero(t2s_1(1,1) - (t2s_2(1,0)*t2_1(1,0) + t2s_2(1,1)*t2_1(1,1)
-		       + t2s_2(1,2)*t2_1(1,2)),"T2(j,k)^T2s(i,k)(1,1)");
-  test_for_zero(t2s_1(1,2) - (t2s_2(1,0)*t2_1(2,0) + t2s_2(1,1)*t2_1(2,1)
-		       + t2s_2(1,2)*t2_1(2,2)),"T2(j,k)^T2s(i,k)(1,2)");
-  test_for_zero(t2s_1(2,0) - (t2s_2(2,0)*t2_1(0,0) + t2s_2(2,1)*t2_1(0,1)
-		       + t2s_2(2,2)*t2_1(0,2)),"T2(j,k)^T2s(i,k)(2,0)");
-  test_for_zero(t2s_1(2,1) - (t2s_2(2,0)*t2_1(1,0) + t2s_2(2,1)*t2_1(1,1)
-		       + t2s_2(2,2)*t2_1(1,2)),"T2(j,k)^T2s(i,k)(2,1)");
-  test_for_zero(t2s_1(2,2) - (t2s_2(2,0)*t2_1(2,0) + t2s_2(2,1)*t2_1(2,1)
-		       + t2s_2(2,2)*t2_1(2,2)),"T2(j,k)^T2s(i,k)(2,2)");
-
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXLII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXLII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,77 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXLII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  t2_1(0,0)=t2s_2(0,0);
+  t2_1(0,1)=t2s_2(0,1);
+  t2_1(0,2)=t2s_2(0,2);
+  t2_1(1,0)=t2s_2(1,0);
+  t2_1(1,1)=t2s_2(1,1);
+  t2_1(1,2)=t2s_2(1,2);
+  t2_1(2,0)=t2s_2(2,0);
+  t2_1(2,1)=t2s_2(2,1);
+  t2_1(2,2)=t2s_2(2,2);
+
+  t2s_1(i,j)=t2s_2(i,k)^t2_1(j,k);
+  test_for_zero(t2s_1(0,0) - (t2s_2(0,0)*t2_1(0,0) + t2s_2(0,1)*t2_1(0,1)
+		       + t2s_2(0,2)*t2_1(0,2)),"T2s(i,k)^T2(j,k)(0,0)");
+  test_for_zero(t2s_1(0,1) - (t2s_2(0,0)*t2_1(1,0) + t2s_2(0,1)*t2_1(1,1)
+		       + t2s_2(0,2)*t2_1(1,2)),"T2s(i,k)^T2(j,k)(0,1)");
+  test_for_zero(t2s_1(0,2) - (t2s_2(0,0)*t2_1(2,0) + t2s_2(0,1)*t2_1(2,1)
+		       + t2s_2(0,2)*t2_1(2,2)),"T2s(i,k)^T2(j,k)(0,2)");
+  test_for_zero(t2s_1(1,0) - (t2s_2(1,0)*t2_1(0,0) + t2s_2(1,1)*t2_1(0,1)
+		       + t2s_2(1,2)*t2_1(0,2)),"T2s(i,k)^T2(j,k)(1,0)");
+  test_for_zero(t2s_1(1,1) - (t2s_2(1,0)*t2_1(1,0) + t2s_2(1,1)*t2_1(1,1)
+		       + t2s_2(1,2)*t2_1(1,2)),"T2s(i,k)^T2(j,k)(1,1)");
+  test_for_zero(t2s_1(1,2) - (t2s_2(1,0)*t2_1(2,0) + t2s_2(1,1)*t2_1(2,1)
+		       + t2s_2(1,2)*t2_1(2,2)),"T2s(i,k)^T2(j,k)(1,2)");
+  test_for_zero(t2s_1(2,0) - (t2s_2(2,0)*t2_1(0,0) + t2s_2(2,1)*t2_1(0,1)
+		       + t2s_2(2,2)*t2_1(0,2)),"T2s(i,k)^T2(j,k)(2,0)");
+  test_for_zero(t2s_1(2,1) - (t2s_2(2,0)*t2_1(1,0) + t2s_2(2,1)*t2_1(1,1)
+		       + t2s_2(2,2)*t2_1(1,2)),"T2s(i,k)^T2(j,k)(2,1)");
+  test_for_zero(t2s_1(2,2) - (t2s_2(2,0)*t2_1(2,0) + t2s_2(2,1)*t2_1(2,1)
+		       + t2s_2(2,2)*t2_1(2,2)),"T2s(i,k)^T2(j,k)(2,2)");
+  t2s_1(i,j)=t2_1(j,k)^t2s_2(i,k);
+  test_for_zero(t2s_1(0,0) - (t2s_2(0,0)*t2_1(0,0) + t2s_2(0,1)*t2_1(0,1)
+		       + t2s_2(0,2)*t2_1(0,2)),"T2(j,k)^T2s(i,k)(0,0)");
+  test_for_zero(t2s_1(0,1) - (t2s_2(0,0)*t2_1(1,0) + t2s_2(0,1)*t2_1(1,1)
+		       + t2s_2(0,2)*t2_1(1,2)),"T2(j,k)^T2s(i,k)(0,1)");
+  test_for_zero(t2s_1(0,2) - (t2s_2(0,0)*t2_1(2,0) + t2s_2(0,1)*t2_1(2,1)
+		       + t2s_2(0,2)*t2_1(2,2)),"T2(j,k)^T2s(i,k)(0,2)");
+  test_for_zero(t2s_1(1,0) - (t2s_2(1,0)*t2_1(0,0) + t2s_2(1,1)*t2_1(0,1)
+		       + t2s_2(1,2)*t2_1(0,2)),"T2(j,k)^T2s(i,k)(1,0)");
+  test_for_zero(t2s_1(1,1) - (t2s_2(1,0)*t2_1(1,0) + t2s_2(1,1)*t2_1(1,1)
+		       + t2s_2(1,2)*t2_1(1,2)),"T2(j,k)^T2s(i,k)(1,1)");
+  test_for_zero(t2s_1(1,2) - (t2s_2(1,0)*t2_1(2,0) + t2s_2(1,1)*t2_1(2,1)
+		       + t2s_2(1,2)*t2_1(2,2)),"T2(j,k)^T2s(i,k)(1,2)");
+  test_for_zero(t2s_1(2,0) - (t2s_2(2,0)*t2_1(0,0) + t2s_2(2,1)*t2_1(0,1)
+		       + t2s_2(2,2)*t2_1(0,2)),"T2(j,k)^T2s(i,k)(2,0)");
+  test_for_zero(t2s_1(2,1) - (t2s_2(2,0)*t2_1(1,0) + t2s_2(2,1)*t2_1(1,1)
+		       + t2s_2(2,2)*t2_1(1,2)),"T2(j,k)^T2s(i,k)(2,1)");
+  test_for_zero(t2s_1(2,2) - (t2s_2(2,0)*t2_1(2,0) + t2s_2(2,1)*t2_1(2,1)
+		       + t2s_2(2,2)*t2_1(2,2)),"T2(j,k)^T2s(i,k)(2,2)");
+
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXLIII.C
--- a/tests/conformance/T2s/test_T2sXLIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXLIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  t2_1(0,0)=t2s_2(0,0);
-  t2_1(0,1)=t2s_2(0,1);
-  t2_1(0,2)=t2s_2(0,2);
-  t2_1(1,0)=t2s_2(1,0);
-  t2_1(1,1)=t2s_2(1,1);
-  t2_1(1,2)=t2s_2(1,2);
-  t2_1(2,0)=t2s_2(2,0);
-  t2_1(2,1)=t2s_2(2,1);
-  t2_1(2,2)=t2s_2(2,2);
-
-
-
-  t2s_1(i,j)=t2s_2(k,i)^t2_1(k,j);
-  test_for_zero(t2s_1(0,0) - (t2s_2(0,0)*t2_1(0,0) + t2s_2(1,0)*t2_1(1,0)
-		       + t2s_2(2,0)*t2_1(2,0)),"T2s(k,i)^T2(k,j)(0,0)");
-  test_for_zero(t2s_1(0,1) - (t2s_2(0,0)*t2_1(0,1) + t2s_2(1,0)*t2_1(1,1)
-		       + t2s_2(2,0)*t2_1(2,1)),"T2s(k,i)^T2(k,j)(0,1)");
-  test_for_zero(t2s_1(0,2) - (t2s_2(0,0)*t2_1(0,2) + t2s_2(1,0)*t2_1(1,2)
-		       + t2s_2(2,0)*t2_1(2,2)),"T2s(k,i)^T2(k,j)(0,2)");
-  test_for_zero(t2s_1(1,0) - (t2s_2(0,1)*t2_1(0,0) + t2s_2(1,1)*t2_1(1,0)
-		       + t2s_2(2,1)*t2_1(2,0)),"T2s(k,i)^T2(k,j)(1,0)");
-  test_for_zero(t2s_1(1,1) - (t2s_2(0,1)*t2_1(0,1) + t2s_2(1,1)*t2_1(1,1)
-		       + t2s_2(2,1)*t2_1(2,1)),"T2s(k,i)^T2(k,j)(1,1)");
-  test_for_zero(t2s_1(1,2) - (t2s_2(0,1)*t2_1(0,2) + t2s_2(1,1)*t2_1(1,2)
-		       + t2s_2(2,1)*t2_1(2,2)),"T2s(k,i)^T2(k,j)(1,2)");
-  test_for_zero(t2s_1(2,0) - (t2s_2(0,2)*t2_1(0,0) + t2s_2(1,2)*t2_1(1,0)
-		       + t2s_2(2,2)*t2_1(2,0)),"T2s(k,i)^T2(k,j)(2,0)");
-  test_for_zero(t2s_1(2,1) - (t2s_2(0,2)*t2_1(0,1) + t2s_2(1,2)*t2_1(1,1)
-		       + t2s_2(2,2)*t2_1(2,1)),"T2s(k,i)^T2(k,j)(2,1)");
-  test_for_zero(t2s_1(2,2) - (t2s_2(0,2)*t2_1(0,2) + t2s_2(1,2)*t2_1(1,2)
-		       + t2s_2(2,2)*t2_1(2,2)),"T2s(k,i)^T2(k,j)(2,2)");
-  t2s_1(i,j)=t2_1(k,j)^t2s_2(k,i);
-  test_for_zero(t2s_1(0,0) - (t2s_2(0,0)*t2_1(0,0) + t2s_2(1,0)*t2_1(1,0)
-		       + t2s_2(2,0)*t2_1(2,0)),"T2(k,j)^T2s(k,i)(0,0)");
-  test_for_zero(t2s_1(0,1) - (t2s_2(0,0)*t2_1(0,1) + t2s_2(1,0)*t2_1(1,1)
-		       + t2s_2(2,0)*t2_1(2,1)),"T2(k,j)^T2s(k,i)(0,1)");
-  test_for_zero(t2s_1(0,2) - (t2s_2(0,0)*t2_1(0,2) + t2s_2(1,0)*t2_1(1,2)
-		       + t2s_2(2,0)*t2_1(2,2)),"T2(k,j)^T2s(k,i)(0,2)");
-  test_for_zero(t2s_1(1,0) - (t2s_2(0,1)*t2_1(0,0) + t2s_2(1,1)*t2_1(1,0)
-		       + t2s_2(2,1)*t2_1(2,0)),"T2(k,j)^T2s(k,i)(1,0)");
-  test_for_zero(t2s_1(1,1) - (t2s_2(0,1)*t2_1(0,1) + t2s_2(1,1)*t2_1(1,1)
-		       + t2s_2(2,1)*t2_1(2,1)),"T2(k,j)^T2s(k,i)(1,1)");
-  test_for_zero(t2s_1(1,2) - (t2s_2(0,1)*t2_1(0,2) + t2s_2(1,1)*t2_1(1,2)
-		       + t2s_2(2,1)*t2_1(2,2)),"T2(k,j)^T2s(k,i)(1,2)");
-  test_for_zero(t2s_1(2,0) - (t2s_2(0,2)*t2_1(0,0) + t2s_2(1,2)*t2_1(1,0)
-		       + t2s_2(2,2)*t2_1(2,0)),"T2(k,j)^T2s(k,i)(2,0)");
-  test_for_zero(t2s_1(2,1) - (t2s_2(0,2)*t2_1(0,1) + t2s_2(1,2)*t2_1(1,1)
-		       + t2s_2(2,2)*t2_1(2,1)),"T2(k,j)^T2s(k,i)(2,1)");
-  test_for_zero(t2s_1(2,2) - (t2s_2(0,2)*t2_1(0,2) + t2s_2(1,2)*t2_1(1,2)
-		       + t2s_2(2,2)*t2_1(2,2)),"T2(k,j)^T2s(k,i)(2,2)");
-
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXLIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXLIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,79 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXLIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  t2_1(0,0)=t2s_2(0,0);
+  t2_1(0,1)=t2s_2(0,1);
+  t2_1(0,2)=t2s_2(0,2);
+  t2_1(1,0)=t2s_2(1,0);
+  t2_1(1,1)=t2s_2(1,1);
+  t2_1(1,2)=t2s_2(1,2);
+  t2_1(2,0)=t2s_2(2,0);
+  t2_1(2,1)=t2s_2(2,1);
+  t2_1(2,2)=t2s_2(2,2);
+
+
+
+  t2s_1(i,j)=t2s_2(k,i)^t2_1(k,j);
+  test_for_zero(t2s_1(0,0) - (t2s_2(0,0)*t2_1(0,0) + t2s_2(1,0)*t2_1(1,0)
+		       + t2s_2(2,0)*t2_1(2,0)),"T2s(k,i)^T2(k,j)(0,0)");
+  test_for_zero(t2s_1(0,1) - (t2s_2(0,0)*t2_1(0,1) + t2s_2(1,0)*t2_1(1,1)
+		       + t2s_2(2,0)*t2_1(2,1)),"T2s(k,i)^T2(k,j)(0,1)");
+  test_for_zero(t2s_1(0,2) - (t2s_2(0,0)*t2_1(0,2) + t2s_2(1,0)*t2_1(1,2)
+		       + t2s_2(2,0)*t2_1(2,2)),"T2s(k,i)^T2(k,j)(0,2)");
+  test_for_zero(t2s_1(1,0) - (t2s_2(0,1)*t2_1(0,0) + t2s_2(1,1)*t2_1(1,0)
+		       + t2s_2(2,1)*t2_1(2,0)),"T2s(k,i)^T2(k,j)(1,0)");
+  test_for_zero(t2s_1(1,1) - (t2s_2(0,1)*t2_1(0,1) + t2s_2(1,1)*t2_1(1,1)
+		       + t2s_2(2,1)*t2_1(2,1)),"T2s(k,i)^T2(k,j)(1,1)");
+  test_for_zero(t2s_1(1,2) - (t2s_2(0,1)*t2_1(0,2) + t2s_2(1,1)*t2_1(1,2)
+		       + t2s_2(2,1)*t2_1(2,2)),"T2s(k,i)^T2(k,j)(1,2)");
+  test_for_zero(t2s_1(2,0) - (t2s_2(0,2)*t2_1(0,0) + t2s_2(1,2)*t2_1(1,0)
+		       + t2s_2(2,2)*t2_1(2,0)),"T2s(k,i)^T2(k,j)(2,0)");
+  test_for_zero(t2s_1(2,1) - (t2s_2(0,2)*t2_1(0,1) + t2s_2(1,2)*t2_1(1,1)
+		       + t2s_2(2,2)*t2_1(2,1)),"T2s(k,i)^T2(k,j)(2,1)");
+  test_for_zero(t2s_1(2,2) - (t2s_2(0,2)*t2_1(0,2) + t2s_2(1,2)*t2_1(1,2)
+		       + t2s_2(2,2)*t2_1(2,2)),"T2s(k,i)^T2(k,j)(2,2)");
+  t2s_1(i,j)=t2_1(k,j)^t2s_2(k,i);
+  test_for_zero(t2s_1(0,0) - (t2s_2(0,0)*t2_1(0,0) + t2s_2(1,0)*t2_1(1,0)
+		       + t2s_2(2,0)*t2_1(2,0)),"T2(k,j)^T2s(k,i)(0,0)");
+  test_for_zero(t2s_1(0,1) - (t2s_2(0,0)*t2_1(0,1) + t2s_2(1,0)*t2_1(1,1)
+		       + t2s_2(2,0)*t2_1(2,1)),"T2(k,j)^T2s(k,i)(0,1)");
+  test_for_zero(t2s_1(0,2) - (t2s_2(0,0)*t2_1(0,2) + t2s_2(1,0)*t2_1(1,2)
+		       + t2s_2(2,0)*t2_1(2,2)),"T2(k,j)^T2s(k,i)(0,2)");
+  test_for_zero(t2s_1(1,0) - (t2s_2(0,1)*t2_1(0,0) + t2s_2(1,1)*t2_1(1,0)
+		       + t2s_2(2,1)*t2_1(2,0)),"T2(k,j)^T2s(k,i)(1,0)");
+  test_for_zero(t2s_1(1,1) - (t2s_2(0,1)*t2_1(0,1) + t2s_2(1,1)*t2_1(1,1)
+		       + t2s_2(2,1)*t2_1(2,1)),"T2(k,j)^T2s(k,i)(1,1)");
+  test_for_zero(t2s_1(1,2) - (t2s_2(0,1)*t2_1(0,2) + t2s_2(1,1)*t2_1(1,2)
+		       + t2s_2(2,1)*t2_1(2,2)),"T2(k,j)^T2s(k,i)(1,2)");
+  test_for_zero(t2s_1(2,0) - (t2s_2(0,2)*t2_1(0,0) + t2s_2(1,2)*t2_1(1,0)
+		       + t2s_2(2,2)*t2_1(2,0)),"T2(k,j)^T2s(k,i)(2,0)");
+  test_for_zero(t2s_1(2,1) - (t2s_2(0,2)*t2_1(0,1) + t2s_2(1,2)*t2_1(1,1)
+		       + t2s_2(2,2)*t2_1(2,1)),"T2(k,j)^T2s(k,i)(2,1)");
+  test_for_zero(t2s_1(2,2) - (t2s_2(0,2)*t2_1(0,2) + t2s_2(1,2)*t2_1(1,2)
+		       + t2s_2(2,2)*t2_1(2,2)),"T2(k,j)^T2s(k,i)(2,2)");
+
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXLIV.C
--- a/tests/conformance/T2s/test_T2sXLIV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,77 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXLIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  t2_1(0,0)=t2s_2(0,0);
-  t2_1(0,1)=t2s_2(0,1);
-  t2_1(0,2)=t2s_2(0,2);
-  t2_1(1,0)=t2s_2(1,0);
-  t2_1(1,1)=t2s_2(1,1);
-  t2_1(1,2)=t2s_2(1,2);
-  t2_1(2,0)=t2s_2(2,0);
-  t2_1(2,1)=t2s_2(2,1);
-  t2_1(2,2)=t2s_2(2,2);
-
-  t2s_1(i,j)=t2s_2(k,i)^t2_1(j,k);
-  test_for_zero(t2s_1(0,0) - (t2s_2(0,0)*t2_1(0,0) + t2s_2(1,0)*t2_1(0,1)
-		       + t2s_2(2,0)*t2_1(0,2)),"T2s(k,i)^T2(j,k)(0,0)");
-  test_for_zero(t2s_1(0,1) - (t2s_2(0,0)*t2_1(1,0) + t2s_2(1,0)*t2_1(1,1)
-		       + t2s_2(2,0)*t2_1(1,2)),"T2s(k,i)^T2(j,k)(0,1)");
-  test_for_zero(t2s_1(0,2) - (t2s_2(0,0)*t2_1(2,0) + t2s_2(1,0)*t2_1(2,1)
-		       + t2s_2(2,0)*t2_1(2,2)),"T2s(k,i)^T2(j,k)(0,2)");
-  test_for_zero(t2s_1(1,0) - (t2s_2(0,1)*t2_1(0,0) + t2s_2(1,1)*t2_1(0,1)
-		       + t2s_2(2,1)*t2_1(0,2)),"T2s(k,i)^T2(j,k)(1,0)");
-  test_for_zero(t2s_1(1,1) - (t2s_2(0,1)*t2_1(1,0) + t2s_2(1,1)*t2_1(1,1)
-		       + t2s_2(2,1)*t2_1(1,2)),"T2s(k,i)^T2(j,k)(1,1)");
-  test_for_zero(t2s_1(1,2) - (t2s_2(0,1)*t2_1(2,0) + t2s_2(1,1)*t2_1(2,1)
-		       + t2s_2(2,1)*t2_1(2,2)),"T2s(k,i)^T2(j,k)(1,2)");
-  test_for_zero(t2s_1(2,0) - (t2s_2(0,2)*t2_1(0,0) + t2s_2(1,2)*t2_1(0,1)
-		       + t2s_2(2,2)*t2_1(0,2)),"T2s(k,i)^T2(j,k)(2,0)");
-  test_for_zero(t2s_1(2,1) - (t2s_2(0,2)*t2_1(1,0) + t2s_2(1,2)*t2_1(1,1)
-		       + t2s_2(2,2)*t2_1(1,2)),"T2s(k,i)^T2(j,k)(2,1)");
-  test_for_zero(t2s_1(2,2) - (t2s_2(0,2)*t2_1(2,0) + t2s_2(1,2)*t2_1(2,1)
-		       + t2s_2(2,2)*t2_1(2,2)),"T2s(k,i)^T2(j,k)(2,2)");
-  t2s_1(i,j)=t2_1(j,k)^t2s_2(k,i);
-  test_for_zero(t2s_1(0,0) - (t2s_2(0,0)*t2_1(0,0) + t2s_2(1,0)*t2_1(0,1)
-		       + t2s_2(2,0)*t2_1(0,2)),"T2(j,k)^T2s(k,i)(0,0)");
-  test_for_zero(t2s_1(0,1) - (t2s_2(0,0)*t2_1(1,0) + t2s_2(1,0)*t2_1(1,1)
-		       + t2s_2(2,0)*t2_1(1,2)),"T2(j,k)^T2s(k,i)(0,1)");
-  test_for_zero(t2s_1(0,2) - (t2s_2(0,0)*t2_1(2,0) + t2s_2(1,0)*t2_1(2,1)
-		       + t2s_2(2,0)*t2_1(2,2)),"T2(j,k)^T2s(k,i)(0,2)");
-  test_for_zero(t2s_1(1,0) - (t2s_2(0,1)*t2_1(0,0) + t2s_2(1,1)*t2_1(0,1)
-		       + t2s_2(2,1)*t2_1(0,2)),"T2(j,k)^T2s(k,i)(1,0)");
-  test_for_zero(t2s_1(1,1) - (t2s_2(0,1)*t2_1(1,0) + t2s_2(1,1)*t2_1(1,1)
-		       + t2s_2(2,1)*t2_1(1,2)),"T2(j,k)^T2s(k,i)(1,1)");
-  test_for_zero(t2s_1(1,2) - (t2s_2(0,1)*t2_1(2,0) + t2s_2(1,1)*t2_1(2,1)
-		       + t2s_2(2,1)*t2_1(2,2)),"T2(j,k)^T2s(k,i)(1,2)");
-  test_for_zero(t2s_1(2,0) - (t2s_2(0,2)*t2_1(0,0) + t2s_2(1,2)*t2_1(0,1)
-		       + t2s_2(2,2)*t2_1(0,2)),"T2(j,k)^T2s(k,i)(2,0)");
-  test_for_zero(t2s_1(2,1) - (t2s_2(0,2)*t2_1(1,0) + t2s_2(1,2)*t2_1(1,1)
-		       + t2s_2(2,2)*t2_1(1,2)),"T2(j,k)^T2s(k,i)(2,1)");
-  test_for_zero(t2s_1(2,2) - (t2s_2(0,2)*t2_1(2,0) + t2s_2(1,2)*t2_1(2,1)
-		       + t2s_2(2,2)*t2_1(2,2)),"T2(j,k)^T2s(k,i)(2,2)");
-
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXLIV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXLIV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,77 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXLIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  t2_1(0,0)=t2s_2(0,0);
+  t2_1(0,1)=t2s_2(0,1);
+  t2_1(0,2)=t2s_2(0,2);
+  t2_1(1,0)=t2s_2(1,0);
+  t2_1(1,1)=t2s_2(1,1);
+  t2_1(1,2)=t2s_2(1,2);
+  t2_1(2,0)=t2s_2(2,0);
+  t2_1(2,1)=t2s_2(2,1);
+  t2_1(2,2)=t2s_2(2,2);
+
+  t2s_1(i,j)=t2s_2(k,i)^t2_1(j,k);
+  test_for_zero(t2s_1(0,0) - (t2s_2(0,0)*t2_1(0,0) + t2s_2(1,0)*t2_1(0,1)
+		       + t2s_2(2,0)*t2_1(0,2)),"T2s(k,i)^T2(j,k)(0,0)");
+  test_for_zero(t2s_1(0,1) - (t2s_2(0,0)*t2_1(1,0) + t2s_2(1,0)*t2_1(1,1)
+		       + t2s_2(2,0)*t2_1(1,2)),"T2s(k,i)^T2(j,k)(0,1)");
+  test_for_zero(t2s_1(0,2) - (t2s_2(0,0)*t2_1(2,0) + t2s_2(1,0)*t2_1(2,1)
+		       + t2s_2(2,0)*t2_1(2,2)),"T2s(k,i)^T2(j,k)(0,2)");
+  test_for_zero(t2s_1(1,0) - (t2s_2(0,1)*t2_1(0,0) + t2s_2(1,1)*t2_1(0,1)
+		       + t2s_2(2,1)*t2_1(0,2)),"T2s(k,i)^T2(j,k)(1,0)");
+  test_for_zero(t2s_1(1,1) - (t2s_2(0,1)*t2_1(1,0) + t2s_2(1,1)*t2_1(1,1)
+		       + t2s_2(2,1)*t2_1(1,2)),"T2s(k,i)^T2(j,k)(1,1)");
+  test_for_zero(t2s_1(1,2) - (t2s_2(0,1)*t2_1(2,0) + t2s_2(1,1)*t2_1(2,1)
+		       + t2s_2(2,1)*t2_1(2,2)),"T2s(k,i)^T2(j,k)(1,2)");
+  test_for_zero(t2s_1(2,0) - (t2s_2(0,2)*t2_1(0,0) + t2s_2(1,2)*t2_1(0,1)
+		       + t2s_2(2,2)*t2_1(0,2)),"T2s(k,i)^T2(j,k)(2,0)");
+  test_for_zero(t2s_1(2,1) - (t2s_2(0,2)*t2_1(1,0) + t2s_2(1,2)*t2_1(1,1)
+		       + t2s_2(2,2)*t2_1(1,2)),"T2s(k,i)^T2(j,k)(2,1)");
+  test_for_zero(t2s_1(2,2) - (t2s_2(0,2)*t2_1(2,0) + t2s_2(1,2)*t2_1(2,1)
+		       + t2s_2(2,2)*t2_1(2,2)),"T2s(k,i)^T2(j,k)(2,2)");
+  t2s_1(i,j)=t2_1(j,k)^t2s_2(k,i);
+  test_for_zero(t2s_1(0,0) - (t2s_2(0,0)*t2_1(0,0) + t2s_2(1,0)*t2_1(0,1)
+		       + t2s_2(2,0)*t2_1(0,2)),"T2(j,k)^T2s(k,i)(0,0)");
+  test_for_zero(t2s_1(0,1) - (t2s_2(0,0)*t2_1(1,0) + t2s_2(1,0)*t2_1(1,1)
+		       + t2s_2(2,0)*t2_1(1,2)),"T2(j,k)^T2s(k,i)(0,1)");
+  test_for_zero(t2s_1(0,2) - (t2s_2(0,0)*t2_1(2,0) + t2s_2(1,0)*t2_1(2,1)
+		       + t2s_2(2,0)*t2_1(2,2)),"T2(j,k)^T2s(k,i)(0,2)");
+  test_for_zero(t2s_1(1,0) - (t2s_2(0,1)*t2_1(0,0) + t2s_2(1,1)*t2_1(0,1)
+		       + t2s_2(2,1)*t2_1(0,2)),"T2(j,k)^T2s(k,i)(1,0)");
+  test_for_zero(t2s_1(1,1) - (t2s_2(0,1)*t2_1(1,0) + t2s_2(1,1)*t2_1(1,1)
+		       + t2s_2(2,1)*t2_1(1,2)),"T2(j,k)^T2s(k,i)(1,1)");
+  test_for_zero(t2s_1(1,2) - (t2s_2(0,1)*t2_1(2,0) + t2s_2(1,1)*t2_1(2,1)
+		       + t2s_2(2,1)*t2_1(2,2)),"T2(j,k)^T2s(k,i)(1,2)");
+  test_for_zero(t2s_1(2,0) - (t2s_2(0,2)*t2_1(0,0) + t2s_2(1,2)*t2_1(0,1)
+		       + t2s_2(2,2)*t2_1(0,2)),"T2(j,k)^T2s(k,i)(2,0)");
+  test_for_zero(t2s_1(2,1) - (t2s_2(0,2)*t2_1(1,0) + t2s_2(1,2)*t2_1(1,1)
+		       + t2s_2(2,2)*t2_1(1,2)),"T2(j,k)^T2s(k,i)(2,1)");
+  test_for_zero(t2s_1(2,2) - (t2s_2(0,2)*t2_1(2,0) + t2s_2(1,2)*t2_1(2,1)
+		       + t2s_2(2,2)*t2_1(2,2)),"T2(j,k)^T2s(k,i)(2,2)");
+
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXV.C
--- a/tests/conformance/T2s/test_T2sXV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* Equals */
-
-  t2s_1(i,j)-=5*t2s_2(i,j);
-  test_for_zero(t2s_1(0,0)-(-3*t2s_2(0,0)+t1_2(0)*t1_2(0)),"T2s(i,j)-=T2s(i,j)(0,0)");
-  test_for_zero(t2s_1(0,1)-(-3*t2s_2(0,1)+t1_2(0)*t1_2(1)),"T2s(i,j)-=T2s(i,j)(0,1)");
-  test_for_zero(t2s_1(0,2)-(-3*t2s_2(0,2)+t1_2(0)*t1_2(2)),"T2s(i,j)-=T2s(i,j)(0,2)");
-  test_for_zero(t2s_1(1,0)-(-3*t2s_2(1,0)+t1_2(1)*t1_2(0)),"T2s(i,j)-=T2s(i,j)(1,0)");
-  test_for_zero(t2s_1(1,1)-(-3*t2s_2(1,1)+t1_2(1)*t1_2(1)),"T2s(i,j)-=T2s(i,j)(1,1)");
-  test_for_zero(t2s_1(1,2)-(-3*t2s_2(1,2)+t1_2(1)*t1_2(2)),"T2s(i,j)-=T2s(i,j)(1,2)");
-  test_for_zero(t2s_1(2,0)-(-3*t2s_2(2,0)+t1_2(2)*t1_2(0)),"T2s(i,j)-=T2s(i,j)(2,0)");
-  test_for_zero(t2s_1(2,1)-(-3*t2s_2(2,1)+t1_2(2)*t1_2(1)),"T2s(i,j)-=T2s(i,j)(2,1)");
-  test_for_zero(t2s_1(2,2)-(-3*t2s_2(2,2)+t1_2(2)*t1_2(2)),"T2s(i,j)-=T2s(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* Equals */
+
+  t2s_1(i,j)-=5*t2s_2(i,j);
+  test_for_zero(t2s_1(0,0)-(-3*t2s_2(0,0)+t1_2(0)*t1_2(0)),"T2s(i,j)-=T2s(i,j)(0,0)");
+  test_for_zero(t2s_1(0,1)-(-3*t2s_2(0,1)+t1_2(0)*t1_2(1)),"T2s(i,j)-=T2s(i,j)(0,1)");
+  test_for_zero(t2s_1(0,2)-(-3*t2s_2(0,2)+t1_2(0)*t1_2(2)),"T2s(i,j)-=T2s(i,j)(0,2)");
+  test_for_zero(t2s_1(1,0)-(-3*t2s_2(1,0)+t1_2(1)*t1_2(0)),"T2s(i,j)-=T2s(i,j)(1,0)");
+  test_for_zero(t2s_1(1,1)-(-3*t2s_2(1,1)+t1_2(1)*t1_2(1)),"T2s(i,j)-=T2s(i,j)(1,1)");
+  test_for_zero(t2s_1(1,2)-(-3*t2s_2(1,2)+t1_2(1)*t1_2(2)),"T2s(i,j)-=T2s(i,j)(1,2)");
+  test_for_zero(t2s_1(2,0)-(-3*t2s_2(2,0)+t1_2(2)*t1_2(0)),"T2s(i,j)-=T2s(i,j)(2,0)");
+  test_for_zero(t2s_1(2,1)-(-3*t2s_2(2,1)+t1_2(2)*t1_2(1)),"T2s(i,j)-=T2s(i,j)(2,1)");
+  test_for_zero(t2s_1(2,2)-(-3*t2s_2(2,2)+t1_2(2)*t1_2(2)),"T2s(i,j)-=T2s(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXVI.C
--- a/tests/conformance/T2s/test_T2sXVI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* Equals */
-
-  /* Switch indices */
-
-  t2s_1(j,i)=t2s_2(i,j)+(t1_2(j)^t1_2(i));
-  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)+t1_2(0)*t1_2(0)),"T2s(j,i)=T2s(i,j)+T2s(j,i)(0,0)");
-  test_for_zero(t2s_1(1,0)-(t2s_2(0,1)+t1_2(0)*t1_2(1)),"T2s(j,i)=T2s(i,j)+T2s(j,i)(0,1)");
-  test_for_zero(t2s_1(2,0)-(t2s_2(0,2)+t1_2(0)*t1_2(2)),"T2s(j,i)=T2s(i,j)+T2s(j,i)(0,2)");
-  test_for_zero(t2s_1(0,1)-(t2s_2(1,0)+t1_2(1)*t1_2(0)),"T2s(j,i)=T2s(i,j)+T2s(j,i)(1,0)");
-  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)+t1_2(1)*t1_2(1)),"T2s(j,i)=T2s(i,j)+T2s(j,i)(1,1)");
-  test_for_zero(t2s_1(2,1)-(t2s_2(1,2)+t1_2(1)*t1_2(2)),"T2s(j,i)=T2s(i,j)+T2s(j,i)(1,2)");
-  test_for_zero(t2s_1(0,2)-(t2s_2(2,0)+t1_2(2)*t1_2(0)),"T2s(j,i)=T2s(i,j)+T2s(j,i)(2,0)");
-  test_for_zero(t2s_1(1,2)-(t2s_2(2,1)+t1_2(2)*t1_2(1)),"T2s(j,i)=T2s(i,j)+T2s(j,i)(2,1)");
-  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)+t1_2(2)*t1_2(2)),"T2s(j,i)=T2s(i,j)+T2s(j,i)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXVI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXVI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,42 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* Equals */
+
+  /* Switch indices */
+
+  t2s_1(j,i)=t2s_2(i,j)+(t1_2(j)^t1_2(i));
+  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)+t1_2(0)*t1_2(0)),"T2s(j,i)=T2s(i,j)+T2s(j,i)(0,0)");
+  test_for_zero(t2s_1(1,0)-(t2s_2(0,1)+t1_2(0)*t1_2(1)),"T2s(j,i)=T2s(i,j)+T2s(j,i)(0,1)");
+  test_for_zero(t2s_1(2,0)-(t2s_2(0,2)+t1_2(0)*t1_2(2)),"T2s(j,i)=T2s(i,j)+T2s(j,i)(0,2)");
+  test_for_zero(t2s_1(0,1)-(t2s_2(1,0)+t1_2(1)*t1_2(0)),"T2s(j,i)=T2s(i,j)+T2s(j,i)(1,0)");
+  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)+t1_2(1)*t1_2(1)),"T2s(j,i)=T2s(i,j)+T2s(j,i)(1,1)");
+  test_for_zero(t2s_1(2,1)-(t2s_2(1,2)+t1_2(1)*t1_2(2)),"T2s(j,i)=T2s(i,j)+T2s(j,i)(1,2)");
+  test_for_zero(t2s_1(0,2)-(t2s_2(2,0)+t1_2(2)*t1_2(0)),"T2s(j,i)=T2s(i,j)+T2s(j,i)(2,0)");
+  test_for_zero(t2s_1(1,2)-(t2s_2(2,1)+t1_2(2)*t1_2(1)),"T2s(j,i)=T2s(i,j)+T2s(j,i)(2,1)");
+  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)+t1_2(2)*t1_2(2)),"T2s(j,i)=T2s(i,j)+T2s(j,i)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXVII.C
--- a/tests/conformance/T2s/test_T2sXVII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* Equals */
-
-  /* Switch indices */
-
-  t2s_1(j,i)+=t2s_2(i,j);
-  test_for_zero(t2s_1(0,0)-(2*t2s_2(0,0)+t1_2(0)*t1_2(0)),"T2s(j,i)+=T2s(i,j)(0,0)");
-  test_for_zero(t2s_1(1,0)-(2*t2s_2(0,1)+t1_2(0)*t1_2(1)),"T2s(j,i)+=T2s(i,j)(0,1)");
-  test_for_zero(t2s_1(2,0)-(2*t2s_2(0,2)+t1_2(0)*t1_2(2)),"T2s(j,i)+=T2s(i,j)(0,2)");
-  test_for_zero(t2s_1(0,1)-(2*t2s_2(1,0)+t1_2(1)*t1_2(0)),"T2s(j,i)+=T2s(i,j)(1,0)");
-  test_for_zero(t2s_1(1,1)-(2*t2s_2(1,1)+t1_2(1)*t1_2(1)),"T2s(j,i)+=T2s(i,j)(1,1)");
-  test_for_zero(t2s_1(2,1)-(2*t2s_2(1,2)+t1_2(1)*t1_2(2)),"T2s(j,i)+=T2s(i,j)(1,2)");
-  test_for_zero(t2s_1(0,2)-(2*t2s_2(2,0)+t1_2(2)*t1_2(0)),"T2s(j,i)+=T2s(i,j)(2,0)");
-  test_for_zero(t2s_1(1,2)-(2*t2s_2(2,1)+t1_2(2)*t1_2(1)),"T2s(j,i)+=T2s(i,j)(2,1)");
-  test_for_zero(t2s_1(2,2)-(2*t2s_2(2,2)+t1_2(2)*t1_2(2)),"T2s(j,i)+=T2s(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXVII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXVII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,42 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* Equals */
+
+  /* Switch indices */
+
+  t2s_1(j,i)+=t2s_2(i,j);
+  test_for_zero(t2s_1(0,0)-(2*t2s_2(0,0)+t1_2(0)*t1_2(0)),"T2s(j,i)+=T2s(i,j)(0,0)");
+  test_for_zero(t2s_1(1,0)-(2*t2s_2(0,1)+t1_2(0)*t1_2(1)),"T2s(j,i)+=T2s(i,j)(0,1)");
+  test_for_zero(t2s_1(2,0)-(2*t2s_2(0,2)+t1_2(0)*t1_2(2)),"T2s(j,i)+=T2s(i,j)(0,2)");
+  test_for_zero(t2s_1(0,1)-(2*t2s_2(1,0)+t1_2(1)*t1_2(0)),"T2s(j,i)+=T2s(i,j)(1,0)");
+  test_for_zero(t2s_1(1,1)-(2*t2s_2(1,1)+t1_2(1)*t1_2(1)),"T2s(j,i)+=T2s(i,j)(1,1)");
+  test_for_zero(t2s_1(2,1)-(2*t2s_2(1,2)+t1_2(1)*t1_2(2)),"T2s(j,i)+=T2s(i,j)(1,2)");
+  test_for_zero(t2s_1(0,2)-(2*t2s_2(2,0)+t1_2(2)*t1_2(0)),"T2s(j,i)+=T2s(i,j)(2,0)");
+  test_for_zero(t2s_1(1,2)-(2*t2s_2(2,1)+t1_2(2)*t1_2(1)),"T2s(j,i)+=T2s(i,j)(2,1)");
+  test_for_zero(t2s_1(2,2)-(2*t2s_2(2,2)+t1_2(2)*t1_2(2)),"T2s(j,i)+=T2s(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXVIII.C
--- a/tests/conformance/T2s/test_T2sXVIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* Equals */
-
-  /* Switch indices */
-
-  t2s_1(j,i)-=5*t2s_2(i,j);
-  test_for_zero(t2s_1(0,0)-(-3*t2s_2(0,0)+t1_2(0)*t1_2(0)),"T2s(j,i)-=T2s(i,j)(0,0)");
-  test_for_zero(t2s_1(1,0)-(-3*t2s_2(0,1)+t1_2(0)*t1_2(1)),"T2s(j,i)-=T2s(i,j)(0,1)");
-  test_for_zero(t2s_1(2,0)-(-3*t2s_2(0,2)+t1_2(0)*t1_2(2)),"T2s(j,i)-=T2s(i,j)(0,2)");
-  test_for_zero(t2s_1(0,1)-(-3*t2s_2(1,0)+t1_2(1)*t1_2(0)),"T2s(j,i)-=T2s(i,j)(1,0)");
-  test_for_zero(t2s_1(1,1)-(-3*t2s_2(1,1)+t1_2(1)*t1_2(1)),"T2s(j,i)-=T2s(i,j)(1,1)");
-  test_for_zero(t2s_1(2,1)-(-3*t2s_2(1,2)+t1_2(1)*t1_2(2)),"T2s(j,i)-=T2s(i,j)(1,2)");
-  test_for_zero(t2s_1(0,2)-(-3*t2s_2(2,0)+t1_2(2)*t1_2(0)),"T2s(j,i)-=T2s(i,j)(2,0)");
-  test_for_zero(t2s_1(1,2)-(-3*t2s_2(2,1)+t1_2(2)*t1_2(1)),"T2s(j,i)-=T2s(i,j)(2,1)");
-  test_for_zero(t2s_1(2,2)-(-3*t2s_2(2,2)+t1_2(2)*t1_2(2)),"T2s(j,i)-=T2s(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXVIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXVIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,42 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* Equals */
+
+  /* Switch indices */
+
+  t2s_1(j,i)-=5*t2s_2(i,j);
+  test_for_zero(t2s_1(0,0)-(-3*t2s_2(0,0)+t1_2(0)*t1_2(0)),"T2s(j,i)-=T2s(i,j)(0,0)");
+  test_for_zero(t2s_1(1,0)-(-3*t2s_2(0,1)+t1_2(0)*t1_2(1)),"T2s(j,i)-=T2s(i,j)(0,1)");
+  test_for_zero(t2s_1(2,0)-(-3*t2s_2(0,2)+t1_2(0)*t1_2(2)),"T2s(j,i)-=T2s(i,j)(0,2)");
+  test_for_zero(t2s_1(0,1)-(-3*t2s_2(1,0)+t1_2(1)*t1_2(0)),"T2s(j,i)-=T2s(i,j)(1,0)");
+  test_for_zero(t2s_1(1,1)-(-3*t2s_2(1,1)+t1_2(1)*t1_2(1)),"T2s(j,i)-=T2s(i,j)(1,1)");
+  test_for_zero(t2s_1(2,1)-(-3*t2s_2(1,2)+t1_2(1)*t1_2(2)),"T2s(j,i)-=T2s(i,j)(1,2)");
+  test_for_zero(t2s_1(0,2)-(-3*t2s_2(2,0)+t1_2(2)*t1_2(0)),"T2s(j,i)-=T2s(i,j)(2,0)");
+  test_for_zero(t2s_1(1,2)-(-3*t2s_2(2,1)+t1_2(2)*t1_2(1)),"T2s(j,i)-=T2s(i,j)(2,1)");
+  test_for_zero(t2s_1(2,2)-(-3*t2s_2(2,2)+t1_2(2)*t1_2(2)),"T2s(j,i)-=T2s(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXX.C
--- a/tests/conformance/T2s/test_T2sXX.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* Tensor2_symmetric*Tensor1 */
-
-  t1_1(i)=t2s_2(i,j)*t1_2(j);
-  test_for_zero(t1_1(0)-(t2s_2(0,0)*t1_2(0) + t2s_2(0,1)*t1_2(1) +t2s_2(0,2)*t1_2(2)),"T2s(i,j)*T1(j)(0)");
-  test_for_zero(t1_1(1)-(t2s_2(1,0)*t1_2(0) + t2s_2(1,1)*t1_2(1) +t2s_2(1,2)*t1_2(2)),"T2s(i,j)*T1(j)(1)");
-  test_for_zero(t1_1(2)-(t2s_2(2,0)*t1_2(0) + t2s_2(2,1)*t1_2(1) +t2s_2(2,2)*t1_2(2)),"T2s(i,j)*T1(j)(2)");
-
-  t1_1(i)=t1_2(j)*t2s_2(i,j);
-  test_for_zero(t1_1(0)-(t2s_2(0,0)*t1_2(0) + t2s_2(0,1)*t1_2(1) +t2s_2(0,2)*t1_2(2)),"T1(j)*T2s(i,j)(0)");
-  test_for_zero(t1_1(1)-(t2s_2(1,0)*t1_2(0) + t2s_2(1,1)*t1_2(1) +t2s_2(1,2)*t1_2(2)),"T1(j)*T2s(i,j)(1)");
-  test_for_zero(t1_1(2)-(t2s_2(2,0)*t1_2(0) + t2s_2(2,1)*t1_2(1) +t2s_2(2,2)*t1_2(2)),"T1(j)*T2s(i,j)(2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXX.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXX.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,39 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* Tensor2_symmetric*Tensor1 */
+
+  t1_1(i)=t2s_2(i,j)*t1_2(j);
+  test_for_zero(t1_1(0)-(t2s_2(0,0)*t1_2(0) + t2s_2(0,1)*t1_2(1) +t2s_2(0,2)*t1_2(2)),"T2s(i,j)*T1(j)(0)");
+  test_for_zero(t1_1(1)-(t2s_2(1,0)*t1_2(0) + t2s_2(1,1)*t1_2(1) +t2s_2(1,2)*t1_2(2)),"T2s(i,j)*T1(j)(1)");
+  test_for_zero(t1_1(2)-(t2s_2(2,0)*t1_2(0) + t2s_2(2,1)*t1_2(1) +t2s_2(2,2)*t1_2(2)),"T2s(i,j)*T1(j)(2)");
+
+  t1_1(i)=t1_2(j)*t2s_2(i,j);
+  test_for_zero(t1_1(0)-(t2s_2(0,0)*t1_2(0) + t2s_2(0,1)*t1_2(1) +t2s_2(0,2)*t1_2(2)),"T1(j)*T2s(i,j)(0)");
+  test_for_zero(t1_1(1)-(t2s_2(1,0)*t1_2(0) + t2s_2(1,1)*t1_2(1) +t2s_2(1,2)*t1_2(2)),"T1(j)*T2s(i,j)(1)");
+  test_for_zero(t1_1(2)-(t2s_2(2,0)*t1_2(0) + t2s_2(2,1)*t1_2(1) +t2s_2(2,2)*t1_2(2)),"T1(j)*T2s(i,j)(2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXI.C
--- a/tests/conformance/T2s/test_T2sXXI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* Tensor2_symmetric*Tensor1 */
-
-  t1_1(j)=t2s_2(i,j)*t1_2(i);
-  test_for_zero(t1_1(0)-(t2s_2(0,0)*t1_2(0) + t2s_2(1,0)*t1_2(1) +t2s_2(2,0)*t1_2(2)),"T2s(i,j)*T1(i)(0)");
-  test_for_zero(t1_1(1)-(t2s_2(0,1)*t1_2(0) + t2s_2(1,1)*t1_2(1) +t2s_2(2,1)*t1_2(2)),"T2s(i,j)*T1(i)(1)");
-  test_for_zero(t1_1(2)-(t2s_2(0,2)*t1_2(0) + t2s_2(1,2)*t1_2(1) +t2s_2(2,2)*t1_2(2)),"T2s(i,j)*T1(i)(2)");
-
-  t1_1(j)=t1_2(i)*t2s_2(i,j);
-  test_for_zero(t1_1(0)-(t2s_2(0,0)*t1_2(0) + t2s_2(1,0)*t1_2(1) +t2s_2(2,0)*t1_2(2)),"T1(i)*T2s(i,j)(0)");
-  test_for_zero(t1_1(1)-(t2s_2(0,1)*t1_2(0) + t2s_2(1,1)*t1_2(1) +t2s_2(2,1)*t1_2(2)),"T1(i)*T2s(i,j)(1)");
-  test_for_zero(t1_1(2)-(t2s_2(0,2)*t1_2(0) + t2s_2(1,2)*t1_2(1) +t2s_2(2,2)*t1_2(2)),"T1(i)*T2s(i,j)(2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXXI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,39 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* Tensor2_symmetric*Tensor1 */
+
+  t1_1(j)=t2s_2(i,j)*t1_2(i);
+  test_for_zero(t1_1(0)-(t2s_2(0,0)*t1_2(0) + t2s_2(1,0)*t1_2(1) +t2s_2(2,0)*t1_2(2)),"T2s(i,j)*T1(i)(0)");
+  test_for_zero(t1_1(1)-(t2s_2(0,1)*t1_2(0) + t2s_2(1,1)*t1_2(1) +t2s_2(2,1)*t1_2(2)),"T2s(i,j)*T1(i)(1)");
+  test_for_zero(t1_1(2)-(t2s_2(0,2)*t1_2(0) + t2s_2(1,2)*t1_2(1) +t2s_2(2,2)*t1_2(2)),"T2s(i,j)*T1(i)(2)");
+
+  t1_1(j)=t1_2(i)*t2s_2(i,j);
+  test_for_zero(t1_1(0)-(t2s_2(0,0)*t1_2(0) + t2s_2(1,0)*t1_2(1) +t2s_2(2,0)*t1_2(2)),"T1(i)*T2s(i,j)(0)");
+  test_for_zero(t1_1(1)-(t2s_2(0,1)*t1_2(0) + t2s_2(1,1)*t1_2(1) +t2s_2(2,1)*t1_2(2)),"T1(i)*T2s(i,j)(1)");
+  test_for_zero(t1_1(2)-(t2s_2(0,2)*t1_2(0) + t2s_2(1,2)*t1_2(1) +t2s_2(2,2)*t1_2(2)),"T1(i)*T2s(i,j)(2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXII.C
--- a/tests/conformance/T2s/test_T2sXXII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* Tensor2_symmetric*Tensor2_symmetric */
-
-  test_for_zero
-    (t2s_1(i,j)*t2s_2(i,j)
-     -(t2s_1(0,0)*t2s_2(0,0) + t2s_1(0,1)*t2s_2(0,1) + t2s_1(0,2)*t2s_2(0,2)
-       + t2s_1(1,0)*t2s_2(1,0) + t2s_1(1,1)*t2s_2(1,1) + t2s_1(1,2)*t2s_2(1,2)
-       + t2s_1(2,0)*t2s_2(2,0) + t2s_1(2,1)*t2s_2(2,1) 
-       + t2s_1(2,2)*t2s_2(2,2)),
-     "T2s(i,j)*T2s(i,j)");	
-
-  test_for_zero
-    (t2s_1(i,j)*t2s_2(j,i)
-     -(t2s_1(0,0)*t2s_2(0,0) + t2s_1(0,1)*t2s_2(1,0) + t2s_1(0,2)*t2s_2(2,0)
-       + t2s_1(1,0)*t2s_2(0,1) + t2s_1(1,1)*t2s_2(1,1) + t2s_1(1,2)*t2s_2(2,1)
-       + t2s_1(2,0)*t2s_2(0,2) + t2s_1(2,1)*t2s_2(1,2)
-       + t2s_1(2,2)*t2s_2(2,2)),
-     "T2s(i,j)*T2s(j,i)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXXII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,45 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* Tensor2_symmetric*Tensor2_symmetric */
+
+  test_for_zero
+    (t2s_1(i,j)*t2s_2(i,j)
+     -(t2s_1(0,0)*t2s_2(0,0) + t2s_1(0,1)*t2s_2(0,1) + t2s_1(0,2)*t2s_2(0,2)
+       + t2s_1(1,0)*t2s_2(1,0) + t2s_1(1,1)*t2s_2(1,1) + t2s_1(1,2)*t2s_2(1,2)
+       + t2s_1(2,0)*t2s_2(2,0) + t2s_1(2,1)*t2s_2(2,1) 
+       + t2s_1(2,2)*t2s_2(2,2)),
+     "T2s(i,j)*T2s(i,j)");	
+
+  test_for_zero
+    (t2s_1(i,j)*t2s_2(j,i)
+     -(t2s_1(0,0)*t2s_2(0,0) + t2s_1(0,1)*t2s_2(1,0) + t2s_1(0,2)*t2s_2(2,0)
+       + t2s_1(1,0)*t2s_2(0,1) + t2s_1(1,1)*t2s_2(1,1) + t2s_1(1,2)*t2s_2(2,1)
+       + t2s_1(2,0)*t2s_2(0,2) + t2s_1(2,1)*t2s_2(1,2)
+       + t2s_1(2,2)*t2s_2(2,2)),
+     "T2s(i,j)*T2s(j,i)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXIII.C
--- a/tests/conformance/T2s/test_T2sXXIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* Tensor2_symmetric*Tensor2_symmetric */
-
-  t2_1(i,k)=t2s_2(i,j)*t2s_3(j,k);
-  test_for_zero
-    (t2_1(0,0)
-     - (t2s_2(0,0)*t2s_3(0,0) + t2s_2(0,1)*t2s_3(1,0) + t2s_2(0,2)*t2s_3(2,0)),
-     "T2s(i,j)*T2s(j,k)(0,0)");
-  test_for_zero(t2_1(0,1)
-		- (t2s_2(0,0)*t2s_3(0,1) + t2s_2(0,1)*t2s_3(1,1) + t2s_2(0,2)*t2s_3(2,1)),
-     "T2s(i,j)*T2s(j,k)(0,1)");
-  test_for_zero(t2_1(0,2)
-		- (t2s_2(0,0)*t2s_3(0,2) + t2s_2(0,1)*t2s_3(1,2) + t2s_2(0,2)*t2s_3(2,2)),
-     "T2s(i,j)*T2s(j,k)(0,2)");
-  test_for_zero(t2_1(1,0)
-		- (t2s_2(1,0)*t2s_3(0,0) + t2s_2(1,1)*t2s_3(1,0) + t2s_2(1,2)*t2s_3(2,0)),
-     "T2s(i,j)*T2s(j,k)(1,0)");
-  test_for_zero(t2_1(1,1)
-		- (t2s_2(1,0)*t2s_3(0,1) + t2s_2(1,1)*t2s_3(1,1) + t2s_2(1,2)*t2s_3(2,1)),
-     "T2s(i,j)*T2s(j,k)(1,1)");
-  test_for_zero(t2_1(1,2)
-		- (t2s_2(1,0)*t2s_3(0,2) + t2s_2(1,1)*t2s_3(1,2) + t2s_2(1,2)*t2s_3(2,2)),
-     "T2s(i,j)*T2s(j,k)(1,2)");
-  test_for_zero(t2_1(2,0)
-		- (t2s_2(2,0)*t2s_3(0,0) + t2s_2(2,1)*t2s_3(1,0) + t2s_2(2,2)*t2s_3(2,0)),
-     "T2s(i,j)*T2s(j,k)(2,0)");
-  test_for_zero(t2_1(2,1)
-		- (t2s_2(2,0)*t2s_3(0,1) + t2s_2(2,1)*t2s_3(1,1) + t2s_2(2,2)*t2s_3(2,1)),
-     "T2s(i,j)*T2s(j,k)(2,1)");
-  test_for_zero(t2_1(2,2)
-		- (t2s_2(2,0)*t2s_3(0,2) + t2s_2(2,1)*t2s_3(1,2) + t2s_2(2,2)*t2s_3(2,2)),
-     "T2s(i,j)*T2s(j,k)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXXIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,59 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* Tensor2_symmetric*Tensor2_symmetric */
+
+  t2_1(i,k)=t2s_2(i,j)*t2s_3(j,k);
+  test_for_zero
+    (t2_1(0,0)
+     - (t2s_2(0,0)*t2s_3(0,0) + t2s_2(0,1)*t2s_3(1,0) + t2s_2(0,2)*t2s_3(2,0)),
+     "T2s(i,j)*T2s(j,k)(0,0)");
+  test_for_zero(t2_1(0,1)
+		- (t2s_2(0,0)*t2s_3(0,1) + t2s_2(0,1)*t2s_3(1,1) + t2s_2(0,2)*t2s_3(2,1)),
+     "T2s(i,j)*T2s(j,k)(0,1)");
+  test_for_zero(t2_1(0,2)
+		- (t2s_2(0,0)*t2s_3(0,2) + t2s_2(0,1)*t2s_3(1,2) + t2s_2(0,2)*t2s_3(2,2)),
+     "T2s(i,j)*T2s(j,k)(0,2)");
+  test_for_zero(t2_1(1,0)
+		- (t2s_2(1,0)*t2s_3(0,0) + t2s_2(1,1)*t2s_3(1,0) + t2s_2(1,2)*t2s_3(2,0)),
+     "T2s(i,j)*T2s(j,k)(1,0)");
+  test_for_zero(t2_1(1,1)
+		- (t2s_2(1,0)*t2s_3(0,1) + t2s_2(1,1)*t2s_3(1,1) + t2s_2(1,2)*t2s_3(2,1)),
+     "T2s(i,j)*T2s(j,k)(1,1)");
+  test_for_zero(t2_1(1,2)
+		- (t2s_2(1,0)*t2s_3(0,2) + t2s_2(1,1)*t2s_3(1,2) + t2s_2(1,2)*t2s_3(2,2)),
+     "T2s(i,j)*T2s(j,k)(1,2)");
+  test_for_zero(t2_1(2,0)
+		- (t2s_2(2,0)*t2s_3(0,0) + t2s_2(2,1)*t2s_3(1,0) + t2s_2(2,2)*t2s_3(2,0)),
+     "T2s(i,j)*T2s(j,k)(2,0)");
+  test_for_zero(t2_1(2,1)
+		- (t2s_2(2,0)*t2s_3(0,1) + t2s_2(2,1)*t2s_3(1,1) + t2s_2(2,2)*t2s_3(2,1)),
+     "T2s(i,j)*T2s(j,k)(2,1)");
+  test_for_zero(t2_1(2,2)
+		- (t2s_2(2,0)*t2s_3(0,2) + t2s_2(2,1)*t2s_3(1,2) + t2s_2(2,2)*t2s_3(2,2)),
+     "T2s(i,j)*T2s(j,k)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXIV.C
--- a/tests/conformance/T2s/test_T2sXXIV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* Tensor2_symmetric*Tensor2_symmetric */
-
-  t2_1(i,k)=t2s_2(i,j)*t2s_3(k,j);
-  test_for_zero(t2_1(0,0)
-		- (t2s_2(0,0)*t2s_3(0,0) + t2s_2(0,1)*t2s_3(0,1) + t2s_2(0,2)*t2s_3(0,2)),
-     "T2s(i,j)*T2s(k,j)(0,0)");
-  test_for_zero(t2_1(0,1)
-		- (t2s_2(0,0)*t2s_3(1,0) + t2s_2(0,1)*t2s_3(1,1) + t2s_2(0,2)*t2s_3(1,2)),
-     "T2s(i,j)*T2s(k,j)(0,1)");
-  test_for_zero(t2_1(0,2)
-		- (t2s_2(0,0)*t2s_3(2,0) + t2s_2(0,1)*t2s_3(2,1) + t2s_2(0,2)*t2s_3(2,2)),
-     "T2s(i,j)*T2s(k,j)(0,2)");
-  test_for_zero(t2_1(1,0)
-		- (t2s_2(1,0)*t2s_3(0,0) + t2s_2(1,1)*t2s_3(0,1) + t2s_2(1,2)*t2s_3(0,2)),
-     "T2s(i,j)*T2s(k,j)(1,0)");
-  test_for_zero(t2_1(1,1)
-		- (t2s_2(1,0)*t2s_3(1,0) + t2s_2(1,1)*t2s_3(1,1) + t2s_2(1,2)*t2s_3(1,2)),
-     "T2s(i,j)*T2s(k,j)(1,1)");
-  test_for_zero(t2_1(1,2)
-		- (t2s_2(1,0)*t2s_3(2,0) + t2s_2(1,1)*t2s_3(2,1) + t2s_2(1,2)*t2s_3(2,2)),
-     "T2s(i,j)*T2s(k,j)(1,2)");
-  test_for_zero(t2_1(2,0)
-		- (t2s_2(2,0)*t2s_3(0,0) + t2s_2(2,1)*t2s_3(0,1) + t2s_2(2,2)*t2s_3(0,2)),
-     "T2s(i,j)*T2s(k,j)(2,0)");
-  test_for_zero(t2_1(2,1)
-		- (t2s_2(2,0)*t2s_3(1,0) + t2s_2(2,1)*t2s_3(1,1) + t2s_2(2,2)*t2s_3(1,2)),
-     "T2s(i,j)*T2s(k,j)(2,1)");
-  test_for_zero(t2_1(2,2)
-		- (t2s_2(2,0)*t2s_3(2,0) + t2s_2(2,1)*t2s_3(2,1) + t2s_2(2,2)*t2s_3(2,2)),
-     "T2s(i,j)*T2s(k,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXIV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXXIV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,58 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* Tensor2_symmetric*Tensor2_symmetric */
+
+  t2_1(i,k)=t2s_2(i,j)*t2s_3(k,j);
+  test_for_zero(t2_1(0,0)
+		- (t2s_2(0,0)*t2s_3(0,0) + t2s_2(0,1)*t2s_3(0,1) + t2s_2(0,2)*t2s_3(0,2)),
+     "T2s(i,j)*T2s(k,j)(0,0)");
+  test_for_zero(t2_1(0,1)
+		- (t2s_2(0,0)*t2s_3(1,0) + t2s_2(0,1)*t2s_3(1,1) + t2s_2(0,2)*t2s_3(1,2)),
+     "T2s(i,j)*T2s(k,j)(0,1)");
+  test_for_zero(t2_1(0,2)
+		- (t2s_2(0,0)*t2s_3(2,0) + t2s_2(0,1)*t2s_3(2,1) + t2s_2(0,2)*t2s_3(2,2)),
+     "T2s(i,j)*T2s(k,j)(0,2)");
+  test_for_zero(t2_1(1,0)
+		- (t2s_2(1,0)*t2s_3(0,0) + t2s_2(1,1)*t2s_3(0,1) + t2s_2(1,2)*t2s_3(0,2)),
+     "T2s(i,j)*T2s(k,j)(1,0)");
+  test_for_zero(t2_1(1,1)
+		- (t2s_2(1,0)*t2s_3(1,0) + t2s_2(1,1)*t2s_3(1,1) + t2s_2(1,2)*t2s_3(1,2)),
+     "T2s(i,j)*T2s(k,j)(1,1)");
+  test_for_zero(t2_1(1,2)
+		- (t2s_2(1,0)*t2s_3(2,0) + t2s_2(1,1)*t2s_3(2,1) + t2s_2(1,2)*t2s_3(2,2)),
+     "T2s(i,j)*T2s(k,j)(1,2)");
+  test_for_zero(t2_1(2,0)
+		- (t2s_2(2,0)*t2s_3(0,0) + t2s_2(2,1)*t2s_3(0,1) + t2s_2(2,2)*t2s_3(0,2)),
+     "T2s(i,j)*T2s(k,j)(2,0)");
+  test_for_zero(t2_1(2,1)
+		- (t2s_2(2,0)*t2s_3(1,0) + t2s_2(2,1)*t2s_3(1,1) + t2s_2(2,2)*t2s_3(1,2)),
+     "T2s(i,j)*T2s(k,j)(2,1)");
+  test_for_zero(t2_1(2,2)
+		- (t2s_2(2,0)*t2s_3(2,0) + t2s_2(2,1)*t2s_3(2,1) + t2s_2(2,2)*t2s_3(2,2)),
+     "T2s(i,j)*T2s(k,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXIX.C
--- a/tests/conformance/T2s/test_T2sXXIX.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* -Tensor2_symmetric */
-
-  t2s_1(i,j)=-t2s_2(i,j);
-  test_for_zero(t2s_1(0,0)+(t2s_2(0,0)),"-T2s(0,0)");
-  test_for_zero(t2s_1(0,1)+(t2s_2(0,1)),"-T2s(0,1)");
-  test_for_zero(t2s_1(0,2)+(t2s_2(0,2)),"-T2s(0,2)");
-  test_for_zero(t2s_1(1,0)+(t2s_2(1,0)),"-T2s(1,0)");
-  test_for_zero(t2s_1(1,1)+(t2s_2(1,1)),"-T2s(1,1)");
-  test_for_zero(t2s_1(1,2)+(t2s_2(1,2)),"-T2s(1,2)");
-  test_for_zero(t2s_1(2,0)+(t2s_2(2,0)),"-T2s(2,0)");
-  test_for_zero(t2s_1(2,1)+(t2s_2(2,1)),"-T2s(2,1)");
-  test_for_zero(t2s_1(2,2)+(t2s_2(2,2)),"-T2s(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXIX.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXXIX.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* -Tensor2_symmetric */
+
+  t2s_1(i,j)=-t2s_2(i,j);
+  test_for_zero(t2s_1(0,0)+(t2s_2(0,0)),"-T2s(0,0)");
+  test_for_zero(t2s_1(0,1)+(t2s_2(0,1)),"-T2s(0,1)");
+  test_for_zero(t2s_1(0,2)+(t2s_2(0,2)),"-T2s(0,2)");
+  test_for_zero(t2s_1(1,0)+(t2s_2(1,0)),"-T2s(1,0)");
+  test_for_zero(t2s_1(1,1)+(t2s_2(1,1)),"-T2s(1,1)");
+  test_for_zero(t2s_1(1,2)+(t2s_2(1,2)),"-T2s(1,2)");
+  test_for_zero(t2s_1(2,0)+(t2s_2(2,0)),"-T2s(2,0)");
+  test_for_zero(t2s_1(2,1)+(t2s_2(2,1)),"-T2s(2,1)");
+  test_for_zero(t2s_1(2,2)+(t2s_2(2,2)),"-T2s(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXV.C
--- a/tests/conformance/T2s/test_T2sXXV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* Tensor2_symmetric*Tensor2_symmetric */
-
-  t2_1(j,k)=t2s_2(i,j)*t2s_3(i,k);
-  test_for_zero(t2_1(0,0)
-		- (t2s_2(0,0)*t2s_3(0,0) + t2s_2(1,0)*t2s_3(1,0) + t2s_2(2,0)*t2s_3(2,0)),
-     "T2s(i,j)*T2s(i,k)(0,0)");
-  test_for_zero(t2_1(0,1)
-		- (t2s_2(0,0)*t2s_3(0,1) + t2s_2(1,0)*t2s_3(1,1) + t2s_2(2,0)*t2s_3(2,1)),
-     "T2s(i,j)*T2s(i,k)(0,1)");
-  test_for_zero(t2_1(0,2)
-		- (t2s_2(0,0)*t2s_3(0,2) + t2s_2(1,0)*t2s_3(1,2) + t2s_2(2,0)*t2s_3(2,2)),
-     "T2s(i,j)*T2s(i,k)(0,2)");
-  test_for_zero(t2_1(1,0)
-		- (t2s_2(0,1)*t2s_3(0,0) + t2s_2(1,1)*t2s_3(1,0) + t2s_2(2,1)*t2s_3(2,0)),
-     "T2s(i,j)*T2s(i,k)(1,0)");
-  test_for_zero(t2_1(1,1)
-		- (t2s_2(0,1)*t2s_3(0,1) + t2s_2(1,1)*t2s_3(1,1) + t2s_2(2,1)*t2s_3(2,1)),
-     "T2s(i,j)*T2s(i,k)(1,1)");
-  test_for_zero(t2_1(1,2)
-		- (t2s_2(0,1)*t2s_3(0,2) + t2s_2(1,1)*t2s_3(1,2) + t2s_2(2,1)*t2s_3(2,2)),
-     "T2s(i,j)*T2s(i,k)(1,2)");
-  test_for_zero(t2_1(2,0)
-		- (t2s_2(0,2)*t2s_3(0,0) + t2s_2(1,2)*t2s_3(1,0) + t2s_2(2,2)*t2s_3(2,0)),
-     "T2s(i,j)*T2s(i,k)(2,0)");
-  test_for_zero(t2_1(2,1)
-		- (t2s_2(0,2)*t2s_3(0,1) + t2s_2(1,2)*t2s_3(1,1) + t2s_2(2,2)*t2s_3(2,1)),
-     "T2s(i,j)*T2s(i,k)(2,1)");
-  test_for_zero(t2_1(2,2)
-		- (t2s_2(0,2)*t2s_3(0,2) + t2s_2(1,2)*t2s_3(1,2) + t2s_2(2,2)*t2s_3(2,2)),
-     "T2s(i,j)*T2s(i,k)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXXV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,58 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* Tensor2_symmetric*Tensor2_symmetric */
+
+  t2_1(j,k)=t2s_2(i,j)*t2s_3(i,k);
+  test_for_zero(t2_1(0,0)
+		- (t2s_2(0,0)*t2s_3(0,0) + t2s_2(1,0)*t2s_3(1,0) + t2s_2(2,0)*t2s_3(2,0)),
+     "T2s(i,j)*T2s(i,k)(0,0)");
+  test_for_zero(t2_1(0,1)
+		- (t2s_2(0,0)*t2s_3(0,1) + t2s_2(1,0)*t2s_3(1,1) + t2s_2(2,0)*t2s_3(2,1)),
+     "T2s(i,j)*T2s(i,k)(0,1)");
+  test_for_zero(t2_1(0,2)
+		- (t2s_2(0,0)*t2s_3(0,2) + t2s_2(1,0)*t2s_3(1,2) + t2s_2(2,0)*t2s_3(2,2)),
+     "T2s(i,j)*T2s(i,k)(0,2)");
+  test_for_zero(t2_1(1,0)
+		- (t2s_2(0,1)*t2s_3(0,0) + t2s_2(1,1)*t2s_3(1,0) + t2s_2(2,1)*t2s_3(2,0)),
+     "T2s(i,j)*T2s(i,k)(1,0)");
+  test_for_zero(t2_1(1,1)
+		- (t2s_2(0,1)*t2s_3(0,1) + t2s_2(1,1)*t2s_3(1,1) + t2s_2(2,1)*t2s_3(2,1)),
+     "T2s(i,j)*T2s(i,k)(1,1)");
+  test_for_zero(t2_1(1,2)
+		- (t2s_2(0,1)*t2s_3(0,2) + t2s_2(1,1)*t2s_3(1,2) + t2s_2(2,1)*t2s_3(2,2)),
+     "T2s(i,j)*T2s(i,k)(1,2)");
+  test_for_zero(t2_1(2,0)
+		- (t2s_2(0,2)*t2s_3(0,0) + t2s_2(1,2)*t2s_3(1,0) + t2s_2(2,2)*t2s_3(2,0)),
+     "T2s(i,j)*T2s(i,k)(2,0)");
+  test_for_zero(t2_1(2,1)
+		- (t2s_2(0,2)*t2s_3(0,1) + t2s_2(1,2)*t2s_3(1,1) + t2s_2(2,2)*t2s_3(2,1)),
+     "T2s(i,j)*T2s(i,k)(2,1)");
+  test_for_zero(t2_1(2,2)
+		- (t2s_2(0,2)*t2s_3(0,2) + t2s_2(1,2)*t2s_3(1,2) + t2s_2(2,2)*t2s_3(2,2)),
+     "T2s(i,j)*T2s(i,k)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXVI.C
--- a/tests/conformance/T2s/test_T2sXXVI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* Tensor2_symmetric*Tensor2_symmetric */
-
-  t2_1(j,k)=t2s_2(i,j)*t2s_3(k,i);
-  test_for_zero(t2_1(0,0)
-		- (t2s_2(0,0)*t2s_3(0,0) + t2s_2(1,0)*t2s_3(0,1) + t2s_2(2,0)*t2s_3(0,2)),
-     "T2s(i,j)*T2s(k,i)(0,0)");
-  test_for_zero(t2_1(0,1)
-		- (t2s_2(0,0)*t2s_3(1,0) + t2s_2(1,0)*t2s_3(1,1) + t2s_2(2,0)*t2s_3(1,2)),
-     "T2s(i,j)*T2s(k,i)(0,1)");
-  test_for_zero(t2_1(0,2)
-		- (t2s_2(0,0)*t2s_3(2,0) + t2s_2(1,0)*t2s_3(2,1) + t2s_2(2,0)*t2s_3(2,2)),
-     "T2s(i,j)*T2s(k,i)(0,2)");
-  test_for_zero(t2_1(1,0)
-		- (t2s_2(0,1)*t2s_3(0,0) + t2s_2(1,1)*t2s_3(0,1) + t2s_2(2,1)*t2s_3(0,2)),
-     "T2s(i,j)*T2s(k,i)(1,0)");
-  test_for_zero(t2_1(1,1)
-		- (t2s_2(0,1)*t2s_3(1,0) + t2s_2(1,1)*t2s_3(1,1) + t2s_2(2,1)*t2s_3(1,2)),
-     "T2s(i,j)*T2s(k,i)(1,1)");
-  test_for_zero(t2_1(1,2)
-		- (t2s_2(0,1)*t2s_3(2,0) + t2s_2(1,1)*t2s_3(2,1) + t2s_2(2,1)*t2s_3(2,2)),
-     "T2s(i,j)*T2s(k,i)(1,2)");
-  test_for_zero(t2_1(2,0)
-		- (t2s_2(0,2)*t2s_3(0,0) + t2s_2(1,2)*t2s_3(0,1) + t2s_2(2,2)*t2s_3(0,2)),
-     "T2s(i,j)*T2s(k,i)(2,0)");
-  test_for_zero(t2_1(2,1)
-		- (t2s_2(0,2)*t2s_3(1,0) + t2s_2(1,2)*t2s_3(1,1) + t2s_2(2,2)*t2s_3(1,2)),
-     "T2s(i,j)*T2s(k,i)(2,1)");
-  test_for_zero(t2_1(2,2)
-		- (t2s_2(0,2)*t2s_3(2,0) + t2s_2(1,2)*t2s_3(2,1) + t2s_2(2,2)*t2s_3(2,2)),
-     "T2s(i,j)*T2s(k,i)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXVI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXXVI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,58 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* Tensor2_symmetric*Tensor2_symmetric */
+
+  t2_1(j,k)=t2s_2(i,j)*t2s_3(k,i);
+  test_for_zero(t2_1(0,0)
+		- (t2s_2(0,0)*t2s_3(0,0) + t2s_2(1,0)*t2s_3(0,1) + t2s_2(2,0)*t2s_3(0,2)),
+     "T2s(i,j)*T2s(k,i)(0,0)");
+  test_for_zero(t2_1(0,1)
+		- (t2s_2(0,0)*t2s_3(1,0) + t2s_2(1,0)*t2s_3(1,1) + t2s_2(2,0)*t2s_3(1,2)),
+     "T2s(i,j)*T2s(k,i)(0,1)");
+  test_for_zero(t2_1(0,2)
+		- (t2s_2(0,0)*t2s_3(2,0) + t2s_2(1,0)*t2s_3(2,1) + t2s_2(2,0)*t2s_3(2,2)),
+     "T2s(i,j)*T2s(k,i)(0,2)");
+  test_for_zero(t2_1(1,0)
+		- (t2s_2(0,1)*t2s_3(0,0) + t2s_2(1,1)*t2s_3(0,1) + t2s_2(2,1)*t2s_3(0,2)),
+     "T2s(i,j)*T2s(k,i)(1,0)");
+  test_for_zero(t2_1(1,1)
+		- (t2s_2(0,1)*t2s_3(1,0) + t2s_2(1,1)*t2s_3(1,1) + t2s_2(2,1)*t2s_3(1,2)),
+     "T2s(i,j)*T2s(k,i)(1,1)");
+  test_for_zero(t2_1(1,2)
+		- (t2s_2(0,1)*t2s_3(2,0) + t2s_2(1,1)*t2s_3(2,1) + t2s_2(2,1)*t2s_3(2,2)),
+     "T2s(i,j)*T2s(k,i)(1,2)");
+  test_for_zero(t2_1(2,0)
+		- (t2s_2(0,2)*t2s_3(0,0) + t2s_2(1,2)*t2s_3(0,1) + t2s_2(2,2)*t2s_3(0,2)),
+     "T2s(i,j)*T2s(k,i)(2,0)");
+  test_for_zero(t2_1(2,1)
+		- (t2s_2(0,2)*t2s_3(1,0) + t2s_2(1,2)*t2s_3(1,1) + t2s_2(2,2)*t2s_3(1,2)),
+     "T2s(i,j)*T2s(k,i)(2,1)");
+  test_for_zero(t2_1(2,2)
+		- (t2s_2(0,2)*t2s_3(2,0) + t2s_2(1,2)*t2s_3(2,1) + t2s_2(2,2)*t2s_3(2,2)),
+     "T2s(i,j)*T2s(k,i)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXVII.C
--- a/tests/conformance/T2s/test_T2sXXVII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* Tensor2_symmetric+-*T or /T */
-  
-  t2s_1(i,j)=t2s_2(i,j)*10;
-  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)*10),"T2s*T(0,0)");
-  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)*10),"T2s*T(0,1)");
-  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)*10),"T2s*T(0,2)");
-  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)*10),"T2s*T(1,0)");
-  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)*10),"T2s*T(1,1)");
-  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)*10),"T2s*T(1,2)");
-  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)*10),"T2s*T(2,0)");
-  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)*10),"T2s*T(2,1)");
-  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)*10),"T2s*T(2,2)");
-
-  t2s_1(i,j)=10*t2s_2(i,j);
-  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)*10),"T*T2s(0,0)");
-  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)*10),"T*T2s(0,1)");
-  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)*10),"T*T2s(0,2)");
-  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)*10),"T*T2s(1,0)");
-  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)*10),"T*T2s(1,1)");
-  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)*10),"T*T2s(1,2)");
-  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)*10),"T*T2s(2,0)");
-  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)*10),"T*T2s(2,1)");
-  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)*10),"T*T2s(2,2)");
-  
-  t2s_1(i,j)=t2s_2(i,j)/10;
-  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)/10),"T2s/T(0,0)");
-  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)/10),"T2s/T(0,1)");
-  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)/10),"T2s/T(0,2)");
-  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)/10),"T2s/T(1,0)");
-  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)/10),"T2s/T(1,1)");
-  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)/10),"T2s/T(1,2)");
-  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)/10),"T2s/T(2,0)");
-  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)/10),"T2s/T(2,1)");
-  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)/10),"T2s/T(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXVII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXXVII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,62 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* Tensor2_symmetric+-*T or /T */
+  
+  t2s_1(i,j)=t2s_2(i,j)*10;
+  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)*10),"T2s*T(0,0)");
+  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)*10),"T2s*T(0,1)");
+  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)*10),"T2s*T(0,2)");
+  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)*10),"T2s*T(1,0)");
+  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)*10),"T2s*T(1,1)");
+  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)*10),"T2s*T(1,2)");
+  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)*10),"T2s*T(2,0)");
+  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)*10),"T2s*T(2,1)");
+  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)*10),"T2s*T(2,2)");
+
+  t2s_1(i,j)=10*t2s_2(i,j);
+  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)*10),"T*T2s(0,0)");
+  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)*10),"T*T2s(0,1)");
+  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)*10),"T*T2s(0,2)");
+  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)*10),"T*T2s(1,0)");
+  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)*10),"T*T2s(1,1)");
+  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)*10),"T*T2s(1,2)");
+  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)*10),"T*T2s(2,0)");
+  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)*10),"T*T2s(2,1)");
+  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)*10),"T*T2s(2,2)");
+  
+  t2s_1(i,j)=t2s_2(i,j)/10;
+  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)/10),"T2s/T(0,0)");
+  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)/10),"T2s/T(0,1)");
+  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)/10),"T2s/T(0,2)");
+  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)/10),"T2s/T(1,0)");
+  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)/10),"T2s/T(1,1)");
+  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)/10),"T2s/T(1,2)");
+  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)/10),"T2s/T(2,0)");
+  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)/10),"T2s/T(2,1)");
+  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)/10),"T2s/T(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXVIII.C
--- a/tests/conformance/T2s/test_T2sXXVIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  /* Tensor2_symmetric+-*T or /T */
-
-  t2s_1(i,j)=t2s_2(i,j)+10;
-  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)+10),"T2s+T(0,0)");
-  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)+10),"T2s+T(0,1)");
-  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)+10),"T2s+T(0,2)");
-  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)+10),"T2s+T(1,0)");
-  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)+10),"T2s+T(1,1)");
-  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)+10),"T2s+T(1,2)");
-  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)+10),"T2s+T(2,0)");
-  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)+10),"T2s+T(2,1)");
-  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)+10),"T2s+T(2,2)");
-
-  t2s_1(i,j)=10+t2s_2(i,j);
-  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)+10),"T+T2s(0,0)");
-  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)+10),"T+T2s(0,1)");
-  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)+10),"T+T2s(0,2)");
-  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)+10),"T+T2s(1,0)");
-  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)+10),"T+T2s(1,1)");
-  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)+10),"T+T2s(1,2)");
-  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)+10),"T+T2s(2,0)");
-  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)+10),"T+T2s(2,1)");
-  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)+10),"T+T2s(2,2)");
-
-  t2s_1(i,j)=t2s_2(i,j)-10;
-  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)-10),"T2s-T(0,0)");
-  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)-10),"T2s-T(0,1)");
-  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)-10),"T2s-T(0,2)");
-  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)-10),"T2s-T(1,0)");
-  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)-10),"T2s-T(1,1)");
-  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)-10),"T2s-T(1,2)");
-  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)-10),"T2s-T(2,0)");
-  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)-10),"T2s-T(2,1)");
-  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)-10),"T2s-T(2,2)");
-
-  t2s_1(i,j)=10-t2s_2(i,j);
-  test_for_zero(t2s_1(0,0)-(10-t2s_2(0,0)),"T-T2s(0,0)");
-  test_for_zero(t2s_1(0,1)-(10-t2s_2(0,1)),"T-T2s(0,1)");
-  test_for_zero(t2s_1(0,2)-(10-t2s_2(0,2)),"T-T2s(0,2)");
-  test_for_zero(t2s_1(1,0)-(10-t2s_2(1,0)),"T-T2s(1,0)");
-  test_for_zero(t2s_1(1,1)-(10-t2s_2(1,1)),"T-T2s(1,1)");
-  test_for_zero(t2s_1(1,2)-(10-t2s_2(1,2)),"T-T2s(1,2)");
-  test_for_zero(t2s_1(2,0)-(10-t2s_2(2,0)),"T-T2s(2,0)");
-  test_for_zero(t2s_1(2,1)-(10-t2s_2(2,1)),"T-T2s(2,1)");
-  test_for_zero(t2s_1(2,2)-(10-t2s_2(2,2)),"T-T2s(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXVIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXXVIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,73 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  /* Tensor2_symmetric+-*T or /T */
+
+  t2s_1(i,j)=t2s_2(i,j)+10;
+  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)+10),"T2s+T(0,0)");
+  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)+10),"T2s+T(0,1)");
+  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)+10),"T2s+T(0,2)");
+  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)+10),"T2s+T(1,0)");
+  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)+10),"T2s+T(1,1)");
+  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)+10),"T2s+T(1,2)");
+  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)+10),"T2s+T(2,0)");
+  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)+10),"T2s+T(2,1)");
+  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)+10),"T2s+T(2,2)");
+
+  t2s_1(i,j)=10+t2s_2(i,j);
+  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)+10),"T+T2s(0,0)");
+  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)+10),"T+T2s(0,1)");
+  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)+10),"T+T2s(0,2)");
+  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)+10),"T+T2s(1,0)");
+  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)+10),"T+T2s(1,1)");
+  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)+10),"T+T2s(1,2)");
+  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)+10),"T+T2s(2,0)");
+  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)+10),"T+T2s(2,1)");
+  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)+10),"T+T2s(2,2)");
+
+  t2s_1(i,j)=t2s_2(i,j)-10;
+  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)-10),"T2s-T(0,0)");
+  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)-10),"T2s-T(0,1)");
+  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)-10),"T2s-T(0,2)");
+  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)-10),"T2s-T(1,0)");
+  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)-10),"T2s-T(1,1)");
+  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)-10),"T2s-T(1,2)");
+  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)-10),"T2s-T(2,0)");
+  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)-10),"T2s-T(2,1)");
+  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)-10),"T2s-T(2,2)");
+
+  t2s_1(i,j)=10-t2s_2(i,j);
+  test_for_zero(t2s_1(0,0)-(10-t2s_2(0,0)),"T-T2s(0,0)");
+  test_for_zero(t2s_1(0,1)-(10-t2s_2(0,1)),"T-T2s(0,1)");
+  test_for_zero(t2s_1(0,2)-(10-t2s_2(0,2)),"T-T2s(0,2)");
+  test_for_zero(t2s_1(1,0)-(10-t2s_2(1,0)),"T-T2s(1,0)");
+  test_for_zero(t2s_1(1,1)-(10-t2s_2(1,1)),"T-T2s(1,1)");
+  test_for_zero(t2s_1(1,2)-(10-t2s_2(1,2)),"T-T2s(1,2)");
+  test_for_zero(t2s_1(2,0)-(10-t2s_2(2,0)),"T-T2s(2,0)");
+  test_for_zero(t2s_1(2,1)-(10-t2s_2(2,1)),"T-T2s(2,1)");
+  test_for_zero(t2s_1(2,2)-(10-t2s_2(2,2)),"T-T2s(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXX.C
--- a/tests/conformance/T2s/test_T2sXXX.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXXX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  t2_1(i,j)=t2s_2(i,j)+t2_2(i,j);
-  test_for_zero(t2_1(0,0)-(t2s_2(0,0)+t2_2(0,0)),"T2s(i,j)+T2(i,j)(0,0)");
-  test_for_zero(t2_1(0,1)-(t2s_2(0,1)+t2_2(0,1)),"T2s(i,j)+T2(i,j)(0,1)");
-  test_for_zero(t2_1(0,2)-(t2s_2(0,2)+t2_2(0,2)),"T2s(i,j)+T2(i,j)(0,2)");
-  test_for_zero(t2_1(1,0)-(t2s_2(1,0)+t2_2(1,0)),"T2s(i,j)+T2(i,j)(1,0)");
-  test_for_zero(t2_1(1,1)-(t2s_2(1,1)+t2_2(1,1)),"T2s(i,j)+T2(i,j)(1,1)");
-  test_for_zero(t2_1(1,2)-(t2s_2(1,2)+t2_2(1,2)),"T2s(i,j)+T2(i,j)(1,2)");
-  test_for_zero(t2_1(2,0)-(t2s_2(2,0)+t2_2(2,0)),"T2s(i,j)+T2(i,j)(2,0)");
-  test_for_zero(t2_1(2,1)-(t2s_2(2,1)+t2_2(2,1)),"T2s(i,j)+T2(i,j)(2,1)");
-  test_for_zero(t2_1(2,2)-(t2s_2(2,2)+t2_2(2,2)),"T2s(i,j)+T2(i,j)(2,2)");
-  t2_1(i,j)=t2_2(i,j)+t2s_2(i,j);
-  test_for_zero(t2_1(0,0)-(t2s_2(0,0)+t2_2(0,0)),"T2(i,j)+T2s(i,j)(0,0)");
-  test_for_zero(t2_1(0,1)-(t2s_2(0,1)+t2_2(0,1)),"T2(i,j)+T2s(i,j)(0,1)");
-  test_for_zero(t2_1(0,2)-(t2s_2(0,2)+t2_2(0,2)),"T2(i,j)+T2s(i,j)(0,2)");
-  test_for_zero(t2_1(1,0)-(t2s_2(1,0)+t2_2(1,0)),"T2(i,j)+T2s(i,j)(1,0)");
-  test_for_zero(t2_1(1,1)-(t2s_2(1,1)+t2_2(1,1)),"T2(i,j)+T2s(i,j)(1,1)");
-  test_for_zero(t2_1(1,2)-(t2s_2(1,2)+t2_2(1,2)),"T2(i,j)+T2s(i,j)(1,2)");
-  test_for_zero(t2_1(2,0)-(t2s_2(2,0)+t2_2(2,0)),"T2(i,j)+T2s(i,j)(2,0)");
-  test_for_zero(t2_1(2,1)-(t2s_2(2,1)+t2_2(2,1)),"T2(i,j)+T2s(i,j)(2,1)");
-  test_for_zero(t2_1(2,2)-(t2s_2(2,2)+t2_2(2,2)),"T2(i,j)+T2s(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXX.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXXX.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,48 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXXX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  t2_1(i,j)=t2s_2(i,j)+t2_2(i,j);
+  test_for_zero(t2_1(0,0)-(t2s_2(0,0)+t2_2(0,0)),"T2s(i,j)+T2(i,j)(0,0)");
+  test_for_zero(t2_1(0,1)-(t2s_2(0,1)+t2_2(0,1)),"T2s(i,j)+T2(i,j)(0,1)");
+  test_for_zero(t2_1(0,2)-(t2s_2(0,2)+t2_2(0,2)),"T2s(i,j)+T2(i,j)(0,2)");
+  test_for_zero(t2_1(1,0)-(t2s_2(1,0)+t2_2(1,0)),"T2s(i,j)+T2(i,j)(1,0)");
+  test_for_zero(t2_1(1,1)-(t2s_2(1,1)+t2_2(1,1)),"T2s(i,j)+T2(i,j)(1,1)");
+  test_for_zero(t2_1(1,2)-(t2s_2(1,2)+t2_2(1,2)),"T2s(i,j)+T2(i,j)(1,2)");
+  test_for_zero(t2_1(2,0)-(t2s_2(2,0)+t2_2(2,0)),"T2s(i,j)+T2(i,j)(2,0)");
+  test_for_zero(t2_1(2,1)-(t2s_2(2,1)+t2_2(2,1)),"T2s(i,j)+T2(i,j)(2,1)");
+  test_for_zero(t2_1(2,2)-(t2s_2(2,2)+t2_2(2,2)),"T2s(i,j)+T2(i,j)(2,2)");
+  t2_1(i,j)=t2_2(i,j)+t2s_2(i,j);
+  test_for_zero(t2_1(0,0)-(t2s_2(0,0)+t2_2(0,0)),"T2(i,j)+T2s(i,j)(0,0)");
+  test_for_zero(t2_1(0,1)-(t2s_2(0,1)+t2_2(0,1)),"T2(i,j)+T2s(i,j)(0,1)");
+  test_for_zero(t2_1(0,2)-(t2s_2(0,2)+t2_2(0,2)),"T2(i,j)+T2s(i,j)(0,2)");
+  test_for_zero(t2_1(1,0)-(t2s_2(1,0)+t2_2(1,0)),"T2(i,j)+T2s(i,j)(1,0)");
+  test_for_zero(t2_1(1,1)-(t2s_2(1,1)+t2_2(1,1)),"T2(i,j)+T2s(i,j)(1,1)");
+  test_for_zero(t2_1(1,2)-(t2s_2(1,2)+t2_2(1,2)),"T2(i,j)+T2s(i,j)(1,2)");
+  test_for_zero(t2_1(2,0)-(t2s_2(2,0)+t2_2(2,0)),"T2(i,j)+T2s(i,j)(2,0)");
+  test_for_zero(t2_1(2,1)-(t2s_2(2,1)+t2_2(2,1)),"T2(i,j)+T2s(i,j)(2,1)");
+  test_for_zero(t2_1(2,2)-(t2s_2(2,2)+t2_2(2,2)),"T2(i,j)+T2s(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXXI.C
--- a/tests/conformance/T2s/test_T2sXXXI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXXXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  t2_1(i,j)=t2s_2(i,j)+t2_2(j,i);
-  test_for_zero(t2_1(0,0)-(t2s_2(0,0)+t2_2(0,0)),"T2s(i,j)+T2(j,i)(0,0)");
-  test_for_zero(t2_1(0,1)-(t2s_2(0,1)+t2_2(1,0)),"T2s(i,j)+T2(j,i)(0,1)");
-  test_for_zero(t2_1(0,2)-(t2s_2(0,2)+t2_2(2,0)),"T2s(i,j)+T2(j,i)(0,2)");
-  test_for_zero(t2_1(1,0)-(t2s_2(1,0)+t2_2(0,1)),"T2s(i,j)+T2(j,i)(1,0)");
-  test_for_zero(t2_1(1,1)-(t2s_2(1,1)+t2_2(1,1)),"T2s(i,j)+T2(j,i)(1,1)");
-  test_for_zero(t2_1(1,2)-(t2s_2(1,2)+t2_2(2,1)),"T2s(i,j)+T2(j,i)(1,2)");
-  test_for_zero(t2_1(2,0)-(t2s_2(2,0)+t2_2(0,2)),"T2s(i,j)+T2(j,i)(2,0)");
-  test_for_zero(t2_1(2,1)-(t2s_2(2,1)+t2_2(1,2)),"T2s(i,j)+T2(j,i)(2,1)");
-  test_for_zero(t2_1(2,2)-(t2s_2(2,2)+t2_2(2,2)),"T2s(i,j)+T2(j,i)(2,2)");
-  t2_1(i,j)=t2_2(j,i)+t2s_2(i,j);
-  test_for_zero(t2_1(0,0)-(t2s_2(0,0)+t2_2(0,0)),"T2(j,i)+T2s(i,j)(0,0)");
-  test_for_zero(t2_1(0,1)-(t2s_2(0,1)+t2_2(1,0)),"T2(j,i)+T2s(i,j)(0,1)");
-  test_for_zero(t2_1(0,2)-(t2s_2(0,2)+t2_2(2,0)),"T2(j,i)+T2s(i,j)(0,2)");
-  test_for_zero(t2_1(1,0)-(t2s_2(1,0)+t2_2(0,1)),"T2(j,i)+T2s(i,j)(1,0)");
-  test_for_zero(t2_1(1,1)-(t2s_2(1,1)+t2_2(1,1)),"T2(j,i)+T2s(i,j)(1,1)");
-  test_for_zero(t2_1(1,2)-(t2s_2(1,2)+t2_2(2,1)),"T2(j,i)+T2s(i,j)(1,2)");
-  test_for_zero(t2_1(2,0)-(t2s_2(2,0)+t2_2(0,2)),"T2(j,i)+T2s(i,j)(2,0)");
-  test_for_zero(t2_1(2,1)-(t2s_2(2,1)+t2_2(1,2)),"T2(j,i)+T2s(i,j)(2,1)");
-  test_for_zero(t2_1(2,2)-(t2s_2(2,2)+t2_2(2,2)),"T2(j,i)+T2s(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXXI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXXXI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,48 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXXXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  t2_1(i,j)=t2s_2(i,j)+t2_2(j,i);
+  test_for_zero(t2_1(0,0)-(t2s_2(0,0)+t2_2(0,0)),"T2s(i,j)+T2(j,i)(0,0)");
+  test_for_zero(t2_1(0,1)-(t2s_2(0,1)+t2_2(1,0)),"T2s(i,j)+T2(j,i)(0,1)");
+  test_for_zero(t2_1(0,2)-(t2s_2(0,2)+t2_2(2,0)),"T2s(i,j)+T2(j,i)(0,2)");
+  test_for_zero(t2_1(1,0)-(t2s_2(1,0)+t2_2(0,1)),"T2s(i,j)+T2(j,i)(1,0)");
+  test_for_zero(t2_1(1,1)-(t2s_2(1,1)+t2_2(1,1)),"T2s(i,j)+T2(j,i)(1,1)");
+  test_for_zero(t2_1(1,2)-(t2s_2(1,2)+t2_2(2,1)),"T2s(i,j)+T2(j,i)(1,2)");
+  test_for_zero(t2_1(2,0)-(t2s_2(2,0)+t2_2(0,2)),"T2s(i,j)+T2(j,i)(2,0)");
+  test_for_zero(t2_1(2,1)-(t2s_2(2,1)+t2_2(1,2)),"T2s(i,j)+T2(j,i)(2,1)");
+  test_for_zero(t2_1(2,2)-(t2s_2(2,2)+t2_2(2,2)),"T2s(i,j)+T2(j,i)(2,2)");
+  t2_1(i,j)=t2_2(j,i)+t2s_2(i,j);
+  test_for_zero(t2_1(0,0)-(t2s_2(0,0)+t2_2(0,0)),"T2(j,i)+T2s(i,j)(0,0)");
+  test_for_zero(t2_1(0,1)-(t2s_2(0,1)+t2_2(1,0)),"T2(j,i)+T2s(i,j)(0,1)");
+  test_for_zero(t2_1(0,2)-(t2s_2(0,2)+t2_2(2,0)),"T2(j,i)+T2s(i,j)(0,2)");
+  test_for_zero(t2_1(1,0)-(t2s_2(1,0)+t2_2(0,1)),"T2(j,i)+T2s(i,j)(1,0)");
+  test_for_zero(t2_1(1,1)-(t2s_2(1,1)+t2_2(1,1)),"T2(j,i)+T2s(i,j)(1,1)");
+  test_for_zero(t2_1(1,2)-(t2s_2(1,2)+t2_2(2,1)),"T2(j,i)+T2s(i,j)(1,2)");
+  test_for_zero(t2_1(2,0)-(t2s_2(2,0)+t2_2(0,2)),"T2(j,i)+T2s(i,j)(2,0)");
+  test_for_zero(t2_1(2,1)-(t2s_2(2,1)+t2_2(1,2)),"T2(j,i)+T2s(i,j)(2,1)");
+  test_for_zero(t2_1(2,2)-(t2s_2(2,2)+t2_2(2,2)),"T2(j,i)+T2s(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXXII.C
--- a/tests/conformance/T2s/test_T2sXXXII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXXXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  t2_1(i,j)=t2s_2(i,j)-t2_2(i,j);
-  test_for_zero(t2_1(0,0)-(t2s_2(0,0)-t2_2(0,0)),"T2s(i,j)-T2(i,j)(0,0)");
-  test_for_zero(t2_1(0,1)-(t2s_2(0,1)-t2_2(0,1)),"T2s(i,j)-T2(i,j)(0,1)");
-  test_for_zero(t2_1(0,2)-(t2s_2(0,2)-t2_2(0,2)),"T2s(i,j)-T2(i,j)(0,2)");
-  test_for_zero(t2_1(1,0)-(t2s_2(1,0)-t2_2(1,0)),"T2s(i,j)-T2(i,j)(1,0)");
-  test_for_zero(t2_1(1,1)-(t2s_2(1,1)-t2_2(1,1)),"T2s(i,j)-T2(i,j)(1,1)");
-  test_for_zero(t2_1(1,2)-(t2s_2(1,2)-t2_2(1,2)),"T2s(i,j)-T2(i,j)(1,2)");
-  test_for_zero(t2_1(2,0)-(t2s_2(2,0)-t2_2(2,0)),"T2s(i,j)-T2(i,j)(2,0)");
-  test_for_zero(t2_1(2,1)-(t2s_2(2,1)-t2_2(2,1)),"T2s(i,j)-T2(i,j)(2,1)");
-  test_for_zero(t2_1(2,2)-(t2s_2(2,2)-t2_2(2,2)),"T2s(i,j)-T2(i,j)(2,2)");
-  t2_1(i,j)=t2_2(i,j)-t2s_2(i,j);
-  test_for_zero(t2_1(0,0)-(-t2s_2(0,0)+t2_2(0,0)),"T2(i,j)-T2s(i,j)(0,0)");
-  test_for_zero(t2_1(0,1)-(-t2s_2(0,1)+t2_2(0,1)),"T2(i,j)-T2s(i,j)(0,1)");
-  test_for_zero(t2_1(0,2)-(-t2s_2(0,2)+t2_2(0,2)),"T2(i,j)-T2s(i,j)(0,2)");
-  test_for_zero(t2_1(1,0)-(-t2s_2(1,0)+t2_2(1,0)),"T2(i,j)-T2s(i,j)(1,0)");
-  test_for_zero(t2_1(1,1)-(-t2s_2(1,1)+t2_2(1,1)),"T2(i,j)-T2s(i,j)(1,1)");
-  test_for_zero(t2_1(1,2)-(-t2s_2(1,2)+t2_2(1,2)),"T2(i,j)-T2s(i,j)(1,2)");
-  test_for_zero(t2_1(2,0)-(-t2s_2(2,0)+t2_2(2,0)),"T2(i,j)-T2s(i,j)(2,0)");
-  test_for_zero(t2_1(2,1)-(-t2s_2(2,1)+t2_2(2,1)),"T2(i,j)-T2s(i,j)(2,1)");
-  test_for_zero(t2_1(2,2)-(-t2s_2(2,2)+t2_2(2,2)),"T2(i,j)-T2s(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXXII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXXXII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,48 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXXXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  t2_1(i,j)=t2s_2(i,j)-t2_2(i,j);
+  test_for_zero(t2_1(0,0)-(t2s_2(0,0)-t2_2(0,0)),"T2s(i,j)-T2(i,j)(0,0)");
+  test_for_zero(t2_1(0,1)-(t2s_2(0,1)-t2_2(0,1)),"T2s(i,j)-T2(i,j)(0,1)");
+  test_for_zero(t2_1(0,2)-(t2s_2(0,2)-t2_2(0,2)),"T2s(i,j)-T2(i,j)(0,2)");
+  test_for_zero(t2_1(1,0)-(t2s_2(1,0)-t2_2(1,0)),"T2s(i,j)-T2(i,j)(1,0)");
+  test_for_zero(t2_1(1,1)-(t2s_2(1,1)-t2_2(1,1)),"T2s(i,j)-T2(i,j)(1,1)");
+  test_for_zero(t2_1(1,2)-(t2s_2(1,2)-t2_2(1,2)),"T2s(i,j)-T2(i,j)(1,2)");
+  test_for_zero(t2_1(2,0)-(t2s_2(2,0)-t2_2(2,0)),"T2s(i,j)-T2(i,j)(2,0)");
+  test_for_zero(t2_1(2,1)-(t2s_2(2,1)-t2_2(2,1)),"T2s(i,j)-T2(i,j)(2,1)");
+  test_for_zero(t2_1(2,2)-(t2s_2(2,2)-t2_2(2,2)),"T2s(i,j)-T2(i,j)(2,2)");
+  t2_1(i,j)=t2_2(i,j)-t2s_2(i,j);
+  test_for_zero(t2_1(0,0)-(-t2s_2(0,0)+t2_2(0,0)),"T2(i,j)-T2s(i,j)(0,0)");
+  test_for_zero(t2_1(0,1)-(-t2s_2(0,1)+t2_2(0,1)),"T2(i,j)-T2s(i,j)(0,1)");
+  test_for_zero(t2_1(0,2)-(-t2s_2(0,2)+t2_2(0,2)),"T2(i,j)-T2s(i,j)(0,2)");
+  test_for_zero(t2_1(1,0)-(-t2s_2(1,0)+t2_2(1,0)),"T2(i,j)-T2s(i,j)(1,0)");
+  test_for_zero(t2_1(1,1)-(-t2s_2(1,1)+t2_2(1,1)),"T2(i,j)-T2s(i,j)(1,1)");
+  test_for_zero(t2_1(1,2)-(-t2s_2(1,2)+t2_2(1,2)),"T2(i,j)-T2s(i,j)(1,2)");
+  test_for_zero(t2_1(2,0)-(-t2s_2(2,0)+t2_2(2,0)),"T2(i,j)-T2s(i,j)(2,0)");
+  test_for_zero(t2_1(2,1)-(-t2s_2(2,1)+t2_2(2,1)),"T2(i,j)-T2s(i,j)(2,1)");
+  test_for_zero(t2_1(2,2)-(-t2s_2(2,2)+t2_2(2,2)),"T2(i,j)-T2s(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXXIII.C
--- a/tests/conformance/T2s/test_T2sXXXIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXXXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  t2_1(i,j)=t2s_2(i,j)-t2_2(j,i);
-  test_for_zero(t2_1(0,0)-(t2s_2(0,0)-t2_2(0,0)),"T2s(i,j)-T2(j,i)(0,0)");
-  test_for_zero(t2_1(0,1)-(t2s_2(0,1)-t2_2(1,0)),"T2s(i,j)-T2(j,i)(0,1)");
-  test_for_zero(t2_1(0,2)-(t2s_2(0,2)-t2_2(2,0)),"T2s(i,j)-T2(j,i)(0,2)");
-  test_for_zero(t2_1(1,0)-(t2s_2(1,0)-t2_2(0,1)),"T2s(i,j)-T2(j,i)(1,0)");
-  test_for_zero(t2_1(1,1)-(t2s_2(1,1)-t2_2(1,1)),"T2s(i,j)-T2(j,i)(1,1)");
-  test_for_zero(t2_1(1,2)-(t2s_2(1,2)-t2_2(2,1)),"T2s(i,j)-T2(j,i)(1,2)");
-  test_for_zero(t2_1(2,0)-(t2s_2(2,0)-t2_2(0,2)),"T2s(i,j)-T2(j,i)(2,0)");
-  test_for_zero(t2_1(2,1)-(t2s_2(2,1)-t2_2(1,2)),"T2s(i,j)-T2(j,i)(2,1)");
-  test_for_zero(t2_1(2,2)-(t2s_2(2,2)-t2_2(2,2)),"T2s(i,j)-T2(j,i)(2,2)");
-  t2_1(i,j)=t2_2(j,i)-t2s_2(i,j);
-  test_for_zero(t2_1(0,0)-(-t2s_2(0,0)+t2_2(0,0)),"T2(j,i)-T2s(i,j)(0,0)");
-  test_for_zero(t2_1(0,1)-(-t2s_2(0,1)+t2_2(1,0)),"T2(j,i)-T2s(i,j)(0,1)");
-  test_for_zero(t2_1(0,2)-(-t2s_2(0,2)+t2_2(2,0)),"T2(j,i)-T2s(i,j)(0,2)");
-  test_for_zero(t2_1(1,0)-(-t2s_2(1,0)+t2_2(0,1)),"T2(j,i)-T2s(i,j)(1,0)");
-  test_for_zero(t2_1(1,1)-(-t2s_2(1,1)+t2_2(1,1)),"T2(j,i)-T2s(i,j)(1,1)");
-  test_for_zero(t2_1(1,2)-(-t2s_2(1,2)+t2_2(2,1)),"T2(j,i)-T2s(i,j)(1,2)");
-  test_for_zero(t2_1(2,0)-(-t2s_2(2,0)+t2_2(0,2)),"T2(j,i)-T2s(i,j)(2,0)");
-  test_for_zero(t2_1(2,1)-(-t2s_2(2,1)+t2_2(1,2)),"T2(j,i)-T2s(i,j)(2,1)");
-  test_for_zero(t2_1(2,2)-(-t2s_2(2,2)+t2_2(2,2)),"T2(j,i)-T2s(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXXIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXXXIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,48 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXXXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  t2_1(i,j)=t2s_2(i,j)-t2_2(j,i);
+  test_for_zero(t2_1(0,0)-(t2s_2(0,0)-t2_2(0,0)),"T2s(i,j)-T2(j,i)(0,0)");
+  test_for_zero(t2_1(0,1)-(t2s_2(0,1)-t2_2(1,0)),"T2s(i,j)-T2(j,i)(0,1)");
+  test_for_zero(t2_1(0,2)-(t2s_2(0,2)-t2_2(2,0)),"T2s(i,j)-T2(j,i)(0,2)");
+  test_for_zero(t2_1(1,0)-(t2s_2(1,0)-t2_2(0,1)),"T2s(i,j)-T2(j,i)(1,0)");
+  test_for_zero(t2_1(1,1)-(t2s_2(1,1)-t2_2(1,1)),"T2s(i,j)-T2(j,i)(1,1)");
+  test_for_zero(t2_1(1,2)-(t2s_2(1,2)-t2_2(2,1)),"T2s(i,j)-T2(j,i)(1,2)");
+  test_for_zero(t2_1(2,0)-(t2s_2(2,0)-t2_2(0,2)),"T2s(i,j)-T2(j,i)(2,0)");
+  test_for_zero(t2_1(2,1)-(t2s_2(2,1)-t2_2(1,2)),"T2s(i,j)-T2(j,i)(2,1)");
+  test_for_zero(t2_1(2,2)-(t2s_2(2,2)-t2_2(2,2)),"T2s(i,j)-T2(j,i)(2,2)");
+  t2_1(i,j)=t2_2(j,i)-t2s_2(i,j);
+  test_for_zero(t2_1(0,0)-(-t2s_2(0,0)+t2_2(0,0)),"T2(j,i)-T2s(i,j)(0,0)");
+  test_for_zero(t2_1(0,1)-(-t2s_2(0,1)+t2_2(1,0)),"T2(j,i)-T2s(i,j)(0,1)");
+  test_for_zero(t2_1(0,2)-(-t2s_2(0,2)+t2_2(2,0)),"T2(j,i)-T2s(i,j)(0,2)");
+  test_for_zero(t2_1(1,0)-(-t2s_2(1,0)+t2_2(0,1)),"T2(j,i)-T2s(i,j)(1,0)");
+  test_for_zero(t2_1(1,1)-(-t2s_2(1,1)+t2_2(1,1)),"T2(j,i)-T2s(i,j)(1,1)");
+  test_for_zero(t2_1(1,2)-(-t2s_2(1,2)+t2_2(2,1)),"T2(j,i)-T2s(i,j)(1,2)");
+  test_for_zero(t2_1(2,0)-(-t2s_2(2,0)+t2_2(0,2)),"T2(j,i)-T2s(i,j)(2,0)");
+  test_for_zero(t2_1(2,1)-(-t2s_2(2,1)+t2_2(1,2)),"T2(j,i)-T2s(i,j)(2,1)");
+  test_for_zero(t2_1(2,2)-(-t2s_2(2,2)+t2_2(2,2)),"T2(j,i)-T2s(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXXIV.C
--- a/tests/conformance/T2s/test_T2sXXXIV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXXXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  t2s_1(i,j)=(t2s_2(i,j)&(t1_2(i)^(t1_2(j))));
-  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)*t1_2(0)*t1_2(0)),"T2s(i,j)&T2s(i,j)(0,0)");
-  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)*t1_2(0)*t1_2(1)),"T2s(i,j)&T2s(i,j)(0,1)");
-  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)*t1_2(0)*t1_2(2)),"T2s(i,j)&T2s(i,j)(0,2)");
-  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)*t1_2(1)*t1_2(0)),"T2s(i,j)&T2s(i,j)(1,0)");
-  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)*t1_2(1)*t1_2(1)),"T2s(i,j)&T2s(i,j)(1,1)");
-  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)*t1_2(1)*t1_2(2)),"T2s(i,j)&T2s(i,j)(1,2)");
-  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)*t1_2(2)*t1_2(0)),"T2s(i,j)&T2s(i,j)(2,0)");
-  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)*t1_2(2)*t1_2(1)),"T2s(i,j)&T2s(i,j)(2,1)");
-  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)*t1_2(2)*t1_2(2)),"T2s(i,j)&T2s(i,j)(2,2)");
-
-  t2s_1(i,j)=(t2s_2(i,j)&(t1_2(j)^(t1_2(i))));
-  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)*t1_2(0)*t1_2(0)),"T2s(i,j)&T2s(j,i)(0,0)");
-  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)*t1_2(0)*t1_2(1)),"T2s(i,j)&T2s(j,i)(0,1)");
-  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)*t1_2(0)*t1_2(2)),"T2s(i,j)&T2s(j,i)(0,2)");
-  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)*t1_2(1)*t1_2(0)),"T2s(i,j)&T2s(j,i)(1,0)");
-  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)*t1_2(1)*t1_2(1)),"T2s(i,j)&T2s(j,i)(1,1)");
-  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)*t1_2(1)*t1_2(2)),"T2s(i,j)&T2s(j,i)(1,2)");
-  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)*t1_2(2)*t1_2(0)),"T2s(i,j)&T2s(j,i)(2,0)");
-  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)*t1_2(2)*t1_2(1)),"T2s(i,j)&T2s(j,i)(2,1)");
-  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)*t1_2(2)*t1_2(2)),"T2s(i,j)&T2s(j,i)(2,2)");
-
-  t2s_1(i,j)=((t1_2(j)^(t1_2(i)))&t2s_2(i,j));
-  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)*t1_2(0)*t1_2(0)),"T2s(j,i)&T2s(i,j)(0,0)");
-  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)*t1_2(0)*t1_2(1)),"T2s(j,i)&T2s(i,j)(0,1)");
-  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)*t1_2(0)*t1_2(2)),"T2s(j,i)&T2s(i,j)(0,2)");
-  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)*t1_2(1)*t1_2(0)),"T2s(j,i)&T2s(i,j)(1,0)");
-  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)*t1_2(1)*t1_2(1)),"T2s(j,i)&T2s(i,j)(1,1)");
-  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)*t1_2(1)*t1_2(2)),"T2s(j,i)&T2s(i,j)(1,2)");
-  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)*t1_2(2)*t1_2(0)),"T2s(j,i)&T2s(i,j)(2,0)");
-  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)*t1_2(2)*t1_2(1)),"T2s(j,i)&T2s(i,j)(2,1)");
-  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)*t1_2(2)*t1_2(2)),"T2s(j,i)&T2s(i,j)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXXIV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXXXIV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,60 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXXXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  t2s_1(i,j)=(t2s_2(i,j)&(t1_2(i)^(t1_2(j))));
+  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)*t1_2(0)*t1_2(0)),"T2s(i,j)&T2s(i,j)(0,0)");
+  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)*t1_2(0)*t1_2(1)),"T2s(i,j)&T2s(i,j)(0,1)");
+  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)*t1_2(0)*t1_2(2)),"T2s(i,j)&T2s(i,j)(0,2)");
+  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)*t1_2(1)*t1_2(0)),"T2s(i,j)&T2s(i,j)(1,0)");
+  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)*t1_2(1)*t1_2(1)),"T2s(i,j)&T2s(i,j)(1,1)");
+  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)*t1_2(1)*t1_2(2)),"T2s(i,j)&T2s(i,j)(1,2)");
+  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)*t1_2(2)*t1_2(0)),"T2s(i,j)&T2s(i,j)(2,0)");
+  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)*t1_2(2)*t1_2(1)),"T2s(i,j)&T2s(i,j)(2,1)");
+  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)*t1_2(2)*t1_2(2)),"T2s(i,j)&T2s(i,j)(2,2)");
+
+  t2s_1(i,j)=(t2s_2(i,j)&(t1_2(j)^(t1_2(i))));
+  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)*t1_2(0)*t1_2(0)),"T2s(i,j)&T2s(j,i)(0,0)");
+  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)*t1_2(0)*t1_2(1)),"T2s(i,j)&T2s(j,i)(0,1)");
+  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)*t1_2(0)*t1_2(2)),"T2s(i,j)&T2s(j,i)(0,2)");
+  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)*t1_2(1)*t1_2(0)),"T2s(i,j)&T2s(j,i)(1,0)");
+  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)*t1_2(1)*t1_2(1)),"T2s(i,j)&T2s(j,i)(1,1)");
+  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)*t1_2(1)*t1_2(2)),"T2s(i,j)&T2s(j,i)(1,2)");
+  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)*t1_2(2)*t1_2(0)),"T2s(i,j)&T2s(j,i)(2,0)");
+  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)*t1_2(2)*t1_2(1)),"T2s(i,j)&T2s(j,i)(2,1)");
+  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)*t1_2(2)*t1_2(2)),"T2s(i,j)&T2s(j,i)(2,2)");
+
+  t2s_1(i,j)=((t1_2(j)^(t1_2(i)))&t2s_2(i,j));
+  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)*t1_2(0)*t1_2(0)),"T2s(j,i)&T2s(i,j)(0,0)");
+  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)*t1_2(0)*t1_2(1)),"T2s(j,i)&T2s(i,j)(0,1)");
+  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)*t1_2(0)*t1_2(2)),"T2s(j,i)&T2s(i,j)(0,2)");
+  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)*t1_2(1)*t1_2(0)),"T2s(j,i)&T2s(i,j)(1,0)");
+  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)*t1_2(1)*t1_2(1)),"T2s(j,i)&T2s(i,j)(1,1)");
+  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)*t1_2(1)*t1_2(2)),"T2s(j,i)&T2s(i,j)(1,2)");
+  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)*t1_2(2)*t1_2(0)),"T2s(j,i)&T2s(i,j)(2,0)");
+  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)*t1_2(2)*t1_2(1)),"T2s(j,i)&T2s(i,j)(2,1)");
+  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)*t1_2(2)*t1_2(2)),"T2s(j,i)&T2s(i,j)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXXIX.C
--- a/tests/conformance/T2s/test_T2sXXXIX.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXXXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  t2_1(i,j)=t2s_2(k,i)*t2_2(k,j);
-  test_for_zero(t2_1(0,0) - (t2s_2(0,0)*t2_2(0,0) + t2s_2(1,0)*t2_2(1,0)
-		       + t2s_2(2,0)*t2_2(2,0)),"T2s(k,i)*T2(k,j)(0,0)");
-  test_for_zero(t2_1(0,1) - (t2s_2(0,0)*t2_2(0,1) + t2s_2(1,0)*t2_2(1,1)
-		       + t2s_2(2,0)*t2_2(2,1)),"T2s(k,i)*T2(k,j)(0,1)");
-  test_for_zero(t2_1(0,2) - (t2s_2(0,0)*t2_2(0,2) + t2s_2(1,0)*t2_2(1,2)
-		       + t2s_2(2,0)*t2_2(2,2)),"T2s(k,i)*T2(k,j)(0,2)");
-  test_for_zero(t2_1(1,0) - (t2s_2(0,1)*t2_2(0,0) + t2s_2(1,1)*t2_2(1,0)
-		       + t2s_2(2,1)*t2_2(2,0)),"T2s(k,i)*T2(k,j)(1,0)");
-  test_for_zero(t2_1(1,1) - (t2s_2(0,1)*t2_2(0,1) + t2s_2(1,1)*t2_2(1,1)
-		       + t2s_2(2,1)*t2_2(2,1)),"T2s(k,i)*T2(k,j)(1,1)");
-  test_for_zero(t2_1(1,2) - (t2s_2(0,1)*t2_2(0,2) + t2s_2(1,1)*t2_2(1,2)
-		       + t2s_2(2,1)*t2_2(2,2)),"T2s(k,i)*T2(k,j)(1,2)");
-  test_for_zero(t2_1(2,0) - (t2s_2(0,2)*t2_2(0,0) + t2s_2(1,2)*t2_2(1,0)
-		       + t2s_2(2,2)*t2_2(2,0)),"T2s(k,i)*T2(k,j)(2,0)");
-  test_for_zero(t2_1(2,1) - (t2s_2(0,2)*t2_2(0,1) + t2s_2(1,2)*t2_2(1,1)
-		       + t2s_2(2,2)*t2_2(2,1)),"T2s(k,i)*T2(k,j)(2,1)");
-  test_for_zero(t2_1(2,2) - (t2s_2(0,2)*t2_2(0,2) + t2s_2(1,2)*t2_2(1,2)
-		       + t2s_2(2,2)*t2_2(2,2)),"T2s(k,i)*T2(k,j)(2,2)");
-  t2_1(i,j)=t2_2(k,j)*t2s_2(k,i);
-  test_for_zero(t2_1(0,0) - (t2s_2(0,0)*t2_2(0,0) + t2s_2(1,0)*t2_2(1,0)
-		       + t2s_2(2,0)*t2_2(2,0)),"T2(k,j)*T2s(k,i)(0,0)");
-  test_for_zero(t2_1(0,1) - (t2s_2(0,0)*t2_2(0,1) + t2s_2(1,0)*t2_2(1,1)
-		       + t2s_2(2,0)*t2_2(2,1)),"T2(k,j)*T2s(k,i)(0,1)");
-  test_for_zero(t2_1(0,2) - (t2s_2(0,0)*t2_2(0,2) + t2s_2(1,0)*t2_2(1,2)
-		       + t2s_2(2,0)*t2_2(2,2)),"T2(k,j)*T2s(k,i)(0,2)");
-  test_for_zero(t2_1(1,0) - (t2s_2(0,1)*t2_2(0,0) + t2s_2(1,1)*t2_2(1,0)
-		       + t2s_2(2,1)*t2_2(2,0)),"T2(k,j)*T2s(k,i)(1,0)");
-  test_for_zero(t2_1(1,1) - (t2s_2(0,1)*t2_2(0,1) + t2s_2(1,1)*t2_2(1,1)
-		       + t2s_2(2,1)*t2_2(2,1)),"T2(k,j)*T2s(k,i)(1,1)");
-  test_for_zero(t2_1(1,2) - (t2s_2(0,1)*t2_2(0,2) + t2s_2(1,1)*t2_2(1,2)
-		       + t2s_2(2,1)*t2_2(2,2)),"T2(k,j)*T2s(k,i)(1,2)");
-  test_for_zero(t2_1(2,0) - (t2s_2(0,2)*t2_2(0,0) + t2s_2(1,2)*t2_2(1,0)
-		       + t2s_2(2,2)*t2_2(2,0)),"T2(k,j)*T2s(k,i)(2,0)");
-  test_for_zero(t2_1(2,1) - (t2s_2(0,2)*t2_2(0,1) + t2s_2(1,2)*t2_2(1,1)
-		       + t2s_2(2,2)*t2_2(2,1)),"T2(k,j)*T2s(k,i)(2,1)");
-  test_for_zero(t2_1(2,2) - (t2s_2(0,2)*t2_2(0,2) + t2s_2(1,2)*t2_2(1,2)
-		       + t2s_2(2,2)*t2_2(2,2)),"T2(k,j)*T2s(k,i)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXXIX.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXXXIX.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,66 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXXXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  t2_1(i,j)=t2s_2(k,i)*t2_2(k,j);
+  test_for_zero(t2_1(0,0) - (t2s_2(0,0)*t2_2(0,0) + t2s_2(1,0)*t2_2(1,0)
+		       + t2s_2(2,0)*t2_2(2,0)),"T2s(k,i)*T2(k,j)(0,0)");
+  test_for_zero(t2_1(0,1) - (t2s_2(0,0)*t2_2(0,1) + t2s_2(1,0)*t2_2(1,1)
+		       + t2s_2(2,0)*t2_2(2,1)),"T2s(k,i)*T2(k,j)(0,1)");
+  test_for_zero(t2_1(0,2) - (t2s_2(0,0)*t2_2(0,2) + t2s_2(1,0)*t2_2(1,2)
+		       + t2s_2(2,0)*t2_2(2,2)),"T2s(k,i)*T2(k,j)(0,2)");
+  test_for_zero(t2_1(1,0) - (t2s_2(0,1)*t2_2(0,0) + t2s_2(1,1)*t2_2(1,0)
+		       + t2s_2(2,1)*t2_2(2,0)),"T2s(k,i)*T2(k,j)(1,0)");
+  test_for_zero(t2_1(1,1) - (t2s_2(0,1)*t2_2(0,1) + t2s_2(1,1)*t2_2(1,1)
+		       + t2s_2(2,1)*t2_2(2,1)),"T2s(k,i)*T2(k,j)(1,1)");
+  test_for_zero(t2_1(1,2) - (t2s_2(0,1)*t2_2(0,2) + t2s_2(1,1)*t2_2(1,2)
+		       + t2s_2(2,1)*t2_2(2,2)),"T2s(k,i)*T2(k,j)(1,2)");
+  test_for_zero(t2_1(2,0) - (t2s_2(0,2)*t2_2(0,0) + t2s_2(1,2)*t2_2(1,0)
+		       + t2s_2(2,2)*t2_2(2,0)),"T2s(k,i)*T2(k,j)(2,0)");
+  test_for_zero(t2_1(2,1) - (t2s_2(0,2)*t2_2(0,1) + t2s_2(1,2)*t2_2(1,1)
+		       + t2s_2(2,2)*t2_2(2,1)),"T2s(k,i)*T2(k,j)(2,1)");
+  test_for_zero(t2_1(2,2) - (t2s_2(0,2)*t2_2(0,2) + t2s_2(1,2)*t2_2(1,2)
+		       + t2s_2(2,2)*t2_2(2,2)),"T2s(k,i)*T2(k,j)(2,2)");
+  t2_1(i,j)=t2_2(k,j)*t2s_2(k,i);
+  test_for_zero(t2_1(0,0) - (t2s_2(0,0)*t2_2(0,0) + t2s_2(1,0)*t2_2(1,0)
+		       + t2s_2(2,0)*t2_2(2,0)),"T2(k,j)*T2s(k,i)(0,0)");
+  test_for_zero(t2_1(0,1) - (t2s_2(0,0)*t2_2(0,1) + t2s_2(1,0)*t2_2(1,1)
+		       + t2s_2(2,0)*t2_2(2,1)),"T2(k,j)*T2s(k,i)(0,1)");
+  test_for_zero(t2_1(0,2) - (t2s_2(0,0)*t2_2(0,2) + t2s_2(1,0)*t2_2(1,2)
+		       + t2s_2(2,0)*t2_2(2,2)),"T2(k,j)*T2s(k,i)(0,2)");
+  test_for_zero(t2_1(1,0) - (t2s_2(0,1)*t2_2(0,0) + t2s_2(1,1)*t2_2(1,0)
+		       + t2s_2(2,1)*t2_2(2,0)),"T2(k,j)*T2s(k,i)(1,0)");
+  test_for_zero(t2_1(1,1) - (t2s_2(0,1)*t2_2(0,1) + t2s_2(1,1)*t2_2(1,1)
+		       + t2s_2(2,1)*t2_2(2,1)),"T2(k,j)*T2s(k,i)(1,1)");
+  test_for_zero(t2_1(1,2) - (t2s_2(0,1)*t2_2(0,2) + t2s_2(1,1)*t2_2(1,2)
+		       + t2s_2(2,1)*t2_2(2,2)),"T2(k,j)*T2s(k,i)(1,2)");
+  test_for_zero(t2_1(2,0) - (t2s_2(0,2)*t2_2(0,0) + t2s_2(1,2)*t2_2(1,0)
+		       + t2s_2(2,2)*t2_2(2,0)),"T2(k,j)*T2s(k,i)(2,0)");
+  test_for_zero(t2_1(2,1) - (t2s_2(0,2)*t2_2(0,1) + t2s_2(1,2)*t2_2(1,1)
+		       + t2s_2(2,2)*t2_2(2,1)),"T2(k,j)*T2s(k,i)(2,1)");
+  test_for_zero(t2_1(2,2) - (t2s_2(0,2)*t2_2(0,2) + t2s_2(1,2)*t2_2(1,2)
+		       + t2s_2(2,2)*t2_2(2,2)),"T2(k,j)*T2s(k,i)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXXV.C
--- a/tests/conformance/T2s/test_T2sXXXV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXXXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  t2s_1(i,j)=(t2s_2(i,j)%(t1_2(i)^(t1_2(j))));
-  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)/t1_2(0)/t1_2(0)),"T2s(j,i)%T2s(i,j)(0,0)");
-  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)/t1_2(0)/t1_2(1)),"T2s(j,i)%T2s(i,j)(0,1)");
-  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)/t1_2(0)/t1_2(2)),"T2s(j,i)%T2s(i,j)(0,2)");
-  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)/t1_2(1)/t1_2(0)),"T2s(j,i)%T2s(i,j)(1,0)");
-  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)/t1_2(1)/t1_2(1)),"T2s(j,i)%T2s(i,j)(1,1)");
-  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)/t1_2(1)/t1_2(2)),"T2s(j,i)%T2s(i,j)(1,2)");
-  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)/t1_2(2)/t1_2(0)),"T2s(j,i)%T2s(i,j)(2,0)");
-  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)/t1_2(2)/t1_2(1)),"T2s(j,i)%T2s(i,j)(2,1)");
-  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)/t1_2(2)/t1_2(2)),"T2s(j,i)%T2s(i,j)(2,2)");
-
-  t2s_1(i,j)=(t2s_2(i,j)%(t1_2(j)^(t1_2(i))));
-  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)/t1_2(0)/t1_2(0)),"T2s(j,i)%T2s(j,i)(0,0)");
-  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)/t1_2(0)/t1_2(1)),"T2s(j,i)%T2s(j,i)(0,1)");
-  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)/t1_2(0)/t1_2(2)),"T2s(j,i)%T2s(j,i)(0,2)");
-  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)/t1_2(1)/t1_2(0)),"T2s(j,i)%T2s(j,i)(1,0)");
-  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)/t1_2(1)/t1_2(1)),"T2s(j,i)%T2s(j,i)(1,1)");
-  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)/t1_2(1)/t1_2(2)),"T2s(j,i)%T2s(j,i)(1,2)");
-  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)/t1_2(2)/t1_2(0)),"T2s(j,i)%T2s(j,i)(2,0)");
-  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)/t1_2(2)/t1_2(1)),"T2s(j,i)%T2s(j,i)(2,1)");
-  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)/t1_2(2)/t1_2(2)),"T2s(j,i)%T2s(j,i)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXXV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXXXV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,49 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXXXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  t2s_1(i,j)=(t2s_2(i,j)%(t1_2(i)^(t1_2(j))));
+  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)/t1_2(0)/t1_2(0)),"T2s(j,i)%T2s(i,j)(0,0)");
+  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)/t1_2(0)/t1_2(1)),"T2s(j,i)%T2s(i,j)(0,1)");
+  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)/t1_2(0)/t1_2(2)),"T2s(j,i)%T2s(i,j)(0,2)");
+  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)/t1_2(1)/t1_2(0)),"T2s(j,i)%T2s(i,j)(1,0)");
+  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)/t1_2(1)/t1_2(1)),"T2s(j,i)%T2s(i,j)(1,1)");
+  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)/t1_2(1)/t1_2(2)),"T2s(j,i)%T2s(i,j)(1,2)");
+  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)/t1_2(2)/t1_2(0)),"T2s(j,i)%T2s(i,j)(2,0)");
+  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)/t1_2(2)/t1_2(1)),"T2s(j,i)%T2s(i,j)(2,1)");
+  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)/t1_2(2)/t1_2(2)),"T2s(j,i)%T2s(i,j)(2,2)");
+
+  t2s_1(i,j)=(t2s_2(i,j)%(t1_2(j)^(t1_2(i))));
+  test_for_zero(t2s_1(0,0)-(t2s_2(0,0)/t1_2(0)/t1_2(0)),"T2s(j,i)%T2s(j,i)(0,0)");
+  test_for_zero(t2s_1(0,1)-(t2s_2(0,1)/t1_2(0)/t1_2(1)),"T2s(j,i)%T2s(j,i)(0,1)");
+  test_for_zero(t2s_1(0,2)-(t2s_2(0,2)/t1_2(0)/t1_2(2)),"T2s(j,i)%T2s(j,i)(0,2)");
+  test_for_zero(t2s_1(1,0)-(t2s_2(1,0)/t1_2(1)/t1_2(0)),"T2s(j,i)%T2s(j,i)(1,0)");
+  test_for_zero(t2s_1(1,1)-(t2s_2(1,1)/t1_2(1)/t1_2(1)),"T2s(j,i)%T2s(j,i)(1,1)");
+  test_for_zero(t2s_1(1,2)-(t2s_2(1,2)/t1_2(1)/t1_2(2)),"T2s(j,i)%T2s(j,i)(1,2)");
+  test_for_zero(t2s_1(2,0)-(t2s_2(2,0)/t1_2(2)/t1_2(0)),"T2s(j,i)%T2s(j,i)(2,0)");
+  test_for_zero(t2s_1(2,1)-(t2s_2(2,1)/t1_2(2)/t1_2(1)),"T2s(j,i)%T2s(j,i)(2,1)");
+  test_for_zero(t2s_1(2,2)-(t2s_2(2,2)/t1_2(2)/t1_2(2)),"T2s(j,i)%T2s(j,i)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXXVI.C
--- a/tests/conformance/T2s/test_T2sXXXVI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXXXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  test_for_zero(t2s_2(i,j)*t2_2(i,j)
-    - (t2s_2(0,0)*t2_2(0,0)
-       + t2s_2(0,1)*t2_2(0,1)
-       + t2s_2(0,2)*t2_2(0,2)
-       + t2s_2(1,0)*t2_2(1,0)
-       + t2s_2(1,1)*t2_2(1,1)
-       + t2s_2(1,2)*t2_2(1,2)
-       + t2s_2(2,0)*t2_2(2,0)
-       + t2s_2(2,1)*t2_2(2,1)
-       + t2s_2(2,2)*t2_2(2,2)),"T2s(i,j)*T2(i,j)");
-  test_for_zero(t2_2(i,j)*t2s_2(i,j)
-    - (t2s_2(0,0)*t2_2(0,0)
-       + t2s_2(0,1)*t2_2(0,1)
-       + t2s_2(0,2)*t2_2(0,2)
-       + t2s_2(1,0)*t2_2(1,0)
-       + t2s_2(1,1)*t2_2(1,1)
-       + t2s_2(1,2)*t2_2(1,2)
-       + t2s_2(2,0)*t2_2(2,0)
-       + t2s_2(2,1)*t2_2(2,1)
-       + t2s_2(2,2)*t2_2(2,2)),"T2(i,j)*T2s(i,j)");
-  test_for_zero(t2s_2(i,j)*t2_2(j,i)
-    - (t2s_2(0,0)*t2_2(0,0)
-       + t2s_2(0,1)*t2_2(1,0)
-       + t2s_2(0,2)*t2_2(2,0)
-       + t2s_2(1,0)*t2_2(0,1)
-       + t2s_2(1,1)*t2_2(1,1)
-       + t2s_2(1,2)*t2_2(2,1)
-       + t2s_2(2,0)*t2_2(0,2)
-       + t2s_2(2,1)*t2_2(1,2)
-       + t2s_2(2,2)*t2_2(2,2)),"T2s(i,j)*T2(j,i)");
-  test_for_zero(t2_2(j,i)*t2s_2(i,j)
-    - (t2s_2(0,0)*t2_2(0,0)
-       + t2s_2(0,1)*t2_2(1,0)
-       + t2s_2(0,2)*t2_2(2,0)
-       + t2s_2(1,0)*t2_2(0,1)
-       + t2s_2(1,1)*t2_2(1,1)
-       + t2s_2(1,2)*t2_2(2,1)
-       + t2s_2(2,0)*t2_2(0,2)
-       + t2s_2(2,1)*t2_2(1,2)
-       + t2s_2(2,2)*t2_2(2,2)),"T2(j,i)*T2s(i,j)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXXVI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXXXVI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,68 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXXXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  test_for_zero(t2s_2(i,j)*t2_2(i,j)
+    - (t2s_2(0,0)*t2_2(0,0)
+       + t2s_2(0,1)*t2_2(0,1)
+       + t2s_2(0,2)*t2_2(0,2)
+       + t2s_2(1,0)*t2_2(1,0)
+       + t2s_2(1,1)*t2_2(1,1)
+       + t2s_2(1,2)*t2_2(1,2)
+       + t2s_2(2,0)*t2_2(2,0)
+       + t2s_2(2,1)*t2_2(2,1)
+       + t2s_2(2,2)*t2_2(2,2)),"T2s(i,j)*T2(i,j)");
+  test_for_zero(t2_2(i,j)*t2s_2(i,j)
+    - (t2s_2(0,0)*t2_2(0,0)
+       + t2s_2(0,1)*t2_2(0,1)
+       + t2s_2(0,2)*t2_2(0,2)
+       + t2s_2(1,0)*t2_2(1,0)
+       + t2s_2(1,1)*t2_2(1,1)
+       + t2s_2(1,2)*t2_2(1,2)
+       + t2s_2(2,0)*t2_2(2,0)
+       + t2s_2(2,1)*t2_2(2,1)
+       + t2s_2(2,2)*t2_2(2,2)),"T2(i,j)*T2s(i,j)");
+  test_for_zero(t2s_2(i,j)*t2_2(j,i)
+    - (t2s_2(0,0)*t2_2(0,0)
+       + t2s_2(0,1)*t2_2(1,0)
+       + t2s_2(0,2)*t2_2(2,0)
+       + t2s_2(1,0)*t2_2(0,1)
+       + t2s_2(1,1)*t2_2(1,1)
+       + t2s_2(1,2)*t2_2(2,1)
+       + t2s_2(2,0)*t2_2(0,2)
+       + t2s_2(2,1)*t2_2(1,2)
+       + t2s_2(2,2)*t2_2(2,2)),"T2s(i,j)*T2(j,i)");
+  test_for_zero(t2_2(j,i)*t2s_2(i,j)
+    - (t2s_2(0,0)*t2_2(0,0)
+       + t2s_2(0,1)*t2_2(1,0)
+       + t2s_2(0,2)*t2_2(2,0)
+       + t2s_2(1,0)*t2_2(0,1)
+       + t2s_2(1,1)*t2_2(1,1)
+       + t2s_2(1,2)*t2_2(2,1)
+       + t2s_2(2,0)*t2_2(0,2)
+       + t2s_2(2,1)*t2_2(1,2)
+       + t2s_2(2,2)*t2_2(2,2)),"T2(j,i)*T2s(i,j)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXXVII.C
--- a/tests/conformance/T2s/test_T2sXXXVII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXXXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  t2_1(i,j)=t2s_2(i,k)*t2_2(k,j);
-  test_for_zero(t2_1(0,0) - (t2s_2(0,0)*t2_2(0,0) + t2s_2(0,1)*t2_2(1,0)
-			     + t2s_2(0,2)*t2_2(2,0)),"T2s(i,k)*T2(k,j)(0,0)");
-  test_for_zero(t2_1(0,1) - (t2s_2(0,0)*t2_2(0,1) + t2s_2(0,1)*t2_2(1,1)
-		       + t2s_2(0,2)*t2_2(2,1)),"T2s(i,k)*T2(k,j)(0,1)");
-  test_for_zero(t2_1(0,2) - (t2s_2(0,0)*t2_2(0,2) + t2s_2(0,1)*t2_2(1,2)
-		       + t2s_2(0,2)*t2_2(2,2)),"T2s(i,k)*T2(k,j)(0,2)");
-  test_for_zero(t2_1(1,0) - (t2s_2(1,0)*t2_2(0,0) + t2s_2(1,1)*t2_2(1,0)
-		       + t2s_2(1,2)*t2_2(2,0)),"T2s(i,k)*T2(k,j)(1,0)");
-  test_for_zero(t2_1(1,1) - (t2s_2(1,0)*t2_2(0,1) + t2s_2(1,1)*t2_2(1,1)
-		       + t2s_2(1,2)*t2_2(2,1)),"T2s(i,k)*T2(k,j)(1,1)");
-  test_for_zero(t2_1(1,2) - (t2s_2(1,0)*t2_2(0,2) + t2s_2(1,1)*t2_2(1,2)
-		       + t2s_2(1,2)*t2_2(2,2)),"T2s(i,k)*T2(k,j)(1,2)");
-  test_for_zero(t2_1(2,0) - (t2s_2(2,0)*t2_2(0,0) + t2s_2(2,1)*t2_2(1,0)
-		       + t2s_2(2,2)*t2_2(2,0)),"T2s(i,k)*T2(k,j)(2,0)");
-  test_for_zero(t2_1(2,1) - (t2s_2(2,0)*t2_2(0,1) + t2s_2(2,1)*t2_2(1,1)
-		       + t2s_2(2,2)*t2_2(2,1)),"T2s(i,k)*T2(k,j)(2,1)");
-  test_for_zero(t2_1(2,2) - (t2s_2(2,0)*t2_2(0,2) + t2s_2(2,1)*t2_2(1,2)
-		       + t2s_2(2,2)*t2_2(2,2)),"T2s(i,k)*T2(k,j)(2,2)");
-  t2_1(i,j)=t2_2(k,j)*t2s_2(i,k);
-  test_for_zero(t2_1(0,0) - (t2s_2(0,0)*t2_2(0,0) + t2s_2(0,1)*t2_2(1,0)
-		       + t2s_2(0,2)*t2_2(2,0)),"T2(k,j)*T2s(i,k)(0,0)");
-  test_for_zero(t2_1(0,1) - (t2s_2(0,0)*t2_2(0,1) + t2s_2(0,1)*t2_2(1,1)
-		       + t2s_2(0,2)*t2_2(2,1)),"T2(k,j)*T2s(i,k)(0,1)");
-  test_for_zero(t2_1(0,2) - (t2s_2(0,0)*t2_2(0,2) + t2s_2(0,1)*t2_2(1,2)
-		       + t2s_2(0,2)*t2_2(2,2)),"T2(k,j)*T2s(i,k)(0,2)");
-  test_for_zero(t2_1(1,0) - (t2s_2(1,0)*t2_2(0,0) + t2s_2(1,1)*t2_2(1,0)
-		       + t2s_2(1,2)*t2_2(2,0)),"T2(k,j)*T2s(i,k)(1,0)");
-  test_for_zero(t2_1(1,1) - (t2s_2(1,0)*t2_2(0,1) + t2s_2(1,1)*t2_2(1,1)
-		       + t2s_2(1,2)*t2_2(2,1)),"T2(k,j)*T2s(i,k)(1,1)");
-  test_for_zero(t2_1(1,2) - (t2s_2(1,0)*t2_2(0,2) + t2s_2(1,1)*t2_2(1,2)
-		       + t2s_2(1,2)*t2_2(2,2)),"T2(k,j)*T2s(i,k)(1,2)");
-  test_for_zero(t2_1(2,0) - (t2s_2(2,0)*t2_2(0,0) + t2s_2(2,1)*t2_2(1,0)
-		       + t2s_2(2,2)*t2_2(2,0)),"T2(k,j)*T2s(i,k)(2,0)");
-  test_for_zero(t2_1(2,1) - (t2s_2(2,0)*t2_2(0,1) + t2s_2(2,1)*t2_2(1,1)
-		       + t2s_2(2,2)*t2_2(2,1)),"T2(k,j)*T2s(i,k)(2,1)");
-  test_for_zero(t2_1(2,2) - (t2s_2(2,0)*t2_2(0,2) + t2s_2(2,1)*t2_2(1,2)
-		       + t2s_2(2,2)*t2_2(2,2)),"T2(k,j)*T2s(i,k)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXXVII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXXXVII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,66 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXXXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  t2_1(i,j)=t2s_2(i,k)*t2_2(k,j);
+  test_for_zero(t2_1(0,0) - (t2s_2(0,0)*t2_2(0,0) + t2s_2(0,1)*t2_2(1,0)
+			     + t2s_2(0,2)*t2_2(2,0)),"T2s(i,k)*T2(k,j)(0,0)");
+  test_for_zero(t2_1(0,1) - (t2s_2(0,0)*t2_2(0,1) + t2s_2(0,1)*t2_2(1,1)
+		       + t2s_2(0,2)*t2_2(2,1)),"T2s(i,k)*T2(k,j)(0,1)");
+  test_for_zero(t2_1(0,2) - (t2s_2(0,0)*t2_2(0,2) + t2s_2(0,1)*t2_2(1,2)
+		       + t2s_2(0,2)*t2_2(2,2)),"T2s(i,k)*T2(k,j)(0,2)");
+  test_for_zero(t2_1(1,0) - (t2s_2(1,0)*t2_2(0,0) + t2s_2(1,1)*t2_2(1,0)
+		       + t2s_2(1,2)*t2_2(2,0)),"T2s(i,k)*T2(k,j)(1,0)");
+  test_for_zero(t2_1(1,1) - (t2s_2(1,0)*t2_2(0,1) + t2s_2(1,1)*t2_2(1,1)
+		       + t2s_2(1,2)*t2_2(2,1)),"T2s(i,k)*T2(k,j)(1,1)");
+  test_for_zero(t2_1(1,2) - (t2s_2(1,0)*t2_2(0,2) + t2s_2(1,1)*t2_2(1,2)
+		       + t2s_2(1,2)*t2_2(2,2)),"T2s(i,k)*T2(k,j)(1,2)");
+  test_for_zero(t2_1(2,0) - (t2s_2(2,0)*t2_2(0,0) + t2s_2(2,1)*t2_2(1,0)
+		       + t2s_2(2,2)*t2_2(2,0)),"T2s(i,k)*T2(k,j)(2,0)");
+  test_for_zero(t2_1(2,1) - (t2s_2(2,0)*t2_2(0,1) + t2s_2(2,1)*t2_2(1,1)
+		       + t2s_2(2,2)*t2_2(2,1)),"T2s(i,k)*T2(k,j)(2,1)");
+  test_for_zero(t2_1(2,2) - (t2s_2(2,0)*t2_2(0,2) + t2s_2(2,1)*t2_2(1,2)
+		       + t2s_2(2,2)*t2_2(2,2)),"T2s(i,k)*T2(k,j)(2,2)");
+  t2_1(i,j)=t2_2(k,j)*t2s_2(i,k);
+  test_for_zero(t2_1(0,0) - (t2s_2(0,0)*t2_2(0,0) + t2s_2(0,1)*t2_2(1,0)
+		       + t2s_2(0,2)*t2_2(2,0)),"T2(k,j)*T2s(i,k)(0,0)");
+  test_for_zero(t2_1(0,1) - (t2s_2(0,0)*t2_2(0,1) + t2s_2(0,1)*t2_2(1,1)
+		       + t2s_2(0,2)*t2_2(2,1)),"T2(k,j)*T2s(i,k)(0,1)");
+  test_for_zero(t2_1(0,2) - (t2s_2(0,0)*t2_2(0,2) + t2s_2(0,1)*t2_2(1,2)
+		       + t2s_2(0,2)*t2_2(2,2)),"T2(k,j)*T2s(i,k)(0,2)");
+  test_for_zero(t2_1(1,0) - (t2s_2(1,0)*t2_2(0,0) + t2s_2(1,1)*t2_2(1,0)
+		       + t2s_2(1,2)*t2_2(2,0)),"T2(k,j)*T2s(i,k)(1,0)");
+  test_for_zero(t2_1(1,1) - (t2s_2(1,0)*t2_2(0,1) + t2s_2(1,1)*t2_2(1,1)
+		       + t2s_2(1,2)*t2_2(2,1)),"T2(k,j)*T2s(i,k)(1,1)");
+  test_for_zero(t2_1(1,2) - (t2s_2(1,0)*t2_2(0,2) + t2s_2(1,1)*t2_2(1,2)
+		       + t2s_2(1,2)*t2_2(2,2)),"T2(k,j)*T2s(i,k)(1,2)");
+  test_for_zero(t2_1(2,0) - (t2s_2(2,0)*t2_2(0,0) + t2s_2(2,1)*t2_2(1,0)
+		       + t2s_2(2,2)*t2_2(2,0)),"T2(k,j)*T2s(i,k)(2,0)");
+  test_for_zero(t2_1(2,1) - (t2s_2(2,0)*t2_2(0,1) + t2s_2(2,1)*t2_2(1,1)
+		       + t2s_2(2,2)*t2_2(2,1)),"T2(k,j)*T2s(i,k)(2,1)");
+  test_for_zero(t2_1(2,2) - (t2s_2(2,0)*t2_2(0,2) + t2s_2(2,1)*t2_2(1,2)
+		       + t2s_2(2,2)*t2_2(2,2)),"T2(k,j)*T2s(i,k)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXXVIII.C
--- a/tests/conformance/T2s/test_T2sXXXVIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T2sXXXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor2_symmetric tests */
-
-  t2_1(i,j)=t2s_2(i,k)*t2_2(j,k);
-  test_for_zero(t2_1(0,0) - (t2s_2(0,0)*t2_2(0,0) + t2s_2(0,1)*t2_2(0,1)
-		       + t2s_2(0,2)*t2_2(0,2)),"T2s(i,k)*T2(j,k)(0,0)");
-  test_for_zero(t2_1(0,1) - (t2s_2(0,0)*t2_2(1,0) + t2s_2(0,1)*t2_2(1,1)
-		       + t2s_2(0,2)*t2_2(1,2)),"T2s(i,k)*T2(j,k)(0,1)");
-  test_for_zero(t2_1(0,2) - (t2s_2(0,0)*t2_2(2,0) + t2s_2(0,1)*t2_2(2,1)
-		       + t2s_2(0,2)*t2_2(2,2)),"T2s(i,k)*T2(j,k)(0,2)");
-  test_for_zero(t2_1(1,0) - (t2s_2(1,0)*t2_2(0,0) + t2s_2(1,1)*t2_2(0,1)
-		       + t2s_2(1,2)*t2_2(0,2)),"T2s(i,k)*T2(j,k)(1,0)");
-  test_for_zero(t2_1(1,1) - (t2s_2(1,0)*t2_2(1,0) + t2s_2(1,1)*t2_2(1,1)
-		       + t2s_2(1,2)*t2_2(1,2)),"T2s(i,k)*T2(j,k)(1,1)");
-  test_for_zero(t2_1(1,2) - (t2s_2(1,0)*t2_2(2,0) + t2s_2(1,1)*t2_2(2,1)
-		       + t2s_2(1,2)*t2_2(2,2)),"T2s(i,k)*T2(j,k)(1,2)");
-  test_for_zero(t2_1(2,0) - (t2s_2(2,0)*t2_2(0,0) + t2s_2(2,1)*t2_2(0,1)
-		       + t2s_2(2,2)*t2_2(0,2)),"T2s(i,k)*T2(j,k)(2,0)");
-  test_for_zero(t2_1(2,1) - (t2s_2(2,0)*t2_2(1,0) + t2s_2(2,1)*t2_2(1,1)
-		       + t2s_2(2,2)*t2_2(1,2)),"T2s(i,k)*T2(j,k)(2,1)");
-  test_for_zero(t2_1(2,2) - (t2s_2(2,0)*t2_2(2,0) + t2s_2(2,1)*t2_2(2,1)
-		       + t2s_2(2,2)*t2_2(2,2)),"T2s(i,k)*T2(j,k)(2,2)");
-  t2_1(i,j)=t2_2(j,k)*t2s_2(i,k);
-  test_for_zero(t2_1(0,0) - (t2s_2(0,0)*t2_2(0,0) + t2s_2(0,1)*t2_2(0,1)
-		       + t2s_2(0,2)*t2_2(0,2)),"T2(j,k)*T2s(i,k)(0,0)");
-  test_for_zero(t2_1(0,1) - (t2s_2(0,0)*t2_2(1,0) + t2s_2(0,1)*t2_2(1,1)
-		       + t2s_2(0,2)*t2_2(1,2)),"T2(j,k)*T2s(i,k)(0,1)");
-  test_for_zero(t2_1(0,2) - (t2s_2(0,0)*t2_2(2,0) + t2s_2(0,1)*t2_2(2,1)
-		       + t2s_2(0,2)*t2_2(2,2)),"T2(j,k)*T2s(i,k)(0,2)");
-  test_for_zero(t2_1(1,0) - (t2s_2(1,0)*t2_2(0,0) + t2s_2(1,1)*t2_2(0,1)
-		       + t2s_2(1,2)*t2_2(0,2)),"T2(j,k)*T2s(i,k)(1,0)");
-  test_for_zero(t2_1(1,1) - (t2s_2(1,0)*t2_2(1,0) + t2s_2(1,1)*t2_2(1,1)
-		       + t2s_2(1,2)*t2_2(1,2)),"T2(j,k)*T2s(i,k)(1,1)");
-  test_for_zero(t2_1(1,2) - (t2s_2(1,0)*t2_2(2,0) + t2s_2(1,1)*t2_2(2,1)
-		       + t2s_2(1,2)*t2_2(2,2)),"T2(j,k)*T2s(i,k)(1,2)");
-  test_for_zero(t2_1(2,0) - (t2s_2(2,0)*t2_2(0,0) + t2s_2(2,1)*t2_2(0,1)
-		       + t2s_2(2,2)*t2_2(0,2)),"T2(j,k)*T2s(i,k)(2,0)");
-  test_for_zero(t2_1(2,1) - (t2s_2(2,0)*t2_2(1,0) + t2s_2(2,1)*t2_2(1,1)
-		       + t2s_2(2,2)*t2_2(1,2)),"T2(j,k)*T2s(i,k)(2,1)");
-  test_for_zero(t2_1(2,2) - (t2s_2(2,0)*t2_2(2,0) + t2s_2(2,1)*t2_2(2,1)
-		       + t2s_2(2,2)*t2_2(2,2)),"T2(j,k)*T2s(i,k)(2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T2s/test_T2sXXXVIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T2s/test_T2sXXXVIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,66 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T2sXXXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor2_symmetric tests */
+
+  t2_1(i,j)=t2s_2(i,k)*t2_2(j,k);
+  test_for_zero(t2_1(0,0) - (t2s_2(0,0)*t2_2(0,0) + t2s_2(0,1)*t2_2(0,1)
+		       + t2s_2(0,2)*t2_2(0,2)),"T2s(i,k)*T2(j,k)(0,0)");
+  test_for_zero(t2_1(0,1) - (t2s_2(0,0)*t2_2(1,0) + t2s_2(0,1)*t2_2(1,1)
+		       + t2s_2(0,2)*t2_2(1,2)),"T2s(i,k)*T2(j,k)(0,1)");
+  test_for_zero(t2_1(0,2) - (t2s_2(0,0)*t2_2(2,0) + t2s_2(0,1)*t2_2(2,1)
+		       + t2s_2(0,2)*t2_2(2,2)),"T2s(i,k)*T2(j,k)(0,2)");
+  test_for_zero(t2_1(1,0) - (t2s_2(1,0)*t2_2(0,0) + t2s_2(1,1)*t2_2(0,1)
+		       + t2s_2(1,2)*t2_2(0,2)),"T2s(i,k)*T2(j,k)(1,0)");
+  test_for_zero(t2_1(1,1) - (t2s_2(1,0)*t2_2(1,0) + t2s_2(1,1)*t2_2(1,1)
+		       + t2s_2(1,2)*t2_2(1,2)),"T2s(i,k)*T2(j,k)(1,1)");
+  test_for_zero(t2_1(1,2) - (t2s_2(1,0)*t2_2(2,0) + t2s_2(1,1)*t2_2(2,1)
+		       + t2s_2(1,2)*t2_2(2,2)),"T2s(i,k)*T2(j,k)(1,2)");
+  test_for_zero(t2_1(2,0) - (t2s_2(2,0)*t2_2(0,0) + t2s_2(2,1)*t2_2(0,1)
+		       + t2s_2(2,2)*t2_2(0,2)),"T2s(i,k)*T2(j,k)(2,0)");
+  test_for_zero(t2_1(2,1) - (t2s_2(2,0)*t2_2(1,0) + t2s_2(2,1)*t2_2(1,1)
+		       + t2s_2(2,2)*t2_2(1,2)),"T2s(i,k)*T2(j,k)(2,1)");
+  test_for_zero(t2_1(2,2) - (t2s_2(2,0)*t2_2(2,0) + t2s_2(2,1)*t2_2(2,1)
+		       + t2s_2(2,2)*t2_2(2,2)),"T2s(i,k)*T2(j,k)(2,2)");
+  t2_1(i,j)=t2_2(j,k)*t2s_2(i,k);
+  test_for_zero(t2_1(0,0) - (t2s_2(0,0)*t2_2(0,0) + t2s_2(0,1)*t2_2(0,1)
+		       + t2s_2(0,2)*t2_2(0,2)),"T2(j,k)*T2s(i,k)(0,0)");
+  test_for_zero(t2_1(0,1) - (t2s_2(0,0)*t2_2(1,0) + t2s_2(0,1)*t2_2(1,1)
+		       + t2s_2(0,2)*t2_2(1,2)),"T2(j,k)*T2s(i,k)(0,1)");
+  test_for_zero(t2_1(0,2) - (t2s_2(0,0)*t2_2(2,0) + t2s_2(0,1)*t2_2(2,1)
+		       + t2s_2(0,2)*t2_2(2,2)),"T2(j,k)*T2s(i,k)(0,2)");
+  test_for_zero(t2_1(1,0) - (t2s_2(1,0)*t2_2(0,0) + t2s_2(1,1)*t2_2(0,1)
+		       + t2s_2(1,2)*t2_2(0,2)),"T2(j,k)*T2s(i,k)(1,0)");
+  test_for_zero(t2_1(1,1) - (t2s_2(1,0)*t2_2(1,0) + t2s_2(1,1)*t2_2(1,1)
+		       + t2s_2(1,2)*t2_2(1,2)),"T2(j,k)*T2s(i,k)(1,1)");
+  test_for_zero(t2_1(1,2) - (t2s_2(1,0)*t2_2(2,0) + t2s_2(1,1)*t2_2(2,1)
+		       + t2s_2(1,2)*t2_2(2,2)),"T2(j,k)*T2s(i,k)(1,2)");
+  test_for_zero(t2_1(2,0) - (t2s_2(2,0)*t2_2(0,0) + t2s_2(2,1)*t2_2(0,1)
+		       + t2s_2(2,2)*t2_2(0,2)),"T2(j,k)*T2s(i,k)(2,0)");
+  test_for_zero(t2_1(2,1) - (t2s_2(2,0)*t2_2(1,0) + t2s_2(2,1)*t2_2(1,1)
+		       + t2s_2(2,2)*t2_2(1,2)),"T2(j,k)*T2s(i,k)(2,1)");
+  test_for_zero(t2_1(2,2) - (t2s_2(2,0)*t2_2(2,0) + t2s_2(2,1)*t2_2(2,1)
+		       + t2s_2(2,2)*t2_2(2,2)),"T2(j,k)*T2s(i,k)(2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3/test_T3.C
--- a/tests/conformance/T3/test_T3.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1064 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3 tests */
-
-
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(0,0,0) - t2_2(0,0)*t1_2(0)*10,
-		"T3*T(0,0,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(0,0,1) - t2_2(0,0)*t1_2(1)*10,
-		"T3*T(0,0,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(0,0,2) - t2_2(0,0)*t1_2(2)*10,
-		"T3*T(0,0,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(0,1,0) - t2_2(0,1)*t1_2(0)*10,
-		"T3*T(0,1,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(0,1,1) - t2_2(0,1)*t1_2(1)*10,
-		"T3*T(0,1,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(0,1,2) - t2_2(0,1)*t1_2(2)*10,
-		"T3*T(0,1,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(0,2,0) - t2_2(0,2)*t1_2(0)*10,
-		"T3*T(0,2,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(0,2,1) - t2_2(0,2)*t1_2(1)*10,
-		"T3*T(0,2,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(0,2,2) - t2_2(0,2)*t1_2(2)*10,
-		"T3*T(0,2,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(1,0,0) - t2_2(1,0)*t1_2(0)*10,
-		"T3*T(1,0,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(1,0,1) - t2_2(1,0)*t1_2(1)*10,
-		"T3*T(1,0,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(1,0,2) - t2_2(1,0)*t1_2(2)*10,
-		"T3*T(1,0,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(1,1,0) - t2_2(1,1)*t1_2(0)*10,
-		"T3*T(1,1,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(1,1,1) - t2_2(1,1)*t1_2(1)*10,
-		"T3*T(1,1,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(1,1,2) - t2_2(1,1)*t1_2(2)*10,
-		"T3*T(1,1,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(1,2,0) - t2_2(1,2)*t1_2(0)*10,
-		"T3*T(1,2,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(1,2,1) - t2_2(1,2)*t1_2(1)*10,
-		"T3*T(1,2,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(1,2,2) - t2_2(1,2)*t1_2(2)*10,
-		"T3*T(1,2,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(2,0,0) - t2_2(2,0)*t1_2(0)*10,
-		"T3*T(2,0,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(2,0,1) - t2_2(2,0)*t1_2(1)*10,
-		"T3*T(2,0,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(2,0,2) - t2_2(2,0)*t1_2(2)*10,
-		"T3*T(2,0,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(2,1,0) - t2_2(2,1)*t1_2(0)*10,
-		"T3*T(2,1,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(2,1,1) - t2_2(2,1)*t1_2(1)*10,
-		"T3*T(2,1,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(2,1,2) - t2_2(2,1)*t1_2(2)*10,
-		"T3*T(2,1,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(2,2,0) - t2_2(2,2)*t1_2(0)*10,
-		"T3*T(2,2,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(2,2,1) - t2_2(2,2)*t1_2(1)*10,
-		"T3*T(2,2,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(2,2,2) - t2_2(2,2)*t1_2(2)*10,
-		"T3*T(2,2,2)");
-  
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(0,0,0) - t2_2(0,0)*t1_2(0)*10,
-		"T*T3(0,0,0)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(0,0,1) - t2_2(0,0)*t1_2(1)*10,
-		"T*T3(0,0,1)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(0,0,2) - t2_2(0,0)*t1_2(2)*10,
-		"T*T3(0,0,2)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(0,1,0) - t2_2(0,1)*t1_2(0)*10,
-		"T*T3(0,1,0)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(0,1,1) - t2_2(0,1)*t1_2(1)*10,
-		"T*T3(0,1,1)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(0,1,2) - t2_2(0,1)*t1_2(2)*10,
-		"T*T3(0,1,2)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(0,2,0) - t2_2(0,2)*t1_2(0)*10,
-		"T*T3(0,2,0)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(0,2,1) - t2_2(0,2)*t1_2(1)*10,
-		"T*T3(0,2,1)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(0,2,2) - t2_2(0,2)*t1_2(2)*10,
-		"T*T3(0,2,2)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(1,0,0) - t2_2(1,0)*t1_2(0)*10,
-		"T*T3(1,0,0)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(1,0,1) - t2_2(1,0)*t1_2(1)*10,
-		"T*T3(1,0,1)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(1,0,2) - t2_2(1,0)*t1_2(2)*10,
-		"T*T3(1,0,2)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(1,1,0) - t2_2(1,1)*t1_2(0)*10,
-		"T*T3(1,1,0)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(1,1,1) - t2_2(1,1)*t1_2(1)*10,
-		"T*T3(1,1,1)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(1,1,2) - t2_2(1,1)*t1_2(2)*10,
-		"T*T3(1,1,2)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(1,2,0) - t2_2(1,2)*t1_2(0)*10,
-		"T*T3(1,2,0)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(1,2,1) - t2_2(1,2)*t1_2(1)*10,
-		"T*T3(1,2,1)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(1,2,2) - t2_2(1,2)*t1_2(2)*10,
-		"T*T3(1,2,2)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(2,0,0) - t2_2(2,0)*t1_2(0)*10,
-		"T*T3(2,0,0)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(2,0,1) - t2_2(2,0)*t1_2(1)*10,
-		"T*T3(2,0,1)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(2,0,2) - t2_2(2,0)*t1_2(2)*10,
-		"T*T3(2,0,2)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(2,1,0) - t2_2(2,1)*t1_2(0)*10,
-		"T*T3(2,1,0)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(2,1,1) - t2_2(2,1)*t1_2(1)*10,
-		"T*T3(2,1,1)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(2,1,2) - t2_2(2,1)*t1_2(2)*10,
-		"T*T3(2,1,2)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(2,2,0) - t2_2(2,2)*t1_2(0)*10,
-		"T*T3(2,2,0)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(2,2,1) - t2_2(2,2)*t1_2(1)*10,
-		"T*T3(2,2,1)");
-  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(2,2,2) - t2_2(2,2)*t1_2(2)*10,
-		"T*T3(2,2,2)");
-
-  
-  t2_1(i,k)=(t2_2(i,j)*t1_2(k))*t1_1(j);
-  
-  test_for_zero(t2_1(0,0) - (t2_2(0,0)*t1_2(0)*t1_1(0)
-			     + t2_2(0,1)*t1_2(0)*t1_1(1)
-			     + t2_2(0,2)*t1_2(0)*t1_1(2)),
-		"T3(i,j,k)*T1(j)(0,0)");
-  test_for_zero(t2_1(0,1) - (t2_2(0,0)*t1_2(1)*t1_1(0)
-			     + t2_2(0,1)*t1_2(1)*t1_1(1)
-			     + t2_2(0,2)*t1_2(1)*t1_1(2)),
-		"T3(i,j,k)*T1(j)(0,1)");
-  test_for_zero(t2_1(0,2) - (t2_2(0,0)*t1_2(2)*t1_1(0)
-			     + t2_2(0,1)*t1_2(2)*t1_1(1)
-			     + t2_2(0,2)*t1_2(2)*t1_1(2)),
-		"T3(i,j,k)*T1(j)(0,2)");
-  test_for_zero(t2_1(1,0) - (t2_2(1,0)*t1_2(0)*t1_1(0)
-			     + t2_2(1,1)*t1_2(0)*t1_1(1)
-			     + t2_2(1,2)*t1_2(0)*t1_1(2)),
-		"T3(i,j,k)*T1(j)(1,0)");
-  test_for_zero(t2_1(1,1) - (t2_2(1,0)*t1_2(1)*t1_1(0)
-			     + t2_2(1,1)*t1_2(1)*t1_1(1)
-			     + t2_2(1,2)*t1_2(1)*t1_1(2)),
-		"T3(i,j,k)*T1(j)(1,1)");
-  test_for_zero(t2_1(1,2) - (t2_2(1,0)*t1_2(2)*t1_1(0)
-			     + t2_2(1,1)*t1_2(2)*t1_1(1)
-			     + t2_2(1,2)*t1_2(2)*t1_1(2)),
-		"T3(i,j,k)*T1(j)(1,2)");
-  test_for_zero(t2_1(2,0) - (t2_2(2,0)*t1_2(0)*t1_1(0)
-			     + t2_2(2,1)*t1_2(0)*t1_1(1)
-			     + t2_2(2,2)*t1_2(0)*t1_1(2)),
-		"T3(i,j,k)*T1(j)(2,0)");
-  test_for_zero(t2_1(2,1) - (t2_2(2,0)*t1_2(1)*t1_1(0)
-			     + t2_2(2,1)*t1_2(1)*t1_1(1)
-			     + t2_2(2,2)*t1_2(1)*t1_1(2)),
-		"T3(i,j,k)*T1(j)(2,1)");
-  test_for_zero(t2_1(2,2) - (t2_2(2,0)*t1_2(2)*t1_1(0)
-			     + t2_2(2,1)*t1_2(2)*t1_1(1)
-			     + t2_2(2,2)*t1_2(2)*t1_1(2)),
-		"T3(i,j,k)*T1(j)(2,2)");
-  
-  t2_1(i,k)=t1_2(j)*(t2_2(i,j)*t1_1(k));
-  
-  test_for_zero(t2_1(0,0) - (t2_2(0,0)*t1_1(0)*t1_2(0)
-			     + t2_2(0,1)*t1_1(0)*t1_2(1)
-			     + t2_2(0,2)*t1_1(0)*t1_2(2)),
-		"T1(j)*T3(i,j,k)(0,0)");
-  test_for_zero(t2_1(0,1) - (t2_2(0,0)*t1_1(1)*t1_2(0)
-			     + t2_2(0,1)*t1_1(1)*t1_2(1)
-			     + t2_2(0,2)*t1_1(1)*t1_2(2)),
-		"T1(j)*T3(i,j,k)(0,1)");
-  test_for_zero(t2_1(0,2) - (t2_2(0,0)*t1_1(2)*t1_2(0)
-			     + t2_2(0,1)*t1_1(2)*t1_2(1)
-			     + t2_2(0,2)*t1_1(2)*t1_2(2)),
-		"T1(j)*T3(i,j,k)(0,2)");
-  test_for_zero(t2_1(1,0) - (t2_2(1,0)*t1_1(0)*t1_2(0)
-			     + t2_2(1,1)*t1_1(0)*t1_2(1)
-			     + t2_2(1,2)*t1_1(0)*t1_2(2)),
-		"T1(j)*T3(i,j,k)(1,0)");
-  test_for_zero(t2_1(1,1) - (t2_2(1,0)*t1_1(1)*t1_2(0)
-			     + t2_2(1,1)*t1_1(1)*t1_2(1)
-			     + t2_2(1,2)*t1_1(1)*t1_2(2)),
-		"T1(j)*T3(i,j,k)(1,1)");
-  test_for_zero(t2_1(1,2) - (t2_2(1,0)*t1_1(2)*t1_2(0)
-			     + t2_2(1,1)*t1_1(2)*t1_2(1)
-			     + t2_2(1,2)*t1_1(2)*t1_2(2)),
-		"T1(j)*T3(i,j,k)(1,2)");
-  test_for_zero(t2_1(2,0) - (t2_2(2,0)*t1_1(0)*t1_2(0)
-			     + t2_2(2,1)*t1_1(0)*t1_2(1)
-			     + t2_2(2,2)*t1_1(0)*t1_2(2)),
-		"T1(j)*T3(i,j,k)(2,0)");
-  test_for_zero(t2_1(2,1) - (t2_2(2,0)*t1_1(1)*t1_2(0)
-			     + t2_2(2,1)*t1_1(1)*t1_2(1)
-			     + t2_2(2,2)*t1_1(1)*t1_2(2)),
-		"T1(j)*T3(i,j,k)(2,1)");
-  test_for_zero(t2_1(2,2) - (t2_2(2,0)*t1_1(2)*t1_2(0)
-			     + t2_2(2,1)*t1_1(2)*t1_2(1)
-			     + t2_2(2,2)*t1_1(2)*t1_2(2)),
-		"T1(j)*T3(i,j,k)(2,2)");
-
-  t1_1(i)=(t2_2(i,j)*t1_2(k))*t2s_2(j,k);
-  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2s_2(0,0)
-			   + t2_2(0,0)*t1_2(1)*t2s_2(0,1)
-			   + t2_2(0,0)*t1_2(2)*t2s_2(0,2)
-			   + t2_2(0,1)*t1_2(0)*t2s_2(1,0)
-			   + t2_2(0,1)*t1_2(1)*t2s_2(1,1)
-			   + t2_2(0,1)*t1_2(2)*t2s_2(1,2)
-			   + t2_2(0,2)*t1_2(0)*t2s_2(2,0)
-			   + t2_2(0,2)*t1_2(1)*t2s_2(2,1)
-			   + t2_2(0,2)*t1_2(2)*t2s_2(2,2)),
-		"T3(i,j,k)*T2s(j,k)(0)");
-  test_for_zero(t1_1(1) - (t2_2(1,0)*t1_2(0)*t2s_2(0,0)
-			   + t2_2(1,0)*t1_2(1)*t2s_2(0,1)
-			   + t2_2(1,0)*t1_2(2)*t2s_2(0,2)
-			   + t2_2(1,1)*t1_2(0)*t2s_2(1,0)
-			   + t2_2(1,1)*t1_2(1)*t2s_2(1,1)
-			   + t2_2(1,1)*t1_2(2)*t2s_2(1,2)
-			   + t2_2(1,2)*t1_2(0)*t2s_2(2,0)
-			   + t2_2(1,2)*t1_2(1)*t2s_2(2,1)
-			   + t2_2(1,2)*t1_2(2)*t2s_2(2,2)),
-		"T3(i,j,k)*T2s(j,k)(1)");
-  test_for_zero(t1_1(2) - (t2_2(2,0)*t1_2(0)*t2s_2(0,0)
-			   + t2_2(2,0)*t1_2(1)*t2s_2(0,1)
-			   + t2_2(2,0)*t1_2(2)*t2s_2(0,2)
-			   + t2_2(2,1)*t1_2(0)*t2s_2(1,0)
-			   + t2_2(2,1)*t1_2(1)*t2s_2(1,1)
-			   + t2_2(2,1)*t1_2(2)*t2s_2(1,2)
-			   + t2_2(2,2)*t1_2(0)*t2s_2(2,0)
-			   + t2_2(2,2)*t1_2(1)*t2s_2(2,1)
-			   + t2_2(2,2)*t1_2(2)*t2s_2(2,2)),
-		"T3(i,j,k)*T2s(j,k)(2)");
-
-  t1_1(i)=t2s_3(j,k)*(t2_2(i,j)*t1_2(k));
-  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2s_3(0,0)
-			   + t2_2(0,0)*t1_2(1)*t2s_3(0,1)
-			   + t2_2(0,0)*t1_2(2)*t2s_3(0,2)
-			   + t2_2(0,1)*t1_2(0)*t2s_3(1,0)
-			   + t2_2(0,1)*t1_2(1)*t2s_3(1,1)
-			   + t2_2(0,1)*t1_2(2)*t2s_3(1,2)
-			   + t2_2(0,2)*t1_2(0)*t2s_3(2,0)
-			   + t2_2(0,2)*t1_2(1)*t2s_3(2,1)
-			   + t2_2(0,2)*t1_2(2)*t2s_3(2,2)),
-		"T2s(j,k)*T3(i,j,k)(0)");
-  test_for_zero(t1_1(1) - (t2_2(1,0)*t1_2(0)*t2s_3(0,0)
-			   + t2_2(1,0)*t1_2(1)*t2s_3(0,1)
-			   + t2_2(1,0)*t1_2(2)*t2s_3(0,2)
-			   + t2_2(1,1)*t1_2(0)*t2s_3(1,0)
-			   + t2_2(1,1)*t1_2(1)*t2s_3(1,1)
-			   + t2_2(1,1)*t1_2(2)*t2s_3(1,2)
-			   + t2_2(1,2)*t1_2(0)*t2s_3(2,0)
-			   + t2_2(1,2)*t1_2(1)*t2s_3(2,1)
-			   + t2_2(1,2)*t1_2(2)*t2s_3(2,2)),
-		"T2s(j,k)*T3(i,j,k)(1)");
-  test_for_zero(t1_1(2) - (t2_2(2,0)*t1_2(0)*t2s_3(0,0)
-			   + t2_2(2,0)*t1_2(1)*t2s_3(0,1)
-			   + t2_2(2,0)*t1_2(2)*t2s_3(0,2)
-			   + t2_2(2,1)*t1_2(0)*t2s_3(1,0)
-			   + t2_2(2,1)*t1_2(1)*t2s_3(1,1)
-			   + t2_2(2,1)*t1_2(2)*t2s_3(1,2)
-			   + t2_2(2,2)*t1_2(0)*t2s_3(2,0)
-			   + t2_2(2,2)*t1_2(1)*t2s_3(2,1)
-			   + t2_2(2,2)*t1_2(2)*t2s_3(2,2)),
-		"T2s(j,k)*T3(i,j,k)(2)");
-
-
-  t1_1(i)=(t2_2(j,i)*t1_2(k))*t2s_2(j,k);
-  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2s_2(0,0)
-			   + t2_2(0,0)*t1_2(1)*t2s_2(0,1)
-			   + t2_2(0,0)*t1_2(2)*t2s_2(0,2)
-			   + t2_2(1,0)*t1_2(0)*t2s_2(1,0)
-			   + t2_2(1,0)*t1_2(1)*t2s_2(1,1)
-			   + t2_2(1,0)*t1_2(2)*t2s_2(1,2)
-			   + t2_2(2,0)*t1_2(0)*t2s_2(2,0)
-			   + t2_2(2,0)*t1_2(1)*t2s_2(2,1)
-			   + t2_2(2,0)*t1_2(2)*t2s_2(2,2)),
-		"T3(j,i,k)*T2s(j,k)(0)");
-  test_for_zero(t1_1(1) - (t2_2(0,1)*t1_2(0)*t2s_2(0,0)
-			   + t2_2(0,1)*t1_2(1)*t2s_2(0,1)
-			   + t2_2(0,1)*t1_2(2)*t2s_2(0,2)
-			   + t2_2(1,1)*t1_2(0)*t2s_2(1,0)
-			   + t2_2(1,1)*t1_2(1)*t2s_2(1,1)
-			   + t2_2(1,1)*t1_2(2)*t2s_2(1,2)
-			   + t2_2(2,1)*t1_2(0)*t2s_2(2,0)
-			   + t2_2(2,1)*t1_2(1)*t2s_2(2,1)
-			   + t2_2(2,1)*t1_2(2)*t2s_2(2,2)),
-		"T3(j,i,k)*T2s(j,k)(1)");
-  test_for_zero(t1_1(2) - (t2_2(0,2)*t1_2(0)*t2s_2(0,0)
-			   + t2_2(0,2)*t1_2(1)*t2s_2(0,1)
-			   + t2_2(0,2)*t1_2(2)*t2s_2(0,2)
-			   + t2_2(1,2)*t1_2(0)*t2s_2(1,0)
-			   + t2_2(1,2)*t1_2(1)*t2s_2(1,1)
-			   + t2_2(1,2)*t1_2(2)*t2s_2(1,2)
-			   + t2_2(2,2)*t1_2(0)*t2s_2(2,0)
-			   + t2_2(2,2)*t1_2(1)*t2s_2(2,1)
-			   + t2_2(2,2)*t1_2(2)*t2s_2(2,2)),
-		"T3(j,i,k)*T2s(j,k)(2)");
-
-  t1_1(i)=t2s_3(j,k)*(t2_2(j,i)*t1_2(k));
-  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2s_3(0,0)
-			   + t2_2(0,0)*t1_2(1)*t2s_3(0,1)
-			   + t2_2(0,0)*t1_2(2)*t2s_3(0,2)
-			   + t2_2(1,0)*t1_2(0)*t2s_3(1,0)
-			   + t2_2(1,0)*t1_2(1)*t2s_3(1,1)
-			   + t2_2(1,0)*t1_2(2)*t2s_3(1,2)
-			   + t2_2(2,0)*t1_2(0)*t2s_3(2,0)
-			   + t2_2(2,0)*t1_2(1)*t2s_3(2,1)
-			   + t2_2(2,0)*t1_2(2)*t2s_3(2,2)),
-		"T2s(j,k)*T3(j,i,k)(0)");
-  test_for_zero(t1_1(1) - (t2_2(0,1)*t1_2(0)*t2s_3(0,0)
-			   + t2_2(0,1)*t1_2(1)*t2s_3(0,1)
-			   + t2_2(0,1)*t1_2(2)*t2s_3(0,2)
-			   + t2_2(1,1)*t1_2(0)*t2s_3(1,0)
-			   + t2_2(1,1)*t1_2(1)*t2s_3(1,1)
-			   + t2_2(1,1)*t1_2(2)*t2s_3(1,2)
-			   + t2_2(2,1)*t1_2(0)*t2s_3(2,0)
-			   + t2_2(2,1)*t1_2(1)*t2s_3(2,1)
-			   + t2_2(2,1)*t1_2(2)*t2s_3(2,2)),
-		"T2s(j,k)*T3(j,i,k)(1)");
-  test_for_zero(t1_1(2) - (t2_2(0,2)*t1_2(0)*t2s_3(0,0)
-			   + t2_2(0,2)*t1_2(1)*t2s_3(0,1)
-			   + t2_2(0,2)*t1_2(2)*t2s_3(0,2)
-			   + t2_2(1,2)*t1_2(0)*t2s_3(1,0)
-			   + t2_2(1,2)*t1_2(1)*t2s_3(1,1)
-			   + t2_2(1,2)*t1_2(2)*t2s_3(1,2)
-			   + t2_2(2,2)*t1_2(0)*t2s_3(2,0)
-			   + t2_2(2,2)*t1_2(1)*t2s_3(2,1)
-			   + t2_2(2,2)*t1_2(2)*t2s_3(2,2)),
-		"T2s(j,k)*T3(j,i,k)(2)");
-
-
-  t1_1(i)=(t2_2(j,k)*t1_2(i))*t2s_2(j,k);
-  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2s_2(0,0)
-			   + t2_2(0,1)*t1_2(0)*t2s_2(0,1)
-			   + t2_2(0,2)*t1_2(0)*t2s_2(0,2)
-			   + t2_2(1,0)*t1_2(0)*t2s_2(1,0)
-			   + t2_2(1,1)*t1_2(0)*t2s_2(1,1)
-			   + t2_2(1,2)*t1_2(0)*t2s_2(1,2)
-			   + t2_2(2,0)*t1_2(0)*t2s_2(2,0)
-			   + t2_2(2,1)*t1_2(0)*t2s_2(2,1)
-			   + t2_2(2,2)*t1_2(0)*t2s_2(2,2)),
-		"T3(j,k,i)*T2s(j,k)(0)");
-  test_for_zero(t1_1(1) - (t2_2(0,0)*t1_2(1)*t2s_2(0,0)
-			   + t2_2(0,1)*t1_2(1)*t2s_2(0,1)
-			   + t2_2(0,2)*t1_2(1)*t2s_2(0,2)
-			   + t2_2(1,0)*t1_2(1)*t2s_2(1,0)
-			   + t2_2(1,1)*t1_2(1)*t2s_2(1,1)
-			   + t2_2(1,2)*t1_2(1)*t2s_2(1,2)
-			   + t2_2(2,0)*t1_2(1)*t2s_2(2,0)
-			   + t2_2(2,1)*t1_2(1)*t2s_2(2,1)
-			   + t2_2(2,2)*t1_2(1)*t2s_2(2,2)),
-		"T3(j,k,i)*T2s(j,k)(1)");
-  test_for_zero(t1_1(2) - (t2_2(0,0)*t1_2(2)*t2s_2(0,0)
-			   + t2_2(0,1)*t1_2(2)*t2s_2(0,1)
-			   + t2_2(0,2)*t1_2(2)*t2s_2(0,2)
-			   + t2_2(1,0)*t1_2(2)*t2s_2(1,0)
-			   + t2_2(1,1)*t1_2(2)*t2s_2(1,1)
-			   + t2_2(1,2)*t1_2(2)*t2s_2(1,2)
-			   + t2_2(2,0)*t1_2(2)*t2s_2(2,0)
-			   + t2_2(2,1)*t1_2(2)*t2s_2(2,1)
-			   + t2_2(2,2)*t1_2(2)*t2s_2(2,2)),
-		"T3(j,k,i)*T2s(j,k)(2)");
-
-  t1_1(i)=t2s_3(j,k)*(t2_2(j,k)*t1_2(i));
-  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2s_3(0,0)
-			   + t2_2(0,1)*t1_2(0)*t2s_3(0,1)
-			   + t2_2(0,2)*t1_2(0)*t2s_3(0,2)
-			   + t2_2(1,0)*t1_2(0)*t2s_3(1,0)
-			   + t2_2(1,1)*t1_2(0)*t2s_3(1,1)
-			   + t2_2(1,2)*t1_2(0)*t2s_3(1,2)
-			   + t2_2(2,0)*t1_2(0)*t2s_3(2,0)
-			   + t2_2(2,1)*t1_2(0)*t2s_3(2,1)
-			   + t2_2(2,2)*t1_2(0)*t2s_3(2,2)),
-		"T2s(j,k)*T3(j,k,i)(0)");
-  test_for_zero(t1_1(1) - (t2_2(0,0)*t1_2(1)*t2s_3(0,0)
-			   + t2_2(0,1)*t1_2(1)*t2s_3(0,1)
-			   + t2_2(0,2)*t1_2(1)*t2s_3(0,2)
-			   + t2_2(1,0)*t1_2(1)*t2s_3(1,0)
-			   + t2_2(1,1)*t1_2(1)*t2s_3(1,1)
-			   + t2_2(1,2)*t1_2(1)*t2s_3(1,2)
-			   + t2_2(2,0)*t1_2(1)*t2s_3(2,0)
-			   + t2_2(2,1)*t1_2(1)*t2s_3(2,1)
-			   + t2_2(2,2)*t1_2(1)*t2s_3(2,2)),
-		"T2s(j,k)*T3(j,k,i)(1)");
-  test_for_zero(t1_1(2) - (t2_2(0,0)*t1_2(2)*t2s_3(0,0)
-			   + t2_2(0,1)*t1_2(2)*t2s_3(0,1)
-			   + t2_2(0,2)*t1_2(2)*t2s_3(0,2)
-			   + t2_2(1,0)*t1_2(2)*t2s_3(1,0)
-			   + t2_2(1,1)*t1_2(2)*t2s_3(1,1)
-			   + t2_2(1,2)*t1_2(2)*t2s_3(1,2)
-			   + t2_2(2,0)*t1_2(2)*t2s_3(2,0)
-			   + t2_2(2,1)*t1_2(2)*t2s_3(2,1)
-			   + t2_2(2,2)*t1_2(2)*t2s_3(2,2)),
-		"T2s(j,k)*T3(j,k,i)(2)");
-
-
-
-
-  t1_1(i)=(t2_2(i,j)*t1_2(k))*t2_2(j,k);
-  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2_2(0,0)
-			   + t2_2(0,0)*t1_2(1)*t2_2(0,1)
-			   + t2_2(0,0)*t1_2(2)*t2_2(0,2)
-			   + t2_2(0,1)*t1_2(0)*t2_2(1,0)
-			   + t2_2(0,1)*t1_2(1)*t2_2(1,1)
-			   + t2_2(0,1)*t1_2(2)*t2_2(1,2)
-			   + t2_2(0,2)*t1_2(0)*t2_2(2,0)
-			   + t2_2(0,2)*t1_2(1)*t2_2(2,1)
-			   + t2_2(0,2)*t1_2(2)*t2_2(2,2)),
-		"T3(i,j,k)*T2(j,k)(0)");
-  test_for_zero(t1_1(1) - (t2_2(1,0)*t1_2(0)*t2_2(0,0)
-			   + t2_2(1,0)*t1_2(1)*t2_2(0,1)
-			   + t2_2(1,0)*t1_2(2)*t2_2(0,2)
-			   + t2_2(1,1)*t1_2(0)*t2_2(1,0)
-			   + t2_2(1,1)*t1_2(1)*t2_2(1,1)
-			   + t2_2(1,1)*t1_2(2)*t2_2(1,2)
-			   + t2_2(1,2)*t1_2(0)*t2_2(2,0)
-			   + t2_2(1,2)*t1_2(1)*t2_2(2,1)
-			   + t2_2(1,2)*t1_2(2)*t2_2(2,2)),
-		"T3(i,j,k)*T2(j,k)(1)");
-  test_for_zero(t1_1(2) - (t2_2(2,0)*t1_2(0)*t2_2(0,0)
-			   + t2_2(2,0)*t1_2(1)*t2_2(0,1)
-			   + t2_2(2,0)*t1_2(2)*t2_2(0,2)
-			   + t2_2(2,1)*t1_2(0)*t2_2(1,0)
-			   + t2_2(2,1)*t1_2(1)*t2_2(1,1)
-			   + t2_2(2,1)*t1_2(2)*t2_2(1,2)
-			   + t2_2(2,2)*t1_2(0)*t2_2(2,0)
-			   + t2_2(2,2)*t1_2(1)*t2_2(2,1)
-			   + t2_2(2,2)*t1_2(2)*t2_2(2,2)),
-		"T3(i,j,k)*T2(j,k)(2)");
-
-  t1_1(i)=t2_3(j,k)*(t2_2(i,j)*t1_2(k));
-  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2_3(0,0)
-			   + t2_2(0,0)*t1_2(1)*t2_3(0,1)
-			   + t2_2(0,0)*t1_2(2)*t2_3(0,2)
-			   + t2_2(0,1)*t1_2(0)*t2_3(1,0)
-			   + t2_2(0,1)*t1_2(1)*t2_3(1,1)
-			   + t2_2(0,1)*t1_2(2)*t2_3(1,2)
-			   + t2_2(0,2)*t1_2(0)*t2_3(2,0)
-			   + t2_2(0,2)*t1_2(1)*t2_3(2,1)
-			   + t2_2(0,2)*t1_2(2)*t2_3(2,2)),
-		"T2(j,k)*T3(i,j,k)(0)");
-  test_for_zero(t1_1(1) - (t2_2(1,0)*t1_2(0)*t2_3(0,0)
-			   + t2_2(1,0)*t1_2(1)*t2_3(0,1)
-			   + t2_2(1,0)*t1_2(2)*t2_3(0,2)
-			   + t2_2(1,1)*t1_2(0)*t2_3(1,0)
-			   + t2_2(1,1)*t1_2(1)*t2_3(1,1)
-			   + t2_2(1,1)*t1_2(2)*t2_3(1,2)
-			   + t2_2(1,2)*t1_2(0)*t2_3(2,0)
-			   + t2_2(1,2)*t1_2(1)*t2_3(2,1)
-			   + t2_2(1,2)*t1_2(2)*t2_3(2,2)),
-		"T2(j,k)*T3(i,j,k)(1)");
-  test_for_zero(t1_1(2) - (t2_2(2,0)*t1_2(0)*t2_3(0,0)
-			   + t2_2(2,0)*t1_2(1)*t2_3(0,1)
-			   + t2_2(2,0)*t1_2(2)*t2_3(0,2)
-			   + t2_2(2,1)*t1_2(0)*t2_3(1,0)
-			   + t2_2(2,1)*t1_2(1)*t2_3(1,1)
-			   + t2_2(2,1)*t1_2(2)*t2_3(1,2)
-			   + t2_2(2,2)*t1_2(0)*t2_3(2,0)
-			   + t2_2(2,2)*t1_2(1)*t2_3(2,1)
-			   + t2_2(2,2)*t1_2(2)*t2_3(2,2))
-		,"T2(j,k)*T3(i,j,k)(2)");
-
-
-  t1_1(i)=(t2_2(j,i)*t1_2(k))*t2_2(j,k);
-  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2_2(0,0)
-			   + t2_2(0,0)*t1_2(1)*t2_2(0,1)
-			   + t2_2(0,0)*t1_2(2)*t2_2(0,2)
-			   + t2_2(1,0)*t1_2(0)*t2_2(1,0)
-			   + t2_2(1,0)*t1_2(1)*t2_2(1,1)
-			   + t2_2(1,0)*t1_2(2)*t2_2(1,2)
-			   + t2_2(2,0)*t1_2(0)*t2_2(2,0)
-			   + t2_2(2,0)*t1_2(1)*t2_2(2,1)
-			   + t2_2(2,0)*t1_2(2)*t2_2(2,2)),
-		"T3(j,i,k)*T2(j,k)(0)");
-  test_for_zero(t1_1(1) - (t2_2(0,1)*t1_2(0)*t2_2(0,0)
-			   + t2_2(0,1)*t1_2(1)*t2_2(0,1)
-			   + t2_2(0,1)*t1_2(2)*t2_2(0,2)
-			   + t2_2(1,1)*t1_2(0)*t2_2(1,0)
-			   + t2_2(1,1)*t1_2(1)*t2_2(1,1)
-			   + t2_2(1,1)*t1_2(2)*t2_2(1,2)
-			   + t2_2(2,1)*t1_2(0)*t2_2(2,0)
-			   + t2_2(2,1)*t1_2(1)*t2_2(2,1)
-			   + t2_2(2,1)*t1_2(2)*t2_2(2,2)),
-		"T3(j,i,k)*T2(j,k)(1)");
-  test_for_zero(t1_1(2) - (t2_2(0,2)*t1_2(0)*t2_2(0,0)
-			   + t2_2(0,2)*t1_2(1)*t2_2(0,1)
-			   + t2_2(0,2)*t1_2(2)*t2_2(0,2)
-			   + t2_2(1,2)*t1_2(0)*t2_2(1,0)
-			   + t2_2(1,2)*t1_2(1)*t2_2(1,1)
-			   + t2_2(1,2)*t1_2(2)*t2_2(1,2)
-			   + t2_2(2,2)*t1_2(0)*t2_2(2,0)
-			   + t2_2(2,2)*t1_2(1)*t2_2(2,1)
-			   + t2_2(2,2)*t1_2(2)*t2_2(2,2)),
-		"T3(j,i,k)*T2(j,k)(2)");
-
-  t1_1(i)=t2_3(j,k)*(t2_2(j,i)*t1_2(k));
-  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2_3(0,0)
-			   + t2_2(0,0)*t1_2(1)*t2_3(0,1)
-			   + t2_2(0,0)*t1_2(2)*t2_3(0,2)
-			   + t2_2(1,0)*t1_2(0)*t2_3(1,0)
-			   + t2_2(1,0)*t1_2(1)*t2_3(1,1)
-			   + t2_2(1,0)*t1_2(2)*t2_3(1,2)
-			   + t2_2(2,0)*t1_2(0)*t2_3(2,0)
-			   + t2_2(2,0)*t1_2(1)*t2_3(2,1)
-			   + t2_2(2,0)*t1_2(2)*t2_3(2,2))
-		,"T2(j,k)*T3(j,i,k)(0)");
-  test_for_zero(t1_1(1) - (t2_2(0,1)*t1_2(0)*t2_3(0,0)
-			   + t2_2(0,1)*t1_2(1)*t2_3(0,1)
-			   + t2_2(0,1)*t1_2(2)*t2_3(0,2)
-			   + t2_2(1,1)*t1_2(0)*t2_3(1,0)
-			   + t2_2(1,1)*t1_2(1)*t2_3(1,1)
-			   + t2_2(1,1)*t1_2(2)*t2_3(1,2)
-			   + t2_2(2,1)*t1_2(0)*t2_3(2,0)
-			   + t2_2(2,1)*t1_2(1)*t2_3(2,1)
-			   + t2_2(2,1)*t1_2(2)*t2_3(2,2))
-		,"T2(j,k)*T3(j,i,k)(1)");
-  test_for_zero(t1_1(2) - (t2_2(0,2)*t1_2(0)*t2_3(0,0)
-			   + t2_2(0,2)*t1_2(1)*t2_3(0,1)
-			   + t2_2(0,2)*t1_2(2)*t2_3(0,2)
-			   + t2_2(1,2)*t1_2(0)*t2_3(1,0)
-			   + t2_2(1,2)*t1_2(1)*t2_3(1,1)
-			   + t2_2(1,2)*t1_2(2)*t2_3(1,2)
-			   + t2_2(2,2)*t1_2(0)*t2_3(2,0)
-			   + t2_2(2,2)*t1_2(1)*t2_3(2,1)
-			   + t2_2(2,2)*t1_2(2)*t2_3(2,2))
-		,"T2(j,k)*T3(j,i,k)(2)");
-
-
-  t1_1(i)=(t2_2(j,k)*t1_2(i))*t2_2(j,k);
-  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2_2(0,0)
-			   + t2_2(0,1)*t1_2(0)*t2_2(0,1)
-			   + t2_2(0,2)*t1_2(0)*t2_2(0,2)
-			   + t2_2(1,0)*t1_2(0)*t2_2(1,0)
-			   + t2_2(1,1)*t1_2(0)*t2_2(1,1)
-			   + t2_2(1,2)*t1_2(0)*t2_2(1,2)
-			   + t2_2(2,0)*t1_2(0)*t2_2(2,0)
-			   + t2_2(2,1)*t1_2(0)*t2_2(2,1)
-			   + t2_2(2,2)*t1_2(0)*t2_2(2,2))
-		,"T3(j,k,i)*T2(j,k)(0)");
-  test_for_zero(t1_1(1) - (t2_2(0,0)*t1_2(1)*t2_2(0,0)
-			   + t2_2(0,1)*t1_2(1)*t2_2(0,1)
-			   + t2_2(0,2)*t1_2(1)*t2_2(0,2)
-			   + t2_2(1,0)*t1_2(1)*t2_2(1,0)
-			   + t2_2(1,1)*t1_2(1)*t2_2(1,1)
-			   + t2_2(1,2)*t1_2(1)*t2_2(1,2)
-			   + t2_2(2,0)*t1_2(1)*t2_2(2,0)
-			   + t2_2(2,1)*t1_2(1)*t2_2(2,1)
-			   + t2_2(2,2)*t1_2(1)*t2_2(2,2))
-		,"T3(j,k,i)*T2(j,k)(1)");
-  test_for_zero(t1_1(2) - (t2_2(0,0)*t1_2(2)*t2_2(0,0)
-			   + t2_2(0,1)*t1_2(2)*t2_2(0,1)
-			   + t2_2(0,2)*t1_2(2)*t2_2(0,2)
-			   + t2_2(1,0)*t1_2(2)*t2_2(1,0)
-			   + t2_2(1,1)*t1_2(2)*t2_2(1,1)
-			   + t2_2(1,2)*t1_2(2)*t2_2(1,2)
-			   + t2_2(2,0)*t1_2(2)*t2_2(2,0)
-			   + t2_2(2,1)*t1_2(2)*t2_2(2,1)
-			   + t2_2(2,2)*t1_2(2)*t2_2(2,2))
-		,"T3(j,k,i)*T2(j,k)(2)");
-
-  t1_1(i)=t2_3(j,k)*(t2_2(j,k)*t1_2(i));
-  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2_3(0,0)
-			   + t2_2(0,1)*t1_2(0)*t2_3(0,1)
-			   + t2_2(0,2)*t1_2(0)*t2_3(0,2)
-			   + t2_2(1,0)*t1_2(0)*t2_3(1,0)
-			   + t2_2(1,1)*t1_2(0)*t2_3(1,1)
-			   + t2_2(1,2)*t1_2(0)*t2_3(1,2)
-			   + t2_2(2,0)*t1_2(0)*t2_3(2,0)
-			   + t2_2(2,1)*t1_2(0)*t2_3(2,1)
-			   + t2_2(2,2)*t1_2(0)*t2_3(2,2))
-		,"T2(j,k)*T3(j,k,i)(0)");
-  test_for_zero(t1_1(1) - (t2_2(0,0)*t1_2(1)*t2_3(0,0)
-			   + t2_2(0,1)*t1_2(1)*t2_3(0,1)
-			   + t2_2(0,2)*t1_2(1)*t2_3(0,2)
-			   + t2_2(1,0)*t1_2(1)*t2_3(1,0)
-			   + t2_2(1,1)*t1_2(1)*t2_3(1,1)
-			   + t2_2(1,2)*t1_2(1)*t2_3(1,2)
-			   + t2_2(2,0)*t1_2(1)*t2_3(2,0)
-			   + t2_2(2,1)*t1_2(1)*t2_3(2,1)
-			   + t2_2(2,2)*t1_2(1)*t2_3(2,2))
-		,"T2(j,k)*T3(j,k,i)(1)");
-  test_for_zero(t1_1(2) - (t2_2(0,0)*t1_2(2)*t2_3(0,0)
-			   + t2_2(0,1)*t1_2(2)*t2_3(0,1)
-			   + t2_2(0,2)*t1_2(2)*t2_3(0,2)
-			   + t2_2(1,0)*t1_2(2)*t2_3(1,0)
-			   + t2_2(1,1)*t1_2(2)*t2_3(1,1)
-			   + t2_2(1,2)*t1_2(2)*t2_3(1,2)
-			   + t2_2(2,0)*t1_2(2)*t2_3(2,0)
-			   + t2_2(2,1)*t1_2(2)*t2_3(2,1)
-			   + t2_2(2,2)*t1_2(2)*t2_3(2,2))
-		,"T2(j,k)*T3(j,k,i)(2)");
-
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(0,0,0)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(0,0,0),
-		"T3(i,j,k)*T2(k,l)(0,0,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(0,0,1)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(0,0,1),
-		"T3(i,j,k)*T2(k,l)(0,0,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(0,0,2)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(0,0,2),
-		"T3(i,j,k)*T2(k,l)(0,0,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(0,1,0)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(0,1,0),
-		"T3(i,j,k)*T2(k,l)(0,1,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(0,1,1)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(0,1,1),
-		"T3(i,j,k)*T2(k,l)(0,1,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(0,1,2)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(0,1,2),
-		"T3(i,j,k)*T2(k,l)(0,1,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(0,2,0)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(0,2,0),
-		"T3(i,j,k)*T2(k,l)(0,2,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(0,2,1)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(0,2,1),
-		"T3(i,j,k)*T2(k,l)(0,2,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(0,2,2)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(0,2,2),
-		"T3(i,j,k)*T2(k,l)(0,2,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(1,0,0)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(1,0,0),
-		"T3(i,j,k)*T2(k,l)(1,0,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(1,0,1)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(1,0,1),
-		"T3(i,j,k)*T2(k,l)(1,0,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(1,0,2)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(1,0,2),
-		"T3(i,j,k)*T2(k,l)(1,0,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(1,1,0)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(1,1,0),
-		"T3(i,j,k)*T2(k,l)(1,1,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(1,1,1)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(1,1,1),
-		"T3(i,j,k)*T2(k,l)(1,1,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(1,1,2)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(1,1,2),
-		"T3(i,j,k)*T2(k,l)(1,1,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(1,2,0)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(1,2,0),
-		"T3(i,j,k)*T2(k,l)(1,2,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(1,2,1)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(1,2,1),
-		"T3(i,j,k)*T2(k,l)(1,2,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(1,2,2)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(1,2,2),
-		"T3(i,j,k)*T2(k,l)(1,2,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(2,0,0)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(2,0,0),
-		"T3(i,j,k)*T2(k,l)(2,0,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(2,0,1)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(2,0,1),
-		"T3(i,j,k)*T2(k,l)(2,0,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(2,0,2)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(2,0,2),
-		"T3(i,j,k)*T2(k,l)(2,0,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(2,1,0)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(2,1,0),
-		"T3(i,j,k)*T2(k,l)(2,1,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(2,1,1)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(2,1,1),
-		"T3(i,j,k)*T2(k,l)(2,1,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(2,1,2)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(2,1,2),
-		"T3(i,j,k)*T2(k,l)(2,1,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(2,2,0)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(2,2,0),
-		"T3(i,j,k)*T2(k,l)(2,2,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(2,2,1)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(2,2,1),
-		"T3(i,j,k)*T2(k,l)(2,2,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(2,2,2)
-		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(2,2,2),
-		"T3(i,j,k)*T2(k,l)(2,2,2)");
-
-
-  test_for_zero((t2_2(i,j)*t1_2(k))*(t2_3(i,j)*t1_1(k))
-		- (t2_2(0,0)*t1_2(0)*t2_3(0,0)*t1_1(0)
-		   + t2_2(1,0)*t1_2(0)*t2_3(1,0)*t1_1(0)
-		   + t2_2(2,0)*t1_2(0)*t2_3(2,0)*t1_1(0)
-		   + t2_2(0,1)*t1_2(0)*t2_3(0,1)*t1_1(0)
-		   + t2_2(1,1)*t1_2(0)*t2_3(1,1)*t1_1(0)
-		   + t2_2(2,1)*t1_2(0)*t2_3(2,1)*t1_1(0)
-		   + t2_2(0,2)*t1_2(0)*t2_3(0,2)*t1_1(0)
-		   + t2_2(1,2)*t1_2(0)*t2_3(1,2)*t1_1(0)
-		   + t2_2(2,2)*t1_2(0)*t2_3(2,2)*t1_1(0)
-		   + t2_2(0,0)*t1_2(1)*t2_3(0,0)*t1_1(1)
-		   + t2_2(1,0)*t1_2(1)*t2_3(1,0)*t1_1(1)
-		   + t2_2(2,0)*t1_2(1)*t2_3(2,0)*t1_1(1)
-		   + t2_2(0,1)*t1_2(1)*t2_3(0,1)*t1_1(1)
-		   + t2_2(1,1)*t1_2(1)*t2_3(1,1)*t1_1(1)
-		   + t2_2(2,1)*t1_2(1)*t2_3(2,1)*t1_1(1)
-		   + t2_2(0,2)*t1_2(1)*t2_3(0,2)*t1_1(1)
-		   + t2_2(1,2)*t1_2(1)*t2_3(1,2)*t1_1(1)
-		   + t2_2(2,2)*t1_2(1)*t2_3(2,2)*t1_1(1)
-		   + t2_2(0,0)*t1_2(2)*t2_3(0,0)*t1_1(2)
-		   + t2_2(1,0)*t1_2(2)*t2_3(1,0)*t1_1(2)
-		   + t2_2(2,0)*t1_2(2)*t2_3(2,0)*t1_1(2)
-		   + t2_2(0,1)*t1_2(2)*t2_3(0,1)*t1_1(2)
-		   + t2_2(1,1)*t1_2(2)*t2_3(1,1)*t1_1(2)
-		   + t2_2(2,1)*t1_2(2)*t2_3(2,1)*t1_1(2)
-		   + t2_2(0,2)*t1_2(2)*t2_3(0,2)*t1_1(2)
-		   + t2_2(1,2)*t1_2(2)*t2_3(1,2)*t1_1(2)
-		   + t2_2(2,2)*t1_2(2)*t2_3(2,2)*t1_1(2)),
-		"T3(i,j,k)*T3(i,j,k)");
-
-  test_for_zero((t2_2(i,j)*t1_2(k))*(t2_3(j,i)*t1_1(k))
-		- (t2_2(0,0)*t1_2(0)*t2_3(0,0)*t1_1(0)
-		   + t2_2(1,0)*t1_2(0)*t2_3(0,1)*t1_1(0)
-		   + t2_2(2,0)*t1_2(0)*t2_3(0,2)*t1_1(0)
-		   + t2_2(0,1)*t1_2(0)*t2_3(1,0)*t1_1(0)
-		   + t2_2(1,1)*t1_2(0)*t2_3(1,1)*t1_1(0)
-		   + t2_2(2,1)*t1_2(0)*t2_3(1,2)*t1_1(0)
-		   + t2_2(0,2)*t1_2(0)*t2_3(2,0)*t1_1(0)
-		   + t2_2(1,2)*t1_2(0)*t2_3(2,1)*t1_1(0)
-		   + t2_2(2,2)*t1_2(0)*t2_3(2,2)*t1_1(0)
-		   + t2_2(0,0)*t1_2(1)*t2_3(0,0)*t1_1(1)
-		   + t2_2(1,0)*t1_2(1)*t2_3(0,1)*t1_1(1)
-		   + t2_2(2,0)*t1_2(1)*t2_3(0,2)*t1_1(1)
-		   + t2_2(0,1)*t1_2(1)*t2_3(1,0)*t1_1(1)
-		   + t2_2(1,1)*t1_2(1)*t2_3(1,1)*t1_1(1)
-		   + t2_2(2,1)*t1_2(1)*t2_3(1,2)*t1_1(1)
-		   + t2_2(0,2)*t1_2(1)*t2_3(2,0)*t1_1(1)
-		   + t2_2(1,2)*t1_2(1)*t2_3(2,1)*t1_1(1)
-		   + t2_2(2,2)*t1_2(1)*t2_3(2,2)*t1_1(1)
-		   + t2_2(0,0)*t1_2(2)*t2_3(0,0)*t1_1(2)
-		   + t2_2(1,0)*t1_2(2)*t2_3(0,1)*t1_1(2)
-		   + t2_2(2,0)*t1_2(2)*t2_3(0,2)*t1_1(2)
-		   + t2_2(0,1)*t1_2(2)*t2_3(1,0)*t1_1(2)
-		   + t2_2(1,1)*t1_2(2)*t2_3(1,1)*t1_1(2)
-		   + t2_2(2,1)*t1_2(2)*t2_3(1,2)*t1_1(2)
-		   + t2_2(0,2)*t1_2(2)*t2_3(2,0)*t1_1(2)
-		   + t2_2(1,2)*t1_2(2)*t2_3(2,1)*t1_1(2)
-		   + t2_2(2,2)*t1_2(2)*t2_3(2,2)*t1_1(2)),
-		"T3(i,j,k)*T3(j,i,k)");
-
-  test_for_zero((t2_2(i,j)*t1_2(k))*(t2_3(i,k)*t1_1(j))
-		- (t2_2(0,0)*t1_2(0)*t2_3(0,0)*t1_1(0)
-		   + t2_2(1,0)*t1_2(0)*t2_3(1,0)*t1_1(0)
-		   + t2_2(2,0)*t1_2(0)*t2_3(2,0)*t1_1(0)
-		   + t2_2(0,1)*t1_2(0)*t2_3(0,0)*t1_1(1)
-		   + t2_2(1,1)*t1_2(0)*t2_3(1,0)*t1_1(1)
-		   + t2_2(2,1)*t1_2(0)*t2_3(2,0)*t1_1(1)
-		   + t2_2(0,2)*t1_2(0)*t2_3(0,0)*t1_1(2)
-		   + t2_2(1,2)*t1_2(0)*t2_3(1,0)*t1_1(2)
-		   + t2_2(2,2)*t1_2(0)*t2_3(2,0)*t1_1(2)
-		   + t2_2(0,0)*t1_2(1)*t2_3(0,1)*t1_1(0)
-		   + t2_2(1,0)*t1_2(1)*t2_3(1,1)*t1_1(0)
-		   + t2_2(2,0)*t1_2(1)*t2_3(2,1)*t1_1(0)
-		   + t2_2(0,1)*t1_2(1)*t2_3(0,1)*t1_1(1)
-		   + t2_2(1,1)*t1_2(1)*t2_3(1,1)*t1_1(1)
-		   + t2_2(2,1)*t1_2(1)*t2_3(2,1)*t1_1(1)
-		   + t2_2(0,2)*t1_2(1)*t2_3(0,1)*t1_1(2)
-		   + t2_2(1,2)*t1_2(1)*t2_3(1,1)*t1_1(2)
-		   + t2_2(2,2)*t1_2(1)*t2_3(2,1)*t1_1(2)
-		   + t2_2(0,0)*t1_2(2)*t2_3(0,2)*t1_1(0)
-		   + t2_2(1,0)*t1_2(2)*t2_3(1,2)*t1_1(0)
-		   + t2_2(2,0)*t1_2(2)*t2_3(2,2)*t1_1(0)
-		   + t2_2(0,1)*t1_2(2)*t2_3(0,2)*t1_1(1)
-		   + t2_2(1,1)*t1_2(2)*t2_3(1,2)*t1_1(1)
-		   + t2_2(2,1)*t1_2(2)*t2_3(2,2)*t1_1(1)
-		   + t2_2(0,2)*t1_2(2)*t2_3(0,2)*t1_1(2)
-		   + t2_2(1,2)*t1_2(2)*t2_3(1,2)*t1_1(2)
-		   + t2_2(2,2)*t1_2(2)*t2_3(2,2)*t1_1(2)),
-		"T3(i,j,k)*T3(i,k,j)");
-
-  test_for_zero((t2_2(i,j)*t1_2(k))*(t2_3(j,k)*t1_1(i))
-		- (t2_2(0,0)*t1_2(0)*t2_3(0,0)*t1_1(0)
-		   + t2_2(1,0)*t1_2(0)*t2_3(0,0)*t1_1(1)
-		   + t2_2(2,0)*t1_2(0)*t2_3(0,0)*t1_1(2)
-		   + t2_2(0,1)*t1_2(0)*t2_3(1,0)*t1_1(0)
-		   + t2_2(1,1)*t1_2(0)*t2_3(1,0)*t1_1(1)
-		   + t2_2(2,1)*t1_2(0)*t2_3(1,0)*t1_1(2)
-		   + t2_2(0,2)*t1_2(0)*t2_3(2,0)*t1_1(0)
-		   + t2_2(1,2)*t1_2(0)*t2_3(2,0)*t1_1(1)
-		   + t2_2(2,2)*t1_2(0)*t2_3(2,0)*t1_1(2)
-		   + t2_2(0,0)*t1_2(1)*t2_3(0,1)*t1_1(0)
-		   + t2_2(1,0)*t1_2(1)*t2_3(0,1)*t1_1(1)
-		   + t2_2(2,0)*t1_2(1)*t2_3(0,1)*t1_1(2)
-		   + t2_2(0,1)*t1_2(1)*t2_3(1,1)*t1_1(0)
-		   + t2_2(1,1)*t1_2(1)*t2_3(1,1)*t1_1(1)
-		   + t2_2(2,1)*t1_2(1)*t2_3(1,1)*t1_1(2)
-		   + t2_2(0,2)*t1_2(1)*t2_3(2,1)*t1_1(0)
-		   + t2_2(1,2)*t1_2(1)*t2_3(2,1)*t1_1(1)
-		   + t2_2(2,2)*t1_2(1)*t2_3(2,1)*t1_1(2)
-		   + t2_2(0,0)*t1_2(2)*t2_3(0,2)*t1_1(0)
-		   + t2_2(1,0)*t1_2(2)*t2_3(0,2)*t1_1(1)
-		   + t2_2(2,0)*t1_2(2)*t2_3(0,2)*t1_1(2)
-		   + t2_2(0,1)*t1_2(2)*t2_3(1,2)*t1_1(0)
-		   + t2_2(1,1)*t1_2(2)*t2_3(1,2)*t1_1(1)
-		   + t2_2(2,1)*t1_2(2)*t2_3(1,2)*t1_1(2)
-		   + t2_2(0,2)*t1_2(2)*t2_3(2,2)*t1_1(0)
-		   + t2_2(1,2)*t1_2(2)*t2_3(2,2)*t1_1(1)
-		   + t2_2(2,2)*t1_2(2)*t2_3(2,2)*t1_1(2)),
-		"T3(i,j,k)*T3(j,k,i)");
-
-  test_for_zero((t2_2(i,j)*t1_2(k))*(t2_3(k,j)*t1_1(i))
-		- (t2_2(0,0)*t1_2(0)*t2_3(0,0)*t1_1(0)
-		   + t2_2(1,0)*t1_2(0)*t2_3(0,0)*t1_1(1)
-		   + t2_2(2,0)*t1_2(0)*t2_3(0,0)*t1_1(2)
-		   + t2_2(0,1)*t1_2(0)*t2_3(0,1)*t1_1(0)
-		   + t2_2(1,1)*t1_2(0)*t2_3(0,1)*t1_1(1)
-		   + t2_2(2,1)*t1_2(0)*t2_3(0,1)*t1_1(2)
-		   + t2_2(0,2)*t1_2(0)*t2_3(0,2)*t1_1(0)
-		   + t2_2(1,2)*t1_2(0)*t2_3(0,2)*t1_1(1)
-		   + t2_2(2,2)*t1_2(0)*t2_3(0,2)*t1_1(2)
-		   + t2_2(0,0)*t1_2(1)*t2_3(1,0)*t1_1(0)
-		   + t2_2(1,0)*t1_2(1)*t2_3(1,0)*t1_1(1)
-		   + t2_2(2,0)*t1_2(1)*t2_3(1,0)*t1_1(2)
-		   + t2_2(0,1)*t1_2(1)*t2_3(1,1)*t1_1(0)
-		   + t2_2(1,1)*t1_2(1)*t2_3(1,1)*t1_1(1)
-		   + t2_2(2,1)*t1_2(1)*t2_3(1,1)*t1_1(2)
-		   + t2_2(0,2)*t1_2(1)*t2_3(1,2)*t1_1(0)
-		   + t2_2(1,2)*t1_2(1)*t2_3(1,2)*t1_1(1)
-		   + t2_2(2,2)*t1_2(1)*t2_3(1,2)*t1_1(2)
-		   + t2_2(0,0)*t1_2(2)*t2_3(2,0)*t1_1(0)
-		   + t2_2(1,0)*t1_2(2)*t2_3(2,0)*t1_1(1)
-		   + t2_2(2,0)*t1_2(2)*t2_3(2,0)*t1_1(2)
-		   + t2_2(0,1)*t1_2(2)*t2_3(2,1)*t1_1(0)
-		   + t2_2(1,1)*t1_2(2)*t2_3(2,1)*t1_1(1)
-		   + t2_2(2,1)*t1_2(2)*t2_3(2,1)*t1_1(2)
-		   + t2_2(0,2)*t1_2(2)*t2_3(2,2)*t1_1(0)
-		   + t2_2(1,2)*t1_2(2)*t2_3(2,2)*t1_1(1)
-		   + t2_2(2,2)*t1_2(2)*t2_3(2,2)*t1_1(2)),
-		"T3(i,j,k)*T3(k,j,i)");
-
-  test_for_zero((t2_2(i,j)*t1_2(k))*(t2_3(k,i)*t1_1(j))
-		- (t2_2(0,0)*t1_2(0)*t2_3(0,0)*t1_1(0)
-		   + t2_2(1,0)*t1_2(0)*t2_3(0,1)*t1_1(0)
-		   + t2_2(2,0)*t1_2(0)*t2_3(0,2)*t1_1(0)
-		   + t2_2(0,1)*t1_2(0)*t2_3(0,0)*t1_1(1)
-		   + t2_2(1,1)*t1_2(0)*t2_3(0,1)*t1_1(1)
-		   + t2_2(2,1)*t1_2(0)*t2_3(0,2)*t1_1(1)
-		   + t2_2(0,2)*t1_2(0)*t2_3(0,0)*t1_1(2)
-		   + t2_2(1,2)*t1_2(0)*t2_3(0,1)*t1_1(2)
-		   + t2_2(2,2)*t1_2(0)*t2_3(0,2)*t1_1(2)
-		   + t2_2(0,0)*t1_2(1)*t2_3(1,0)*t1_1(0)
-		   + t2_2(1,0)*t1_2(1)*t2_3(1,1)*t1_1(0)
-		   + t2_2(2,0)*t1_2(1)*t2_3(1,2)*t1_1(0)
-		   + t2_2(0,1)*t1_2(1)*t2_3(1,0)*t1_1(1)
-		   + t2_2(1,1)*t1_2(1)*t2_3(1,1)*t1_1(1)
-		   + t2_2(2,1)*t1_2(1)*t2_3(1,2)*t1_1(1)
-		   + t2_2(0,2)*t1_2(1)*t2_3(1,0)*t1_1(2)
-		   + t2_2(1,2)*t1_2(1)*t2_3(1,1)*t1_1(2)
-		   + t2_2(2,2)*t1_2(1)*t2_3(1,2)*t1_1(2)
-		   + t2_2(0,0)*t1_2(2)*t2_3(2,0)*t1_1(0)
-		   + t2_2(1,0)*t1_2(2)*t2_3(2,1)*t1_1(0)
-		   + t2_2(2,0)*t1_2(2)*t2_3(2,2)*t1_1(0)
-		   + t2_2(0,1)*t1_2(2)*t2_3(2,0)*t1_1(1)
-		   + t2_2(1,1)*t1_2(2)*t2_3(2,1)*t1_1(1)
-		   + t2_2(2,1)*t1_2(2)*t2_3(2,2)*t1_1(1)
-		   + t2_2(0,2)*t1_2(2)*t2_3(2,0)*t1_1(2)
-		   + t2_2(1,2)*t1_2(2)*t2_3(2,1)*t1_1(2)
-		   + t2_2(2,2)*t1_2(2)*t2_3(2,2)*t1_1(2)),
-		"T3(i,j,k)*T3(k,i,j)");
-
-
-
-
-
-
-  test_for_zero((t2_2(i,j)*t1_2(k))*(t3dg_2(i,j,k))
-		- (t2_2(0,0)*t1_2(0)*t3dg_2(0,0,0)
-		   + t2_2(1,0)*t1_2(0)*t3dg_2(1,0,0)
-		   + t2_2(2,0)*t1_2(0)*t3dg_2(2,0,0)
-		   + t2_2(0,1)*t1_2(0)*t3dg_2(0,1,0)
-		   + t2_2(1,1)*t1_2(0)*t3dg_2(1,1,0)
-		   + t2_2(2,1)*t1_2(0)*t3dg_2(2,1,0)
-		   + t2_2(0,2)*t1_2(0)*t3dg_2(0,2,0)
-		   + t2_2(1,2)*t1_2(0)*t3dg_2(1,2,0)
-		   + t2_2(2,2)*t1_2(0)*t3dg_2(2,2,0)
-		   + t2_2(0,0)*t1_2(1)*t3dg_2(0,0,1)
-		   + t2_2(1,0)*t1_2(1)*t3dg_2(1,0,1)
-		   + t2_2(2,0)*t1_2(1)*t3dg_2(2,0,1)
-		   + t2_2(0,1)*t1_2(1)*t3dg_2(0,1,1)
-		   + t2_2(1,1)*t1_2(1)*t3dg_2(1,1,1)
-		   + t2_2(2,1)*t1_2(1)*t3dg_2(2,1,1)
-		   + t2_2(0,2)*t1_2(1)*t3dg_2(0,2,1)
-		   + t2_2(1,2)*t1_2(1)*t3dg_2(1,2,1)
-		   + t2_2(2,2)*t1_2(1)*t3dg_2(2,2,1)
-		   + t2_2(0,0)*t1_2(2)*t3dg_2(0,0,2)
-		   + t2_2(1,0)*t1_2(2)*t3dg_2(1,0,2)
-		   + t2_2(2,0)*t1_2(2)*t3dg_2(2,0,2)
-		   + t2_2(0,1)*t1_2(2)*t3dg_2(0,1,2)
-		   + t2_2(1,1)*t1_2(2)*t3dg_2(1,1,2)
-		   + t2_2(2,1)*t1_2(2)*t3dg_2(2,1,2)
-		   + t2_2(0,2)*t1_2(2)*t3dg_2(0,2,2)
-		   + t2_2(1,2)*t1_2(2)*t3dg_2(1,2,2)
-		   + t2_2(2,2)*t1_2(2)*t3dg_2(2,2,2)),
-		"T3(i,j,k)*T3dg(i,j,k)");
-
-  test_for_zero((t2_2(i,j)*t1_2(k))*(t3dg_2(j,i,k))
-		- (t2_2(0,0)*t1_2(0)*t3dg_2(0,0,0)
-		   + t2_2(1,0)*t1_2(0)*t3dg_2(0,1,0)
-		   + t2_2(2,0)*t1_2(0)*t3dg_2(0,2,0)
-		   + t2_2(0,1)*t1_2(0)*t3dg_2(1,0,0)
-		   + t2_2(1,1)*t1_2(0)*t3dg_2(1,1,0)
-		   + t2_2(2,1)*t1_2(0)*t3dg_2(1,2,0)
-		   + t2_2(0,2)*t1_2(0)*t3dg_2(2,0,0)
-		   + t2_2(1,2)*t1_2(0)*t3dg_2(2,1,0)
-		   + t2_2(2,2)*t1_2(0)*t3dg_2(2,2,0)
-		   + t2_2(0,0)*t1_2(1)*t3dg_2(0,0,1)
-		   + t2_2(1,0)*t1_2(1)*t3dg_2(0,1,1)
-		   + t2_2(2,0)*t1_2(1)*t3dg_2(0,2,1)
-		   + t2_2(0,1)*t1_2(1)*t3dg_2(1,0,1)
-		   + t2_2(1,1)*t1_2(1)*t3dg_2(1,1,1)
-		   + t2_2(2,1)*t1_2(1)*t3dg_2(1,2,1)
-		   + t2_2(0,2)*t1_2(1)*t3dg_2(2,0,1)
-		   + t2_2(1,2)*t1_2(1)*t3dg_2(2,1,1)
-		   + t2_2(2,2)*t1_2(1)*t3dg_2(2,2,1)
-		   + t2_2(0,0)*t1_2(2)*t3dg_2(0,0,2)
-		   + t2_2(1,0)*t1_2(2)*t3dg_2(0,1,2)
-		   + t2_2(2,0)*t1_2(2)*t3dg_2(0,2,2)
-		   + t2_2(0,1)*t1_2(2)*t3dg_2(1,0,2)
-		   + t2_2(1,1)*t1_2(2)*t3dg_2(1,1,2)
-		   + t2_2(2,1)*t1_2(2)*t3dg_2(1,2,2)
-		   + t2_2(0,2)*t1_2(2)*t3dg_2(2,0,2)
-		   + t2_2(1,2)*t1_2(2)*t3dg_2(2,1,2)
-		   + t2_2(2,2)*t1_2(2)*t3dg_2(2,2,2)),
-		"T3(i,j,k)*T3dg(j,i,k)");
-
-  test_for_zero((t2_2(i,j)*t1_2(k))*(t3dg_2(i,k,j))
-		- (t2_2(0,0)*t1_2(0)*t3dg_2(0,0,0)
-		   + t2_2(1,0)*t1_2(0)*t3dg_2(1,0,0)
-		   + t2_2(2,0)*t1_2(0)*t3dg_2(2,0,0)
-		   + t2_2(0,1)*t1_2(0)*t3dg_2(0,0,1)
-		   + t2_2(1,1)*t1_2(0)*t3dg_2(1,0,1)
-		   + t2_2(2,1)*t1_2(0)*t3dg_2(2,0,1)
-		   + t2_2(0,2)*t1_2(0)*t3dg_2(0,0,2)
-		   + t2_2(1,2)*t1_2(0)*t3dg_2(1,0,2)
-		   + t2_2(2,2)*t1_2(0)*t3dg_2(2,0,2)
-		   + t2_2(0,0)*t1_2(1)*t3dg_2(0,1,0)
-		   + t2_2(1,0)*t1_2(1)*t3dg_2(1,1,0)
-		   + t2_2(2,0)*t1_2(1)*t3dg_2(2,1,0)
-		   + t2_2(0,1)*t1_2(1)*t3dg_2(0,1,1)
-		   + t2_2(1,1)*t1_2(1)*t3dg_2(1,1,1)
-		   + t2_2(2,1)*t1_2(1)*t3dg_2(2,1,1)
-		   + t2_2(0,2)*t1_2(1)*t3dg_2(0,1,2)
-		   + t2_2(1,2)*t1_2(1)*t3dg_2(1,1,2)
-		   + t2_2(2,2)*t1_2(1)*t3dg_2(2,1,2)
-		   + t2_2(0,0)*t1_2(2)*t3dg_2(0,2,0)
-		   + t2_2(1,0)*t1_2(2)*t3dg_2(1,2,0)
-		   + t2_2(2,0)*t1_2(2)*t3dg_2(2,2,0)
-		   + t2_2(0,1)*t1_2(2)*t3dg_2(0,2,1)
-		   + t2_2(1,1)*t1_2(2)*t3dg_2(1,2,1)
-		   + t2_2(2,1)*t1_2(2)*t3dg_2(2,2,1)
-		   + t2_2(0,2)*t1_2(2)*t3dg_2(0,2,2)
-		   + t2_2(1,2)*t1_2(2)*t3dg_2(1,2,2)
-		   + t2_2(2,2)*t1_2(2)*t3dg_2(2,2,2)),
-		"T3(i,j,k)*T3dg(i,k,j)");
-
-  test_for_zero((t2_2(i,j)*t1_2(k))*(t3dg_2(j,k,i))
-		- (t2_2(0,0)*t1_2(0)*t3dg_2(0,0,0)
-		   + t2_2(1,0)*t1_2(0)*t3dg_2(0,0,1)
-		   + t2_2(2,0)*t1_2(0)*t3dg_2(0,0,2)
-		   + t2_2(0,1)*t1_2(0)*t3dg_2(1,0,0)
-		   + t2_2(1,1)*t1_2(0)*t3dg_2(1,0,1)
-		   + t2_2(2,1)*t1_2(0)*t3dg_2(1,0,2)
-		   + t2_2(0,2)*t1_2(0)*t3dg_2(2,0,0)
-		   + t2_2(1,2)*t1_2(0)*t3dg_2(2,0,1)
-		   + t2_2(2,2)*t1_2(0)*t3dg_2(2,0,2)
-		   + t2_2(0,0)*t1_2(1)*t3dg_2(0,1,0)
-		   + t2_2(1,0)*t1_2(1)*t3dg_2(0,1,1)
-		   + t2_2(2,0)*t1_2(1)*t3dg_2(0,1,2)
-		   + t2_2(0,1)*t1_2(1)*t3dg_2(1,1,0)
-		   + t2_2(1,1)*t1_2(1)*t3dg_2(1,1,1)
-		   + t2_2(2,1)*t1_2(1)*t3dg_2(1,1,2)
-		   + t2_2(0,2)*t1_2(1)*t3dg_2(2,1,0)
-		   + t2_2(1,2)*t1_2(1)*t3dg_2(2,1,1)
-		   + t2_2(2,2)*t1_2(1)*t3dg_2(2,1,2)
-		   + t2_2(0,0)*t1_2(2)*t3dg_2(0,2,0)
-		   + t2_2(1,0)*t1_2(2)*t3dg_2(0,2,1)
-		   + t2_2(2,0)*t1_2(2)*t3dg_2(0,2,2)
-		   + t2_2(0,1)*t1_2(2)*t3dg_2(1,2,0)
-		   + t2_2(1,1)*t1_2(2)*t3dg_2(1,2,1)
-		   + t2_2(2,1)*t1_2(2)*t3dg_2(1,2,2)
-		   + t2_2(0,2)*t1_2(2)*t3dg_2(2,2,0)
-		   + t2_2(1,2)*t1_2(2)*t3dg_2(2,2,1)
-		   + t2_2(2,2)*t1_2(2)*t3dg_2(2,2,2)),
-		"T3(i,j,k)*T3dg(j,k,i)");
-
-  test_for_zero((t2_2(i,j)*t1_2(k))*(t3dg_2(k,j,i))
-		- (t2_2(0,0)*t1_2(0)*t3dg_2(0,0,0)
-		   + t2_2(1,0)*t1_2(0)*t3dg_2(0,0,1)
-		   + t2_2(2,0)*t1_2(0)*t3dg_2(0,0,2)
-		   + t2_2(0,1)*t1_2(0)*t3dg_2(0,1,0)
-		   + t2_2(1,1)*t1_2(0)*t3dg_2(0,1,1)
-		   + t2_2(2,1)*t1_2(0)*t3dg_2(0,1,2)
-		   + t2_2(0,2)*t1_2(0)*t3dg_2(0,2,0)
-		   + t2_2(1,2)*t1_2(0)*t3dg_2(0,2,1)
-		   + t2_2(2,2)*t1_2(0)*t3dg_2(0,2,2)
-		   + t2_2(0,0)*t1_2(1)*t3dg_2(1,0,0)
-		   + t2_2(1,0)*t1_2(1)*t3dg_2(1,0,1)
-		   + t2_2(2,0)*t1_2(1)*t3dg_2(1,0,2)
-		   + t2_2(0,1)*t1_2(1)*t3dg_2(1,1,0)
-		   + t2_2(1,1)*t1_2(1)*t3dg_2(1,1,1)
-		   + t2_2(2,1)*t1_2(1)*t3dg_2(1,1,2)
-		   + t2_2(0,2)*t1_2(1)*t3dg_2(1,2,0)
-		   + t2_2(1,2)*t1_2(1)*t3dg_2(1,2,1)
-		   + t2_2(2,2)*t1_2(1)*t3dg_2(1,2,2)
-		   + t2_2(0,0)*t1_2(2)*t3dg_2(2,0,0)
-		   + t2_2(1,0)*t1_2(2)*t3dg_2(2,0,1)
-		   + t2_2(2,0)*t1_2(2)*t3dg_2(2,0,2)
-		   + t2_2(0,1)*t1_2(2)*t3dg_2(2,1,0)
-		   + t2_2(1,1)*t1_2(2)*t3dg_2(2,1,1)
-		   + t2_2(2,1)*t1_2(2)*t3dg_2(2,1,2)
-		   + t2_2(0,2)*t1_2(2)*t3dg_2(2,2,0)
-		   + t2_2(1,2)*t1_2(2)*t3dg_2(2,2,1)
-		   + t2_2(2,2)*t1_2(2)*t3dg_2(2,2,2)),
-		"T3(i,j,k)*T3dg(k,j,i)");
-
-  test_for_zero((t2_2(i,j)*t1_2(k))*(t3dg_2(k,i,j))
-		- (t2_2(0,0)*t1_2(0)*t3dg_2(0,0,0)
-		   + t2_2(1,0)*t1_2(0)*t3dg_2(0,1,0)
-		   + t2_2(2,0)*t1_2(0)*t3dg_2(0,2,0)
-		   + t2_2(0,1)*t1_2(0)*t3dg_2(0,0,1)
-		   + t2_2(1,1)*t1_2(0)*t3dg_2(0,1,1)
-		   + t2_2(2,1)*t1_2(0)*t3dg_2(0,2,1)
-		   + t2_2(0,2)*t1_2(0)*t3dg_2(0,0,2)
-		   + t2_2(1,2)*t1_2(0)*t3dg_2(0,1,2)
-		   + t2_2(2,2)*t1_2(0)*t3dg_2(0,2,2)
-		   + t2_2(0,0)*t1_2(1)*t3dg_2(1,0,0)
-		   + t2_2(1,0)*t1_2(1)*t3dg_2(1,1,0)
-		   + t2_2(2,0)*t1_2(1)*t3dg_2(1,2,0)
-		   + t2_2(0,1)*t1_2(1)*t3dg_2(1,0,1)
-		   + t2_2(1,1)*t1_2(1)*t3dg_2(1,1,1)
-		   + t2_2(2,1)*t1_2(1)*t3dg_2(1,2,1)
-		   + t2_2(0,2)*t1_2(1)*t3dg_2(1,0,2)
-		   + t2_2(1,2)*t1_2(1)*t3dg_2(1,1,2)
-		   + t2_2(2,2)*t1_2(1)*t3dg_2(1,2,2)
-		   + t2_2(0,0)*t1_2(2)*t3dg_2(2,0,0)
-		   + t2_2(1,0)*t1_2(2)*t3dg_2(2,1,0)
-		   + t2_2(2,0)*t1_2(2)*t3dg_2(2,2,0)
-		   + t2_2(0,1)*t1_2(2)*t3dg_2(2,0,1)
-		   + t2_2(1,1)*t1_2(2)*t3dg_2(2,1,1)
-		   + t2_2(2,1)*t1_2(2)*t3dg_2(2,2,1)
-		   + t2_2(0,2)*t1_2(2)*t3dg_2(2,0,2)
-		   + t2_2(1,2)*t1_2(2)*t3dg_2(2,1,2)
-		   + t2_2(2,2)*t1_2(2)*t3dg_2(2,2,2)),
-		"T3(i,j,k)*T3dg(k,i,j)");
-
-  cout << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3/test_T3.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3/test_T3.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,1064 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3 tests */
+
+
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(0,0,0) - t2_2(0,0)*t1_2(0)*10,
+		"T3*T(0,0,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(0,0,1) - t2_2(0,0)*t1_2(1)*10,
+		"T3*T(0,0,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(0,0,2) - t2_2(0,0)*t1_2(2)*10,
+		"T3*T(0,0,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(0,1,0) - t2_2(0,1)*t1_2(0)*10,
+		"T3*T(0,1,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(0,1,1) - t2_2(0,1)*t1_2(1)*10,
+		"T3*T(0,1,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(0,1,2) - t2_2(0,1)*t1_2(2)*10,
+		"T3*T(0,1,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(0,2,0) - t2_2(0,2)*t1_2(0)*10,
+		"T3*T(0,2,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(0,2,1) - t2_2(0,2)*t1_2(1)*10,
+		"T3*T(0,2,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(0,2,2) - t2_2(0,2)*t1_2(2)*10,
+		"T3*T(0,2,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(1,0,0) - t2_2(1,0)*t1_2(0)*10,
+		"T3*T(1,0,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(1,0,1) - t2_2(1,0)*t1_2(1)*10,
+		"T3*T(1,0,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(1,0,2) - t2_2(1,0)*t1_2(2)*10,
+		"T3*T(1,0,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(1,1,0) - t2_2(1,1)*t1_2(0)*10,
+		"T3*T(1,1,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(1,1,1) - t2_2(1,1)*t1_2(1)*10,
+		"T3*T(1,1,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(1,1,2) - t2_2(1,1)*t1_2(2)*10,
+		"T3*T(1,1,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(1,2,0) - t2_2(1,2)*t1_2(0)*10,
+		"T3*T(1,2,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(1,2,1) - t2_2(1,2)*t1_2(1)*10,
+		"T3*T(1,2,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(1,2,2) - t2_2(1,2)*t1_2(2)*10,
+		"T3*T(1,2,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(2,0,0) - t2_2(2,0)*t1_2(0)*10,
+		"T3*T(2,0,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(2,0,1) - t2_2(2,0)*t1_2(1)*10,
+		"T3*T(2,0,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(2,0,2) - t2_2(2,0)*t1_2(2)*10,
+		"T3*T(2,0,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(2,1,0) - t2_2(2,1)*t1_2(0)*10,
+		"T3*T(2,1,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(2,1,1) - t2_2(2,1)*t1_2(1)*10,
+		"T3*T(2,1,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(2,1,2) - t2_2(2,1)*t1_2(2)*10,
+		"T3*T(2,1,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(2,2,0) - t2_2(2,2)*t1_2(0)*10,
+		"T3*T(2,2,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(2,2,1) - t2_2(2,2)*t1_2(1)*10,
+		"T3*T(2,2,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*10)(2,2,2) - t2_2(2,2)*t1_2(2)*10,
+		"T3*T(2,2,2)");
+  
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(0,0,0) - t2_2(0,0)*t1_2(0)*10,
+		"T*T3(0,0,0)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(0,0,1) - t2_2(0,0)*t1_2(1)*10,
+		"T*T3(0,0,1)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(0,0,2) - t2_2(0,0)*t1_2(2)*10,
+		"T*T3(0,0,2)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(0,1,0) - t2_2(0,1)*t1_2(0)*10,
+		"T*T3(0,1,0)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(0,1,1) - t2_2(0,1)*t1_2(1)*10,
+		"T*T3(0,1,1)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(0,1,2) - t2_2(0,1)*t1_2(2)*10,
+		"T*T3(0,1,2)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(0,2,0) - t2_2(0,2)*t1_2(0)*10,
+		"T*T3(0,2,0)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(0,2,1) - t2_2(0,2)*t1_2(1)*10,
+		"T*T3(0,2,1)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(0,2,2) - t2_2(0,2)*t1_2(2)*10,
+		"T*T3(0,2,2)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(1,0,0) - t2_2(1,0)*t1_2(0)*10,
+		"T*T3(1,0,0)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(1,0,1) - t2_2(1,0)*t1_2(1)*10,
+		"T*T3(1,0,1)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(1,0,2) - t2_2(1,0)*t1_2(2)*10,
+		"T*T3(1,0,2)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(1,1,0) - t2_2(1,1)*t1_2(0)*10,
+		"T*T3(1,1,0)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(1,1,1) - t2_2(1,1)*t1_2(1)*10,
+		"T*T3(1,1,1)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(1,1,2) - t2_2(1,1)*t1_2(2)*10,
+		"T*T3(1,1,2)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(1,2,0) - t2_2(1,2)*t1_2(0)*10,
+		"T*T3(1,2,0)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(1,2,1) - t2_2(1,2)*t1_2(1)*10,
+		"T*T3(1,2,1)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(1,2,2) - t2_2(1,2)*t1_2(2)*10,
+		"T*T3(1,2,2)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(2,0,0) - t2_2(2,0)*t1_2(0)*10,
+		"T*T3(2,0,0)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(2,0,1) - t2_2(2,0)*t1_2(1)*10,
+		"T*T3(2,0,1)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(2,0,2) - t2_2(2,0)*t1_2(2)*10,
+		"T*T3(2,0,2)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(2,1,0) - t2_2(2,1)*t1_2(0)*10,
+		"T*T3(2,1,0)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(2,1,1) - t2_2(2,1)*t1_2(1)*10,
+		"T*T3(2,1,1)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(2,1,2) - t2_2(2,1)*t1_2(2)*10,
+		"T*T3(2,1,2)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(2,2,0) - t2_2(2,2)*t1_2(0)*10,
+		"T*T3(2,2,0)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(2,2,1) - t2_2(2,2)*t1_2(1)*10,
+		"T*T3(2,2,1)");
+  test_for_zero((10*(t2_2(i,j)*t1_2(k)))(2,2,2) - t2_2(2,2)*t1_2(2)*10,
+		"T*T3(2,2,2)");
+
+  
+  t2_1(i,k)=(t2_2(i,j)*t1_2(k))*t1_1(j);
+  
+  test_for_zero(t2_1(0,0) - (t2_2(0,0)*t1_2(0)*t1_1(0)
+			     + t2_2(0,1)*t1_2(0)*t1_1(1)
+			     + t2_2(0,2)*t1_2(0)*t1_1(2)),
+		"T3(i,j,k)*T1(j)(0,0)");
+  test_for_zero(t2_1(0,1) - (t2_2(0,0)*t1_2(1)*t1_1(0)
+			     + t2_2(0,1)*t1_2(1)*t1_1(1)
+			     + t2_2(0,2)*t1_2(1)*t1_1(2)),
+		"T3(i,j,k)*T1(j)(0,1)");
+  test_for_zero(t2_1(0,2) - (t2_2(0,0)*t1_2(2)*t1_1(0)
+			     + t2_2(0,1)*t1_2(2)*t1_1(1)
+			     + t2_2(0,2)*t1_2(2)*t1_1(2)),
+		"T3(i,j,k)*T1(j)(0,2)");
+  test_for_zero(t2_1(1,0) - (t2_2(1,0)*t1_2(0)*t1_1(0)
+			     + t2_2(1,1)*t1_2(0)*t1_1(1)
+			     + t2_2(1,2)*t1_2(0)*t1_1(2)),
+		"T3(i,j,k)*T1(j)(1,0)");
+  test_for_zero(t2_1(1,1) - (t2_2(1,0)*t1_2(1)*t1_1(0)
+			     + t2_2(1,1)*t1_2(1)*t1_1(1)
+			     + t2_2(1,2)*t1_2(1)*t1_1(2)),
+		"T3(i,j,k)*T1(j)(1,1)");
+  test_for_zero(t2_1(1,2) - (t2_2(1,0)*t1_2(2)*t1_1(0)
+			     + t2_2(1,1)*t1_2(2)*t1_1(1)
+			     + t2_2(1,2)*t1_2(2)*t1_1(2)),
+		"T3(i,j,k)*T1(j)(1,2)");
+  test_for_zero(t2_1(2,0) - (t2_2(2,0)*t1_2(0)*t1_1(0)
+			     + t2_2(2,1)*t1_2(0)*t1_1(1)
+			     + t2_2(2,2)*t1_2(0)*t1_1(2)),
+		"T3(i,j,k)*T1(j)(2,0)");
+  test_for_zero(t2_1(2,1) - (t2_2(2,0)*t1_2(1)*t1_1(0)
+			     + t2_2(2,1)*t1_2(1)*t1_1(1)
+			     + t2_2(2,2)*t1_2(1)*t1_1(2)),
+		"T3(i,j,k)*T1(j)(2,1)");
+  test_for_zero(t2_1(2,2) - (t2_2(2,0)*t1_2(2)*t1_1(0)
+			     + t2_2(2,1)*t1_2(2)*t1_1(1)
+			     + t2_2(2,2)*t1_2(2)*t1_1(2)),
+		"T3(i,j,k)*T1(j)(2,2)");
+  
+  t2_1(i,k)=t1_2(j)*(t2_2(i,j)*t1_1(k));
+  
+  test_for_zero(t2_1(0,0) - (t2_2(0,0)*t1_1(0)*t1_2(0)
+			     + t2_2(0,1)*t1_1(0)*t1_2(1)
+			     + t2_2(0,2)*t1_1(0)*t1_2(2)),
+		"T1(j)*T3(i,j,k)(0,0)");
+  test_for_zero(t2_1(0,1) - (t2_2(0,0)*t1_1(1)*t1_2(0)
+			     + t2_2(0,1)*t1_1(1)*t1_2(1)
+			     + t2_2(0,2)*t1_1(1)*t1_2(2)),
+		"T1(j)*T3(i,j,k)(0,1)");
+  test_for_zero(t2_1(0,2) - (t2_2(0,0)*t1_1(2)*t1_2(0)
+			     + t2_2(0,1)*t1_1(2)*t1_2(1)
+			     + t2_2(0,2)*t1_1(2)*t1_2(2)),
+		"T1(j)*T3(i,j,k)(0,2)");
+  test_for_zero(t2_1(1,0) - (t2_2(1,0)*t1_1(0)*t1_2(0)
+			     + t2_2(1,1)*t1_1(0)*t1_2(1)
+			     + t2_2(1,2)*t1_1(0)*t1_2(2)),
+		"T1(j)*T3(i,j,k)(1,0)");
+  test_for_zero(t2_1(1,1) - (t2_2(1,0)*t1_1(1)*t1_2(0)
+			     + t2_2(1,1)*t1_1(1)*t1_2(1)
+			     + t2_2(1,2)*t1_1(1)*t1_2(2)),
+		"T1(j)*T3(i,j,k)(1,1)");
+  test_for_zero(t2_1(1,2) - (t2_2(1,0)*t1_1(2)*t1_2(0)
+			     + t2_2(1,1)*t1_1(2)*t1_2(1)
+			     + t2_2(1,2)*t1_1(2)*t1_2(2)),
+		"T1(j)*T3(i,j,k)(1,2)");
+  test_for_zero(t2_1(2,0) - (t2_2(2,0)*t1_1(0)*t1_2(0)
+			     + t2_2(2,1)*t1_1(0)*t1_2(1)
+			     + t2_2(2,2)*t1_1(0)*t1_2(2)),
+		"T1(j)*T3(i,j,k)(2,0)");
+  test_for_zero(t2_1(2,1) - (t2_2(2,0)*t1_1(1)*t1_2(0)
+			     + t2_2(2,1)*t1_1(1)*t1_2(1)
+			     + t2_2(2,2)*t1_1(1)*t1_2(2)),
+		"T1(j)*T3(i,j,k)(2,1)");
+  test_for_zero(t2_1(2,2) - (t2_2(2,0)*t1_1(2)*t1_2(0)
+			     + t2_2(2,1)*t1_1(2)*t1_2(1)
+			     + t2_2(2,2)*t1_1(2)*t1_2(2)),
+		"T1(j)*T3(i,j,k)(2,2)");
+
+  t1_1(i)=(t2_2(i,j)*t1_2(k))*t2s_2(j,k);
+  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2s_2(0,0)
+			   + t2_2(0,0)*t1_2(1)*t2s_2(0,1)
+			   + t2_2(0,0)*t1_2(2)*t2s_2(0,2)
+			   + t2_2(0,1)*t1_2(0)*t2s_2(1,0)
+			   + t2_2(0,1)*t1_2(1)*t2s_2(1,1)
+			   + t2_2(0,1)*t1_2(2)*t2s_2(1,2)
+			   + t2_2(0,2)*t1_2(0)*t2s_2(2,0)
+			   + t2_2(0,2)*t1_2(1)*t2s_2(2,1)
+			   + t2_2(0,2)*t1_2(2)*t2s_2(2,2)),
+		"T3(i,j,k)*T2s(j,k)(0)");
+  test_for_zero(t1_1(1) - (t2_2(1,0)*t1_2(0)*t2s_2(0,0)
+			   + t2_2(1,0)*t1_2(1)*t2s_2(0,1)
+			   + t2_2(1,0)*t1_2(2)*t2s_2(0,2)
+			   + t2_2(1,1)*t1_2(0)*t2s_2(1,0)
+			   + t2_2(1,1)*t1_2(1)*t2s_2(1,1)
+			   + t2_2(1,1)*t1_2(2)*t2s_2(1,2)
+			   + t2_2(1,2)*t1_2(0)*t2s_2(2,0)
+			   + t2_2(1,2)*t1_2(1)*t2s_2(2,1)
+			   + t2_2(1,2)*t1_2(2)*t2s_2(2,2)),
+		"T3(i,j,k)*T2s(j,k)(1)");
+  test_for_zero(t1_1(2) - (t2_2(2,0)*t1_2(0)*t2s_2(0,0)
+			   + t2_2(2,0)*t1_2(1)*t2s_2(0,1)
+			   + t2_2(2,0)*t1_2(2)*t2s_2(0,2)
+			   + t2_2(2,1)*t1_2(0)*t2s_2(1,0)
+			   + t2_2(2,1)*t1_2(1)*t2s_2(1,1)
+			   + t2_2(2,1)*t1_2(2)*t2s_2(1,2)
+			   + t2_2(2,2)*t1_2(0)*t2s_2(2,0)
+			   + t2_2(2,2)*t1_2(1)*t2s_2(2,1)
+			   + t2_2(2,2)*t1_2(2)*t2s_2(2,2)),
+		"T3(i,j,k)*T2s(j,k)(2)");
+
+  t1_1(i)=t2s_3(j,k)*(t2_2(i,j)*t1_2(k));
+  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2s_3(0,0)
+			   + t2_2(0,0)*t1_2(1)*t2s_3(0,1)
+			   + t2_2(0,0)*t1_2(2)*t2s_3(0,2)
+			   + t2_2(0,1)*t1_2(0)*t2s_3(1,0)
+			   + t2_2(0,1)*t1_2(1)*t2s_3(1,1)
+			   + t2_2(0,1)*t1_2(2)*t2s_3(1,2)
+			   + t2_2(0,2)*t1_2(0)*t2s_3(2,0)
+			   + t2_2(0,2)*t1_2(1)*t2s_3(2,1)
+			   + t2_2(0,2)*t1_2(2)*t2s_3(2,2)),
+		"T2s(j,k)*T3(i,j,k)(0)");
+  test_for_zero(t1_1(1) - (t2_2(1,0)*t1_2(0)*t2s_3(0,0)
+			   + t2_2(1,0)*t1_2(1)*t2s_3(0,1)
+			   + t2_2(1,0)*t1_2(2)*t2s_3(0,2)
+			   + t2_2(1,1)*t1_2(0)*t2s_3(1,0)
+			   + t2_2(1,1)*t1_2(1)*t2s_3(1,1)
+			   + t2_2(1,1)*t1_2(2)*t2s_3(1,2)
+			   + t2_2(1,2)*t1_2(0)*t2s_3(2,0)
+			   + t2_2(1,2)*t1_2(1)*t2s_3(2,1)
+			   + t2_2(1,2)*t1_2(2)*t2s_3(2,2)),
+		"T2s(j,k)*T3(i,j,k)(1)");
+  test_for_zero(t1_1(2) - (t2_2(2,0)*t1_2(0)*t2s_3(0,0)
+			   + t2_2(2,0)*t1_2(1)*t2s_3(0,1)
+			   + t2_2(2,0)*t1_2(2)*t2s_3(0,2)
+			   + t2_2(2,1)*t1_2(0)*t2s_3(1,0)
+			   + t2_2(2,1)*t1_2(1)*t2s_3(1,1)
+			   + t2_2(2,1)*t1_2(2)*t2s_3(1,2)
+			   + t2_2(2,2)*t1_2(0)*t2s_3(2,0)
+			   + t2_2(2,2)*t1_2(1)*t2s_3(2,1)
+			   + t2_2(2,2)*t1_2(2)*t2s_3(2,2)),
+		"T2s(j,k)*T3(i,j,k)(2)");
+
+
+  t1_1(i)=(t2_2(j,i)*t1_2(k))*t2s_2(j,k);
+  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2s_2(0,0)
+			   + t2_2(0,0)*t1_2(1)*t2s_2(0,1)
+			   + t2_2(0,0)*t1_2(2)*t2s_2(0,2)
+			   + t2_2(1,0)*t1_2(0)*t2s_2(1,0)
+			   + t2_2(1,0)*t1_2(1)*t2s_2(1,1)
+			   + t2_2(1,0)*t1_2(2)*t2s_2(1,2)
+			   + t2_2(2,0)*t1_2(0)*t2s_2(2,0)
+			   + t2_2(2,0)*t1_2(1)*t2s_2(2,1)
+			   + t2_2(2,0)*t1_2(2)*t2s_2(2,2)),
+		"T3(j,i,k)*T2s(j,k)(0)");
+  test_for_zero(t1_1(1) - (t2_2(0,1)*t1_2(0)*t2s_2(0,0)
+			   + t2_2(0,1)*t1_2(1)*t2s_2(0,1)
+			   + t2_2(0,1)*t1_2(2)*t2s_2(0,2)
+			   + t2_2(1,1)*t1_2(0)*t2s_2(1,0)
+			   + t2_2(1,1)*t1_2(1)*t2s_2(1,1)
+			   + t2_2(1,1)*t1_2(2)*t2s_2(1,2)
+			   + t2_2(2,1)*t1_2(0)*t2s_2(2,0)
+			   + t2_2(2,1)*t1_2(1)*t2s_2(2,1)
+			   + t2_2(2,1)*t1_2(2)*t2s_2(2,2)),
+		"T3(j,i,k)*T2s(j,k)(1)");
+  test_for_zero(t1_1(2) - (t2_2(0,2)*t1_2(0)*t2s_2(0,0)
+			   + t2_2(0,2)*t1_2(1)*t2s_2(0,1)
+			   + t2_2(0,2)*t1_2(2)*t2s_2(0,2)
+			   + t2_2(1,2)*t1_2(0)*t2s_2(1,0)
+			   + t2_2(1,2)*t1_2(1)*t2s_2(1,1)
+			   + t2_2(1,2)*t1_2(2)*t2s_2(1,2)
+			   + t2_2(2,2)*t1_2(0)*t2s_2(2,0)
+			   + t2_2(2,2)*t1_2(1)*t2s_2(2,1)
+			   + t2_2(2,2)*t1_2(2)*t2s_2(2,2)),
+		"T3(j,i,k)*T2s(j,k)(2)");
+
+  t1_1(i)=t2s_3(j,k)*(t2_2(j,i)*t1_2(k));
+  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2s_3(0,0)
+			   + t2_2(0,0)*t1_2(1)*t2s_3(0,1)
+			   + t2_2(0,0)*t1_2(2)*t2s_3(0,2)
+			   + t2_2(1,0)*t1_2(0)*t2s_3(1,0)
+			   + t2_2(1,0)*t1_2(1)*t2s_3(1,1)
+			   + t2_2(1,0)*t1_2(2)*t2s_3(1,2)
+			   + t2_2(2,0)*t1_2(0)*t2s_3(2,0)
+			   + t2_2(2,0)*t1_2(1)*t2s_3(2,1)
+			   + t2_2(2,0)*t1_2(2)*t2s_3(2,2)),
+		"T2s(j,k)*T3(j,i,k)(0)");
+  test_for_zero(t1_1(1) - (t2_2(0,1)*t1_2(0)*t2s_3(0,0)
+			   + t2_2(0,1)*t1_2(1)*t2s_3(0,1)
+			   + t2_2(0,1)*t1_2(2)*t2s_3(0,2)
+			   + t2_2(1,1)*t1_2(0)*t2s_3(1,0)
+			   + t2_2(1,1)*t1_2(1)*t2s_3(1,1)
+			   + t2_2(1,1)*t1_2(2)*t2s_3(1,2)
+			   + t2_2(2,1)*t1_2(0)*t2s_3(2,0)
+			   + t2_2(2,1)*t1_2(1)*t2s_3(2,1)
+			   + t2_2(2,1)*t1_2(2)*t2s_3(2,2)),
+		"T2s(j,k)*T3(j,i,k)(1)");
+  test_for_zero(t1_1(2) - (t2_2(0,2)*t1_2(0)*t2s_3(0,0)
+			   + t2_2(0,2)*t1_2(1)*t2s_3(0,1)
+			   + t2_2(0,2)*t1_2(2)*t2s_3(0,2)
+			   + t2_2(1,2)*t1_2(0)*t2s_3(1,0)
+			   + t2_2(1,2)*t1_2(1)*t2s_3(1,1)
+			   + t2_2(1,2)*t1_2(2)*t2s_3(1,2)
+			   + t2_2(2,2)*t1_2(0)*t2s_3(2,0)
+			   + t2_2(2,2)*t1_2(1)*t2s_3(2,1)
+			   + t2_2(2,2)*t1_2(2)*t2s_3(2,2)),
+		"T2s(j,k)*T3(j,i,k)(2)");
+
+
+  t1_1(i)=(t2_2(j,k)*t1_2(i))*t2s_2(j,k);
+  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2s_2(0,0)
+			   + t2_2(0,1)*t1_2(0)*t2s_2(0,1)
+			   + t2_2(0,2)*t1_2(0)*t2s_2(0,2)
+			   + t2_2(1,0)*t1_2(0)*t2s_2(1,0)
+			   + t2_2(1,1)*t1_2(0)*t2s_2(1,1)
+			   + t2_2(1,2)*t1_2(0)*t2s_2(1,2)
+			   + t2_2(2,0)*t1_2(0)*t2s_2(2,0)
+			   + t2_2(2,1)*t1_2(0)*t2s_2(2,1)
+			   + t2_2(2,2)*t1_2(0)*t2s_2(2,2)),
+		"T3(j,k,i)*T2s(j,k)(0)");
+  test_for_zero(t1_1(1) - (t2_2(0,0)*t1_2(1)*t2s_2(0,0)
+			   + t2_2(0,1)*t1_2(1)*t2s_2(0,1)
+			   + t2_2(0,2)*t1_2(1)*t2s_2(0,2)
+			   + t2_2(1,0)*t1_2(1)*t2s_2(1,0)
+			   + t2_2(1,1)*t1_2(1)*t2s_2(1,1)
+			   + t2_2(1,2)*t1_2(1)*t2s_2(1,2)
+			   + t2_2(2,0)*t1_2(1)*t2s_2(2,0)
+			   + t2_2(2,1)*t1_2(1)*t2s_2(2,1)
+			   + t2_2(2,2)*t1_2(1)*t2s_2(2,2)),
+		"T3(j,k,i)*T2s(j,k)(1)");
+  test_for_zero(t1_1(2) - (t2_2(0,0)*t1_2(2)*t2s_2(0,0)
+			   + t2_2(0,1)*t1_2(2)*t2s_2(0,1)
+			   + t2_2(0,2)*t1_2(2)*t2s_2(0,2)
+			   + t2_2(1,0)*t1_2(2)*t2s_2(1,0)
+			   + t2_2(1,1)*t1_2(2)*t2s_2(1,1)
+			   + t2_2(1,2)*t1_2(2)*t2s_2(1,2)
+			   + t2_2(2,0)*t1_2(2)*t2s_2(2,0)
+			   + t2_2(2,1)*t1_2(2)*t2s_2(2,1)
+			   + t2_2(2,2)*t1_2(2)*t2s_2(2,2)),
+		"T3(j,k,i)*T2s(j,k)(2)");
+
+  t1_1(i)=t2s_3(j,k)*(t2_2(j,k)*t1_2(i));
+  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2s_3(0,0)
+			   + t2_2(0,1)*t1_2(0)*t2s_3(0,1)
+			   + t2_2(0,2)*t1_2(0)*t2s_3(0,2)
+			   + t2_2(1,0)*t1_2(0)*t2s_3(1,0)
+			   + t2_2(1,1)*t1_2(0)*t2s_3(1,1)
+			   + t2_2(1,2)*t1_2(0)*t2s_3(1,2)
+			   + t2_2(2,0)*t1_2(0)*t2s_3(2,0)
+			   + t2_2(2,1)*t1_2(0)*t2s_3(2,1)
+			   + t2_2(2,2)*t1_2(0)*t2s_3(2,2)),
+		"T2s(j,k)*T3(j,k,i)(0)");
+  test_for_zero(t1_1(1) - (t2_2(0,0)*t1_2(1)*t2s_3(0,0)
+			   + t2_2(0,1)*t1_2(1)*t2s_3(0,1)
+			   + t2_2(0,2)*t1_2(1)*t2s_3(0,2)
+			   + t2_2(1,0)*t1_2(1)*t2s_3(1,0)
+			   + t2_2(1,1)*t1_2(1)*t2s_3(1,1)
+			   + t2_2(1,2)*t1_2(1)*t2s_3(1,2)
+			   + t2_2(2,0)*t1_2(1)*t2s_3(2,0)
+			   + t2_2(2,1)*t1_2(1)*t2s_3(2,1)
+			   + t2_2(2,2)*t1_2(1)*t2s_3(2,2)),
+		"T2s(j,k)*T3(j,k,i)(1)");
+  test_for_zero(t1_1(2) - (t2_2(0,0)*t1_2(2)*t2s_3(0,0)
+			   + t2_2(0,1)*t1_2(2)*t2s_3(0,1)
+			   + t2_2(0,2)*t1_2(2)*t2s_3(0,2)
+			   + t2_2(1,0)*t1_2(2)*t2s_3(1,0)
+			   + t2_2(1,1)*t1_2(2)*t2s_3(1,1)
+			   + t2_2(1,2)*t1_2(2)*t2s_3(1,2)
+			   + t2_2(2,0)*t1_2(2)*t2s_3(2,0)
+			   + t2_2(2,1)*t1_2(2)*t2s_3(2,1)
+			   + t2_2(2,2)*t1_2(2)*t2s_3(2,2)),
+		"T2s(j,k)*T3(j,k,i)(2)");
+
+
+
+
+  t1_1(i)=(t2_2(i,j)*t1_2(k))*t2_2(j,k);
+  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2_2(0,0)
+			   + t2_2(0,0)*t1_2(1)*t2_2(0,1)
+			   + t2_2(0,0)*t1_2(2)*t2_2(0,2)
+			   + t2_2(0,1)*t1_2(0)*t2_2(1,0)
+			   + t2_2(0,1)*t1_2(1)*t2_2(1,1)
+			   + t2_2(0,1)*t1_2(2)*t2_2(1,2)
+			   + t2_2(0,2)*t1_2(0)*t2_2(2,0)
+			   + t2_2(0,2)*t1_2(1)*t2_2(2,1)
+			   + t2_2(0,2)*t1_2(2)*t2_2(2,2)),
+		"T3(i,j,k)*T2(j,k)(0)");
+  test_for_zero(t1_1(1) - (t2_2(1,0)*t1_2(0)*t2_2(0,0)
+			   + t2_2(1,0)*t1_2(1)*t2_2(0,1)
+			   + t2_2(1,0)*t1_2(2)*t2_2(0,2)
+			   + t2_2(1,1)*t1_2(0)*t2_2(1,0)
+			   + t2_2(1,1)*t1_2(1)*t2_2(1,1)
+			   + t2_2(1,1)*t1_2(2)*t2_2(1,2)
+			   + t2_2(1,2)*t1_2(0)*t2_2(2,0)
+			   + t2_2(1,2)*t1_2(1)*t2_2(2,1)
+			   + t2_2(1,2)*t1_2(2)*t2_2(2,2)),
+		"T3(i,j,k)*T2(j,k)(1)");
+  test_for_zero(t1_1(2) - (t2_2(2,0)*t1_2(0)*t2_2(0,0)
+			   + t2_2(2,0)*t1_2(1)*t2_2(0,1)
+			   + t2_2(2,0)*t1_2(2)*t2_2(0,2)
+			   + t2_2(2,1)*t1_2(0)*t2_2(1,0)
+			   + t2_2(2,1)*t1_2(1)*t2_2(1,1)
+			   + t2_2(2,1)*t1_2(2)*t2_2(1,2)
+			   + t2_2(2,2)*t1_2(0)*t2_2(2,0)
+			   + t2_2(2,2)*t1_2(1)*t2_2(2,1)
+			   + t2_2(2,2)*t1_2(2)*t2_2(2,2)),
+		"T3(i,j,k)*T2(j,k)(2)");
+
+  t1_1(i)=t2_3(j,k)*(t2_2(i,j)*t1_2(k));
+  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2_3(0,0)
+			   + t2_2(0,0)*t1_2(1)*t2_3(0,1)
+			   + t2_2(0,0)*t1_2(2)*t2_3(0,2)
+			   + t2_2(0,1)*t1_2(0)*t2_3(1,0)
+			   + t2_2(0,1)*t1_2(1)*t2_3(1,1)
+			   + t2_2(0,1)*t1_2(2)*t2_3(1,2)
+			   + t2_2(0,2)*t1_2(0)*t2_3(2,0)
+			   + t2_2(0,2)*t1_2(1)*t2_3(2,1)
+			   + t2_2(0,2)*t1_2(2)*t2_3(2,2)),
+		"T2(j,k)*T3(i,j,k)(0)");
+  test_for_zero(t1_1(1) - (t2_2(1,0)*t1_2(0)*t2_3(0,0)
+			   + t2_2(1,0)*t1_2(1)*t2_3(0,1)
+			   + t2_2(1,0)*t1_2(2)*t2_3(0,2)
+			   + t2_2(1,1)*t1_2(0)*t2_3(1,0)
+			   + t2_2(1,1)*t1_2(1)*t2_3(1,1)
+			   + t2_2(1,1)*t1_2(2)*t2_3(1,2)
+			   + t2_2(1,2)*t1_2(0)*t2_3(2,0)
+			   + t2_2(1,2)*t1_2(1)*t2_3(2,1)
+			   + t2_2(1,2)*t1_2(2)*t2_3(2,2)),
+		"T2(j,k)*T3(i,j,k)(1)");
+  test_for_zero(t1_1(2) - (t2_2(2,0)*t1_2(0)*t2_3(0,0)
+			   + t2_2(2,0)*t1_2(1)*t2_3(0,1)
+			   + t2_2(2,0)*t1_2(2)*t2_3(0,2)
+			   + t2_2(2,1)*t1_2(0)*t2_3(1,0)
+			   + t2_2(2,1)*t1_2(1)*t2_3(1,1)
+			   + t2_2(2,1)*t1_2(2)*t2_3(1,2)
+			   + t2_2(2,2)*t1_2(0)*t2_3(2,0)
+			   + t2_2(2,2)*t1_2(1)*t2_3(2,1)
+			   + t2_2(2,2)*t1_2(2)*t2_3(2,2))
+		,"T2(j,k)*T3(i,j,k)(2)");
+
+
+  t1_1(i)=(t2_2(j,i)*t1_2(k))*t2_2(j,k);
+  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2_2(0,0)
+			   + t2_2(0,0)*t1_2(1)*t2_2(0,1)
+			   + t2_2(0,0)*t1_2(2)*t2_2(0,2)
+			   + t2_2(1,0)*t1_2(0)*t2_2(1,0)
+			   + t2_2(1,0)*t1_2(1)*t2_2(1,1)
+			   + t2_2(1,0)*t1_2(2)*t2_2(1,2)
+			   + t2_2(2,0)*t1_2(0)*t2_2(2,0)
+			   + t2_2(2,0)*t1_2(1)*t2_2(2,1)
+			   + t2_2(2,0)*t1_2(2)*t2_2(2,2)),
+		"T3(j,i,k)*T2(j,k)(0)");
+  test_for_zero(t1_1(1) - (t2_2(0,1)*t1_2(0)*t2_2(0,0)
+			   + t2_2(0,1)*t1_2(1)*t2_2(0,1)
+			   + t2_2(0,1)*t1_2(2)*t2_2(0,2)
+			   + t2_2(1,1)*t1_2(0)*t2_2(1,0)
+			   + t2_2(1,1)*t1_2(1)*t2_2(1,1)
+			   + t2_2(1,1)*t1_2(2)*t2_2(1,2)
+			   + t2_2(2,1)*t1_2(0)*t2_2(2,0)
+			   + t2_2(2,1)*t1_2(1)*t2_2(2,1)
+			   + t2_2(2,1)*t1_2(2)*t2_2(2,2)),
+		"T3(j,i,k)*T2(j,k)(1)");
+  test_for_zero(t1_1(2) - (t2_2(0,2)*t1_2(0)*t2_2(0,0)
+			   + t2_2(0,2)*t1_2(1)*t2_2(0,1)
+			   + t2_2(0,2)*t1_2(2)*t2_2(0,2)
+			   + t2_2(1,2)*t1_2(0)*t2_2(1,0)
+			   + t2_2(1,2)*t1_2(1)*t2_2(1,1)
+			   + t2_2(1,2)*t1_2(2)*t2_2(1,2)
+			   + t2_2(2,2)*t1_2(0)*t2_2(2,0)
+			   + t2_2(2,2)*t1_2(1)*t2_2(2,1)
+			   + t2_2(2,2)*t1_2(2)*t2_2(2,2)),
+		"T3(j,i,k)*T2(j,k)(2)");
+
+  t1_1(i)=t2_3(j,k)*(t2_2(j,i)*t1_2(k));
+  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2_3(0,0)
+			   + t2_2(0,0)*t1_2(1)*t2_3(0,1)
+			   + t2_2(0,0)*t1_2(2)*t2_3(0,2)
+			   + t2_2(1,0)*t1_2(0)*t2_3(1,0)
+			   + t2_2(1,0)*t1_2(1)*t2_3(1,1)
+			   + t2_2(1,0)*t1_2(2)*t2_3(1,2)
+			   + t2_2(2,0)*t1_2(0)*t2_3(2,0)
+			   + t2_2(2,0)*t1_2(1)*t2_3(2,1)
+			   + t2_2(2,0)*t1_2(2)*t2_3(2,2))
+		,"T2(j,k)*T3(j,i,k)(0)");
+  test_for_zero(t1_1(1) - (t2_2(0,1)*t1_2(0)*t2_3(0,0)
+			   + t2_2(0,1)*t1_2(1)*t2_3(0,1)
+			   + t2_2(0,1)*t1_2(2)*t2_3(0,2)
+			   + t2_2(1,1)*t1_2(0)*t2_3(1,0)
+			   + t2_2(1,1)*t1_2(1)*t2_3(1,1)
+			   + t2_2(1,1)*t1_2(2)*t2_3(1,2)
+			   + t2_2(2,1)*t1_2(0)*t2_3(2,0)
+			   + t2_2(2,1)*t1_2(1)*t2_3(2,1)
+			   + t2_2(2,1)*t1_2(2)*t2_3(2,2))
+		,"T2(j,k)*T3(j,i,k)(1)");
+  test_for_zero(t1_1(2) - (t2_2(0,2)*t1_2(0)*t2_3(0,0)
+			   + t2_2(0,2)*t1_2(1)*t2_3(0,1)
+			   + t2_2(0,2)*t1_2(2)*t2_3(0,2)
+			   + t2_2(1,2)*t1_2(0)*t2_3(1,0)
+			   + t2_2(1,2)*t1_2(1)*t2_3(1,1)
+			   + t2_2(1,2)*t1_2(2)*t2_3(1,2)
+			   + t2_2(2,2)*t1_2(0)*t2_3(2,0)
+			   + t2_2(2,2)*t1_2(1)*t2_3(2,1)
+			   + t2_2(2,2)*t1_2(2)*t2_3(2,2))
+		,"T2(j,k)*T3(j,i,k)(2)");
+
+
+  t1_1(i)=(t2_2(j,k)*t1_2(i))*t2_2(j,k);
+  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2_2(0,0)
+			   + t2_2(0,1)*t1_2(0)*t2_2(0,1)
+			   + t2_2(0,2)*t1_2(0)*t2_2(0,2)
+			   + t2_2(1,0)*t1_2(0)*t2_2(1,0)
+			   + t2_2(1,1)*t1_2(0)*t2_2(1,1)
+			   + t2_2(1,2)*t1_2(0)*t2_2(1,2)
+			   + t2_2(2,0)*t1_2(0)*t2_2(2,0)
+			   + t2_2(2,1)*t1_2(0)*t2_2(2,1)
+			   + t2_2(2,2)*t1_2(0)*t2_2(2,2))
+		,"T3(j,k,i)*T2(j,k)(0)");
+  test_for_zero(t1_1(1) - (t2_2(0,0)*t1_2(1)*t2_2(0,0)
+			   + t2_2(0,1)*t1_2(1)*t2_2(0,1)
+			   + t2_2(0,2)*t1_2(1)*t2_2(0,2)
+			   + t2_2(1,0)*t1_2(1)*t2_2(1,0)
+			   + t2_2(1,1)*t1_2(1)*t2_2(1,1)
+			   + t2_2(1,2)*t1_2(1)*t2_2(1,2)
+			   + t2_2(2,0)*t1_2(1)*t2_2(2,0)
+			   + t2_2(2,1)*t1_2(1)*t2_2(2,1)
+			   + t2_2(2,2)*t1_2(1)*t2_2(2,2))
+		,"T3(j,k,i)*T2(j,k)(1)");
+  test_for_zero(t1_1(2) - (t2_2(0,0)*t1_2(2)*t2_2(0,0)
+			   + t2_2(0,1)*t1_2(2)*t2_2(0,1)
+			   + t2_2(0,2)*t1_2(2)*t2_2(0,2)
+			   + t2_2(1,0)*t1_2(2)*t2_2(1,0)
+			   + t2_2(1,1)*t1_2(2)*t2_2(1,1)
+			   + t2_2(1,2)*t1_2(2)*t2_2(1,2)
+			   + t2_2(2,0)*t1_2(2)*t2_2(2,0)
+			   + t2_2(2,1)*t1_2(2)*t2_2(2,1)
+			   + t2_2(2,2)*t1_2(2)*t2_2(2,2))
+		,"T3(j,k,i)*T2(j,k)(2)");
+
+  t1_1(i)=t2_3(j,k)*(t2_2(j,k)*t1_2(i));
+  test_for_zero(t1_1(0) - (t2_2(0,0)*t1_2(0)*t2_3(0,0)
+			   + t2_2(0,1)*t1_2(0)*t2_3(0,1)
+			   + t2_2(0,2)*t1_2(0)*t2_3(0,2)
+			   + t2_2(1,0)*t1_2(0)*t2_3(1,0)
+			   + t2_2(1,1)*t1_2(0)*t2_3(1,1)
+			   + t2_2(1,2)*t1_2(0)*t2_3(1,2)
+			   + t2_2(2,0)*t1_2(0)*t2_3(2,0)
+			   + t2_2(2,1)*t1_2(0)*t2_3(2,1)
+			   + t2_2(2,2)*t1_2(0)*t2_3(2,2))
+		,"T2(j,k)*T3(j,k,i)(0)");
+  test_for_zero(t1_1(1) - (t2_2(0,0)*t1_2(1)*t2_3(0,0)
+			   + t2_2(0,1)*t1_2(1)*t2_3(0,1)
+			   + t2_2(0,2)*t1_2(1)*t2_3(0,2)
+			   + t2_2(1,0)*t1_2(1)*t2_3(1,0)
+			   + t2_2(1,1)*t1_2(1)*t2_3(1,1)
+			   + t2_2(1,2)*t1_2(1)*t2_3(1,2)
+			   + t2_2(2,0)*t1_2(1)*t2_3(2,0)
+			   + t2_2(2,1)*t1_2(1)*t2_3(2,1)
+			   + t2_2(2,2)*t1_2(1)*t2_3(2,2))
+		,"T2(j,k)*T3(j,k,i)(1)");
+  test_for_zero(t1_1(2) - (t2_2(0,0)*t1_2(2)*t2_3(0,0)
+			   + t2_2(0,1)*t1_2(2)*t2_3(0,1)
+			   + t2_2(0,2)*t1_2(2)*t2_3(0,2)
+			   + t2_2(1,0)*t1_2(2)*t2_3(1,0)
+			   + t2_2(1,1)*t1_2(2)*t2_3(1,1)
+			   + t2_2(1,2)*t1_2(2)*t2_3(1,2)
+			   + t2_2(2,0)*t1_2(2)*t2_3(2,0)
+			   + t2_2(2,1)*t1_2(2)*t2_3(2,1)
+			   + t2_2(2,2)*t1_2(2)*t2_3(2,2))
+		,"T2(j,k)*T3(j,k,i)(2)");
+
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(0,0,0)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(0,0,0),
+		"T3(i,j,k)*T2(k,l)(0,0,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(0,0,1)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(0,0,1),
+		"T3(i,j,k)*T2(k,l)(0,0,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(0,0,2)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(0,0,2),
+		"T3(i,j,k)*T2(k,l)(0,0,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(0,1,0)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(0,1,0),
+		"T3(i,j,k)*T2(k,l)(0,1,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(0,1,1)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(0,1,1),
+		"T3(i,j,k)*T2(k,l)(0,1,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(0,1,2)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(0,1,2),
+		"T3(i,j,k)*T2(k,l)(0,1,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(0,2,0)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(0,2,0),
+		"T3(i,j,k)*T2(k,l)(0,2,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(0,2,1)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(0,2,1),
+		"T3(i,j,k)*T2(k,l)(0,2,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(0,2,2)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(0,2,2),
+		"T3(i,j,k)*T2(k,l)(0,2,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(1,0,0)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(1,0,0),
+		"T3(i,j,k)*T2(k,l)(1,0,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(1,0,1)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(1,0,1),
+		"T3(i,j,k)*T2(k,l)(1,0,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(1,0,2)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(1,0,2),
+		"T3(i,j,k)*T2(k,l)(1,0,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(1,1,0)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(1,1,0),
+		"T3(i,j,k)*T2(k,l)(1,1,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(1,1,1)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(1,1,1),
+		"T3(i,j,k)*T2(k,l)(1,1,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(1,1,2)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(1,1,2),
+		"T3(i,j,k)*T2(k,l)(1,1,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(1,2,0)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(1,2,0),
+		"T3(i,j,k)*T2(k,l)(1,2,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(1,2,1)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(1,2,1),
+		"T3(i,j,k)*T2(k,l)(1,2,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(1,2,2)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(1,2,2),
+		"T3(i,j,k)*T2(k,l)(1,2,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(2,0,0)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(2,0,0),
+		"T3(i,j,k)*T2(k,l)(2,0,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(2,0,1)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(2,0,1),
+		"T3(i,j,k)*T2(k,l)(2,0,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(2,0,2)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(2,0,2),
+		"T3(i,j,k)*T2(k,l)(2,0,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(2,1,0)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(2,1,0),
+		"T3(i,j,k)*T2(k,l)(2,1,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(2,1,1)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(2,1,1),
+		"T3(i,j,k)*T2(k,l)(2,1,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(2,1,2)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(2,1,2),
+		"T3(i,j,k)*T2(k,l)(2,1,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(2,2,0)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(2,2,0),
+		"T3(i,j,k)*T2(k,l)(2,2,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(2,2,1)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(2,2,1),
+		"T3(i,j,k)*T2(k,l)(2,2,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))*t2_3(k,l))(2,2,2)
+		- (t2_2(i,j)*(t1_2(k)*t2_3(k,l)))(2,2,2),
+		"T3(i,j,k)*T2(k,l)(2,2,2)");
+
+
+  test_for_zero((t2_2(i,j)*t1_2(k))*(t2_3(i,j)*t1_1(k))
+		- (t2_2(0,0)*t1_2(0)*t2_3(0,0)*t1_1(0)
+		   + t2_2(1,0)*t1_2(0)*t2_3(1,0)*t1_1(0)
+		   + t2_2(2,0)*t1_2(0)*t2_3(2,0)*t1_1(0)
+		   + t2_2(0,1)*t1_2(0)*t2_3(0,1)*t1_1(0)
+		   + t2_2(1,1)*t1_2(0)*t2_3(1,1)*t1_1(0)
+		   + t2_2(2,1)*t1_2(0)*t2_3(2,1)*t1_1(0)
+		   + t2_2(0,2)*t1_2(0)*t2_3(0,2)*t1_1(0)
+		   + t2_2(1,2)*t1_2(0)*t2_3(1,2)*t1_1(0)
+		   + t2_2(2,2)*t1_2(0)*t2_3(2,2)*t1_1(0)
+		   + t2_2(0,0)*t1_2(1)*t2_3(0,0)*t1_1(1)
+		   + t2_2(1,0)*t1_2(1)*t2_3(1,0)*t1_1(1)
+		   + t2_2(2,0)*t1_2(1)*t2_3(2,0)*t1_1(1)
+		   + t2_2(0,1)*t1_2(1)*t2_3(0,1)*t1_1(1)
+		   + t2_2(1,1)*t1_2(1)*t2_3(1,1)*t1_1(1)
+		   + t2_2(2,1)*t1_2(1)*t2_3(2,1)*t1_1(1)
+		   + t2_2(0,2)*t1_2(1)*t2_3(0,2)*t1_1(1)
+		   + t2_2(1,2)*t1_2(1)*t2_3(1,2)*t1_1(1)
+		   + t2_2(2,2)*t1_2(1)*t2_3(2,2)*t1_1(1)
+		   + t2_2(0,0)*t1_2(2)*t2_3(0,0)*t1_1(2)
+		   + t2_2(1,0)*t1_2(2)*t2_3(1,0)*t1_1(2)
+		   + t2_2(2,0)*t1_2(2)*t2_3(2,0)*t1_1(2)
+		   + t2_2(0,1)*t1_2(2)*t2_3(0,1)*t1_1(2)
+		   + t2_2(1,1)*t1_2(2)*t2_3(1,1)*t1_1(2)
+		   + t2_2(2,1)*t1_2(2)*t2_3(2,1)*t1_1(2)
+		   + t2_2(0,2)*t1_2(2)*t2_3(0,2)*t1_1(2)
+		   + t2_2(1,2)*t1_2(2)*t2_3(1,2)*t1_1(2)
+		   + t2_2(2,2)*t1_2(2)*t2_3(2,2)*t1_1(2)),
+		"T3(i,j,k)*T3(i,j,k)");
+
+  test_for_zero((t2_2(i,j)*t1_2(k))*(t2_3(j,i)*t1_1(k))
+		- (t2_2(0,0)*t1_2(0)*t2_3(0,0)*t1_1(0)
+		   + t2_2(1,0)*t1_2(0)*t2_3(0,1)*t1_1(0)
+		   + t2_2(2,0)*t1_2(0)*t2_3(0,2)*t1_1(0)
+		   + t2_2(0,1)*t1_2(0)*t2_3(1,0)*t1_1(0)
+		   + t2_2(1,1)*t1_2(0)*t2_3(1,1)*t1_1(0)
+		   + t2_2(2,1)*t1_2(0)*t2_3(1,2)*t1_1(0)
+		   + t2_2(0,2)*t1_2(0)*t2_3(2,0)*t1_1(0)
+		   + t2_2(1,2)*t1_2(0)*t2_3(2,1)*t1_1(0)
+		   + t2_2(2,2)*t1_2(0)*t2_3(2,2)*t1_1(0)
+		   + t2_2(0,0)*t1_2(1)*t2_3(0,0)*t1_1(1)
+		   + t2_2(1,0)*t1_2(1)*t2_3(0,1)*t1_1(1)
+		   + t2_2(2,0)*t1_2(1)*t2_3(0,2)*t1_1(1)
+		   + t2_2(0,1)*t1_2(1)*t2_3(1,0)*t1_1(1)
+		   + t2_2(1,1)*t1_2(1)*t2_3(1,1)*t1_1(1)
+		   + t2_2(2,1)*t1_2(1)*t2_3(1,2)*t1_1(1)
+		   + t2_2(0,2)*t1_2(1)*t2_3(2,0)*t1_1(1)
+		   + t2_2(1,2)*t1_2(1)*t2_3(2,1)*t1_1(1)
+		   + t2_2(2,2)*t1_2(1)*t2_3(2,2)*t1_1(1)
+		   + t2_2(0,0)*t1_2(2)*t2_3(0,0)*t1_1(2)
+		   + t2_2(1,0)*t1_2(2)*t2_3(0,1)*t1_1(2)
+		   + t2_2(2,0)*t1_2(2)*t2_3(0,2)*t1_1(2)
+		   + t2_2(0,1)*t1_2(2)*t2_3(1,0)*t1_1(2)
+		   + t2_2(1,1)*t1_2(2)*t2_3(1,1)*t1_1(2)
+		   + t2_2(2,1)*t1_2(2)*t2_3(1,2)*t1_1(2)
+		   + t2_2(0,2)*t1_2(2)*t2_3(2,0)*t1_1(2)
+		   + t2_2(1,2)*t1_2(2)*t2_3(2,1)*t1_1(2)
+		   + t2_2(2,2)*t1_2(2)*t2_3(2,2)*t1_1(2)),
+		"T3(i,j,k)*T3(j,i,k)");
+
+  test_for_zero((t2_2(i,j)*t1_2(k))*(t2_3(i,k)*t1_1(j))
+		- (t2_2(0,0)*t1_2(0)*t2_3(0,0)*t1_1(0)
+		   + t2_2(1,0)*t1_2(0)*t2_3(1,0)*t1_1(0)
+		   + t2_2(2,0)*t1_2(0)*t2_3(2,0)*t1_1(0)
+		   + t2_2(0,1)*t1_2(0)*t2_3(0,0)*t1_1(1)
+		   + t2_2(1,1)*t1_2(0)*t2_3(1,0)*t1_1(1)
+		   + t2_2(2,1)*t1_2(0)*t2_3(2,0)*t1_1(1)
+		   + t2_2(0,2)*t1_2(0)*t2_3(0,0)*t1_1(2)
+		   + t2_2(1,2)*t1_2(0)*t2_3(1,0)*t1_1(2)
+		   + t2_2(2,2)*t1_2(0)*t2_3(2,0)*t1_1(2)
+		   + t2_2(0,0)*t1_2(1)*t2_3(0,1)*t1_1(0)
+		   + t2_2(1,0)*t1_2(1)*t2_3(1,1)*t1_1(0)
+		   + t2_2(2,0)*t1_2(1)*t2_3(2,1)*t1_1(0)
+		   + t2_2(0,1)*t1_2(1)*t2_3(0,1)*t1_1(1)
+		   + t2_2(1,1)*t1_2(1)*t2_3(1,1)*t1_1(1)
+		   + t2_2(2,1)*t1_2(1)*t2_3(2,1)*t1_1(1)
+		   + t2_2(0,2)*t1_2(1)*t2_3(0,1)*t1_1(2)
+		   + t2_2(1,2)*t1_2(1)*t2_3(1,1)*t1_1(2)
+		   + t2_2(2,2)*t1_2(1)*t2_3(2,1)*t1_1(2)
+		   + t2_2(0,0)*t1_2(2)*t2_3(0,2)*t1_1(0)
+		   + t2_2(1,0)*t1_2(2)*t2_3(1,2)*t1_1(0)
+		   + t2_2(2,0)*t1_2(2)*t2_3(2,2)*t1_1(0)
+		   + t2_2(0,1)*t1_2(2)*t2_3(0,2)*t1_1(1)
+		   + t2_2(1,1)*t1_2(2)*t2_3(1,2)*t1_1(1)
+		   + t2_2(2,1)*t1_2(2)*t2_3(2,2)*t1_1(1)
+		   + t2_2(0,2)*t1_2(2)*t2_3(0,2)*t1_1(2)
+		   + t2_2(1,2)*t1_2(2)*t2_3(1,2)*t1_1(2)
+		   + t2_2(2,2)*t1_2(2)*t2_3(2,2)*t1_1(2)),
+		"T3(i,j,k)*T3(i,k,j)");
+
+  test_for_zero((t2_2(i,j)*t1_2(k))*(t2_3(j,k)*t1_1(i))
+		- (t2_2(0,0)*t1_2(0)*t2_3(0,0)*t1_1(0)
+		   + t2_2(1,0)*t1_2(0)*t2_3(0,0)*t1_1(1)
+		   + t2_2(2,0)*t1_2(0)*t2_3(0,0)*t1_1(2)
+		   + t2_2(0,1)*t1_2(0)*t2_3(1,0)*t1_1(0)
+		   + t2_2(1,1)*t1_2(0)*t2_3(1,0)*t1_1(1)
+		   + t2_2(2,1)*t1_2(0)*t2_3(1,0)*t1_1(2)
+		   + t2_2(0,2)*t1_2(0)*t2_3(2,0)*t1_1(0)
+		   + t2_2(1,2)*t1_2(0)*t2_3(2,0)*t1_1(1)
+		   + t2_2(2,2)*t1_2(0)*t2_3(2,0)*t1_1(2)
+		   + t2_2(0,0)*t1_2(1)*t2_3(0,1)*t1_1(0)
+		   + t2_2(1,0)*t1_2(1)*t2_3(0,1)*t1_1(1)
+		   + t2_2(2,0)*t1_2(1)*t2_3(0,1)*t1_1(2)
+		   + t2_2(0,1)*t1_2(1)*t2_3(1,1)*t1_1(0)
+		   + t2_2(1,1)*t1_2(1)*t2_3(1,1)*t1_1(1)
+		   + t2_2(2,1)*t1_2(1)*t2_3(1,1)*t1_1(2)
+		   + t2_2(0,2)*t1_2(1)*t2_3(2,1)*t1_1(0)
+		   + t2_2(1,2)*t1_2(1)*t2_3(2,1)*t1_1(1)
+		   + t2_2(2,2)*t1_2(1)*t2_3(2,1)*t1_1(2)
+		   + t2_2(0,0)*t1_2(2)*t2_3(0,2)*t1_1(0)
+		   + t2_2(1,0)*t1_2(2)*t2_3(0,2)*t1_1(1)
+		   + t2_2(2,0)*t1_2(2)*t2_3(0,2)*t1_1(2)
+		   + t2_2(0,1)*t1_2(2)*t2_3(1,2)*t1_1(0)
+		   + t2_2(1,1)*t1_2(2)*t2_3(1,2)*t1_1(1)
+		   + t2_2(2,1)*t1_2(2)*t2_3(1,2)*t1_1(2)
+		   + t2_2(0,2)*t1_2(2)*t2_3(2,2)*t1_1(0)
+		   + t2_2(1,2)*t1_2(2)*t2_3(2,2)*t1_1(1)
+		   + t2_2(2,2)*t1_2(2)*t2_3(2,2)*t1_1(2)),
+		"T3(i,j,k)*T3(j,k,i)");
+
+  test_for_zero((t2_2(i,j)*t1_2(k))*(t2_3(k,j)*t1_1(i))
+		- (t2_2(0,0)*t1_2(0)*t2_3(0,0)*t1_1(0)
+		   + t2_2(1,0)*t1_2(0)*t2_3(0,0)*t1_1(1)
+		   + t2_2(2,0)*t1_2(0)*t2_3(0,0)*t1_1(2)
+		   + t2_2(0,1)*t1_2(0)*t2_3(0,1)*t1_1(0)
+		   + t2_2(1,1)*t1_2(0)*t2_3(0,1)*t1_1(1)
+		   + t2_2(2,1)*t1_2(0)*t2_3(0,1)*t1_1(2)
+		   + t2_2(0,2)*t1_2(0)*t2_3(0,2)*t1_1(0)
+		   + t2_2(1,2)*t1_2(0)*t2_3(0,2)*t1_1(1)
+		   + t2_2(2,2)*t1_2(0)*t2_3(0,2)*t1_1(2)
+		   + t2_2(0,0)*t1_2(1)*t2_3(1,0)*t1_1(0)
+		   + t2_2(1,0)*t1_2(1)*t2_3(1,0)*t1_1(1)
+		   + t2_2(2,0)*t1_2(1)*t2_3(1,0)*t1_1(2)
+		   + t2_2(0,1)*t1_2(1)*t2_3(1,1)*t1_1(0)
+		   + t2_2(1,1)*t1_2(1)*t2_3(1,1)*t1_1(1)
+		   + t2_2(2,1)*t1_2(1)*t2_3(1,1)*t1_1(2)
+		   + t2_2(0,2)*t1_2(1)*t2_3(1,2)*t1_1(0)
+		   + t2_2(1,2)*t1_2(1)*t2_3(1,2)*t1_1(1)
+		   + t2_2(2,2)*t1_2(1)*t2_3(1,2)*t1_1(2)
+		   + t2_2(0,0)*t1_2(2)*t2_3(2,0)*t1_1(0)
+		   + t2_2(1,0)*t1_2(2)*t2_3(2,0)*t1_1(1)
+		   + t2_2(2,0)*t1_2(2)*t2_3(2,0)*t1_1(2)
+		   + t2_2(0,1)*t1_2(2)*t2_3(2,1)*t1_1(0)
+		   + t2_2(1,1)*t1_2(2)*t2_3(2,1)*t1_1(1)
+		   + t2_2(2,1)*t1_2(2)*t2_3(2,1)*t1_1(2)
+		   + t2_2(0,2)*t1_2(2)*t2_3(2,2)*t1_1(0)
+		   + t2_2(1,2)*t1_2(2)*t2_3(2,2)*t1_1(1)
+		   + t2_2(2,2)*t1_2(2)*t2_3(2,2)*t1_1(2)),
+		"T3(i,j,k)*T3(k,j,i)");
+
+  test_for_zero((t2_2(i,j)*t1_2(k))*(t2_3(k,i)*t1_1(j))
+		- (t2_2(0,0)*t1_2(0)*t2_3(0,0)*t1_1(0)
+		   + t2_2(1,0)*t1_2(0)*t2_3(0,1)*t1_1(0)
+		   + t2_2(2,0)*t1_2(0)*t2_3(0,2)*t1_1(0)
+		   + t2_2(0,1)*t1_2(0)*t2_3(0,0)*t1_1(1)
+		   + t2_2(1,1)*t1_2(0)*t2_3(0,1)*t1_1(1)
+		   + t2_2(2,1)*t1_2(0)*t2_3(0,2)*t1_1(1)
+		   + t2_2(0,2)*t1_2(0)*t2_3(0,0)*t1_1(2)
+		   + t2_2(1,2)*t1_2(0)*t2_3(0,1)*t1_1(2)
+		   + t2_2(2,2)*t1_2(0)*t2_3(0,2)*t1_1(2)
+		   + t2_2(0,0)*t1_2(1)*t2_3(1,0)*t1_1(0)
+		   + t2_2(1,0)*t1_2(1)*t2_3(1,1)*t1_1(0)
+		   + t2_2(2,0)*t1_2(1)*t2_3(1,2)*t1_1(0)
+		   + t2_2(0,1)*t1_2(1)*t2_3(1,0)*t1_1(1)
+		   + t2_2(1,1)*t1_2(1)*t2_3(1,1)*t1_1(1)
+		   + t2_2(2,1)*t1_2(1)*t2_3(1,2)*t1_1(1)
+		   + t2_2(0,2)*t1_2(1)*t2_3(1,0)*t1_1(2)
+		   + t2_2(1,2)*t1_2(1)*t2_3(1,1)*t1_1(2)
+		   + t2_2(2,2)*t1_2(1)*t2_3(1,2)*t1_1(2)
+		   + t2_2(0,0)*t1_2(2)*t2_3(2,0)*t1_1(0)
+		   + t2_2(1,0)*t1_2(2)*t2_3(2,1)*t1_1(0)
+		   + t2_2(2,0)*t1_2(2)*t2_3(2,2)*t1_1(0)
+		   + t2_2(0,1)*t1_2(2)*t2_3(2,0)*t1_1(1)
+		   + t2_2(1,1)*t1_2(2)*t2_3(2,1)*t1_1(1)
+		   + t2_2(2,1)*t1_2(2)*t2_3(2,2)*t1_1(1)
+		   + t2_2(0,2)*t1_2(2)*t2_3(2,0)*t1_1(2)
+		   + t2_2(1,2)*t1_2(2)*t2_3(2,1)*t1_1(2)
+		   + t2_2(2,2)*t1_2(2)*t2_3(2,2)*t1_1(2)),
+		"T3(i,j,k)*T3(k,i,j)");
+
+
+
+
+
+
+  test_for_zero((t2_2(i,j)*t1_2(k))*(t3dg_2(i,j,k))
+		- (t2_2(0,0)*t1_2(0)*t3dg_2(0,0,0)
+		   + t2_2(1,0)*t1_2(0)*t3dg_2(1,0,0)
+		   + t2_2(2,0)*t1_2(0)*t3dg_2(2,0,0)
+		   + t2_2(0,1)*t1_2(0)*t3dg_2(0,1,0)
+		   + t2_2(1,1)*t1_2(0)*t3dg_2(1,1,0)
+		   + t2_2(2,1)*t1_2(0)*t3dg_2(2,1,0)
+		   + t2_2(0,2)*t1_2(0)*t3dg_2(0,2,0)
+		   + t2_2(1,2)*t1_2(0)*t3dg_2(1,2,0)
+		   + t2_2(2,2)*t1_2(0)*t3dg_2(2,2,0)
+		   + t2_2(0,0)*t1_2(1)*t3dg_2(0,0,1)
+		   + t2_2(1,0)*t1_2(1)*t3dg_2(1,0,1)
+		   + t2_2(2,0)*t1_2(1)*t3dg_2(2,0,1)
+		   + t2_2(0,1)*t1_2(1)*t3dg_2(0,1,1)
+		   + t2_2(1,1)*t1_2(1)*t3dg_2(1,1,1)
+		   + t2_2(2,1)*t1_2(1)*t3dg_2(2,1,1)
+		   + t2_2(0,2)*t1_2(1)*t3dg_2(0,2,1)
+		   + t2_2(1,2)*t1_2(1)*t3dg_2(1,2,1)
+		   + t2_2(2,2)*t1_2(1)*t3dg_2(2,2,1)
+		   + t2_2(0,0)*t1_2(2)*t3dg_2(0,0,2)
+		   + t2_2(1,0)*t1_2(2)*t3dg_2(1,0,2)
+		   + t2_2(2,0)*t1_2(2)*t3dg_2(2,0,2)
+		   + t2_2(0,1)*t1_2(2)*t3dg_2(0,1,2)
+		   + t2_2(1,1)*t1_2(2)*t3dg_2(1,1,2)
+		   + t2_2(2,1)*t1_2(2)*t3dg_2(2,1,2)
+		   + t2_2(0,2)*t1_2(2)*t3dg_2(0,2,2)
+		   + t2_2(1,2)*t1_2(2)*t3dg_2(1,2,2)
+		   + t2_2(2,2)*t1_2(2)*t3dg_2(2,2,2)),
+		"T3(i,j,k)*T3dg(i,j,k)");
+
+  test_for_zero((t2_2(i,j)*t1_2(k))*(t3dg_2(j,i,k))
+		- (t2_2(0,0)*t1_2(0)*t3dg_2(0,0,0)
+		   + t2_2(1,0)*t1_2(0)*t3dg_2(0,1,0)
+		   + t2_2(2,0)*t1_2(0)*t3dg_2(0,2,0)
+		   + t2_2(0,1)*t1_2(0)*t3dg_2(1,0,0)
+		   + t2_2(1,1)*t1_2(0)*t3dg_2(1,1,0)
+		   + t2_2(2,1)*t1_2(0)*t3dg_2(1,2,0)
+		   + t2_2(0,2)*t1_2(0)*t3dg_2(2,0,0)
+		   + t2_2(1,2)*t1_2(0)*t3dg_2(2,1,0)
+		   + t2_2(2,2)*t1_2(0)*t3dg_2(2,2,0)
+		   + t2_2(0,0)*t1_2(1)*t3dg_2(0,0,1)
+		   + t2_2(1,0)*t1_2(1)*t3dg_2(0,1,1)
+		   + t2_2(2,0)*t1_2(1)*t3dg_2(0,2,1)
+		   + t2_2(0,1)*t1_2(1)*t3dg_2(1,0,1)
+		   + t2_2(1,1)*t1_2(1)*t3dg_2(1,1,1)
+		   + t2_2(2,1)*t1_2(1)*t3dg_2(1,2,1)
+		   + t2_2(0,2)*t1_2(1)*t3dg_2(2,0,1)
+		   + t2_2(1,2)*t1_2(1)*t3dg_2(2,1,1)
+		   + t2_2(2,2)*t1_2(1)*t3dg_2(2,2,1)
+		   + t2_2(0,0)*t1_2(2)*t3dg_2(0,0,2)
+		   + t2_2(1,0)*t1_2(2)*t3dg_2(0,1,2)
+		   + t2_2(2,0)*t1_2(2)*t3dg_2(0,2,2)
+		   + t2_2(0,1)*t1_2(2)*t3dg_2(1,0,2)
+		   + t2_2(1,1)*t1_2(2)*t3dg_2(1,1,2)
+		   + t2_2(2,1)*t1_2(2)*t3dg_2(1,2,2)
+		   + t2_2(0,2)*t1_2(2)*t3dg_2(2,0,2)
+		   + t2_2(1,2)*t1_2(2)*t3dg_2(2,1,2)
+		   + t2_2(2,2)*t1_2(2)*t3dg_2(2,2,2)),
+		"T3(i,j,k)*T3dg(j,i,k)");
+
+  test_for_zero((t2_2(i,j)*t1_2(k))*(t3dg_2(i,k,j))
+		- (t2_2(0,0)*t1_2(0)*t3dg_2(0,0,0)
+		   + t2_2(1,0)*t1_2(0)*t3dg_2(1,0,0)
+		   + t2_2(2,0)*t1_2(0)*t3dg_2(2,0,0)
+		   + t2_2(0,1)*t1_2(0)*t3dg_2(0,0,1)
+		   + t2_2(1,1)*t1_2(0)*t3dg_2(1,0,1)
+		   + t2_2(2,1)*t1_2(0)*t3dg_2(2,0,1)
+		   + t2_2(0,2)*t1_2(0)*t3dg_2(0,0,2)
+		   + t2_2(1,2)*t1_2(0)*t3dg_2(1,0,2)
+		   + t2_2(2,2)*t1_2(0)*t3dg_2(2,0,2)
+		   + t2_2(0,0)*t1_2(1)*t3dg_2(0,1,0)
+		   + t2_2(1,0)*t1_2(1)*t3dg_2(1,1,0)
+		   + t2_2(2,0)*t1_2(1)*t3dg_2(2,1,0)
+		   + t2_2(0,1)*t1_2(1)*t3dg_2(0,1,1)
+		   + t2_2(1,1)*t1_2(1)*t3dg_2(1,1,1)
+		   + t2_2(2,1)*t1_2(1)*t3dg_2(2,1,1)
+		   + t2_2(0,2)*t1_2(1)*t3dg_2(0,1,2)
+		   + t2_2(1,2)*t1_2(1)*t3dg_2(1,1,2)
+		   + t2_2(2,2)*t1_2(1)*t3dg_2(2,1,2)
+		   + t2_2(0,0)*t1_2(2)*t3dg_2(0,2,0)
+		   + t2_2(1,0)*t1_2(2)*t3dg_2(1,2,0)
+		   + t2_2(2,0)*t1_2(2)*t3dg_2(2,2,0)
+		   + t2_2(0,1)*t1_2(2)*t3dg_2(0,2,1)
+		   + t2_2(1,1)*t1_2(2)*t3dg_2(1,2,1)
+		   + t2_2(2,1)*t1_2(2)*t3dg_2(2,2,1)
+		   + t2_2(0,2)*t1_2(2)*t3dg_2(0,2,2)
+		   + t2_2(1,2)*t1_2(2)*t3dg_2(1,2,2)
+		   + t2_2(2,2)*t1_2(2)*t3dg_2(2,2,2)),
+		"T3(i,j,k)*T3dg(i,k,j)");
+
+  test_for_zero((t2_2(i,j)*t1_2(k))*(t3dg_2(j,k,i))
+		- (t2_2(0,0)*t1_2(0)*t3dg_2(0,0,0)
+		   + t2_2(1,0)*t1_2(0)*t3dg_2(0,0,1)
+		   + t2_2(2,0)*t1_2(0)*t3dg_2(0,0,2)
+		   + t2_2(0,1)*t1_2(0)*t3dg_2(1,0,0)
+		   + t2_2(1,1)*t1_2(0)*t3dg_2(1,0,1)
+		   + t2_2(2,1)*t1_2(0)*t3dg_2(1,0,2)
+		   + t2_2(0,2)*t1_2(0)*t3dg_2(2,0,0)
+		   + t2_2(1,2)*t1_2(0)*t3dg_2(2,0,1)
+		   + t2_2(2,2)*t1_2(0)*t3dg_2(2,0,2)
+		   + t2_2(0,0)*t1_2(1)*t3dg_2(0,1,0)
+		   + t2_2(1,0)*t1_2(1)*t3dg_2(0,1,1)
+		   + t2_2(2,0)*t1_2(1)*t3dg_2(0,1,2)
+		   + t2_2(0,1)*t1_2(1)*t3dg_2(1,1,0)
+		   + t2_2(1,1)*t1_2(1)*t3dg_2(1,1,1)
+		   + t2_2(2,1)*t1_2(1)*t3dg_2(1,1,2)
+		   + t2_2(0,2)*t1_2(1)*t3dg_2(2,1,0)
+		   + t2_2(1,2)*t1_2(1)*t3dg_2(2,1,1)
+		   + t2_2(2,2)*t1_2(1)*t3dg_2(2,1,2)
+		   + t2_2(0,0)*t1_2(2)*t3dg_2(0,2,0)
+		   + t2_2(1,0)*t1_2(2)*t3dg_2(0,2,1)
+		   + t2_2(2,0)*t1_2(2)*t3dg_2(0,2,2)
+		   + t2_2(0,1)*t1_2(2)*t3dg_2(1,2,0)
+		   + t2_2(1,1)*t1_2(2)*t3dg_2(1,2,1)
+		   + t2_2(2,1)*t1_2(2)*t3dg_2(1,2,2)
+		   + t2_2(0,2)*t1_2(2)*t3dg_2(2,2,0)
+		   + t2_2(1,2)*t1_2(2)*t3dg_2(2,2,1)
+		   + t2_2(2,2)*t1_2(2)*t3dg_2(2,2,2)),
+		"T3(i,j,k)*T3dg(j,k,i)");
+
+  test_for_zero((t2_2(i,j)*t1_2(k))*(t3dg_2(k,j,i))
+		- (t2_2(0,0)*t1_2(0)*t3dg_2(0,0,0)
+		   + t2_2(1,0)*t1_2(0)*t3dg_2(0,0,1)
+		   + t2_2(2,0)*t1_2(0)*t3dg_2(0,0,2)
+		   + t2_2(0,1)*t1_2(0)*t3dg_2(0,1,0)
+		   + t2_2(1,1)*t1_2(0)*t3dg_2(0,1,1)
+		   + t2_2(2,1)*t1_2(0)*t3dg_2(0,1,2)
+		   + t2_2(0,2)*t1_2(0)*t3dg_2(0,2,0)
+		   + t2_2(1,2)*t1_2(0)*t3dg_2(0,2,1)
+		   + t2_2(2,2)*t1_2(0)*t3dg_2(0,2,2)
+		   + t2_2(0,0)*t1_2(1)*t3dg_2(1,0,0)
+		   + t2_2(1,0)*t1_2(1)*t3dg_2(1,0,1)
+		   + t2_2(2,0)*t1_2(1)*t3dg_2(1,0,2)
+		   + t2_2(0,1)*t1_2(1)*t3dg_2(1,1,0)
+		   + t2_2(1,1)*t1_2(1)*t3dg_2(1,1,1)
+		   + t2_2(2,1)*t1_2(1)*t3dg_2(1,1,2)
+		   + t2_2(0,2)*t1_2(1)*t3dg_2(1,2,0)
+		   + t2_2(1,2)*t1_2(1)*t3dg_2(1,2,1)
+		   + t2_2(2,2)*t1_2(1)*t3dg_2(1,2,2)
+		   + t2_2(0,0)*t1_2(2)*t3dg_2(2,0,0)
+		   + t2_2(1,0)*t1_2(2)*t3dg_2(2,0,1)
+		   + t2_2(2,0)*t1_2(2)*t3dg_2(2,0,2)
+		   + t2_2(0,1)*t1_2(2)*t3dg_2(2,1,0)
+		   + t2_2(1,1)*t1_2(2)*t3dg_2(2,1,1)
+		   + t2_2(2,1)*t1_2(2)*t3dg_2(2,1,2)
+		   + t2_2(0,2)*t1_2(2)*t3dg_2(2,2,0)
+		   + t2_2(1,2)*t1_2(2)*t3dg_2(2,2,1)
+		   + t2_2(2,2)*t1_2(2)*t3dg_2(2,2,2)),
+		"T3(i,j,k)*T3dg(k,j,i)");
+
+  test_for_zero((t2_2(i,j)*t1_2(k))*(t3dg_2(k,i,j))
+		- (t2_2(0,0)*t1_2(0)*t3dg_2(0,0,0)
+		   + t2_2(1,0)*t1_2(0)*t3dg_2(0,1,0)
+		   + t2_2(2,0)*t1_2(0)*t3dg_2(0,2,0)
+		   + t2_2(0,1)*t1_2(0)*t3dg_2(0,0,1)
+		   + t2_2(1,1)*t1_2(0)*t3dg_2(0,1,1)
+		   + t2_2(2,1)*t1_2(0)*t3dg_2(0,2,1)
+		   + t2_2(0,2)*t1_2(0)*t3dg_2(0,0,2)
+		   + t2_2(1,2)*t1_2(0)*t3dg_2(0,1,2)
+		   + t2_2(2,2)*t1_2(0)*t3dg_2(0,2,2)
+		   + t2_2(0,0)*t1_2(1)*t3dg_2(1,0,0)
+		   + t2_2(1,0)*t1_2(1)*t3dg_2(1,1,0)
+		   + t2_2(2,0)*t1_2(1)*t3dg_2(1,2,0)
+		   + t2_2(0,1)*t1_2(1)*t3dg_2(1,0,1)
+		   + t2_2(1,1)*t1_2(1)*t3dg_2(1,1,1)
+		   + t2_2(2,1)*t1_2(1)*t3dg_2(1,2,1)
+		   + t2_2(0,2)*t1_2(1)*t3dg_2(1,0,2)
+		   + t2_2(1,2)*t1_2(1)*t3dg_2(1,1,2)
+		   + t2_2(2,2)*t1_2(1)*t3dg_2(1,2,2)
+		   + t2_2(0,0)*t1_2(2)*t3dg_2(2,0,0)
+		   + t2_2(1,0)*t1_2(2)*t3dg_2(2,1,0)
+		   + t2_2(2,0)*t1_2(2)*t3dg_2(2,2,0)
+		   + t2_2(0,1)*t1_2(2)*t3dg_2(2,0,1)
+		   + t2_2(1,1)*t1_2(2)*t3dg_2(2,1,1)
+		   + t2_2(2,1)*t1_2(2)*t3dg_2(2,2,1)
+		   + t2_2(0,2)*t1_2(2)*t3dg_2(2,0,2)
+		   + t2_2(1,2)*t1_2(2)*t3dg_2(2,1,2)
+		   + t2_2(2,2)*t1_2(2)*t3dg_2(2,2,2)),
+		"T3(i,j,k)*T3dg(k,i,j)");
+
+  cout << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3/test_T3II.C
--- a/tests/conformance/T3/test_T3II.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,372 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3II(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,j)*t1_1(k)))(0,0,0)
-		- ((t2_2(0,0)*t1_2(0))+(t2_3(0,0)*t1_1(0)))
-		,"T3(i,j,k)+T3(i,j,k)(0,0,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,j)*t1_1(k)))(0,0,1)
-		- ((t2_2(0,0)*t1_2(1))+(t2_3(0,0)*t1_1(1)))
-		,"T3(i,j,k)+T3(i,j,k)(0,0,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,j)*t1_1(k)))(0,0,2)
-		- ((t2_2(0,0)*t1_2(2))+(t2_3(0,0)*t1_1(2)))
-		,"T3(i,j,k)+T3(i,j,k)(0,0,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,j)*t1_1(k)))(0,1,0)
-		- ((t2_2(0,1)*t1_2(0))+(t2_3(0,1)*t1_1(0)))
-		,"T3(i,j,k)+T3(i,j,k)(0,1,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,j)*t1_1(k)))(0,1,1)
-		- ((t2_2(0,1)*t1_2(1))+(t2_3(0,1)*t1_1(1)))
-		,"T3(i,j,k)+T3(i,j,k)(0,1,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,j)*t1_1(k)))(0,1,2)
-		- ((t2_2(0,1)*t1_2(2))+(t2_3(0,1)*t1_1(2)))
-		,"T3(i,j,k)+T3(i,j,k)(0,1,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,j)*t1_1(k)))(0,2,0)
-		- ((t2_2(0,2)*t1_2(0))+(t2_3(0,2)*t1_1(0)))
-		,"T3(i,j,k)+T3(i,j,k)(0,2,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,j)*t1_1(k)))(0,2,1)
-		- ((t2_2(0,2)*t1_2(1))+(t2_3(0,2)*t1_1(1)))
-		,"T3(i,j,k)+T3(i,j,k)(0,2,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,j)*t1_1(k)))(0,2,2)
-		- ((t2_2(0,2)*t1_2(2))+(t2_3(0,2)*t1_1(2)))
-		,"T3(i,j,k)+T3(i,j,k)(0,2,2)");
-
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,k)*t1_1(j)))(0,0,0)
-		- ((t2_2(0,0)*t1_2(0))+(t2_3(0,0)*t1_1(0)))
-		,"T3(i,j,k)+T3(i,k,j)(0,0,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,k)*t1_1(j)))(0,0,1)
-		- ((t2_2(0,0)*t1_2(1))+(t2_3(0,1)*t1_1(0)))
-		,"T3(i,j,k)+T3(i,k,j)(0,0,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,k)*t1_1(j)))(0,0,2)
-		- ((t2_2(0,0)*t1_2(2))+(t2_3(0,2)*t1_1(0)))
-		,"T3(i,j,k)+T3(i,k,j)(0,0,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,k)*t1_1(j)))(0,1,0)
-		- ((t2_2(0,1)*t1_2(0))+(t2_3(0,0)*t1_1(1)))
-		,"T3(i,j,k)+T3(i,k,j)(0,1,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,k)*t1_1(j)))(0,1,1)
-		- ((t2_2(0,1)*t1_2(1))+(t2_3(0,1)*t1_1(1)))
-		,"T3(i,j,k)+T3(i,k,j)(0,1,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,k)*t1_1(j)))(0,1,2)
-		- ((t2_2(0,1)*t1_2(2))+(t2_3(0,2)*t1_1(1)))
-		,"T3(i,j,k)+T3(i,k,j)(0,1,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,k)*t1_1(j)))(0,2,0)
-		- ((t2_2(0,2)*t1_2(0))+(t2_3(0,0)*t1_1(2)))
-		,"T3(i,j,k)+T3(i,k,j)(0,2,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,k)*t1_1(j)))(0,2,1)
-		- ((t2_2(0,2)*t1_2(1))+(t2_3(0,1)*t1_1(2)))
-		,"T3(i,j,k)+T3(i,k,j)(0,2,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,k)*t1_1(j)))(0,2,2)
-		- ((t2_2(0,2)*t1_2(2))+(t2_3(0,2)*t1_1(2)))
-		,"T3(i,j,k)+T3(i,k,j)(0,2,2)");
-
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(j,i)*t1_1(k)))(0,0,0)
-		- ((t2_2(0,0)*t1_2(0))+(t2_3(0,0)*t1_1(0)))
-		,"T3(i,j,k)+T3(j,i,k)(0,0,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(j,i)*t1_1(k)))(0,0,1)
-		- ((t2_2(0,0)*t1_2(1))+(t2_3(0,0)*t1_1(1)))
-		,"T3(i,j,k)+T3(j,i,k)(0,0,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(j,i)*t1_1(k)))(0,0,2)
-		- ((t2_2(0,0)*t1_2(2))+(t2_3(0,0)*t1_1(2)))
-		,"T3(i,j,k)+T3(j,i,k)(0,0,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(j,i)*t1_1(k)))(0,1,0)
-		- ((t2_2(0,1)*t1_2(0))+(t2_3(1,0)*t1_1(0)))
-		,"T3(i,j,k)+T3(j,i,k)(0,1,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(j,i)*t1_1(k)))(0,1,1)
-		- ((t2_2(0,1)*t1_2(1))+(t2_3(1,0)*t1_1(1)))
-		,"T3(i,j,k)+T3(j,i,k)(0,1,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(j,i)*t1_1(k)))(0,1,2)
-		- ((t2_2(0,1)*t1_2(2))+(t2_3(1,0)*t1_1(2)))
-		,"T3(i,j,k)+T3(j,i,k)(0,1,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(j,i)*t1_1(k)))(0,2,0)
-		- ((t2_2(0,2)*t1_2(0))+(t2_3(2,0)*t1_1(0)))
-		,"T3(i,j,k)+T3(j,i,k)(0,2,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(j,i)*t1_1(k)))(0,2,1)
-		- ((t2_2(0,2)*t1_2(1))+(t2_3(2,0)*t1_1(1)))
-		,"T3(i,j,k)+T3(j,i,k)(0,2,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(j,i)*t1_1(k)))(0,2,2)
-		- ((t2_2(0,2)*t1_2(2))+(t2_3(2,0)*t1_1(2)))
-		,"T3(i,j,k)+T3(j,i,k)(0,2,2)");
-
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(k,i)*t1_1(j)))(0,0,0)
-		- ((t2_2(0,0)*t1_2(0))+(t2_3(0,0)*t1_1(0)))
-		,"T3(i,j,k)+T3(k,i,j)(0,0,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(k,i)*t1_1(j)))(0,0,1)
-		- ((t2_2(0,0)*t1_2(1))+(t2_3(1,0)*t1_1(0)))
-		,"T3(i,j,k)+T3(k,i,j)(0,0,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(k,i)*t1_1(j)))(0,0,2)
-		- ((t2_2(0,0)*t1_2(2))+(t2_3(2,0)*t1_1(0)))
-		,"T3(i,j,k)+T3(k,i,j)(0,0,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(k,i)*t1_1(j)))(0,1,0)
-		- ((t2_2(0,1)*t1_2(0))+(t2_3(0,0)*t1_1(1)))
-		,"T3(i,j,k)+T3(k,i,j)(0,1,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(k,i)*t1_1(j)))(0,1,1)
-		- ((t2_2(0,1)*t1_2(1))+(t2_3(1,0)*t1_1(1)))
-		,"T3(i,j,k)+T3(k,i,j)(0,1,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(k,i)*t1_1(j)))(0,1,2)
-		- ((t2_2(0,1)*t1_2(2))+(t2_3(2,0)*t1_1(1)))
-		,"T3(i,j,k)+T3(k,i,j)(0,1,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(k,i)*t1_1(j)))(0,2,0)
-		- ((t2_2(0,2)*t1_2(0))+(t2_3(0,0)*t1_1(2)))
-		,"T3(i,j,k)+T3(k,i,j)(0,2,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(k,i)*t1_1(j)))(0,2,1)
-		- ((t2_2(0,2)*t1_2(1))+(t2_3(1,0)*t1_1(2)))
-		,"T3(i,j,k)+T3(k,i,j)(0,2,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(k,i)*t1_1(j)))(0,2,2)
-		- ((t2_2(0,2)*t1_2(2))+(t2_3(2,0)*t1_1(2)))
-		,"T3(i,j,k)+T3(k,i,j)(0,2,2)");
-
-
-
-
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,j)*t1_1(k)))(0,0,0)
-		- ((t2_2(0,0)*t1_2(0))-(t2_3(0,0)*t1_1(0)))
-		,"T3(i,j,k)-T3(i,j,k)(0,0,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,j)*t1_1(k)))(0,0,1)
-		- ((t2_2(0,0)*t1_2(1))-(t2_3(0,0)*t1_1(1)))
-		,"T3(i,j,k)-T3(i,j,k)(0,0,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,j)*t1_1(k)))(0,0,2)
-		- ((t2_2(0,0)*t1_2(2))-(t2_3(0,0)*t1_1(2)))
-		,"T3(i,j,k)-T3(i,j,k)(0,0,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,j)*t1_1(k)))(0,1,0)
-		- ((t2_2(0,1)*t1_2(0))-(t2_3(0,1)*t1_1(0)))
-		,"T3(i,j,k)-T3(i,j,k)(0,1,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,j)*t1_1(k)))(0,1,1)
-		- ((t2_2(0,1)*t1_2(1))-(t2_3(0,1)*t1_1(1)))
-		,"T3(i,j,k)-T3(i,j,k)(0,1,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,j)*t1_1(k)))(0,1,2)
-		- ((t2_2(0,1)*t1_2(2))-(t2_3(0,1)*t1_1(2)))
-		,"T3(i,j,k)-T3(i,j,k)(0,1,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,j)*t1_1(k)))(0,2,0)
-		- ((t2_2(0,2)*t1_2(0))-(t2_3(0,2)*t1_1(0)))
-		,"T3(i,j,k)-T3(i,j,k)(0,2,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,j)*t1_1(k)))(0,2,1)
-		- ((t2_2(0,2)*t1_2(1))-(t2_3(0,2)*t1_1(1)))
-		,"T3(i,j,k)-T3(i,j,k)(0,2,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,j)*t1_1(k)))(0,2,2)
-		- ((t2_2(0,2)*t1_2(2))-(t2_3(0,2)*t1_1(2)))
-		,"T3(i,j,k)-T3(i,j,k)(0,2,2)");
-
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,k)*t1_1(j)))(0,0,0)
-		- ((t2_2(0,0)*t1_2(0))-(t2_3(0,0)*t1_1(0)))
-		,"T3(i,j,k)-T3(i,k,j)(0,0,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,k)*t1_1(j)))(0,0,1)
-		- ((t2_2(0,0)*t1_2(1))-(t2_3(0,1)*t1_1(0)))
-		,"T3(i,j,k)-T3(i,k,j)(0,0,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,k)*t1_1(j)))(0,0,2)
-		- ((t2_2(0,0)*t1_2(2))-(t2_3(0,2)*t1_1(0)))
-		,"T3(i,j,k)-T3(i,k,j)(0,0,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,k)*t1_1(j)))(0,1,0)
-		- ((t2_2(0,1)*t1_2(0))-(t2_3(0,0)*t1_1(1)))
-		,"T3(i,j,k)-T3(i,k,j)(0,1,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,k)*t1_1(j)))(0,1,1)
-		- ((t2_2(0,1)*t1_2(1))-(t2_3(0,1)*t1_1(1)))
-		,"T3(i,j,k)-T3(i,k,j)(0,1,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,k)*t1_1(j)))(0,1,2)
-		- ((t2_2(0,1)*t1_2(2))-(t2_3(0,2)*t1_1(1)))
-		,"T3(i,j,k)-T3(i,k,j)(0,1,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,k)*t1_1(j)))(0,2,0)
-		- ((t2_2(0,2)*t1_2(0))-(t2_3(0,0)*t1_1(2)))
-		,"T3(i,j,k)-T3(i,k,j)(0,2,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,k)*t1_1(j)))(0,2,1)
-		- ((t2_2(0,2)*t1_2(1))-(t2_3(0,1)*t1_1(2)))
-		,"T3(i,j,k)-T3(i,k,j)(0,2,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,k)*t1_1(j)))(0,2,2)
-		- ((t2_2(0,2)*t1_2(2))-(t2_3(0,2)*t1_1(2)))
-		,"T3(i,j,k)-T3(i,k,j)(0,2,2)");
-
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(j,i)*t1_1(k)))(0,0,0)
-		- ((t2_2(0,0)*t1_2(0))-(t2_3(0,0)*t1_1(0)))
-		,"T3(i,j,k)-T3(j,i,k)(0,0,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(j,i)*t1_1(k)))(0,0,1)
-		- ((t2_2(0,0)*t1_2(1))-(t2_3(0,0)*t1_1(1)))
-		,"T3(i,j,k)-T3(j,i,k)(0,0,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(j,i)*t1_1(k)))(0,0,2)
-		- ((t2_2(0,0)*t1_2(2))-(t2_3(0,0)*t1_1(2)))
-		,"T3(i,j,k)-T3(j,i,k)(0,0,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(j,i)*t1_1(k)))(0,1,0)
-		- ((t2_2(0,1)*t1_2(0))-(t2_3(1,0)*t1_1(0)))
-		,"T3(i,j,k)-T3(j,i,k)(0,1,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(j,i)*t1_1(k)))(0,1,1)
-		- ((t2_2(0,1)*t1_2(1))-(t2_3(1,0)*t1_1(1)))
-		,"T3(i,j,k)-T3(j,i,k)(0,1,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(j,i)*t1_1(k)))(0,1,2)
-		- ((t2_2(0,1)*t1_2(2))-(t2_3(1,0)*t1_1(2)))
-		,"T3(i,j,k)-T3(j,i,k)(0,1,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(j,i)*t1_1(k)))(0,2,0)
-		- ((t2_2(0,2)*t1_2(0))-(t2_3(2,0)*t1_1(0)))
-		,"T3(i,j,k)-T3(j,i,k)(0,2,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(j,i)*t1_1(k)))(0,2,1)
-		- ((t2_2(0,2)*t1_2(1))-(t2_3(2,0)*t1_1(1)))
-		,"T3(i,j,k)-T3(j,i,k)(0,2,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(j,i)*t1_1(k)))(0,2,2)
-		- ((t2_2(0,2)*t1_2(2))-(t2_3(2,0)*t1_1(2)))
-		,"T3(i,j,k)-T3(j,i,k)(0,2,2)");
-
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(k,i)*t1_1(j)))(0,0,0)
-		- ((t2_2(0,0)*t1_2(0))-(t2_3(0,0)*t1_1(0)))
-		,"T3(i,j,k)-T3(k,i,j)(0,0,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(k,i)*t1_1(j)))(0,0,1)
-		- ((t2_2(0,0)*t1_2(1))-(t2_3(1,0)*t1_1(0)))
-		,"T3(i,j,k)-T3(k,i,j)(0,0,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(k,i)*t1_1(j)))(0,0,2)
-		- ((t2_2(0,0)*t1_2(2))-(t2_3(2,0)*t1_1(0)))
-		,"T3(i,j,k)-T3(k,i,j)(0,0,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(k,i)*t1_1(j)))(0,1,0)
-		- ((t2_2(0,1)*t1_2(0))-(t2_3(0,0)*t1_1(1)))
-		,"T3(i,j,k)-T3(k,i,j)(0,1,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(k,i)*t1_1(j)))(0,1,1)
-		- ((t2_2(0,1)*t1_2(1))-(t2_3(1,0)*t1_1(1)))
-		,"T3(i,j,k)-T3(k,i,j)(0,1,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(k,i)*t1_1(j)))(0,1,2)
-		- ((t2_2(0,1)*t1_2(2))-(t2_3(2,0)*t1_1(1)))
-		,"T3(i,j,k)-T3(k,i,j)(0,1,2)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(k,i)*t1_1(j)))(0,2,0)
-		- ((t2_2(0,2)*t1_2(0))-(t2_3(0,0)*t1_1(2)))
-		,"T3(i,j,k)-T3(k,i,j)(0,2,0)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(k,i)*t1_1(j)))(0,2,1)
-		- ((t2_2(0,2)*t1_2(1))-(t2_3(1,0)*t1_1(2)))
-		,"T3(i,j,k)-T3(k,i,j)(0,2,1)");
-  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(k,i)*t1_1(j)))(0,2,2)
-		- ((t2_2(0,2)*t1_2(2))-(t2_3(2,0)*t1_1(2)))
-		,"T3(i,j,k)-T3(k,i,j)(0,2,2)");
-
-  t3dg_1(j,k,i)=(t2_2(i,j)*t1_2(k)) || (t2_2(i,k)*t1_2(j));
-  test_for_zero(t3dg_1(0,0,0) - (t2_2(0,0)*t1_2(0) + t2_2(0,0)*t1_2(0))
-		,"T3(i,j,k)||T3(i,k,j)(0,0,0)");
-  test_for_zero(t3dg_1(0,1,0) - (t2_2(0,0)*t1_2(1) + t2_2(0,1)*t1_2(0))
-		,"T3(i,j,k)||T3(i,k,j)(0,0,1)");
-  test_for_zero(t3dg_1(0,2,0) - (t2_2(0,0)*t1_2(2) + t2_2(0,2)*t1_2(0))
-		,"T3(i,j,k)||T3(i,k,j)(0,0,2)");
-  test_for_zero(t3dg_1(1,0,0) - (t2_2(0,1)*t1_2(0) + t2_2(0,0)*t1_2(1))
-		,"T3(i,j,k)||T3(i,k,j)(0,1,0)");
-  test_for_zero(t3dg_1(1,1,0) - (t2_2(0,1)*t1_2(1) + t2_2(0,1)*t1_2(1))
-		,"T3(i,j,k)||T3(i,k,j)(0,1,1)");
-  test_for_zero(t3dg_1(1,2,0) - (t2_2(0,1)*t1_2(2) + t2_2(0,2)*t1_2(1))
-		,"T3(i,j,k)||T3(i,k,j)(0,1,2)");
-  test_for_zero(t3dg_1(2,0,0) - (t2_2(0,2)*t1_2(0) + t2_2(0,0)*t1_2(2))
-		,"T3(i,j,k)||T3(i,k,j)(0,2,0)");
-  test_for_zero(t3dg_1(2,1,0) - (t2_2(0,2)*t1_2(1) + t2_2(0,1)*t1_2(2))
-		,"T3(i,j,k)||T3(i,k,j)(0,2,1)");
-  test_for_zero(t3dg_1(2,2,0) - (t2_2(0,2)*t1_2(2) + t2_2(0,2)*t1_2(2))
-		,"T3(i,j,k)||T3(i,k,j)(0,2,2)");
-  test_for_zero(t3dg_1(0,0,1) - (t2_2(1,0)*t1_2(0) + t2_2(1,0)*t1_2(0))
-		,"T3(i,j,k)||T3(i,k,j)(1,0,0)");
-  test_for_zero(t3dg_1(0,1,1) - (t2_2(1,0)*t1_2(1) + t2_2(1,1)*t1_2(0))
-		,"T3(i,j,k)||T3(i,k,j)(1,0,1)");
-  test_for_zero(t3dg_1(0,2,1) - (t2_2(1,0)*t1_2(2) + t2_2(1,2)*t1_2(0))
-		,"T3(i,j,k)||T3(i,k,j)(1,0,2)");
-  test_for_zero(t3dg_1(1,0,1) - (t2_2(1,1)*t1_2(0) + t2_2(1,0)*t1_2(1))
-		,"T3(i,j,k)||T3(i,k,j)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - (t2_2(1,1)*t1_2(1) + t2_2(1,1)*t1_2(1))
-		,"T3(i,j,k)||T3(i,k,j)(1,1,1)");
-  test_for_zero(t3dg_1(1,2,1) - (t2_2(1,1)*t1_2(2) + t2_2(1,2)*t1_2(1))
-		,"T3(i,j,k)||T3(i,k,j)(1,1,2)");
-  test_for_zero(t3dg_1(2,0,1) - (t2_2(1,2)*t1_2(0) + t2_2(1,0)*t1_2(2))
-		,"T3(i,j,k)||T3(i,k,j)(1,2,0)");
-  test_for_zero(t3dg_1(2,1,1) - (t2_2(1,2)*t1_2(1) + t2_2(1,1)*t1_2(2))
-		,"T3(i,j,k)||T3(i,k,j)(1,2,1)");
-  test_for_zero(t3dg_1(2,2,1) - (t2_2(1,2)*t1_2(2) + t2_2(1,2)*t1_2(2))
-		,"T3(i,j,k)||T3(i,k,j)(1,2,2)");
-  test_for_zero(t3dg_1(0,0,2) - (t2_2(2,0)*t1_2(0) + t2_2(2,0)*t1_2(0))
-		,"T3(i,j,k)||T3(i,k,j)(2,0,0)");
-  test_for_zero(t3dg_1(0,1,2) - (t2_2(2,0)*t1_2(1) + t2_2(2,1)*t1_2(0))
-		,"T3(i,j,k)||T3(i,k,j)(2,0,1)");
-  test_for_zero(t3dg_1(0,2,2) - (t2_2(2,0)*t1_2(2) + t2_2(2,2)*t1_2(0))
-		,"T3(i,j,k)||T3(i,k,j)(2,0,2)");
-  test_for_zero(t3dg_1(1,0,2) - (t2_2(2,1)*t1_2(0) + t2_2(2,0)*t1_2(1))
-		,"T3(i,j,k)||T3(i,k,j)(2,1,0)");
-  test_for_zero(t3dg_1(1,1,2) - (t2_2(2,1)*t1_2(1) + t2_2(2,1)*t1_2(1))
-		,"T3(i,j,k)||T3(i,k,j)(2,1,1)");
-  test_for_zero(t3dg_1(1,2,2) - (t2_2(2,1)*t1_2(2) + t2_2(2,2)*t1_2(1))
-		,"T3(i,j,k)||T3(i,k,j)(2,1,2)");
-  test_for_zero(t3dg_1(2,0,2) - (t2_2(2,2)*t1_2(0) + t2_2(2,0)*t1_2(2))
-		,"T3(i,j,k)||T3(i,k,j)(2,2,0)");
-  test_for_zero(t3dg_1(2,1,2) - (t2_2(2,2)*t1_2(1) + t2_2(2,1)*t1_2(2))
-		,"T3(i,j,k)||T3(i,k,j)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - (t2_2(2,2)*t1_2(2) + t2_2(2,2)*t1_2(2))
-		,"T3(i,j,k)||T3(i,k,j)(2,2,2)");
-  t3dg_1(i,k,j)=(t2_2(i,j)*t1_2(k)) || (t2_2(k,j)*t1_2(i));
-  test_for_zero(t3dg_1(0,0,0) - (t2_2(0,0)*t1_2(0) + t2_2(0,0)*t1_2(0))
-		,"T3(i,j,k)||T3(k,j,i)(0,0,0)");
-  test_for_zero(t3dg_1(0,1,0) - (t2_2(0,0)*t1_2(1) + t2_2(1,0)*t1_2(0))
-		,"T3(i,j,k)||T3(k,j,i)(0,0,1)");
-  test_for_zero(t3dg_1(0,2,0) - (t2_2(0,0)*t1_2(2) + t2_2(2,0)*t1_2(0))
-		,"T3(i,j,k)||T3(k,j,i)(0,0,2)");
-  test_for_zero(t3dg_1(0,0,1) - (t2_2(0,1)*t1_2(0) + t2_2(0,1)*t1_2(0))
-		,"T3(i,j,k)||T3(k,j,i)(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - (t2_2(0,1)*t1_2(1) + t2_2(1,1)*t1_2(0))
-		,"T3(i,j,k)||T3(k,j,i)(0,1,1)");
-  test_for_zero(t3dg_1(0,2,1) - (t2_2(0,1)*t1_2(2) + t2_2(2,1)*t1_2(0))
-		,"T3(i,j,k)||T3(k,j,i)(0,1,2)");
-  test_for_zero(t3dg_1(0,0,2) - (t2_2(0,2)*t1_2(0) + t2_2(0,2)*t1_2(0))
-		,"T3(i,j,k)||T3(k,j,i)(0,2,0)");
-  test_for_zero(t3dg_1(0,1,2) - (t2_2(0,2)*t1_2(1) + t2_2(1,2)*t1_2(0))
-		,"T3(i,j,k)||T3(k,j,i)(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - (t2_2(0,2)*t1_2(2) + t2_2(2,2)*t1_2(0))
-		,"T3(i,j,k)||T3(k,j,i)(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - (t2_2(1,0)*t1_2(0) + t2_2(0,0)*t1_2(1))
-		,"T3(i,j,k)||T3(k,j,i)(1,0,0)");
-  test_for_zero(t3dg_1(1,1,0) - (t2_2(1,0)*t1_2(1) + t2_2(1,0)*t1_2(1))
-		,"T3(i,j,k)||T3(k,j,i)(1,0,1)");
-  test_for_zero(t3dg_1(1,2,0) - (t2_2(1,0)*t1_2(2) + t2_2(2,0)*t1_2(1))
-		,"T3(i,j,k)||T3(k,j,i)(1,0,2)");
-  test_for_zero(t3dg_1(1,0,1) - (t2_2(1,1)*t1_2(0) + t2_2(0,1)*t1_2(1))
-		,"T3(i,j,k)||T3(k,j,i)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - (t2_2(1,1)*t1_2(1) + t2_2(1,1)*t1_2(1))
-		,"T3(i,j,k)||T3(k,j,i)(1,1,1)");
-  test_for_zero(t3dg_1(1,2,1) - (t2_2(1,1)*t1_2(2) + t2_2(2,1)*t1_2(1))
-		,"T3(i,j,k)||T3(k,j,i)(1,1,2)");
-  test_for_zero(t3dg_1(1,0,2) - (t2_2(1,2)*t1_2(0) + t2_2(0,2)*t1_2(1))
-		,"T3(i,j,k)||T3(k,j,i)(1,2,0)");
-  test_for_zero(t3dg_1(1,1,2) - (t2_2(1,2)*t1_2(1) + t2_2(1,2)*t1_2(1))
-		,"T3(i,j,k)||T3(k,j,i)(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - (t2_2(1,2)*t1_2(2) + t2_2(2,2)*t1_2(1))
-		,"T3(i,j,k)||T3(k,j,i)(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - (t2_2(2,0)*t1_2(0) + t2_2(0,0)*t1_2(2))
-		,"T3(i,j,k)||T3(k,j,i)(2,0,0)");
-  test_for_zero(t3dg_1(2,1,0) - (t2_2(2,0)*t1_2(1) + t2_2(1,0)*t1_2(2))
-		,"T3(i,j,k)||T3(k,j,i)(2,0,1)");
-  test_for_zero(t3dg_1(2,2,0) - (t2_2(2,0)*t1_2(2) + t2_2(2,0)*t1_2(2))
-		,"T3(i,j,k)||T3(k,j,i)(2,0,2)");
-  test_for_zero(t3dg_1(2,0,1) - (t2_2(2,1)*t1_2(0) + t2_2(0,1)*t1_2(2))
-		,"T3(i,j,k)||T3(k,j,i)(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - (t2_2(2,1)*t1_2(1) + t2_2(1,1)*t1_2(2))
-		,"T3(i,j,k)||T3(k,j,i)(2,1,1)");
-  test_for_zero(t3dg_1(2,2,1) - (t2_2(2,1)*t1_2(2) + t2_2(2,1)*t1_2(2))
-		,"T3(i,j,k)||T3(k,j,i)(2,1,2)");
-  test_for_zero(t3dg_1(2,0,2) - (t2_2(2,2)*t1_2(0) + t2_2(0,2)*t1_2(2))
-		,"T3(i,j,k)||T3(k,j,i)(2,2,0)");
-  test_for_zero(t3dg_1(2,1,2) - (t2_2(2,2)*t1_2(1) + t2_2(1,2)*t1_2(2))
-		,"T3(i,j,k)||T3(k,j,i)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - (t2_2(2,2)*t1_2(2) + t2_2(2,2)*t1_2(2))
-		,"T3(i,j,k)||T3(k,j,i)(2,2,2)");
-
-  cout << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3/test_T3II.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3/test_T3II.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,372 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3II(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,j)*t1_1(k)))(0,0,0)
+		- ((t2_2(0,0)*t1_2(0))+(t2_3(0,0)*t1_1(0)))
+		,"T3(i,j,k)+T3(i,j,k)(0,0,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,j)*t1_1(k)))(0,0,1)
+		- ((t2_2(0,0)*t1_2(1))+(t2_3(0,0)*t1_1(1)))
+		,"T3(i,j,k)+T3(i,j,k)(0,0,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,j)*t1_1(k)))(0,0,2)
+		- ((t2_2(0,0)*t1_2(2))+(t2_3(0,0)*t1_1(2)))
+		,"T3(i,j,k)+T3(i,j,k)(0,0,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,j)*t1_1(k)))(0,1,0)
+		- ((t2_2(0,1)*t1_2(0))+(t2_3(0,1)*t1_1(0)))
+		,"T3(i,j,k)+T3(i,j,k)(0,1,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,j)*t1_1(k)))(0,1,1)
+		- ((t2_2(0,1)*t1_2(1))+(t2_3(0,1)*t1_1(1)))
+		,"T3(i,j,k)+T3(i,j,k)(0,1,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,j)*t1_1(k)))(0,1,2)
+		- ((t2_2(0,1)*t1_2(2))+(t2_3(0,1)*t1_1(2)))
+		,"T3(i,j,k)+T3(i,j,k)(0,1,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,j)*t1_1(k)))(0,2,0)
+		- ((t2_2(0,2)*t1_2(0))+(t2_3(0,2)*t1_1(0)))
+		,"T3(i,j,k)+T3(i,j,k)(0,2,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,j)*t1_1(k)))(0,2,1)
+		- ((t2_2(0,2)*t1_2(1))+(t2_3(0,2)*t1_1(1)))
+		,"T3(i,j,k)+T3(i,j,k)(0,2,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,j)*t1_1(k)))(0,2,2)
+		- ((t2_2(0,2)*t1_2(2))+(t2_3(0,2)*t1_1(2)))
+		,"T3(i,j,k)+T3(i,j,k)(0,2,2)");
+
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,k)*t1_1(j)))(0,0,0)
+		- ((t2_2(0,0)*t1_2(0))+(t2_3(0,0)*t1_1(0)))
+		,"T3(i,j,k)+T3(i,k,j)(0,0,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,k)*t1_1(j)))(0,0,1)
+		- ((t2_2(0,0)*t1_2(1))+(t2_3(0,1)*t1_1(0)))
+		,"T3(i,j,k)+T3(i,k,j)(0,0,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,k)*t1_1(j)))(0,0,2)
+		- ((t2_2(0,0)*t1_2(2))+(t2_3(0,2)*t1_1(0)))
+		,"T3(i,j,k)+T3(i,k,j)(0,0,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,k)*t1_1(j)))(0,1,0)
+		- ((t2_2(0,1)*t1_2(0))+(t2_3(0,0)*t1_1(1)))
+		,"T3(i,j,k)+T3(i,k,j)(0,1,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,k)*t1_1(j)))(0,1,1)
+		- ((t2_2(0,1)*t1_2(1))+(t2_3(0,1)*t1_1(1)))
+		,"T3(i,j,k)+T3(i,k,j)(0,1,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,k)*t1_1(j)))(0,1,2)
+		- ((t2_2(0,1)*t1_2(2))+(t2_3(0,2)*t1_1(1)))
+		,"T3(i,j,k)+T3(i,k,j)(0,1,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,k)*t1_1(j)))(0,2,0)
+		- ((t2_2(0,2)*t1_2(0))+(t2_3(0,0)*t1_1(2)))
+		,"T3(i,j,k)+T3(i,k,j)(0,2,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,k)*t1_1(j)))(0,2,1)
+		- ((t2_2(0,2)*t1_2(1))+(t2_3(0,1)*t1_1(2)))
+		,"T3(i,j,k)+T3(i,k,j)(0,2,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(i,k)*t1_1(j)))(0,2,2)
+		- ((t2_2(0,2)*t1_2(2))+(t2_3(0,2)*t1_1(2)))
+		,"T3(i,j,k)+T3(i,k,j)(0,2,2)");
+
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(j,i)*t1_1(k)))(0,0,0)
+		- ((t2_2(0,0)*t1_2(0))+(t2_3(0,0)*t1_1(0)))
+		,"T3(i,j,k)+T3(j,i,k)(0,0,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(j,i)*t1_1(k)))(0,0,1)
+		- ((t2_2(0,0)*t1_2(1))+(t2_3(0,0)*t1_1(1)))
+		,"T3(i,j,k)+T3(j,i,k)(0,0,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(j,i)*t1_1(k)))(0,0,2)
+		- ((t2_2(0,0)*t1_2(2))+(t2_3(0,0)*t1_1(2)))
+		,"T3(i,j,k)+T3(j,i,k)(0,0,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(j,i)*t1_1(k)))(0,1,0)
+		- ((t2_2(0,1)*t1_2(0))+(t2_3(1,0)*t1_1(0)))
+		,"T3(i,j,k)+T3(j,i,k)(0,1,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(j,i)*t1_1(k)))(0,1,1)
+		- ((t2_2(0,1)*t1_2(1))+(t2_3(1,0)*t1_1(1)))
+		,"T3(i,j,k)+T3(j,i,k)(0,1,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(j,i)*t1_1(k)))(0,1,2)
+		- ((t2_2(0,1)*t1_2(2))+(t2_3(1,0)*t1_1(2)))
+		,"T3(i,j,k)+T3(j,i,k)(0,1,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(j,i)*t1_1(k)))(0,2,0)
+		- ((t2_2(0,2)*t1_2(0))+(t2_3(2,0)*t1_1(0)))
+		,"T3(i,j,k)+T3(j,i,k)(0,2,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(j,i)*t1_1(k)))(0,2,1)
+		- ((t2_2(0,2)*t1_2(1))+(t2_3(2,0)*t1_1(1)))
+		,"T3(i,j,k)+T3(j,i,k)(0,2,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(j,i)*t1_1(k)))(0,2,2)
+		- ((t2_2(0,2)*t1_2(2))+(t2_3(2,0)*t1_1(2)))
+		,"T3(i,j,k)+T3(j,i,k)(0,2,2)");
+
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(k,i)*t1_1(j)))(0,0,0)
+		- ((t2_2(0,0)*t1_2(0))+(t2_3(0,0)*t1_1(0)))
+		,"T3(i,j,k)+T3(k,i,j)(0,0,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(k,i)*t1_1(j)))(0,0,1)
+		- ((t2_2(0,0)*t1_2(1))+(t2_3(1,0)*t1_1(0)))
+		,"T3(i,j,k)+T3(k,i,j)(0,0,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(k,i)*t1_1(j)))(0,0,2)
+		- ((t2_2(0,0)*t1_2(2))+(t2_3(2,0)*t1_1(0)))
+		,"T3(i,j,k)+T3(k,i,j)(0,0,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(k,i)*t1_1(j)))(0,1,0)
+		- ((t2_2(0,1)*t1_2(0))+(t2_3(0,0)*t1_1(1)))
+		,"T3(i,j,k)+T3(k,i,j)(0,1,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(k,i)*t1_1(j)))(0,1,1)
+		- ((t2_2(0,1)*t1_2(1))+(t2_3(1,0)*t1_1(1)))
+		,"T3(i,j,k)+T3(k,i,j)(0,1,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(k,i)*t1_1(j)))(0,1,2)
+		- ((t2_2(0,1)*t1_2(2))+(t2_3(2,0)*t1_1(1)))
+		,"T3(i,j,k)+T3(k,i,j)(0,1,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(k,i)*t1_1(j)))(0,2,0)
+		- ((t2_2(0,2)*t1_2(0))+(t2_3(0,0)*t1_1(2)))
+		,"T3(i,j,k)+T3(k,i,j)(0,2,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(k,i)*t1_1(j)))(0,2,1)
+		- ((t2_2(0,2)*t1_2(1))+(t2_3(1,0)*t1_1(2)))
+		,"T3(i,j,k)+T3(k,i,j)(0,2,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))+(t2_3(k,i)*t1_1(j)))(0,2,2)
+		- ((t2_2(0,2)*t1_2(2))+(t2_3(2,0)*t1_1(2)))
+		,"T3(i,j,k)+T3(k,i,j)(0,2,2)");
+
+
+
+
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,j)*t1_1(k)))(0,0,0)
+		- ((t2_2(0,0)*t1_2(0))-(t2_3(0,0)*t1_1(0)))
+		,"T3(i,j,k)-T3(i,j,k)(0,0,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,j)*t1_1(k)))(0,0,1)
+		- ((t2_2(0,0)*t1_2(1))-(t2_3(0,0)*t1_1(1)))
+		,"T3(i,j,k)-T3(i,j,k)(0,0,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,j)*t1_1(k)))(0,0,2)
+		- ((t2_2(0,0)*t1_2(2))-(t2_3(0,0)*t1_1(2)))
+		,"T3(i,j,k)-T3(i,j,k)(0,0,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,j)*t1_1(k)))(0,1,0)
+		- ((t2_2(0,1)*t1_2(0))-(t2_3(0,1)*t1_1(0)))
+		,"T3(i,j,k)-T3(i,j,k)(0,1,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,j)*t1_1(k)))(0,1,1)
+		- ((t2_2(0,1)*t1_2(1))-(t2_3(0,1)*t1_1(1)))
+		,"T3(i,j,k)-T3(i,j,k)(0,1,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,j)*t1_1(k)))(0,1,2)
+		- ((t2_2(0,1)*t1_2(2))-(t2_3(0,1)*t1_1(2)))
+		,"T3(i,j,k)-T3(i,j,k)(0,1,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,j)*t1_1(k)))(0,2,0)
+		- ((t2_2(0,2)*t1_2(0))-(t2_3(0,2)*t1_1(0)))
+		,"T3(i,j,k)-T3(i,j,k)(0,2,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,j)*t1_1(k)))(0,2,1)
+		- ((t2_2(0,2)*t1_2(1))-(t2_3(0,2)*t1_1(1)))
+		,"T3(i,j,k)-T3(i,j,k)(0,2,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,j)*t1_1(k)))(0,2,2)
+		- ((t2_2(0,2)*t1_2(2))-(t2_3(0,2)*t1_1(2)))
+		,"T3(i,j,k)-T3(i,j,k)(0,2,2)");
+
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,k)*t1_1(j)))(0,0,0)
+		- ((t2_2(0,0)*t1_2(0))-(t2_3(0,0)*t1_1(0)))
+		,"T3(i,j,k)-T3(i,k,j)(0,0,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,k)*t1_1(j)))(0,0,1)
+		- ((t2_2(0,0)*t1_2(1))-(t2_3(0,1)*t1_1(0)))
+		,"T3(i,j,k)-T3(i,k,j)(0,0,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,k)*t1_1(j)))(0,0,2)
+		- ((t2_2(0,0)*t1_2(2))-(t2_3(0,2)*t1_1(0)))
+		,"T3(i,j,k)-T3(i,k,j)(0,0,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,k)*t1_1(j)))(0,1,0)
+		- ((t2_2(0,1)*t1_2(0))-(t2_3(0,0)*t1_1(1)))
+		,"T3(i,j,k)-T3(i,k,j)(0,1,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,k)*t1_1(j)))(0,1,1)
+		- ((t2_2(0,1)*t1_2(1))-(t2_3(0,1)*t1_1(1)))
+		,"T3(i,j,k)-T3(i,k,j)(0,1,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,k)*t1_1(j)))(0,1,2)
+		- ((t2_2(0,1)*t1_2(2))-(t2_3(0,2)*t1_1(1)))
+		,"T3(i,j,k)-T3(i,k,j)(0,1,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,k)*t1_1(j)))(0,2,0)
+		- ((t2_2(0,2)*t1_2(0))-(t2_3(0,0)*t1_1(2)))
+		,"T3(i,j,k)-T3(i,k,j)(0,2,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,k)*t1_1(j)))(0,2,1)
+		- ((t2_2(0,2)*t1_2(1))-(t2_3(0,1)*t1_1(2)))
+		,"T3(i,j,k)-T3(i,k,j)(0,2,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(i,k)*t1_1(j)))(0,2,2)
+		- ((t2_2(0,2)*t1_2(2))-(t2_3(0,2)*t1_1(2)))
+		,"T3(i,j,k)-T3(i,k,j)(0,2,2)");
+
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(j,i)*t1_1(k)))(0,0,0)
+		- ((t2_2(0,0)*t1_2(0))-(t2_3(0,0)*t1_1(0)))
+		,"T3(i,j,k)-T3(j,i,k)(0,0,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(j,i)*t1_1(k)))(0,0,1)
+		- ((t2_2(0,0)*t1_2(1))-(t2_3(0,0)*t1_1(1)))
+		,"T3(i,j,k)-T3(j,i,k)(0,0,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(j,i)*t1_1(k)))(0,0,2)
+		- ((t2_2(0,0)*t1_2(2))-(t2_3(0,0)*t1_1(2)))
+		,"T3(i,j,k)-T3(j,i,k)(0,0,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(j,i)*t1_1(k)))(0,1,0)
+		- ((t2_2(0,1)*t1_2(0))-(t2_3(1,0)*t1_1(0)))
+		,"T3(i,j,k)-T3(j,i,k)(0,1,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(j,i)*t1_1(k)))(0,1,1)
+		- ((t2_2(0,1)*t1_2(1))-(t2_3(1,0)*t1_1(1)))
+		,"T3(i,j,k)-T3(j,i,k)(0,1,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(j,i)*t1_1(k)))(0,1,2)
+		- ((t2_2(0,1)*t1_2(2))-(t2_3(1,0)*t1_1(2)))
+		,"T3(i,j,k)-T3(j,i,k)(0,1,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(j,i)*t1_1(k)))(0,2,0)
+		- ((t2_2(0,2)*t1_2(0))-(t2_3(2,0)*t1_1(0)))
+		,"T3(i,j,k)-T3(j,i,k)(0,2,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(j,i)*t1_1(k)))(0,2,1)
+		- ((t2_2(0,2)*t1_2(1))-(t2_3(2,0)*t1_1(1)))
+		,"T3(i,j,k)-T3(j,i,k)(0,2,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(j,i)*t1_1(k)))(0,2,2)
+		- ((t2_2(0,2)*t1_2(2))-(t2_3(2,0)*t1_1(2)))
+		,"T3(i,j,k)-T3(j,i,k)(0,2,2)");
+
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(k,i)*t1_1(j)))(0,0,0)
+		- ((t2_2(0,0)*t1_2(0))-(t2_3(0,0)*t1_1(0)))
+		,"T3(i,j,k)-T3(k,i,j)(0,0,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(k,i)*t1_1(j)))(0,0,1)
+		- ((t2_2(0,0)*t1_2(1))-(t2_3(1,0)*t1_1(0)))
+		,"T3(i,j,k)-T3(k,i,j)(0,0,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(k,i)*t1_1(j)))(0,0,2)
+		- ((t2_2(0,0)*t1_2(2))-(t2_3(2,0)*t1_1(0)))
+		,"T3(i,j,k)-T3(k,i,j)(0,0,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(k,i)*t1_1(j)))(0,1,0)
+		- ((t2_2(0,1)*t1_2(0))-(t2_3(0,0)*t1_1(1)))
+		,"T3(i,j,k)-T3(k,i,j)(0,1,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(k,i)*t1_1(j)))(0,1,1)
+		- ((t2_2(0,1)*t1_2(1))-(t2_3(1,0)*t1_1(1)))
+		,"T3(i,j,k)-T3(k,i,j)(0,1,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(k,i)*t1_1(j)))(0,1,2)
+		- ((t2_2(0,1)*t1_2(2))-(t2_3(2,0)*t1_1(1)))
+		,"T3(i,j,k)-T3(k,i,j)(0,1,2)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(k,i)*t1_1(j)))(0,2,0)
+		- ((t2_2(0,2)*t1_2(0))-(t2_3(0,0)*t1_1(2)))
+		,"T3(i,j,k)-T3(k,i,j)(0,2,0)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(k,i)*t1_1(j)))(0,2,1)
+		- ((t2_2(0,2)*t1_2(1))-(t2_3(1,0)*t1_1(2)))
+		,"T3(i,j,k)-T3(k,i,j)(0,2,1)");
+  test_for_zero(((t2_2(i,j)*t1_2(k))-(t2_3(k,i)*t1_1(j)))(0,2,2)
+		- ((t2_2(0,2)*t1_2(2))-(t2_3(2,0)*t1_1(2)))
+		,"T3(i,j,k)-T3(k,i,j)(0,2,2)");
+
+  t3dg_1(j,k,i)=(t2_2(i,j)*t1_2(k)) || (t2_2(i,k)*t1_2(j));
+  test_for_zero(t3dg_1(0,0,0) - (t2_2(0,0)*t1_2(0) + t2_2(0,0)*t1_2(0))
+		,"T3(i,j,k)||T3(i,k,j)(0,0,0)");
+  test_for_zero(t3dg_1(0,1,0) - (t2_2(0,0)*t1_2(1) + t2_2(0,1)*t1_2(0))
+		,"T3(i,j,k)||T3(i,k,j)(0,0,1)");
+  test_for_zero(t3dg_1(0,2,0) - (t2_2(0,0)*t1_2(2) + t2_2(0,2)*t1_2(0))
+		,"T3(i,j,k)||T3(i,k,j)(0,0,2)");
+  test_for_zero(t3dg_1(1,0,0) - (t2_2(0,1)*t1_2(0) + t2_2(0,0)*t1_2(1))
+		,"T3(i,j,k)||T3(i,k,j)(0,1,0)");
+  test_for_zero(t3dg_1(1,1,0) - (t2_2(0,1)*t1_2(1) + t2_2(0,1)*t1_2(1))
+		,"T3(i,j,k)||T3(i,k,j)(0,1,1)");
+  test_for_zero(t3dg_1(1,2,0) - (t2_2(0,1)*t1_2(2) + t2_2(0,2)*t1_2(1))
+		,"T3(i,j,k)||T3(i,k,j)(0,1,2)");
+  test_for_zero(t3dg_1(2,0,0) - (t2_2(0,2)*t1_2(0) + t2_2(0,0)*t1_2(2))
+		,"T3(i,j,k)||T3(i,k,j)(0,2,0)");
+  test_for_zero(t3dg_1(2,1,0) - (t2_2(0,2)*t1_2(1) + t2_2(0,1)*t1_2(2))
+		,"T3(i,j,k)||T3(i,k,j)(0,2,1)");
+  test_for_zero(t3dg_1(2,2,0) - (t2_2(0,2)*t1_2(2) + t2_2(0,2)*t1_2(2))
+		,"T3(i,j,k)||T3(i,k,j)(0,2,2)");
+  test_for_zero(t3dg_1(0,0,1) - (t2_2(1,0)*t1_2(0) + t2_2(1,0)*t1_2(0))
+		,"T3(i,j,k)||T3(i,k,j)(1,0,0)");
+  test_for_zero(t3dg_1(0,1,1) - (t2_2(1,0)*t1_2(1) + t2_2(1,1)*t1_2(0))
+		,"T3(i,j,k)||T3(i,k,j)(1,0,1)");
+  test_for_zero(t3dg_1(0,2,1) - (t2_2(1,0)*t1_2(2) + t2_2(1,2)*t1_2(0))
+		,"T3(i,j,k)||T3(i,k,j)(1,0,2)");
+  test_for_zero(t3dg_1(1,0,1) - (t2_2(1,1)*t1_2(0) + t2_2(1,0)*t1_2(1))
+		,"T3(i,j,k)||T3(i,k,j)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - (t2_2(1,1)*t1_2(1) + t2_2(1,1)*t1_2(1))
+		,"T3(i,j,k)||T3(i,k,j)(1,1,1)");
+  test_for_zero(t3dg_1(1,2,1) - (t2_2(1,1)*t1_2(2) + t2_2(1,2)*t1_2(1))
+		,"T3(i,j,k)||T3(i,k,j)(1,1,2)");
+  test_for_zero(t3dg_1(2,0,1) - (t2_2(1,2)*t1_2(0) + t2_2(1,0)*t1_2(2))
+		,"T3(i,j,k)||T3(i,k,j)(1,2,0)");
+  test_for_zero(t3dg_1(2,1,1) - (t2_2(1,2)*t1_2(1) + t2_2(1,1)*t1_2(2))
+		,"T3(i,j,k)||T3(i,k,j)(1,2,1)");
+  test_for_zero(t3dg_1(2,2,1) - (t2_2(1,2)*t1_2(2) + t2_2(1,2)*t1_2(2))
+		,"T3(i,j,k)||T3(i,k,j)(1,2,2)");
+  test_for_zero(t3dg_1(0,0,2) - (t2_2(2,0)*t1_2(0) + t2_2(2,0)*t1_2(0))
+		,"T3(i,j,k)||T3(i,k,j)(2,0,0)");
+  test_for_zero(t3dg_1(0,1,2) - (t2_2(2,0)*t1_2(1) + t2_2(2,1)*t1_2(0))
+		,"T3(i,j,k)||T3(i,k,j)(2,0,1)");
+  test_for_zero(t3dg_1(0,2,2) - (t2_2(2,0)*t1_2(2) + t2_2(2,2)*t1_2(0))
+		,"T3(i,j,k)||T3(i,k,j)(2,0,2)");
+  test_for_zero(t3dg_1(1,0,2) - (t2_2(2,1)*t1_2(0) + t2_2(2,0)*t1_2(1))
+		,"T3(i,j,k)||T3(i,k,j)(2,1,0)");
+  test_for_zero(t3dg_1(1,1,2) - (t2_2(2,1)*t1_2(1) + t2_2(2,1)*t1_2(1))
+		,"T3(i,j,k)||T3(i,k,j)(2,1,1)");
+  test_for_zero(t3dg_1(1,2,2) - (t2_2(2,1)*t1_2(2) + t2_2(2,2)*t1_2(1))
+		,"T3(i,j,k)||T3(i,k,j)(2,1,2)");
+  test_for_zero(t3dg_1(2,0,2) - (t2_2(2,2)*t1_2(0) + t2_2(2,0)*t1_2(2))
+		,"T3(i,j,k)||T3(i,k,j)(2,2,0)");
+  test_for_zero(t3dg_1(2,1,2) - (t2_2(2,2)*t1_2(1) + t2_2(2,1)*t1_2(2))
+		,"T3(i,j,k)||T3(i,k,j)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - (t2_2(2,2)*t1_2(2) + t2_2(2,2)*t1_2(2))
+		,"T3(i,j,k)||T3(i,k,j)(2,2,2)");
+  t3dg_1(i,k,j)=(t2_2(i,j)*t1_2(k)) || (t2_2(k,j)*t1_2(i));
+  test_for_zero(t3dg_1(0,0,0) - (t2_2(0,0)*t1_2(0) + t2_2(0,0)*t1_2(0))
+		,"T3(i,j,k)||T3(k,j,i)(0,0,0)");
+  test_for_zero(t3dg_1(0,1,0) - (t2_2(0,0)*t1_2(1) + t2_2(1,0)*t1_2(0))
+		,"T3(i,j,k)||T3(k,j,i)(0,0,1)");
+  test_for_zero(t3dg_1(0,2,0) - (t2_2(0,0)*t1_2(2) + t2_2(2,0)*t1_2(0))
+		,"T3(i,j,k)||T3(k,j,i)(0,0,2)");
+  test_for_zero(t3dg_1(0,0,1) - (t2_2(0,1)*t1_2(0) + t2_2(0,1)*t1_2(0))
+		,"T3(i,j,k)||T3(k,j,i)(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - (t2_2(0,1)*t1_2(1) + t2_2(1,1)*t1_2(0))
+		,"T3(i,j,k)||T3(k,j,i)(0,1,1)");
+  test_for_zero(t3dg_1(0,2,1) - (t2_2(0,1)*t1_2(2) + t2_2(2,1)*t1_2(0))
+		,"T3(i,j,k)||T3(k,j,i)(0,1,2)");
+  test_for_zero(t3dg_1(0,0,2) - (t2_2(0,2)*t1_2(0) + t2_2(0,2)*t1_2(0))
+		,"T3(i,j,k)||T3(k,j,i)(0,2,0)");
+  test_for_zero(t3dg_1(0,1,2) - (t2_2(0,2)*t1_2(1) + t2_2(1,2)*t1_2(0))
+		,"T3(i,j,k)||T3(k,j,i)(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - (t2_2(0,2)*t1_2(2) + t2_2(2,2)*t1_2(0))
+		,"T3(i,j,k)||T3(k,j,i)(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - (t2_2(1,0)*t1_2(0) + t2_2(0,0)*t1_2(1))
+		,"T3(i,j,k)||T3(k,j,i)(1,0,0)");
+  test_for_zero(t3dg_1(1,1,0) - (t2_2(1,0)*t1_2(1) + t2_2(1,0)*t1_2(1))
+		,"T3(i,j,k)||T3(k,j,i)(1,0,1)");
+  test_for_zero(t3dg_1(1,2,0) - (t2_2(1,0)*t1_2(2) + t2_2(2,0)*t1_2(1))
+		,"T3(i,j,k)||T3(k,j,i)(1,0,2)");
+  test_for_zero(t3dg_1(1,0,1) - (t2_2(1,1)*t1_2(0) + t2_2(0,1)*t1_2(1))
+		,"T3(i,j,k)||T3(k,j,i)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - (t2_2(1,1)*t1_2(1) + t2_2(1,1)*t1_2(1))
+		,"T3(i,j,k)||T3(k,j,i)(1,1,1)");
+  test_for_zero(t3dg_1(1,2,1) - (t2_2(1,1)*t1_2(2) + t2_2(2,1)*t1_2(1))
+		,"T3(i,j,k)||T3(k,j,i)(1,1,2)");
+  test_for_zero(t3dg_1(1,0,2) - (t2_2(1,2)*t1_2(0) + t2_2(0,2)*t1_2(1))
+		,"T3(i,j,k)||T3(k,j,i)(1,2,0)");
+  test_for_zero(t3dg_1(1,1,2) - (t2_2(1,2)*t1_2(1) + t2_2(1,2)*t1_2(1))
+		,"T3(i,j,k)||T3(k,j,i)(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - (t2_2(1,2)*t1_2(2) + t2_2(2,2)*t1_2(1))
+		,"T3(i,j,k)||T3(k,j,i)(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - (t2_2(2,0)*t1_2(0) + t2_2(0,0)*t1_2(2))
+		,"T3(i,j,k)||T3(k,j,i)(2,0,0)");
+  test_for_zero(t3dg_1(2,1,0) - (t2_2(2,0)*t1_2(1) + t2_2(1,0)*t1_2(2))
+		,"T3(i,j,k)||T3(k,j,i)(2,0,1)");
+  test_for_zero(t3dg_1(2,2,0) - (t2_2(2,0)*t1_2(2) + t2_2(2,0)*t1_2(2))
+		,"T3(i,j,k)||T3(k,j,i)(2,0,2)");
+  test_for_zero(t3dg_1(2,0,1) - (t2_2(2,1)*t1_2(0) + t2_2(0,1)*t1_2(2))
+		,"T3(i,j,k)||T3(k,j,i)(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - (t2_2(2,1)*t1_2(1) + t2_2(1,1)*t1_2(2))
+		,"T3(i,j,k)||T3(k,j,i)(2,1,1)");
+  test_for_zero(t3dg_1(2,2,1) - (t2_2(2,1)*t1_2(2) + t2_2(2,1)*t1_2(2))
+		,"T3(i,j,k)||T3(k,j,i)(2,1,2)");
+  test_for_zero(t3dg_1(2,0,2) - (t2_2(2,2)*t1_2(0) + t2_2(0,2)*t1_2(2))
+		,"T3(i,j,k)||T3(k,j,i)(2,2,0)");
+  test_for_zero(t3dg_1(2,1,2) - (t2_2(2,2)*t1_2(1) + t2_2(1,2)*t1_2(2))
+		,"T3(i,j,k)||T3(k,j,i)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - (t2_2(2,2)*t1_2(2) + t2_2(2,2)*t1_2(2))
+		,"T3(i,j,k)||T3(k,j,i)(2,2,2)");
+
+  cout << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3as.C
--- a/tests/conformance/T3as/test_T3as.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,277 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-extern 
-void test_T3asI(const int &T, Tensor0<double*> &t0_1,
-	       const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
-
-extern 
-void test_T3asII(const int &T, Tensor0<double*> &t0_1,
-	       const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
-
-extern 
-void test_T3asIII(const int &T, Tensor0<double*> &t0_1,
-	       const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
-
-extern 
-void test_T3asIV(const int &T, Tensor0<double*> &t0_1,
-	       const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
-
-extern 
-void test_T3asV(const int &T, Tensor0<double*> &t0_1,
-	       const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
-
-extern 
-void test_T3asVI(const int &T, Tensor0<double*> &t0_1,
-	       const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
-
-extern 
-void test_T3asVII(const int &T, Tensor0<double*> &t0_1,
-	       const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
-
-extern 
-void test_T3asVIII(const int &T, Tensor0<double*> &t0_1,
-	       const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
-
-extern 
-void test_T3asIX(const int &T, Tensor0<double*> &t0_1,
-	       const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
-
-extern 
-void test_T3asX(const int &T, Tensor0<double*> &t0_1,
-	       const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
-
-extern 
-void test_T3asXI(const int &T, Tensor0<double*> &t0_1,
-	       const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
-
-extern 
-void test_T3asXII(const int &T, Tensor0<double*> &t0_1,
-	       const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
-
-extern 
-void test_T3asXIII(const int &T, Tensor0<double*> &t0_1,
-	       const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
-
-extern 
-void test_T3asXIV(const int &T, Tensor0<double*> &t0_1,
-	       const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
-
-
-
-void test_T3as(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
-{
-  test_T3asI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
-  test_T3asII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
-  test_T3asIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
-  test_T3asIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
-  test_T3asV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
-  test_T3asVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
-  test_T3asVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
-  test_T3asVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
-  test_T3asIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
-  test_T3asX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
-  test_T3asXI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
-  test_T3asXII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
-  test_T3asXIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
-  test_T3asXIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
-
-  cout << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3as.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3as/test_T3as.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,277 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+extern 
+void test_T3asI(const int &T, Tensor0<double*> &t0_1,
+	       const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
+
+extern 
+void test_T3asII(const int &T, Tensor0<double*> &t0_1,
+	       const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
+
+extern 
+void test_T3asIII(const int &T, Tensor0<double*> &t0_1,
+	       const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
+
+extern 
+void test_T3asIV(const int &T, Tensor0<double*> &t0_1,
+	       const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
+
+extern 
+void test_T3asV(const int &T, Tensor0<double*> &t0_1,
+	       const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
+
+extern 
+void test_T3asVI(const int &T, Tensor0<double*> &t0_1,
+	       const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
+
+extern 
+void test_T3asVII(const int &T, Tensor0<double*> &t0_1,
+	       const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
+
+extern 
+void test_T3asVIII(const int &T, Tensor0<double*> &t0_1,
+	       const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
+
+extern 
+void test_T3asIX(const int &T, Tensor0<double*> &t0_1,
+	       const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
+
+extern 
+void test_T3asX(const int &T, Tensor0<double*> &t0_1,
+	       const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
+
+extern 
+void test_T3asXI(const int &T, Tensor0<double*> &t0_1,
+	       const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
+
+extern 
+void test_T3asXII(const int &T, Tensor0<double*> &t0_1,
+	       const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
+
+extern 
+void test_T3asXIII(const int &T, Tensor0<double*> &t0_1,
+	       const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
+
+extern 
+void test_T3asXIV(const int &T, Tensor0<double*> &t0_1,
+	       const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
+
+
+
+void test_T3as(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
+{
+  test_T3asI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
+  test_T3asII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
+  test_T3asIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
+  test_T3asIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
+  test_T3asV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
+  test_T3asVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
+  test_T3asVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
+  test_T3asVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
+  test_T3asIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
+  test_T3asX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
+  test_T3asXI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
+  test_T3asXII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
+  test_T3asXIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
+  test_T3asXIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
+
+  cout << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asI.C
--- a/tests/conformance/T3as/test_T3asI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,88 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3asI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  t3as_1(i,j,k)=(t3dg_2(i,j,k) && t3dg_2(i,k,j));
-
-  test_for_zero(t3as_1(0,0,0) - (t3dg_2(0,0,0) - t3dg_2(0,0,0))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(0,0,0)");
-  test_for_zero(t3as_1(0,0,1) - (t3dg_2(0,0,1) - t3dg_2(0,1,0))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(0,0,1)");
-  test_for_zero(t3as_1(0,0,2) - (t3dg_2(0,0,2) - t3dg_2(0,2,0))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(0,0,2)");
-  test_for_zero(t3as_1(0,1,0) - (t3dg_2(0,1,0) - t3dg_2(0,0,1))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(0,1,0)");
-  test_for_zero(t3as_1(0,1,1) - (t3dg_2(0,1,1) - t3dg_2(0,1,1))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(0,1,1)");
-  test_for_zero(t3as_1(0,1,2) - (t3dg_2(0,1,2) - t3dg_2(0,2,1))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(0,1,2)");
-  test_for_zero(t3as_1(0,2,0) - (t3dg_2(0,2,0) - t3dg_2(0,0,2))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(0,2,0)");
-  test_for_zero(t3as_1(0,2,1) - (t3dg_2(0,2,1) - t3dg_2(0,1,2))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(0,2,1)");
-  test_for_zero(t3as_1(0,2,2) - (t3dg_2(0,2,2) - t3dg_2(0,2,2))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(0,2,2)");
-  test_for_zero(t3as_1(1,0,0) - (t3dg_2(1,0,0) - t3dg_2(1,0,0))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(1,0,0)");
-  test_for_zero(t3as_1(1,0,1) - (t3dg_2(1,0,1) - t3dg_2(1,1,0))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(1,0,1)");
-  test_for_zero(t3as_1(1,0,2) - (t3dg_2(1,0,2) - t3dg_2(1,2,0))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(1,0,2)");
-  test_for_zero(t3as_1(1,1,0) - (t3dg_2(1,1,0) - t3dg_2(1,0,1))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(1,1,0)");
-  test_for_zero(t3as_1(1,1,1) - (t3dg_2(1,1,1) - t3dg_2(1,1,1))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(1,1,1)");
-  test_for_zero(t3as_1(1,1,2) - (t3dg_2(1,1,2) - t3dg_2(1,2,1))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(1,1,2)");
-  test_for_zero(t3as_1(1,2,0) - (t3dg_2(1,2,0) - t3dg_2(1,0,2))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(1,2,0)");
-  test_for_zero(t3as_1(1,2,1) - (t3dg_2(1,2,1) - t3dg_2(1,1,2))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(1,2,1)");
-  test_for_zero(t3as_1(1,2,2) - (t3dg_2(1,2,2) - t3dg_2(1,2,2))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(1,2,2)");
-  test_for_zero(t3as_1(2,0,0) - (t3dg_2(2,0,0) - t3dg_2(2,0,0))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(2,0,0)");
-  test_for_zero(t3as_1(2,0,1) - (t3dg_2(2,0,1) - t3dg_2(2,1,0))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(2,0,1)");
-  test_for_zero(t3as_1(2,0,2) - (t3dg_2(2,0,2) - t3dg_2(2,2,0))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(2,0,2)");
-  test_for_zero(t3as_1(2,1,0) - (t3dg_2(2,1,0) - t3dg_2(2,0,1))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(2,1,0)");
-  test_for_zero(t3as_1(2,1,1) - (t3dg_2(2,1,1) - t3dg_2(2,1,1))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(2,1,1)");
-  test_for_zero(t3as_1(2,1,2) - (t3dg_2(2,1,2) - t3dg_2(2,2,1))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(2,1,2)");
-  test_for_zero(t3as_1(2,2,0) - (t3dg_2(2,2,0) - t3dg_2(2,0,2))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(2,2,0)");
-  test_for_zero(t3as_1(2,2,1) - (t3dg_2(2,2,1) - t3dg_2(2,1,2))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(2,2,1)");
-  test_for_zero(t3as_1(2,2,2) - (t3dg_2(2,2,2) - t3dg_2(2,2,2))
-		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(2,2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3as/test_T3asI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,88 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3asI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  t3as_1(i,j,k)=(t3dg_2(i,j,k) && t3dg_2(i,k,j));
+
+  test_for_zero(t3as_1(0,0,0) - (t3dg_2(0,0,0) - t3dg_2(0,0,0))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(0,0,0)");
+  test_for_zero(t3as_1(0,0,1) - (t3dg_2(0,0,1) - t3dg_2(0,1,0))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(0,0,1)");
+  test_for_zero(t3as_1(0,0,2) - (t3dg_2(0,0,2) - t3dg_2(0,2,0))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(0,0,2)");
+  test_for_zero(t3as_1(0,1,0) - (t3dg_2(0,1,0) - t3dg_2(0,0,1))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(0,1,0)");
+  test_for_zero(t3as_1(0,1,1) - (t3dg_2(0,1,1) - t3dg_2(0,1,1))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(0,1,1)");
+  test_for_zero(t3as_1(0,1,2) - (t3dg_2(0,1,2) - t3dg_2(0,2,1))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(0,1,2)");
+  test_for_zero(t3as_1(0,2,0) - (t3dg_2(0,2,0) - t3dg_2(0,0,2))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(0,2,0)");
+  test_for_zero(t3as_1(0,2,1) - (t3dg_2(0,2,1) - t3dg_2(0,1,2))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(0,2,1)");
+  test_for_zero(t3as_1(0,2,2) - (t3dg_2(0,2,2) - t3dg_2(0,2,2))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(0,2,2)");
+  test_for_zero(t3as_1(1,0,0) - (t3dg_2(1,0,0) - t3dg_2(1,0,0))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(1,0,0)");
+  test_for_zero(t3as_1(1,0,1) - (t3dg_2(1,0,1) - t3dg_2(1,1,0))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(1,0,1)");
+  test_for_zero(t3as_1(1,0,2) - (t3dg_2(1,0,2) - t3dg_2(1,2,0))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(1,0,2)");
+  test_for_zero(t3as_1(1,1,0) - (t3dg_2(1,1,0) - t3dg_2(1,0,1))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(1,1,0)");
+  test_for_zero(t3as_1(1,1,1) - (t3dg_2(1,1,1) - t3dg_2(1,1,1))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(1,1,1)");
+  test_for_zero(t3as_1(1,1,2) - (t3dg_2(1,1,2) - t3dg_2(1,2,1))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(1,1,2)");
+  test_for_zero(t3as_1(1,2,0) - (t3dg_2(1,2,0) - t3dg_2(1,0,2))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(1,2,0)");
+  test_for_zero(t3as_1(1,2,1) - (t3dg_2(1,2,1) - t3dg_2(1,1,2))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(1,2,1)");
+  test_for_zero(t3as_1(1,2,2) - (t3dg_2(1,2,2) - t3dg_2(1,2,2))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(1,2,2)");
+  test_for_zero(t3as_1(2,0,0) - (t3dg_2(2,0,0) - t3dg_2(2,0,0))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(2,0,0)");
+  test_for_zero(t3as_1(2,0,1) - (t3dg_2(2,0,1) - t3dg_2(2,1,0))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(2,0,1)");
+  test_for_zero(t3as_1(2,0,2) - (t3dg_2(2,0,2) - t3dg_2(2,2,0))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(2,0,2)");
+  test_for_zero(t3as_1(2,1,0) - (t3dg_2(2,1,0) - t3dg_2(2,0,1))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(2,1,0)");
+  test_for_zero(t3as_1(2,1,1) - (t3dg_2(2,1,1) - t3dg_2(2,1,1))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(2,1,1)");
+  test_for_zero(t3as_1(2,1,2) - (t3dg_2(2,1,2) - t3dg_2(2,2,1))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(2,1,2)");
+  test_for_zero(t3as_1(2,2,0) - (t3dg_2(2,2,0) - t3dg_2(2,0,2))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(2,2,0)");
+  test_for_zero(t3as_1(2,2,1) - (t3dg_2(2,2,1) - t3dg_2(2,1,2))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(2,2,1)");
+  test_for_zero(t3as_1(2,2,2) - (t3dg_2(2,2,2) - t3dg_2(2,2,2))
+		,"T3as(i,j,k)=T3dg(i,j,k) && T3dg(i,k,j)(2,2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asII.C
--- a/tests/conformance/T3as/test_T3asII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3asII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  t3as_1(j,i,k)=(t3dg_2(i,j,k) && t3dg_2(k,j,i));
-  test_for_zero(t3as_1(0,0,0) - (t3dg_2(0,0,0) - t3dg_2(0,0,0))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(0,0,0)");
-  test_for_zero(t3as_1(0,0,1) - (t3dg_2(0,0,1) - t3dg_2(1,0,0))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(0,0,1)");
-  test_for_zero(t3as_1(0,0,2) - (t3dg_2(0,0,2) - t3dg_2(2,0,0))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(0,0,2)");
-  test_for_zero(t3as_1(1,0,0) - (t3dg_2(0,1,0) - t3dg_2(0,1,0))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(0,1,0)");
-  test_for_zero(t3as_1(1,0,1) - (t3dg_2(0,1,1) - t3dg_2(1,1,0))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(0,1,1)");
-  test_for_zero(t3as_1(1,0,2) - (t3dg_2(0,1,2) - t3dg_2(2,1,0))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(0,1,2)");
-  test_for_zero(t3as_1(2,0,0) - (t3dg_2(0,2,0) - t3dg_2(0,2,0))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(0,2,0)");
-  test_for_zero(t3as_1(2,0,1) - (t3dg_2(0,2,1) - t3dg_2(1,2,0))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(0,2,1)");
-  test_for_zero(t3as_1(2,0,2) - (t3dg_2(0,2,2) - t3dg_2(2,2,0))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(0,2,2)");
-  test_for_zero(t3as_1(0,1,0) - (t3dg_2(1,0,0) - t3dg_2(0,0,1))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(1,0,0)");
-  test_for_zero(t3as_1(0,1,1) - (t3dg_2(1,0,1) - t3dg_2(1,0,1))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(1,0,1)");
-  test_for_zero(t3as_1(0,1,2) - (t3dg_2(1,0,2) - t3dg_2(2,0,1))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(1,0,2)");
-  test_for_zero(t3as_1(1,1,0) - (t3dg_2(1,1,0) - t3dg_2(0,1,1))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(1,1,0)");
-  test_for_zero(t3as_1(1,1,1) - (t3dg_2(1,1,1) - t3dg_2(1,1,1))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(1,1,1)");
-  test_for_zero(t3as_1(1,1,2) - (t3dg_2(1,1,2) - t3dg_2(2,1,1))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(1,1,2)");
-  test_for_zero(t3as_1(2,1,0) - (t3dg_2(1,2,0) - t3dg_2(0,2,1))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(1,2,0)");
-  test_for_zero(t3as_1(2,1,1) - (t3dg_2(1,2,1) - t3dg_2(1,2,1))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(1,2,1)");
-  test_for_zero(t3as_1(2,1,2) - (t3dg_2(1,2,2) - t3dg_2(2,2,1))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(1,2,2)");
-  test_for_zero(t3as_1(0,2,0) - (t3dg_2(2,0,0) - t3dg_2(0,0,2))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(2,0,0)");
-  test_for_zero(t3as_1(0,2,1) - (t3dg_2(2,0,1) - t3dg_2(1,0,2))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(2,0,1)");
-  test_for_zero(t3as_1(0,2,2) - (t3dg_2(2,0,2) - t3dg_2(2,0,2))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(2,0,2)");
-  test_for_zero(t3as_1(1,2,0) - (t3dg_2(2,1,0) - t3dg_2(0,1,2))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(2,1,0)");
-  test_for_zero(t3as_1(1,2,1) - (t3dg_2(2,1,1) - t3dg_2(1,1,2))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(2,1,1)");
-  test_for_zero(t3as_1(1,2,2) - (t3dg_2(2,1,2) - t3dg_2(2,1,2))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(2,1,2)");
-  test_for_zero(t3as_1(2,2,0) - (t3dg_2(2,2,0) - t3dg_2(0,2,2))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(2,2,0)");
-  test_for_zero(t3as_1(2,2,1) - (t3dg_2(2,2,1) - t3dg_2(1,2,2))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(2,2,1)");
-  test_for_zero(t3as_1(2,2,2) - (t3dg_2(2,2,2) - t3dg_2(2,2,2))
-		,"T3dg(i,j,k) && T3dg(k,j,i)(2,2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3as/test_T3asII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,87 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3asII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  t3as_1(j,i,k)=(t3dg_2(i,j,k) && t3dg_2(k,j,i));
+  test_for_zero(t3as_1(0,0,0) - (t3dg_2(0,0,0) - t3dg_2(0,0,0))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(0,0,0)");
+  test_for_zero(t3as_1(0,0,1) - (t3dg_2(0,0,1) - t3dg_2(1,0,0))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(0,0,1)");
+  test_for_zero(t3as_1(0,0,2) - (t3dg_2(0,0,2) - t3dg_2(2,0,0))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(0,0,2)");
+  test_for_zero(t3as_1(1,0,0) - (t3dg_2(0,1,0) - t3dg_2(0,1,0))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(0,1,0)");
+  test_for_zero(t3as_1(1,0,1) - (t3dg_2(0,1,1) - t3dg_2(1,1,0))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(0,1,1)");
+  test_for_zero(t3as_1(1,0,2) - (t3dg_2(0,1,2) - t3dg_2(2,1,0))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(0,1,2)");
+  test_for_zero(t3as_1(2,0,0) - (t3dg_2(0,2,0) - t3dg_2(0,2,0))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(0,2,0)");
+  test_for_zero(t3as_1(2,0,1) - (t3dg_2(0,2,1) - t3dg_2(1,2,0))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(0,2,1)");
+  test_for_zero(t3as_1(2,0,2) - (t3dg_2(0,2,2) - t3dg_2(2,2,0))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(0,2,2)");
+  test_for_zero(t3as_1(0,1,0) - (t3dg_2(1,0,0) - t3dg_2(0,0,1))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(1,0,0)");
+  test_for_zero(t3as_1(0,1,1) - (t3dg_2(1,0,1) - t3dg_2(1,0,1))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(1,0,1)");
+  test_for_zero(t3as_1(0,1,2) - (t3dg_2(1,0,2) - t3dg_2(2,0,1))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(1,0,2)");
+  test_for_zero(t3as_1(1,1,0) - (t3dg_2(1,1,0) - t3dg_2(0,1,1))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(1,1,0)");
+  test_for_zero(t3as_1(1,1,1) - (t3dg_2(1,1,1) - t3dg_2(1,1,1))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(1,1,1)");
+  test_for_zero(t3as_1(1,1,2) - (t3dg_2(1,1,2) - t3dg_2(2,1,1))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(1,1,2)");
+  test_for_zero(t3as_1(2,1,0) - (t3dg_2(1,2,0) - t3dg_2(0,2,1))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(1,2,0)");
+  test_for_zero(t3as_1(2,1,1) - (t3dg_2(1,2,1) - t3dg_2(1,2,1))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(1,2,1)");
+  test_for_zero(t3as_1(2,1,2) - (t3dg_2(1,2,2) - t3dg_2(2,2,1))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(1,2,2)");
+  test_for_zero(t3as_1(0,2,0) - (t3dg_2(2,0,0) - t3dg_2(0,0,2))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(2,0,0)");
+  test_for_zero(t3as_1(0,2,1) - (t3dg_2(2,0,1) - t3dg_2(1,0,2))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(2,0,1)");
+  test_for_zero(t3as_1(0,2,2) - (t3dg_2(2,0,2) - t3dg_2(2,0,2))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(2,0,2)");
+  test_for_zero(t3as_1(1,2,0) - (t3dg_2(2,1,0) - t3dg_2(0,1,2))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(2,1,0)");
+  test_for_zero(t3as_1(1,2,1) - (t3dg_2(2,1,1) - t3dg_2(1,1,2))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(2,1,1)");
+  test_for_zero(t3as_1(1,2,2) - (t3dg_2(2,1,2) - t3dg_2(2,1,2))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(2,1,2)");
+  test_for_zero(t3as_1(2,2,0) - (t3dg_2(2,2,0) - t3dg_2(0,2,2))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(2,2,0)");
+  test_for_zero(t3as_1(2,2,1) - (t3dg_2(2,2,1) - t3dg_2(1,2,2))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(2,2,1)");
+  test_for_zero(t3as_1(2,2,2) - (t3dg_2(2,2,2) - t3dg_2(2,2,2))
+		,"T3dg(i,j,k) && T3dg(k,j,i)(2,2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asIII.C
--- a/tests/conformance/T3as/test_T3asIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3asIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  t3as_1(i,k,j)=(t3dg_2(i,j,k) && t3dg_2(i,k,j));
-  test_for_zero(t3as_1(0,0,0) - (t3dg_2(0,0,0) - t3dg_2(0,0,0))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(0,0,0)");
-  test_for_zero(t3as_1(0,1,0) - (t3dg_2(0,0,1) - t3dg_2(0,1,0))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(0,0,1)");
-  test_for_zero(t3as_1(0,2,0) - (t3dg_2(0,0,2) - t3dg_2(0,2,0))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(0,0,2)");
-  test_for_zero(t3as_1(0,0,1) - (t3dg_2(0,1,0) - t3dg_2(0,0,1))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(0,1,0)");
-  test_for_zero(t3as_1(0,1,1) - (t3dg_2(0,1,1) - t3dg_2(0,1,1))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(0,1,1)");
-  test_for_zero(t3as_1(0,2,1) - (t3dg_2(0,1,2) - t3dg_2(0,2,1))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(0,1,2)");
-  test_for_zero(t3as_1(0,0,2) - (t3dg_2(0,2,0) - t3dg_2(0,0,2))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(0,2,0)");
-  test_for_zero(t3as_1(0,1,2) - (t3dg_2(0,2,1) - t3dg_2(0,1,2))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(0,2,1)");
-  test_for_zero(t3as_1(0,2,2) - (t3dg_2(0,2,2) - t3dg_2(0,2,2))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(0,2,2)");
-  test_for_zero(t3as_1(1,0,0) - (t3dg_2(1,0,0) - t3dg_2(1,0,0))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(1,0,0)");
-  test_for_zero(t3as_1(1,1,0) - (t3dg_2(1,0,1) - t3dg_2(1,1,0))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(1,0,1)");
-  test_for_zero(t3as_1(1,2,0) - (t3dg_2(1,0,2) - t3dg_2(1,2,0))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(1,0,2)");
-  test_for_zero(t3as_1(1,0,1) - (t3dg_2(1,1,0) - t3dg_2(1,0,1))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(1,1,0)");
-  test_for_zero(t3as_1(1,1,1) - (t3dg_2(1,1,1) - t3dg_2(1,1,1))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(1,1,1)");
-  test_for_zero(t3as_1(1,2,1) - (t3dg_2(1,1,2) - t3dg_2(1,2,1))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(1,1,2)");
-  test_for_zero(t3as_1(1,0,2) - (t3dg_2(1,2,0) - t3dg_2(1,0,2))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(1,2,0)");
-  test_for_zero(t3as_1(1,1,2) - (t3dg_2(1,2,1) - t3dg_2(1,1,2))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(1,2,1)");
-  test_for_zero(t3as_1(1,2,2) - (t3dg_2(1,2,2) - t3dg_2(1,2,2))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(1,2,2)");
-  test_for_zero(t3as_1(2,0,0) - (t3dg_2(2,0,0) - t3dg_2(2,0,0))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(2,0,0)");
-  test_for_zero(t3as_1(2,1,0) - (t3dg_2(2,0,1) - t3dg_2(2,1,0))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(2,0,1)");
-  test_for_zero(t3as_1(2,2,0) - (t3dg_2(2,0,2) - t3dg_2(2,2,0))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(2,0,2)");
-  test_for_zero(t3as_1(2,0,1) - (t3dg_2(2,1,0) - t3dg_2(2,0,1))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(2,1,0)");
-  test_for_zero(t3as_1(2,1,1) - (t3dg_2(2,1,1) - t3dg_2(2,1,1))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(2,1,1)");
-  test_for_zero(t3as_1(2,2,1) - (t3dg_2(2,1,2) - t3dg_2(2,2,1))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(2,1,2)");
-  test_for_zero(t3as_1(2,0,2) - (t3dg_2(2,2,0) - t3dg_2(2,0,2))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(2,2,0)");
-  test_for_zero(t3as_1(2,1,2) - (t3dg_2(2,2,1) - t3dg_2(2,1,2))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(2,2,1)");
-  test_for_zero(t3as_1(2,2,2) - (t3dg_2(2,2,2) - t3dg_2(2,2,2))
-		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(2,2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3as/test_T3asIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,87 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3asIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  t3as_1(i,k,j)=(t3dg_2(i,j,k) && t3dg_2(i,k,j));
+  test_for_zero(t3as_1(0,0,0) - (t3dg_2(0,0,0) - t3dg_2(0,0,0))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(0,0,0)");
+  test_for_zero(t3as_1(0,1,0) - (t3dg_2(0,0,1) - t3dg_2(0,1,0))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(0,0,1)");
+  test_for_zero(t3as_1(0,2,0) - (t3dg_2(0,0,2) - t3dg_2(0,2,0))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(0,0,2)");
+  test_for_zero(t3as_1(0,0,1) - (t3dg_2(0,1,0) - t3dg_2(0,0,1))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(0,1,0)");
+  test_for_zero(t3as_1(0,1,1) - (t3dg_2(0,1,1) - t3dg_2(0,1,1))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(0,1,1)");
+  test_for_zero(t3as_1(0,2,1) - (t3dg_2(0,1,2) - t3dg_2(0,2,1))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(0,1,2)");
+  test_for_zero(t3as_1(0,0,2) - (t3dg_2(0,2,0) - t3dg_2(0,0,2))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(0,2,0)");
+  test_for_zero(t3as_1(0,1,2) - (t3dg_2(0,2,1) - t3dg_2(0,1,2))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(0,2,1)");
+  test_for_zero(t3as_1(0,2,2) - (t3dg_2(0,2,2) - t3dg_2(0,2,2))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(0,2,2)");
+  test_for_zero(t3as_1(1,0,0) - (t3dg_2(1,0,0) - t3dg_2(1,0,0))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(1,0,0)");
+  test_for_zero(t3as_1(1,1,0) - (t3dg_2(1,0,1) - t3dg_2(1,1,0))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(1,0,1)");
+  test_for_zero(t3as_1(1,2,0) - (t3dg_2(1,0,2) - t3dg_2(1,2,0))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(1,0,2)");
+  test_for_zero(t3as_1(1,0,1) - (t3dg_2(1,1,0) - t3dg_2(1,0,1))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(1,1,0)");
+  test_for_zero(t3as_1(1,1,1) - (t3dg_2(1,1,1) - t3dg_2(1,1,1))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(1,1,1)");
+  test_for_zero(t3as_1(1,2,1) - (t3dg_2(1,1,2) - t3dg_2(1,2,1))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(1,1,2)");
+  test_for_zero(t3as_1(1,0,2) - (t3dg_2(1,2,0) - t3dg_2(1,0,2))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(1,2,0)");
+  test_for_zero(t3as_1(1,1,2) - (t3dg_2(1,2,1) - t3dg_2(1,1,2))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(1,2,1)");
+  test_for_zero(t3as_1(1,2,2) - (t3dg_2(1,2,2) - t3dg_2(1,2,2))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(1,2,2)");
+  test_for_zero(t3as_1(2,0,0) - (t3dg_2(2,0,0) - t3dg_2(2,0,0))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(2,0,0)");
+  test_for_zero(t3as_1(2,1,0) - (t3dg_2(2,0,1) - t3dg_2(2,1,0))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(2,0,1)");
+  test_for_zero(t3as_1(2,2,0) - (t3dg_2(2,0,2) - t3dg_2(2,2,0))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(2,0,2)");
+  test_for_zero(t3as_1(2,0,1) - (t3dg_2(2,1,0) - t3dg_2(2,0,1))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(2,1,0)");
+  test_for_zero(t3as_1(2,1,1) - (t3dg_2(2,1,1) - t3dg_2(2,1,1))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(2,1,1)");
+  test_for_zero(t3as_1(2,2,1) - (t3dg_2(2,1,2) - t3dg_2(2,2,1))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(2,1,2)");
+  test_for_zero(t3as_1(2,0,2) - (t3dg_2(2,2,0) - t3dg_2(2,0,2))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(2,2,0)");
+  test_for_zero(t3as_1(2,1,2) - (t3dg_2(2,2,1) - t3dg_2(2,1,2))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(2,2,1)");
+  test_for_zero(t3as_1(2,2,2) - (t3dg_2(2,2,2) - t3dg_2(2,2,2))
+		,"T3as(i,k,j)=T3dg(i,j,k) && T3dg(i,k,j)(2,2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asIV.C
--- a/tests/conformance/T3as/test_T3asIV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3asIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  t3as_1(i,j,k)=t3as_2(i,j,k) + t3as_3(i,j,k);
-  test_for_zero(t3as_1(0,0,0)-(t3as_2(0,0,0)+t3as_3(0,0,0))
-		,"T3as(i,j,k) + T3as(i,j,k)(0,0,0)");
-  test_for_zero(t3as_1(0,0,1)-(t3as_2(0,0,1)+t3as_3(0,0,1))
-		,"T3as(i,j,k) + T3as(i,j,k)(0,0,1)");
-  test_for_zero(t3as_1(0,0,2)-(t3as_2(0,0,2)+t3as_3(0,0,2))
-		,"T3as(i,j,k) + T3as(i,j,k)(0,0,2)");
-  test_for_zero(t3as_1(0,1,0)-(t3as_2(0,1,0)+t3as_3(0,1,0))
-		,"T3as(i,j,k) + T3as(i,j,k)(0,1,0)");
-  test_for_zero(t3as_1(0,1,1)-(t3as_2(0,1,1)+t3as_3(0,1,1))
-		,"T3as(i,j,k) + T3as(i,j,k)(0,1,1)");
-  test_for_zero(t3as_1(0,1,2)-(t3as_2(0,1,2)+t3as_3(0,1,2))
-		,"T3as(i,j,k) + T3as(i,j,k)(0,1,2)");
-  test_for_zero(t3as_1(0,2,0)-(t3as_2(0,2,0)+t3as_3(0,2,0))
-		,"T3as(i,j,k) + T3as(i,j,k)(0,2,0)");
-  test_for_zero(t3as_1(0,2,1)-(t3as_2(0,2,1)+t3as_3(0,2,1))
-		,"T3as(i,j,k) + T3as(i,j,k)(0,2,1)");
-  test_for_zero(t3as_1(0,2,2)-(t3as_2(0,2,2)+t3as_3(0,2,2))
-		,"T3as(i,j,k) + T3as(i,j,k)(0,2,2)");
-  test_for_zero(t3as_1(1,0,0)-(t3as_2(1,0,0)+t3as_3(1,0,0))
-		,"T3as(i,j,k) + T3as(i,j,k)(1,0,0)");
-  test_for_zero(t3as_1(1,0,1)-(t3as_2(1,0,1)+t3as_3(1,0,1))
-		,"T3as(i,j,k) + T3as(i,j,k)(1,0,1)");
-  test_for_zero(t3as_1(1,0,2)-(t3as_2(1,0,2)+t3as_3(1,0,2))
-		,"T3as(i,j,k) + T3as(i,j,k)(1,0,2)");
-  test_for_zero(t3as_1(1,1,0)-(t3as_2(1,1,0)+t3as_3(1,1,0))
-		,"T3as(i,j,k) + T3as(i,j,k)(1,1,0)");
-  test_for_zero(t3as_1(1,1,1)-(t3as_2(1,1,1)+t3as_3(1,1,1))
-		,"T3as(i,j,k) + T3as(i,j,k)(1,1,1)");
-  test_for_zero(t3as_1(1,1,2)-(t3as_2(1,1,2)+t3as_3(1,1,2))
-		,"T3as(i,j,k) + T3as(i,j,k)(1,1,2)");
-  test_for_zero(t3as_1(1,2,0)-(t3as_2(1,2,0)+t3as_3(1,2,0))
-		,"T3as(i,j,k) + T3as(i,j,k)(1,2,0)");
-  test_for_zero(t3as_1(1,2,1)-(t3as_2(1,2,1)+t3as_3(1,2,1))
-		,"T3as(i,j,k) + T3as(i,j,k)(1,2,1)");
-  test_for_zero(t3as_1(1,2,2)-(t3as_2(1,2,2)+t3as_3(1,2,2))
-		,"T3as(i,j,k) + T3as(i,j,k)(1,2,2)");
-  test_for_zero(t3as_1(2,0,0)-(t3as_2(2,0,0)+t3as_3(2,0,0))
-		,"T3as(i,j,k) + T3as(i,j,k)(2,0,0)");
-  test_for_zero(t3as_1(2,0,1)-(t3as_2(2,0,1)+t3as_3(2,0,1))
-		,"T3as(i,j,k) + T3as(i,j,k)(2,0,1)");
-  test_for_zero(t3as_1(2,0,2)-(t3as_2(2,0,2)+t3as_3(2,0,2))
-		,"T3as(i,j,k) + T3as(i,j,k)(2,0,2)");
-  test_for_zero(t3as_1(2,1,0)-(t3as_2(2,1,0)+t3as_3(2,1,0))
-		,"T3as(i,j,k) + T3as(i,j,k)(2,1,0)");
-  test_for_zero(t3as_1(2,1,1)-(t3as_2(2,1,1)+t3as_3(2,1,1))
-		,"T3as(i,j,k) + T3as(i,j,k)(2,1,1)");
-  test_for_zero(t3as_1(2,1,2)-(t3as_2(2,1,2)+t3as_3(2,1,2))
-		,"T3as(i,j,k) + T3as(i,j,k)(2,1,2)");
-  test_for_zero(t3as_1(2,2,0)-(t3as_2(2,2,0)+t3as_3(2,2,0))
-		,"T3as(i,j,k) + T3as(i,j,k)(2,2,0)");
-  test_for_zero(t3as_1(2,2,1)-(t3as_2(2,2,1)+t3as_3(2,2,1))
-		,"T3as(i,j,k) + T3as(i,j,k)(2,2,1)");
-  test_for_zero(t3as_1(2,2,2)-(t3as_2(2,2,2)+t3as_3(2,2,2))
-		,"T3as(i,j,k) + T3as(i,j,k)(2,2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asIV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3as/test_T3asIV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,87 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3asIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  t3as_1(i,j,k)=t3as_2(i,j,k) + t3as_3(i,j,k);
+  test_for_zero(t3as_1(0,0,0)-(t3as_2(0,0,0)+t3as_3(0,0,0))
+		,"T3as(i,j,k) + T3as(i,j,k)(0,0,0)");
+  test_for_zero(t3as_1(0,0,1)-(t3as_2(0,0,1)+t3as_3(0,0,1))
+		,"T3as(i,j,k) + T3as(i,j,k)(0,0,1)");
+  test_for_zero(t3as_1(0,0,2)-(t3as_2(0,0,2)+t3as_3(0,0,2))
+		,"T3as(i,j,k) + T3as(i,j,k)(0,0,2)");
+  test_for_zero(t3as_1(0,1,0)-(t3as_2(0,1,0)+t3as_3(0,1,0))
+		,"T3as(i,j,k) + T3as(i,j,k)(0,1,0)");
+  test_for_zero(t3as_1(0,1,1)-(t3as_2(0,1,1)+t3as_3(0,1,1))
+		,"T3as(i,j,k) + T3as(i,j,k)(0,1,1)");
+  test_for_zero(t3as_1(0,1,2)-(t3as_2(0,1,2)+t3as_3(0,1,2))
+		,"T3as(i,j,k) + T3as(i,j,k)(0,1,2)");
+  test_for_zero(t3as_1(0,2,0)-(t3as_2(0,2,0)+t3as_3(0,2,0))
+		,"T3as(i,j,k) + T3as(i,j,k)(0,2,0)");
+  test_for_zero(t3as_1(0,2,1)-(t3as_2(0,2,1)+t3as_3(0,2,1))
+		,"T3as(i,j,k) + T3as(i,j,k)(0,2,1)");
+  test_for_zero(t3as_1(0,2,2)-(t3as_2(0,2,2)+t3as_3(0,2,2))
+		,"T3as(i,j,k) + T3as(i,j,k)(0,2,2)");
+  test_for_zero(t3as_1(1,0,0)-(t3as_2(1,0,0)+t3as_3(1,0,0))
+		,"T3as(i,j,k) + T3as(i,j,k)(1,0,0)");
+  test_for_zero(t3as_1(1,0,1)-(t3as_2(1,0,1)+t3as_3(1,0,1))
+		,"T3as(i,j,k) + T3as(i,j,k)(1,0,1)");
+  test_for_zero(t3as_1(1,0,2)-(t3as_2(1,0,2)+t3as_3(1,0,2))
+		,"T3as(i,j,k) + T3as(i,j,k)(1,0,2)");
+  test_for_zero(t3as_1(1,1,0)-(t3as_2(1,1,0)+t3as_3(1,1,0))
+		,"T3as(i,j,k) + T3as(i,j,k)(1,1,0)");
+  test_for_zero(t3as_1(1,1,1)-(t3as_2(1,1,1)+t3as_3(1,1,1))
+		,"T3as(i,j,k) + T3as(i,j,k)(1,1,1)");
+  test_for_zero(t3as_1(1,1,2)-(t3as_2(1,1,2)+t3as_3(1,1,2))
+		,"T3as(i,j,k) + T3as(i,j,k)(1,1,2)");
+  test_for_zero(t3as_1(1,2,0)-(t3as_2(1,2,0)+t3as_3(1,2,0))
+		,"T3as(i,j,k) + T3as(i,j,k)(1,2,0)");
+  test_for_zero(t3as_1(1,2,1)-(t3as_2(1,2,1)+t3as_3(1,2,1))
+		,"T3as(i,j,k) + T3as(i,j,k)(1,2,1)");
+  test_for_zero(t3as_1(1,2,2)-(t3as_2(1,2,2)+t3as_3(1,2,2))
+		,"T3as(i,j,k) + T3as(i,j,k)(1,2,2)");
+  test_for_zero(t3as_1(2,0,0)-(t3as_2(2,0,0)+t3as_3(2,0,0))
+		,"T3as(i,j,k) + T3as(i,j,k)(2,0,0)");
+  test_for_zero(t3as_1(2,0,1)-(t3as_2(2,0,1)+t3as_3(2,0,1))
+		,"T3as(i,j,k) + T3as(i,j,k)(2,0,1)");
+  test_for_zero(t3as_1(2,0,2)-(t3as_2(2,0,2)+t3as_3(2,0,2))
+		,"T3as(i,j,k) + T3as(i,j,k)(2,0,2)");
+  test_for_zero(t3as_1(2,1,0)-(t3as_2(2,1,0)+t3as_3(2,1,0))
+		,"T3as(i,j,k) + T3as(i,j,k)(2,1,0)");
+  test_for_zero(t3as_1(2,1,1)-(t3as_2(2,1,1)+t3as_3(2,1,1))
+		,"T3as(i,j,k) + T3as(i,j,k)(2,1,1)");
+  test_for_zero(t3as_1(2,1,2)-(t3as_2(2,1,2)+t3as_3(2,1,2))
+		,"T3as(i,j,k) + T3as(i,j,k)(2,1,2)");
+  test_for_zero(t3as_1(2,2,0)-(t3as_2(2,2,0)+t3as_3(2,2,0))
+		,"T3as(i,j,k) + T3as(i,j,k)(2,2,0)");
+  test_for_zero(t3as_1(2,2,1)-(t3as_2(2,2,1)+t3as_3(2,2,1))
+		,"T3as(i,j,k) + T3as(i,j,k)(2,2,1)");
+  test_for_zero(t3as_1(2,2,2)-(t3as_2(2,2,2)+t3as_3(2,2,2))
+		,"T3as(i,j,k) + T3as(i,j,k)(2,2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asIX.C
--- a/tests/conformance/T3as/test_T3asIX.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3asIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  test_for_zero(t3as_2(i,j,k)*(t2_2(i,j)*t1_2(k))
-		- (t3as_2(0,1,0)*t2_2(0,1)*t1_2(0)
-		   + t3as_2(1,1,0)*t2_2(1,1)*t1_2(0)
-		   + t3as_2(2,1,0)*t2_2(2,1)*t1_2(0)
-		   + t3as_2(0,2,0)*t2_2(0,2)*t1_2(0)
-		   + t3as_2(1,2,0)*t2_2(1,2)*t1_2(0)
-		   + t3as_2(2,2,0)*t2_2(2,2)*t1_2(0)
-		   + t3as_2(0,0,1)*t2_2(0,0)*t1_2(1)
-		   + t3as_2(1,0,1)*t2_2(1,0)*t1_2(1)
-		   + t3as_2(2,0,1)*t2_2(2,0)*t1_2(1)
-		   + t3as_2(0,2,1)*t2_2(0,2)*t1_2(1)
-		   + t3as_2(1,2,1)*t2_2(1,2)*t1_2(1)
-		   + t3as_2(2,2,1)*t2_2(2,2)*t1_2(1)
-		   + t3as_2(0,0,2)*t2_2(0,0)*t1_2(2)
-		   + t3as_2(1,0,2)*t2_2(1,0)*t1_2(2)
-		   + t3as_2(2,0,2)*t2_2(2,0)*t1_2(2)
-		   + t3as_2(0,1,2)*t2_2(0,1)*t1_2(2)
-		   + t3as_2(1,1,2)*t2_2(1,1)*t1_2(2)
-		   + t3as_2(2,1,2)*t2_2(2,1)*t1_2(2))
-		,"T3as(i,j,k)*T3dg(i,j,k)");
-  test_for_zero((t2_2(i,j)*t1_2(k)*t3as_2(i,j,k))
-		- (t3as_2(0,1,0)*t2_2(0,1)*t1_2(0)
-		   + t3as_2(1,1,0)*t2_2(1,1)*t1_2(0)
-		   + t3as_2(2,1,0)*t2_2(2,1)*t1_2(0)
-		   + t3as_2(0,2,0)*t2_2(0,2)*t1_2(0)
-		   + t3as_2(1,2,0)*t2_2(1,2)*t1_2(0)
-		   + t3as_2(2,2,0)*t2_2(2,2)*t1_2(0)
-		   + t3as_2(0,0,1)*t2_2(0,0)*t1_2(1)
-		   + t3as_2(1,0,1)*t2_2(1,0)*t1_2(1)
-		   + t3as_2(2,0,1)*t2_2(2,0)*t1_2(1)
-		   + t3as_2(0,2,1)*t2_2(0,2)*t1_2(1)
-		   + t3as_2(1,2,1)*t2_2(1,2)*t1_2(1)
-		   + t3as_2(2,2,1)*t2_2(2,2)*t1_2(1)
-		   + t3as_2(0,0,2)*t2_2(0,0)*t1_2(2)
-		   + t3as_2(1,0,2)*t2_2(1,0)*t1_2(2)
-		   + t3as_2(2,0,2)*t2_2(2,0)*t1_2(2)
-		   + t3as_2(0,1,2)*t2_2(0,1)*t1_2(2)
-		   + t3as_2(1,1,2)*t2_2(1,1)*t1_2(2)
-		   + t3as_2(2,1,2)*t2_2(2,1)*t1_2(2))
-		,"T3dg(i,j,k)*T3as(i,j,k)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asIX.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3as/test_T3asIX.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,72 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3asIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  test_for_zero(t3as_2(i,j,k)*(t2_2(i,j)*t1_2(k))
+		- (t3as_2(0,1,0)*t2_2(0,1)*t1_2(0)
+		   + t3as_2(1,1,0)*t2_2(1,1)*t1_2(0)
+		   + t3as_2(2,1,0)*t2_2(2,1)*t1_2(0)
+		   + t3as_2(0,2,0)*t2_2(0,2)*t1_2(0)
+		   + t3as_2(1,2,0)*t2_2(1,2)*t1_2(0)
+		   + t3as_2(2,2,0)*t2_2(2,2)*t1_2(0)
+		   + t3as_2(0,0,1)*t2_2(0,0)*t1_2(1)
+		   + t3as_2(1,0,1)*t2_2(1,0)*t1_2(1)
+		   + t3as_2(2,0,1)*t2_2(2,0)*t1_2(1)
+		   + t3as_2(0,2,1)*t2_2(0,2)*t1_2(1)
+		   + t3as_2(1,2,1)*t2_2(1,2)*t1_2(1)
+		   + t3as_2(2,2,1)*t2_2(2,2)*t1_2(1)
+		   + t3as_2(0,0,2)*t2_2(0,0)*t1_2(2)
+		   + t3as_2(1,0,2)*t2_2(1,0)*t1_2(2)
+		   + t3as_2(2,0,2)*t2_2(2,0)*t1_2(2)
+		   + t3as_2(0,1,2)*t2_2(0,1)*t1_2(2)
+		   + t3as_2(1,1,2)*t2_2(1,1)*t1_2(2)
+		   + t3as_2(2,1,2)*t2_2(2,1)*t1_2(2))
+		,"T3as(i,j,k)*T3dg(i,j,k)");
+  test_for_zero((t2_2(i,j)*t1_2(k)*t3as_2(i,j,k))
+		- (t3as_2(0,1,0)*t2_2(0,1)*t1_2(0)
+		   + t3as_2(1,1,0)*t2_2(1,1)*t1_2(0)
+		   + t3as_2(2,1,0)*t2_2(2,1)*t1_2(0)
+		   + t3as_2(0,2,0)*t2_2(0,2)*t1_2(0)
+		   + t3as_2(1,2,0)*t2_2(1,2)*t1_2(0)
+		   + t3as_2(2,2,0)*t2_2(2,2)*t1_2(0)
+		   + t3as_2(0,0,1)*t2_2(0,0)*t1_2(1)
+		   + t3as_2(1,0,1)*t2_2(1,0)*t1_2(1)
+		   + t3as_2(2,0,1)*t2_2(2,0)*t1_2(1)
+		   + t3as_2(0,2,1)*t2_2(0,2)*t1_2(1)
+		   + t3as_2(1,2,1)*t2_2(1,2)*t1_2(1)
+		   + t3as_2(2,2,1)*t2_2(2,2)*t1_2(1)
+		   + t3as_2(0,0,2)*t2_2(0,0)*t1_2(2)
+		   + t3as_2(1,0,2)*t2_2(1,0)*t1_2(2)
+		   + t3as_2(2,0,2)*t2_2(2,0)*t1_2(2)
+		   + t3as_2(0,1,2)*t2_2(0,1)*t1_2(2)
+		   + t3as_2(1,1,2)*t2_2(1,1)*t1_2(2)
+		   + t3as_2(2,1,2)*t2_2(2,1)*t1_2(2))
+		,"T3dg(i,j,k)*T3as(i,j,k)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asV.C
--- a/tests/conformance/T3as/test_T3asV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3asV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  t3as_1(i,j,k)=t3as_2(i,j,k) + t3as_3(i,k,j);
-  test_for_zero(t3as_1(0,0,0)-(t3as_2(0,0,0)-t3as_3(0,0,0))
-		,"T3as(i,j,k) + T3as(i,k,j)(0,0,0)");
-  test_for_zero(t3as_1(0,0,1)-(t3as_2(0,0,1)-t3as_3(0,0,1))
-		,"T3as(i,j,k) + T3as(i,k,j)(0,0,1)");
-  test_for_zero(t3as_1(0,0,2)-(t3as_2(0,0,2)-t3as_3(0,0,2))
-		,"T3as(i,j,k) + T3as(i,k,j)(0,0,2)");
-  test_for_zero(t3as_1(0,1,0)-(t3as_2(0,1,0)-t3as_3(0,1,0))
-		,"T3as(i,j,k) + T3as(i,k,j)(0,1,0)");
-  test_for_zero(t3as_1(0,1,1)-(t3as_2(0,1,1)-t3as_3(0,1,1))
-		,"T3as(i,j,k) + T3as(i,k,j)(0,1,1)");
-  test_for_zero(t3as_1(0,1,2)-(t3as_2(0,1,2)-t3as_3(0,1,2))
-		,"T3as(i,j,k) + T3as(i,k,j)(0,1,2)");
-  test_for_zero(t3as_1(0,2,0)-(t3as_2(0,2,0)-t3as_3(0,2,0))
-		,"T3as(i,j,k) + T3as(i,k,j)(0,2,0)");
-  test_for_zero(t3as_1(0,2,1)-(t3as_2(0,2,1)-t3as_3(0,2,1))
-		,"T3as(i,j,k) + T3as(i,k,j)(0,2,1)");
-  test_for_zero(t3as_1(0,2,2)-(t3as_2(0,2,2)-t3as_3(0,2,2))
-		,"T3as(i,j,k) + T3as(i,k,j)(0,2,2)");
-  test_for_zero(t3as_1(1,0,0)-(t3as_2(1,0,0)-t3as_3(1,0,0))
-		,"T3as(i,j,k) + T3as(i,k,j)(1,0,0)");
-  test_for_zero(t3as_1(1,0,1)-(t3as_2(1,0,1)-t3as_3(1,0,1))
-		,"T3as(i,j,k) + T3as(i,k,j)(1,0,1)");
-  test_for_zero(t3as_1(1,0,2)-(t3as_2(1,0,2)-t3as_3(1,0,2))
-		,"T3as(i,j,k) + T3as(i,k,j)(1,0,2)");
-  test_for_zero(t3as_1(1,1,0)-(t3as_2(1,1,0)-t3as_3(1,1,0))
-		,"T3as(i,j,k) + T3as(i,k,j)(1,1,0)");
-  test_for_zero(t3as_1(1,1,1)-(t3as_2(1,1,1)-t3as_3(1,1,1))
-		,"T3as(i,j,k) + T3as(i,k,j)(1,1,1)");
-  test_for_zero(t3as_1(1,1,2)-(t3as_2(1,1,2)-t3as_3(1,1,2))
-		,"T3as(i,j,k) + T3as(i,k,j)(1,1,2)");
-  test_for_zero(t3as_1(1,2,0)-(t3as_2(1,2,0)-t3as_3(1,2,0))
-		,"T3as(i,j,k) + T3as(i,k,j)(1,2,0)");
-  test_for_zero(t3as_1(1,2,1)-(t3as_2(1,2,1)-t3as_3(1,2,1))
-		,"T3as(i,j,k) + T3as(i,k,j)(1,2,1)");
-  test_for_zero(t3as_1(1,2,2)-(t3as_2(1,2,2)-t3as_3(1,2,2))
-		,"T3as(i,j,k) + T3as(i,k,j)(1,2,2)");
-  test_for_zero(t3as_1(2,0,0)-(t3as_2(2,0,0)-t3as_3(2,0,0))
-		,"T3as(i,j,k) + T3as(i,k,j)(2,0,0)");
-  test_for_zero(t3as_1(2,0,1)-(t3as_2(2,0,1)-t3as_3(2,0,1))
-		,"T3as(i,j,k) + T3as(i,k,j)(2,0,1)");
-  test_for_zero(t3as_1(2,0,2)-(t3as_2(2,0,2)-t3as_3(2,0,2))
-		,"T3as(i,j,k) + T3as(i,k,j)(2,0,2)");
-  test_for_zero(t3as_1(2,1,0)-(t3as_2(2,1,0)-t3as_3(2,1,0))
-		,"T3as(i,j,k) + T3as(i,k,j)(2,1,0)");
-  test_for_zero(t3as_1(2,1,1)-(t3as_2(2,1,1)-t3as_3(2,1,1))
-		,"T3as(i,j,k) + T3as(i,k,j)(2,1,1)");
-  test_for_zero(t3as_1(2,1,2)-(t3as_2(2,1,2)-t3as_3(2,1,2))
-		,"T3as(i,j,k) + T3as(i,k,j)(2,1,2)");
-  test_for_zero(t3as_1(2,2,0)-(t3as_2(2,2,0)-t3as_3(2,2,0))
-		,"T3as(i,j,k) + T3as(i,k,j)(2,2,0)");
-  test_for_zero(t3as_1(2,2,1)-(t3as_2(2,2,1)-t3as_3(2,2,1))
-		,"T3as(i,j,k) + T3as(i,k,j)(2,2,1)");
-  test_for_zero(t3as_1(2,2,2)-(t3as_2(2,2,2)-t3as_3(2,2,2))
-		,"T3as(i,j,k) + T3as(i,k,j)(2,2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3as/test_T3asV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,87 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3asV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  t3as_1(i,j,k)=t3as_2(i,j,k) + t3as_3(i,k,j);
+  test_for_zero(t3as_1(0,0,0)-(t3as_2(0,0,0)-t3as_3(0,0,0))
+		,"T3as(i,j,k) + T3as(i,k,j)(0,0,0)");
+  test_for_zero(t3as_1(0,0,1)-(t3as_2(0,0,1)-t3as_3(0,0,1))
+		,"T3as(i,j,k) + T3as(i,k,j)(0,0,1)");
+  test_for_zero(t3as_1(0,0,2)-(t3as_2(0,0,2)-t3as_3(0,0,2))
+		,"T3as(i,j,k) + T3as(i,k,j)(0,0,2)");
+  test_for_zero(t3as_1(0,1,0)-(t3as_2(0,1,0)-t3as_3(0,1,0))
+		,"T3as(i,j,k) + T3as(i,k,j)(0,1,0)");
+  test_for_zero(t3as_1(0,1,1)-(t3as_2(0,1,1)-t3as_3(0,1,1))
+		,"T3as(i,j,k) + T3as(i,k,j)(0,1,1)");
+  test_for_zero(t3as_1(0,1,2)-(t3as_2(0,1,2)-t3as_3(0,1,2))
+		,"T3as(i,j,k) + T3as(i,k,j)(0,1,2)");
+  test_for_zero(t3as_1(0,2,0)-(t3as_2(0,2,0)-t3as_3(0,2,0))
+		,"T3as(i,j,k) + T3as(i,k,j)(0,2,0)");
+  test_for_zero(t3as_1(0,2,1)-(t3as_2(0,2,1)-t3as_3(0,2,1))
+		,"T3as(i,j,k) + T3as(i,k,j)(0,2,1)");
+  test_for_zero(t3as_1(0,2,2)-(t3as_2(0,2,2)-t3as_3(0,2,2))
+		,"T3as(i,j,k) + T3as(i,k,j)(0,2,2)");
+  test_for_zero(t3as_1(1,0,0)-(t3as_2(1,0,0)-t3as_3(1,0,0))
+		,"T3as(i,j,k) + T3as(i,k,j)(1,0,0)");
+  test_for_zero(t3as_1(1,0,1)-(t3as_2(1,0,1)-t3as_3(1,0,1))
+		,"T3as(i,j,k) + T3as(i,k,j)(1,0,1)");
+  test_for_zero(t3as_1(1,0,2)-(t3as_2(1,0,2)-t3as_3(1,0,2))
+		,"T3as(i,j,k) + T3as(i,k,j)(1,0,2)");
+  test_for_zero(t3as_1(1,1,0)-(t3as_2(1,1,0)-t3as_3(1,1,0))
+		,"T3as(i,j,k) + T3as(i,k,j)(1,1,0)");
+  test_for_zero(t3as_1(1,1,1)-(t3as_2(1,1,1)-t3as_3(1,1,1))
+		,"T3as(i,j,k) + T3as(i,k,j)(1,1,1)");
+  test_for_zero(t3as_1(1,1,2)-(t3as_2(1,1,2)-t3as_3(1,1,2))
+		,"T3as(i,j,k) + T3as(i,k,j)(1,1,2)");
+  test_for_zero(t3as_1(1,2,0)-(t3as_2(1,2,0)-t3as_3(1,2,0))
+		,"T3as(i,j,k) + T3as(i,k,j)(1,2,0)");
+  test_for_zero(t3as_1(1,2,1)-(t3as_2(1,2,1)-t3as_3(1,2,1))
+		,"T3as(i,j,k) + T3as(i,k,j)(1,2,1)");
+  test_for_zero(t3as_1(1,2,2)-(t3as_2(1,2,2)-t3as_3(1,2,2))
+		,"T3as(i,j,k) + T3as(i,k,j)(1,2,2)");
+  test_for_zero(t3as_1(2,0,0)-(t3as_2(2,0,0)-t3as_3(2,0,0))
+		,"T3as(i,j,k) + T3as(i,k,j)(2,0,0)");
+  test_for_zero(t3as_1(2,0,1)-(t3as_2(2,0,1)-t3as_3(2,0,1))
+		,"T3as(i,j,k) + T3as(i,k,j)(2,0,1)");
+  test_for_zero(t3as_1(2,0,2)-(t3as_2(2,0,2)-t3as_3(2,0,2))
+		,"T3as(i,j,k) + T3as(i,k,j)(2,0,2)");
+  test_for_zero(t3as_1(2,1,0)-(t3as_2(2,1,0)-t3as_3(2,1,0))
+		,"T3as(i,j,k) + T3as(i,k,j)(2,1,0)");
+  test_for_zero(t3as_1(2,1,1)-(t3as_2(2,1,1)-t3as_3(2,1,1))
+		,"T3as(i,j,k) + T3as(i,k,j)(2,1,1)");
+  test_for_zero(t3as_1(2,1,2)-(t3as_2(2,1,2)-t3as_3(2,1,2))
+		,"T3as(i,j,k) + T3as(i,k,j)(2,1,2)");
+  test_for_zero(t3as_1(2,2,0)-(t3as_2(2,2,0)-t3as_3(2,2,0))
+		,"T3as(i,j,k) + T3as(i,k,j)(2,2,0)");
+  test_for_zero(t3as_1(2,2,1)-(t3as_2(2,2,1)-t3as_3(2,2,1))
+		,"T3as(i,j,k) + T3as(i,k,j)(2,2,1)");
+  test_for_zero(t3as_1(2,2,2)-(t3as_2(2,2,2)-t3as_3(2,2,2))
+		,"T3as(i,j,k) + T3as(i,k,j)(2,2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asVI.C
--- a/tests/conformance/T3as/test_T3asVI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3asVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  t3dg_1(i,k,j)=(t3as_2(i,j,k) || t3as_2(k,j,i));
-  test_for_zero(t3dg_1(0,0,0)-(t3as_2(0,0,0)+t3as_2(0,0,0))
-		,"T3as(i,j,k) || T3as(k,j,i)(0,0,0)");
-  test_for_zero(t3dg_1(0,1,0)-(t3as_2(0,0,1)+t3as_2(1,0,0))
-		,"T3as(i,j,k) || T3as(k,j,i)(0,0,1)");
-  test_for_zero(t3dg_1(0,2,0)-(t3as_2(0,0,2)+t3as_2(2,0,0))
-		,"T3as(i,j,k) || T3as(k,j,i)(0,0,2)");
-  test_for_zero(t3dg_1(0,0,1)-(t3as_2(0,1,0)+t3as_2(0,1,0))
-		,"T3as(i,j,k) || T3as(k,j,i)(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1)-(t3as_2(0,1,1)+t3as_2(1,1,0))
-		,"T3as(i,j,k) || T3as(k,j,i)(0,1,1)");
-  test_for_zero(t3dg_1(0,2,1)-(t3as_2(0,1,2)+t3as_2(2,1,0))
-		,"T3as(i,j,k) || T3as(k,j,i)(0,1,2)");
-  test_for_zero(t3dg_1(0,0,2)-(t3as_2(0,2,0)+t3as_2(0,2,0))
-		,"T3as(i,j,k) || T3as(k,j,i)(0,2,0)");
-  test_for_zero(t3dg_1(0,1,2)-(t3as_2(0,2,1)+t3as_2(1,2,0))
-		,"T3as(i,j,k) || T3as(k,j,i)(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2)-(t3as_2(0,2,2)+t3as_2(2,2,0))
-		,"T3as(i,j,k) || T3as(k,j,i)(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0)-(t3as_2(1,0,0)+t3as_2(0,0,1))
-		,"T3as(i,j,k) || T3as(k,j,i)(1,0,0)");
-  test_for_zero(t3dg_1(1,1,0)-(t3as_2(1,0,1)+t3as_2(1,0,1))
-		,"T3as(i,j,k) || T3as(k,j,i)(1,0,1)");
-  test_for_zero(t3dg_1(1,2,0)-(t3as_2(1,0,2)+t3as_2(2,0,1))
-		,"T3as(i,j,k) || T3as(k,j,i)(1,0,2)");
-  test_for_zero(t3dg_1(1,0,1)-(t3as_2(1,1,0)+t3as_2(0,1,1))
-		,"T3as(i,j,k) || T3as(k,j,i)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1)-(t3as_2(1,1,1)+t3as_2(1,1,1))
-		,"T3as(i,j,k) || T3as(k,j,i)(1,1,1)");
-  test_for_zero(t3dg_1(1,2,1)-(t3as_2(1,1,2)+t3as_2(2,1,1))
-		,"T3as(i,j,k) || T3as(k,j,i)(1,1,2)");
-  test_for_zero(t3dg_1(1,0,2)-(t3as_2(1,2,0)+t3as_2(0,2,1))
-		,"T3as(i,j,k) || T3as(k,j,i)(1,2,0)");
-  test_for_zero(t3dg_1(1,1,2)-(t3as_2(1,2,1)+t3as_2(1,2,1))
-		,"T3as(i,j,k) || T3as(k,j,i)(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2)-(t3as_2(1,2,2)+t3as_2(2,2,1))
-		,"T3as(i,j,k) || T3as(k,j,i)(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0)-(t3as_2(2,0,0)+t3as_2(0,0,2))
-		,"T3as(i,j,k) || T3as(k,j,i)(2,0,0)");
-  test_for_zero(t3dg_1(2,1,0)-(t3as_2(2,0,1)+t3as_2(1,0,2))
-		,"T3as(i,j,k) || T3as(k,j,i)(2,0,1)");
-  test_for_zero(t3dg_1(2,2,0)-(t3as_2(2,0,2)+t3as_2(2,0,2))
-		,"T3as(i,j,k) || T3as(k,j,i)(2,0,2)");
-  test_for_zero(t3dg_1(2,0,1)-(t3as_2(2,1,0)+t3as_2(0,1,2))
-		,"T3as(i,j,k) || T3as(k,j,i)(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1)-(t3as_2(2,1,1)+t3as_2(1,1,2))
-		,"T3as(i,j,k) || T3as(k,j,i)(2,1,1)");
-  test_for_zero(t3dg_1(2,2,1)-(t3as_2(2,1,2)+t3as_2(2,1,2))
-		,"T3as(i,j,k) || T3as(k,j,i)(2,1,2)");
-  test_for_zero(t3dg_1(2,0,2)-(t3as_2(2,2,0)+t3as_2(0,2,2))
-		,"T3as(i,j,k) || T3as(k,j,i)(2,2,0)");
-  test_for_zero(t3dg_1(2,1,2)-(t3as_2(2,2,1)+t3as_2(1,2,2))
-		,"T3as(i,j,k) || T3as(k,j,i)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2)-(t3as_2(2,2,2)+t3as_2(2,2,2))
-		,"T3as(i,j,k) || T3as(k,j,i)(2,2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asVI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3as/test_T3asVI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,87 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3asVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  t3dg_1(i,k,j)=(t3as_2(i,j,k) || t3as_2(k,j,i));
+  test_for_zero(t3dg_1(0,0,0)-(t3as_2(0,0,0)+t3as_2(0,0,0))
+		,"T3as(i,j,k) || T3as(k,j,i)(0,0,0)");
+  test_for_zero(t3dg_1(0,1,0)-(t3as_2(0,0,1)+t3as_2(1,0,0))
+		,"T3as(i,j,k) || T3as(k,j,i)(0,0,1)");
+  test_for_zero(t3dg_1(0,2,0)-(t3as_2(0,0,2)+t3as_2(2,0,0))
+		,"T3as(i,j,k) || T3as(k,j,i)(0,0,2)");
+  test_for_zero(t3dg_1(0,0,1)-(t3as_2(0,1,0)+t3as_2(0,1,0))
+		,"T3as(i,j,k) || T3as(k,j,i)(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1)-(t3as_2(0,1,1)+t3as_2(1,1,0))
+		,"T3as(i,j,k) || T3as(k,j,i)(0,1,1)");
+  test_for_zero(t3dg_1(0,2,1)-(t3as_2(0,1,2)+t3as_2(2,1,0))
+		,"T3as(i,j,k) || T3as(k,j,i)(0,1,2)");
+  test_for_zero(t3dg_1(0,0,2)-(t3as_2(0,2,0)+t3as_2(0,2,0))
+		,"T3as(i,j,k) || T3as(k,j,i)(0,2,0)");
+  test_for_zero(t3dg_1(0,1,2)-(t3as_2(0,2,1)+t3as_2(1,2,0))
+		,"T3as(i,j,k) || T3as(k,j,i)(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2)-(t3as_2(0,2,2)+t3as_2(2,2,0))
+		,"T3as(i,j,k) || T3as(k,j,i)(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0)-(t3as_2(1,0,0)+t3as_2(0,0,1))
+		,"T3as(i,j,k) || T3as(k,j,i)(1,0,0)");
+  test_for_zero(t3dg_1(1,1,0)-(t3as_2(1,0,1)+t3as_2(1,0,1))
+		,"T3as(i,j,k) || T3as(k,j,i)(1,0,1)");
+  test_for_zero(t3dg_1(1,2,0)-(t3as_2(1,0,2)+t3as_2(2,0,1))
+		,"T3as(i,j,k) || T3as(k,j,i)(1,0,2)");
+  test_for_zero(t3dg_1(1,0,1)-(t3as_2(1,1,0)+t3as_2(0,1,1))
+		,"T3as(i,j,k) || T3as(k,j,i)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1)-(t3as_2(1,1,1)+t3as_2(1,1,1))
+		,"T3as(i,j,k) || T3as(k,j,i)(1,1,1)");
+  test_for_zero(t3dg_1(1,2,1)-(t3as_2(1,1,2)+t3as_2(2,1,1))
+		,"T3as(i,j,k) || T3as(k,j,i)(1,1,2)");
+  test_for_zero(t3dg_1(1,0,2)-(t3as_2(1,2,0)+t3as_2(0,2,1))
+		,"T3as(i,j,k) || T3as(k,j,i)(1,2,0)");
+  test_for_zero(t3dg_1(1,1,2)-(t3as_2(1,2,1)+t3as_2(1,2,1))
+		,"T3as(i,j,k) || T3as(k,j,i)(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2)-(t3as_2(1,2,2)+t3as_2(2,2,1))
+		,"T3as(i,j,k) || T3as(k,j,i)(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0)-(t3as_2(2,0,0)+t3as_2(0,0,2))
+		,"T3as(i,j,k) || T3as(k,j,i)(2,0,0)");
+  test_for_zero(t3dg_1(2,1,0)-(t3as_2(2,0,1)+t3as_2(1,0,2))
+		,"T3as(i,j,k) || T3as(k,j,i)(2,0,1)");
+  test_for_zero(t3dg_1(2,2,0)-(t3as_2(2,0,2)+t3as_2(2,0,2))
+		,"T3as(i,j,k) || T3as(k,j,i)(2,0,2)");
+  test_for_zero(t3dg_1(2,0,1)-(t3as_2(2,1,0)+t3as_2(0,1,2))
+		,"T3as(i,j,k) || T3as(k,j,i)(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1)-(t3as_2(2,1,1)+t3as_2(1,1,2))
+		,"T3as(i,j,k) || T3as(k,j,i)(2,1,1)");
+  test_for_zero(t3dg_1(2,2,1)-(t3as_2(2,1,2)+t3as_2(2,1,2))
+		,"T3as(i,j,k) || T3as(k,j,i)(2,1,2)");
+  test_for_zero(t3dg_1(2,0,2)-(t3as_2(2,2,0)+t3as_2(0,2,2))
+		,"T3as(i,j,k) || T3as(k,j,i)(2,2,0)");
+  test_for_zero(t3dg_1(2,1,2)-(t3as_2(2,2,1)+t3as_2(1,2,2))
+		,"T3as(i,j,k) || T3as(k,j,i)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2)-(t3as_2(2,2,2)+t3as_2(2,2,2))
+		,"T3as(i,j,k) || T3as(k,j,i)(2,2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asVII.C
--- a/tests/conformance/T3as/test_T3asVII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3asVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-  
-  t3as_1(i,j,k)=t3as_2(i,j,k)*10;
-  test_for_zero(t3as_1(0,0,0)-(t3as_2(0,0,0)*10)
-		,"T3as*T(0,0,0)");
-  test_for_zero(t3as_1(0,0,1)-(t3as_2(0,0,1)*10)
-		,"T3as*T(0,0,1)");
-  test_for_zero(t3as_1(0,0,2)-(t3as_2(0,0,2)*10)
-		,"T3as*T(0,0,2)");
-  test_for_zero(t3as_1(0,1,0)-(t3as_2(0,1,0)*10)
-		,"T3as*T(0,1,0)");
-  test_for_zero(t3as_1(0,1,1)-(t3as_2(0,1,1)*10)
-		,"T3as*T(0,1,1)");
-  test_for_zero(t3as_1(0,1,2)-(t3as_2(0,1,2)*10)
-		,"T3as*T(0,1,2)");
-  test_for_zero(t3as_1(0,2,0)-(t3as_2(0,2,0)*10)
-		,"T3as*T(0,2,0)");
-  test_for_zero(t3as_1(0,2,1)-(t3as_2(0,2,1)*10)
-		,"T3as*T(0,2,1)");
-  test_for_zero(t3as_1(0,2,2)-(t3as_2(0,2,2)*10)
-		,"T3as*T(0,2,2)");
-  test_for_zero(t3as_1(1,0,0)-(t3as_2(1,0,0)*10)
-		,"T3as*T(1,0,0)");
-  test_for_zero(t3as_1(1,0,1)-(t3as_2(1,0,1)*10)
-		,"T3as*T(1,0,1)");
-  test_for_zero(t3as_1(1,0,2)-(t3as_2(1,0,2)*10)
-		,"T3as*T(1,0,2)");
-  test_for_zero(t3as_1(1,1,0)-(t3as_2(1,1,0)*10)
-		,"T3as*T(1,1,0)");
-  test_for_zero(t3as_1(1,1,1)-(t3as_2(1,1,1)*10)
-		,"T3as*T(1,1,1)");
-  test_for_zero(t3as_1(1,1,2)-(t3as_2(1,1,2)*10)
-		,"T3as*T(1,1,2)");
-  test_for_zero(t3as_1(1,2,0)-(t3as_2(1,2,0)*10)
-		,"T3as*T(1,2,0)");
-  test_for_zero(t3as_1(1,2,1)-(t3as_2(1,2,1)*10)
-		,"T3as*T(1,2,1)");
-  test_for_zero(t3as_1(1,2,2)-(t3as_2(1,2,2)*10)
-		,"T3as*T(1,2,2)");
-  test_for_zero(t3as_1(2,0,0)-(t3as_2(2,0,0)*10)
-		,"T3as*T(2,0,0)");
-  test_for_zero(t3as_1(2,0,1)-(t3as_2(2,0,1)*10)
-		,"T3as*T(2,0,1)");
-  test_for_zero(t3as_1(2,0,2)-(t3as_2(2,0,2)*10)
-		,"T3as*T(2,0,2)");
-  test_for_zero(t3as_1(2,1,0)-(t3as_2(2,1,0)*10)
-		,"T3as*T(2,1,0)");
-  test_for_zero(t3as_1(2,1,1)-(t3as_2(2,1,1)*10)
-		,"T3as*T(2,1,1)");
-  test_for_zero(t3as_1(2,1,2)-(t3as_2(2,1,2)*10)
-		,"T3as*T(2,1,2)");
-  test_for_zero(t3as_1(2,2,0)-(t3as_2(2,2,0)*10)
-		,"T3as*T(2,2,0)");
-  test_for_zero(t3as_1(2,2,1)-(t3as_2(2,2,1)*10)
-		,"T3as*T(2,2,1)");
-  test_for_zero(t3as_1(2,2,2)-(t3as_2(2,2,2)*10)
-		,"T3as*T(2,2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asVII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3as/test_T3asVII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,87 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3asVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+  
+  t3as_1(i,j,k)=t3as_2(i,j,k)*10;
+  test_for_zero(t3as_1(0,0,0)-(t3as_2(0,0,0)*10)
+		,"T3as*T(0,0,0)");
+  test_for_zero(t3as_1(0,0,1)-(t3as_2(0,0,1)*10)
+		,"T3as*T(0,0,1)");
+  test_for_zero(t3as_1(0,0,2)-(t3as_2(0,0,2)*10)
+		,"T3as*T(0,0,2)");
+  test_for_zero(t3as_1(0,1,0)-(t3as_2(0,1,0)*10)
+		,"T3as*T(0,1,0)");
+  test_for_zero(t3as_1(0,1,1)-(t3as_2(0,1,1)*10)
+		,"T3as*T(0,1,1)");
+  test_for_zero(t3as_1(0,1,2)-(t3as_2(0,1,2)*10)
+		,"T3as*T(0,1,2)");
+  test_for_zero(t3as_1(0,2,0)-(t3as_2(0,2,0)*10)
+		,"T3as*T(0,2,0)");
+  test_for_zero(t3as_1(0,2,1)-(t3as_2(0,2,1)*10)
+		,"T3as*T(0,2,1)");
+  test_for_zero(t3as_1(0,2,2)-(t3as_2(0,2,2)*10)
+		,"T3as*T(0,2,2)");
+  test_for_zero(t3as_1(1,0,0)-(t3as_2(1,0,0)*10)
+		,"T3as*T(1,0,0)");
+  test_for_zero(t3as_1(1,0,1)-(t3as_2(1,0,1)*10)
+		,"T3as*T(1,0,1)");
+  test_for_zero(t3as_1(1,0,2)-(t3as_2(1,0,2)*10)
+		,"T3as*T(1,0,2)");
+  test_for_zero(t3as_1(1,1,0)-(t3as_2(1,1,0)*10)
+		,"T3as*T(1,1,0)");
+  test_for_zero(t3as_1(1,1,1)-(t3as_2(1,1,1)*10)
+		,"T3as*T(1,1,1)");
+  test_for_zero(t3as_1(1,1,2)-(t3as_2(1,1,2)*10)
+		,"T3as*T(1,1,2)");
+  test_for_zero(t3as_1(1,2,0)-(t3as_2(1,2,0)*10)
+		,"T3as*T(1,2,0)");
+  test_for_zero(t3as_1(1,2,1)-(t3as_2(1,2,1)*10)
+		,"T3as*T(1,2,1)");
+  test_for_zero(t3as_1(1,2,2)-(t3as_2(1,2,2)*10)
+		,"T3as*T(1,2,2)");
+  test_for_zero(t3as_1(2,0,0)-(t3as_2(2,0,0)*10)
+		,"T3as*T(2,0,0)");
+  test_for_zero(t3as_1(2,0,1)-(t3as_2(2,0,1)*10)
+		,"T3as*T(2,0,1)");
+  test_for_zero(t3as_1(2,0,2)-(t3as_2(2,0,2)*10)
+		,"T3as*T(2,0,2)");
+  test_for_zero(t3as_1(2,1,0)-(t3as_2(2,1,0)*10)
+		,"T3as*T(2,1,0)");
+  test_for_zero(t3as_1(2,1,1)-(t3as_2(2,1,1)*10)
+		,"T3as*T(2,1,1)");
+  test_for_zero(t3as_1(2,1,2)-(t3as_2(2,1,2)*10)
+		,"T3as*T(2,1,2)");
+  test_for_zero(t3as_1(2,2,0)-(t3as_2(2,2,0)*10)
+		,"T3as*T(2,2,0)");
+  test_for_zero(t3as_1(2,2,1)-(t3as_2(2,2,1)*10)
+		,"T3as*T(2,2,1)");
+  test_for_zero(t3as_1(2,2,2)-(t3as_2(2,2,2)*10)
+		,"T3as*T(2,2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asVIII.C
--- a/tests/conformance/T3as/test_T3asVIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3asVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  t3as_1(i,j,k)=5*t3as_2(i,j,k);
-  test_for_zero(t3as_1(0,0,0)-(t3as_2(0,0,0)*5)
-		,"T*T3as(0,0,0)");
-  test_for_zero(t3as_1(0,0,1)-(t3as_2(0,0,1)*5)
-		,"T*T3as(0,0,1)");
-  test_for_zero(t3as_1(0,0,2)-(t3as_2(0,0,2)*5)
-		,"T*T3as(0,0,2)");
-  test_for_zero(t3as_1(0,1,0)-(t3as_2(0,1,0)*5)
-		,"T*T3as(0,1,0)");
-  test_for_zero(t3as_1(0,1,1)-(t3as_2(0,1,1)*5)
-		,"T*T3as(0,1,1)");
-  test_for_zero(t3as_1(0,1,2)-(t3as_2(0,1,2)*5)
-		,"T*T3as(0,1,2)");
-  test_for_zero(t3as_1(0,2,0)-(t3as_2(0,2,0)*5)
-		,"T*T3as(0,2,0)");
-  test_for_zero(t3as_1(0,2,1)-(t3as_2(0,2,1)*5)
-		,"T*T3as(0,2,1)");
-  test_for_zero(t3as_1(0,2,2)-(t3as_2(0,2,2)*5)
-		,"T*T3as(0,2,2)");
-  test_for_zero(t3as_1(1,0,0)-(t3as_2(1,0,0)*5)
-		,"T*T3as(1,0,0)");
-  test_for_zero(t3as_1(1,0,1)-(t3as_2(1,0,1)*5)
-		,"T*T3as(1,0,1)");
-  test_for_zero(t3as_1(1,0,2)-(t3as_2(1,0,2)*5)
-		,"T*T3as(1,0,2)");
-  test_for_zero(t3as_1(1,1,0)-(t3as_2(1,1,0)*5)
-		,"T*T3as(1,1,0)");
-  test_for_zero(t3as_1(1,1,1)-(t3as_2(1,1,1)*5)
-		,"T*T3as(1,1,1)");
-  test_for_zero(t3as_1(1,1,2)-(t3as_2(1,1,2)*5)
-		,"T*T3as(1,1,2)");
-  test_for_zero(t3as_1(1,2,0)-(t3as_2(1,2,0)*5)
-		,"T*T3as(1,2,0)");
-  test_for_zero(t3as_1(1,2,1)-(t3as_2(1,2,1)*5)
-		,"T*T3as(1,2,1)");
-  test_for_zero(t3as_1(1,2,2)-(t3as_2(1,2,2)*5)
-		,"T*T3as(1,2,2)");
-  test_for_zero(t3as_1(2,0,0)-(t3as_2(2,0,0)*5)
-		,"T*T3as(2,0,0)");
-  test_for_zero(t3as_1(2,0,1)-(t3as_2(2,0,1)*5)
-		,"T*T3as(2,0,1)");
-  test_for_zero(t3as_1(2,0,2)-(t3as_2(2,0,2)*5)
-		,"T*T3as(2,0,2)");
-  test_for_zero(t3as_1(2,1,0)-(t3as_2(2,1,0)*5)
-		,"T*T3as(2,1,0)");
-  test_for_zero(t3as_1(2,1,1)-(t3as_2(2,1,1)*5)
-		,"T*T3as(2,1,1)");
-  test_for_zero(t3as_1(2,1,2)-(t3as_2(2,1,2)*5)
-		,"T*T3as(2,1,2)");
-  test_for_zero(t3as_1(2,2,0)-(t3as_2(2,2,0)*5)
-		,"T*T3as(2,2,0)");
-  test_for_zero(t3as_1(2,2,1)-(t3as_2(2,2,1)*5)
-		,"T*T3as(2,2,1)");
-  test_for_zero(t3as_1(2,2,2)-(t3as_2(2,2,2)*5)
-		,"T*T3as(2,2,2)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asVIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3as/test_T3asVIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,87 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3asVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  t3as_1(i,j,k)=5*t3as_2(i,j,k);
+  test_for_zero(t3as_1(0,0,0)-(t3as_2(0,0,0)*5)
+		,"T*T3as(0,0,0)");
+  test_for_zero(t3as_1(0,0,1)-(t3as_2(0,0,1)*5)
+		,"T*T3as(0,0,1)");
+  test_for_zero(t3as_1(0,0,2)-(t3as_2(0,0,2)*5)
+		,"T*T3as(0,0,2)");
+  test_for_zero(t3as_1(0,1,0)-(t3as_2(0,1,0)*5)
+		,"T*T3as(0,1,0)");
+  test_for_zero(t3as_1(0,1,1)-(t3as_2(0,1,1)*5)
+		,"T*T3as(0,1,1)");
+  test_for_zero(t3as_1(0,1,2)-(t3as_2(0,1,2)*5)
+		,"T*T3as(0,1,2)");
+  test_for_zero(t3as_1(0,2,0)-(t3as_2(0,2,0)*5)
+		,"T*T3as(0,2,0)");
+  test_for_zero(t3as_1(0,2,1)-(t3as_2(0,2,1)*5)
+		,"T*T3as(0,2,1)");
+  test_for_zero(t3as_1(0,2,2)-(t3as_2(0,2,2)*5)
+		,"T*T3as(0,2,2)");
+  test_for_zero(t3as_1(1,0,0)-(t3as_2(1,0,0)*5)
+		,"T*T3as(1,0,0)");
+  test_for_zero(t3as_1(1,0,1)-(t3as_2(1,0,1)*5)
+		,"T*T3as(1,0,1)");
+  test_for_zero(t3as_1(1,0,2)-(t3as_2(1,0,2)*5)
+		,"T*T3as(1,0,2)");
+  test_for_zero(t3as_1(1,1,0)-(t3as_2(1,1,0)*5)
+		,"T*T3as(1,1,0)");
+  test_for_zero(t3as_1(1,1,1)-(t3as_2(1,1,1)*5)
+		,"T*T3as(1,1,1)");
+  test_for_zero(t3as_1(1,1,2)-(t3as_2(1,1,2)*5)
+		,"T*T3as(1,1,2)");
+  test_for_zero(t3as_1(1,2,0)-(t3as_2(1,2,0)*5)
+		,"T*T3as(1,2,0)");
+  test_for_zero(t3as_1(1,2,1)-(t3as_2(1,2,1)*5)
+		,"T*T3as(1,2,1)");
+  test_for_zero(t3as_1(1,2,2)-(t3as_2(1,2,2)*5)
+		,"T*T3as(1,2,2)");
+  test_for_zero(t3as_1(2,0,0)-(t3as_2(2,0,0)*5)
+		,"T*T3as(2,0,0)");
+  test_for_zero(t3as_1(2,0,1)-(t3as_2(2,0,1)*5)
+		,"T*T3as(2,0,1)");
+  test_for_zero(t3as_1(2,0,2)-(t3as_2(2,0,2)*5)
+		,"T*T3as(2,0,2)");
+  test_for_zero(t3as_1(2,1,0)-(t3as_2(2,1,0)*5)
+		,"T*T3as(2,1,0)");
+  test_for_zero(t3as_1(2,1,1)-(t3as_2(2,1,1)*5)
+		,"T*T3as(2,1,1)");
+  test_for_zero(t3as_1(2,1,2)-(t3as_2(2,1,2)*5)
+		,"T*T3as(2,1,2)");
+  test_for_zero(t3as_1(2,2,0)-(t3as_2(2,2,0)*5)
+		,"T*T3as(2,2,0)");
+  test_for_zero(t3as_1(2,2,1)-(t3as_2(2,2,1)*5)
+		,"T*T3as(2,2,1)");
+  test_for_zero(t3as_1(2,2,2)-(t3as_2(2,2,2)*5)
+		,"T*T3as(2,2,2)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asX.C
--- a/tests/conformance/T3as/test_T3asX.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3asX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  test_for_zero(t3as_2(i,j,k)*(t2_2(i,k)*t1_2(j))
-		- (t3as_2(0,1,0)*t2_2(0,0)*t1_2(1)
-		   + t3as_2(1,1,0)*t2_2(1,0)*t1_2(1)
-		   + t3as_2(2,1,0)*t2_2(2,0)*t1_2(1)
-		   + t3as_2(0,2,0)*t2_2(0,0)*t1_2(2)
-		   + t3as_2(1,2,0)*t2_2(1,0)*t1_2(2)
-		   + t3as_2(2,2,0)*t2_2(2,0)*t1_2(2)
-		   + t3as_2(0,0,1)*t2_2(0,1)*t1_2(0)
-		   + t3as_2(1,0,1)*t2_2(1,1)*t1_2(0)
-		   + t3as_2(2,0,1)*t2_2(2,1)*t1_2(0)
-		   + t3as_2(0,2,1)*t2_2(0,1)*t1_2(2)
-		   + t3as_2(1,2,1)*t2_2(1,1)*t1_2(2)
-		   + t3as_2(2,2,1)*t2_2(2,1)*t1_2(2)
-		   + t3as_2(0,0,2)*t2_2(0,2)*t1_2(0)
-		   + t3as_2(1,0,2)*t2_2(1,2)*t1_2(0)
-		   + t3as_2(2,0,2)*t2_2(2,2)*t1_2(0)
-		   + t3as_2(0,1,2)*t2_2(0,2)*t1_2(1)
-		   + t3as_2(1,1,2)*t2_2(1,2)*t1_2(1)
-		   + t3as_2(2,1,2)*t2_2(2,2)*t1_2(1))
-		,"T3as(i,j,k)*T3dg(i,k,j)");
-  test_for_zero((t2_2(i,k)*t1_2(j)*t3as_2(i,j,k))
-		- (t3as_2(0,1,0)*t2_2(0,0)*t1_2(1)
-		   + t3as_2(1,1,0)*t2_2(1,0)*t1_2(1)
-		   + t3as_2(2,1,0)*t2_2(2,0)*t1_2(1)
-		   + t3as_2(0,2,0)*t2_2(0,0)*t1_2(2)
-		   + t3as_2(1,2,0)*t2_2(1,0)*t1_2(2)
-		   + t3as_2(2,2,0)*t2_2(2,0)*t1_2(2)
-		   + t3as_2(0,0,1)*t2_2(0,1)*t1_2(0)
-		   + t3as_2(1,0,1)*t2_2(1,1)*t1_2(0)
-		   + t3as_2(2,0,1)*t2_2(2,1)*t1_2(0)
-		   + t3as_2(0,2,1)*t2_2(0,1)*t1_2(2)
-		   + t3as_2(1,2,1)*t2_2(1,1)*t1_2(2)
-		   + t3as_2(2,2,1)*t2_2(2,1)*t1_2(2)
-		   + t3as_2(0,0,2)*t2_2(0,2)*t1_2(0)
-		   + t3as_2(1,0,2)*t2_2(1,2)*t1_2(0)
-		   + t3as_2(2,0,2)*t2_2(2,2)*t1_2(0)
-		   + t3as_2(0,1,2)*t2_2(0,2)*t1_2(1)
-		   + t3as_2(1,1,2)*t2_2(1,2)*t1_2(1)
-		   + t3as_2(2,1,2)*t2_2(2,2)*t1_2(1))
-		,"T3dg(i,k,j)*T3as(i,j,k)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asX.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3as/test_T3asX.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,72 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3asX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  test_for_zero(t3as_2(i,j,k)*(t2_2(i,k)*t1_2(j))
+		- (t3as_2(0,1,0)*t2_2(0,0)*t1_2(1)
+		   + t3as_2(1,1,0)*t2_2(1,0)*t1_2(1)
+		   + t3as_2(2,1,0)*t2_2(2,0)*t1_2(1)
+		   + t3as_2(0,2,0)*t2_2(0,0)*t1_2(2)
+		   + t3as_2(1,2,0)*t2_2(1,0)*t1_2(2)
+		   + t3as_2(2,2,0)*t2_2(2,0)*t1_2(2)
+		   + t3as_2(0,0,1)*t2_2(0,1)*t1_2(0)
+		   + t3as_2(1,0,1)*t2_2(1,1)*t1_2(0)
+		   + t3as_2(2,0,1)*t2_2(2,1)*t1_2(0)
+		   + t3as_2(0,2,1)*t2_2(0,1)*t1_2(2)
+		   + t3as_2(1,2,1)*t2_2(1,1)*t1_2(2)
+		   + t3as_2(2,2,1)*t2_2(2,1)*t1_2(2)
+		   + t3as_2(0,0,2)*t2_2(0,2)*t1_2(0)
+		   + t3as_2(1,0,2)*t2_2(1,2)*t1_2(0)
+		   + t3as_2(2,0,2)*t2_2(2,2)*t1_2(0)
+		   + t3as_2(0,1,2)*t2_2(0,2)*t1_2(1)
+		   + t3as_2(1,1,2)*t2_2(1,2)*t1_2(1)
+		   + t3as_2(2,1,2)*t2_2(2,2)*t1_2(1))
+		,"T3as(i,j,k)*T3dg(i,k,j)");
+  test_for_zero((t2_2(i,k)*t1_2(j)*t3as_2(i,j,k))
+		- (t3as_2(0,1,0)*t2_2(0,0)*t1_2(1)
+		   + t3as_2(1,1,0)*t2_2(1,0)*t1_2(1)
+		   + t3as_2(2,1,0)*t2_2(2,0)*t1_2(1)
+		   + t3as_2(0,2,0)*t2_2(0,0)*t1_2(2)
+		   + t3as_2(1,2,0)*t2_2(1,0)*t1_2(2)
+		   + t3as_2(2,2,0)*t2_2(2,0)*t1_2(2)
+		   + t3as_2(0,0,1)*t2_2(0,1)*t1_2(0)
+		   + t3as_2(1,0,1)*t2_2(1,1)*t1_2(0)
+		   + t3as_2(2,0,1)*t2_2(2,1)*t1_2(0)
+		   + t3as_2(0,2,1)*t2_2(0,1)*t1_2(2)
+		   + t3as_2(1,2,1)*t2_2(1,1)*t1_2(2)
+		   + t3as_2(2,2,1)*t2_2(2,1)*t1_2(2)
+		   + t3as_2(0,0,2)*t2_2(0,2)*t1_2(0)
+		   + t3as_2(1,0,2)*t2_2(1,2)*t1_2(0)
+		   + t3as_2(2,0,2)*t2_2(2,2)*t1_2(0)
+		   + t3as_2(0,1,2)*t2_2(0,2)*t1_2(1)
+		   + t3as_2(1,1,2)*t2_2(1,2)*t1_2(1)
+		   + t3as_2(2,1,2)*t2_2(2,2)*t1_2(1))
+		,"T3dg(i,k,j)*T3as(i,j,k)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asXI.C
--- a/tests/conformance/T3as/test_T3asXI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3asXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  test_for_zero(t3as_2(i,j,k)*(t2_2(k,i)*t1_2(j))
-		- (t3as_2(0,1,0)*t2_2(0,0)*t1_2(1)
-		   + t3as_2(1,1,0)*t2_2(0,1)*t1_2(1)
-		   + t3as_2(2,1,0)*t2_2(0,2)*t1_2(1)
-		   + t3as_2(0,2,0)*t2_2(0,0)*t1_2(2)
-		   + t3as_2(1,2,0)*t2_2(0,1)*t1_2(2)
-		   + t3as_2(2,2,0)*t2_2(0,2)*t1_2(2)
-		   + t3as_2(0,0,1)*t2_2(1,0)*t1_2(0)
-		   + t3as_2(1,0,1)*t2_2(1,1)*t1_2(0)
-		   + t3as_2(2,0,1)*t2_2(1,2)*t1_2(0)
-		   + t3as_2(0,2,1)*t2_2(1,0)*t1_2(2)
-		   + t3as_2(1,2,1)*t2_2(1,1)*t1_2(2)
-		   + t3as_2(2,2,1)*t2_2(1,2)*t1_2(2)
-		   + t3as_2(0,0,2)*t2_2(2,0)*t1_2(0)
-		   + t3as_2(1,0,2)*t2_2(2,1)*t1_2(0)
-		   + t3as_2(2,0,2)*t2_2(2,2)*t1_2(0)
-		   + t3as_2(0,1,2)*t2_2(2,0)*t1_2(1)
-		   + t3as_2(1,1,2)*t2_2(2,1)*t1_2(1)
-		   + t3as_2(2,1,2)*t2_2(2,2)*t1_2(1))
-		,"T3as(i,j,k)*T3dg(k,i,j)");
-  test_for_zero((t2_2(k,i)*t1_2(j)*t3as_2(i,j,k))
-		- (t3as_2(0,1,0)*t2_2(0,0)*t1_2(1)
-		   + t3as_2(1,1,0)*t2_2(0,1)*t1_2(1)
-		   + t3as_2(2,1,0)*t2_2(0,2)*t1_2(1)
-		   + t3as_2(0,2,0)*t2_2(0,0)*t1_2(2)
-		   + t3as_2(1,2,0)*t2_2(0,1)*t1_2(2)
-		   + t3as_2(2,2,0)*t2_2(0,2)*t1_2(2)
-		   + t3as_2(0,0,1)*t2_2(1,0)*t1_2(0)
-		   + t3as_2(1,0,1)*t2_2(1,1)*t1_2(0)
-		   + t3as_2(2,0,1)*t2_2(1,2)*t1_2(0)
-		   + t3as_2(0,2,1)*t2_2(1,0)*t1_2(2)
-		   + t3as_2(1,2,1)*t2_2(1,1)*t1_2(2)
-		   + t3as_2(2,2,1)*t2_2(1,2)*t1_2(2)
-		   + t3as_2(0,0,2)*t2_2(2,0)*t1_2(0)
-		   + t3as_2(1,0,2)*t2_2(2,1)*t1_2(0)
-		   + t3as_2(2,0,2)*t2_2(2,2)*t1_2(0)
-		   + t3as_2(0,1,2)*t2_2(2,0)*t1_2(1)
-		   + t3as_2(1,1,2)*t2_2(2,1)*t1_2(1)
-		   + t3as_2(2,1,2)*t2_2(2,2)*t1_2(1))
-		,"T3dg(k,i,j)*T3as(i,j,k)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asXI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3as/test_T3asXI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,72 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3asXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  test_for_zero(t3as_2(i,j,k)*(t2_2(k,i)*t1_2(j))
+		- (t3as_2(0,1,0)*t2_2(0,0)*t1_2(1)
+		   + t3as_2(1,1,0)*t2_2(0,1)*t1_2(1)
+		   + t3as_2(2,1,0)*t2_2(0,2)*t1_2(1)
+		   + t3as_2(0,2,0)*t2_2(0,0)*t1_2(2)
+		   + t3as_2(1,2,0)*t2_2(0,1)*t1_2(2)
+		   + t3as_2(2,2,0)*t2_2(0,2)*t1_2(2)
+		   + t3as_2(0,0,1)*t2_2(1,0)*t1_2(0)
+		   + t3as_2(1,0,1)*t2_2(1,1)*t1_2(0)
+		   + t3as_2(2,0,1)*t2_2(1,2)*t1_2(0)
+		   + t3as_2(0,2,1)*t2_2(1,0)*t1_2(2)
+		   + t3as_2(1,2,1)*t2_2(1,1)*t1_2(2)
+		   + t3as_2(2,2,1)*t2_2(1,2)*t1_2(2)
+		   + t3as_2(0,0,2)*t2_2(2,0)*t1_2(0)
+		   + t3as_2(1,0,2)*t2_2(2,1)*t1_2(0)
+		   + t3as_2(2,0,2)*t2_2(2,2)*t1_2(0)
+		   + t3as_2(0,1,2)*t2_2(2,0)*t1_2(1)
+		   + t3as_2(1,1,2)*t2_2(2,1)*t1_2(1)
+		   + t3as_2(2,1,2)*t2_2(2,2)*t1_2(1))
+		,"T3as(i,j,k)*T3dg(k,i,j)");
+  test_for_zero((t2_2(k,i)*t1_2(j)*t3as_2(i,j,k))
+		- (t3as_2(0,1,0)*t2_2(0,0)*t1_2(1)
+		   + t3as_2(1,1,0)*t2_2(0,1)*t1_2(1)
+		   + t3as_2(2,1,0)*t2_2(0,2)*t1_2(1)
+		   + t3as_2(0,2,0)*t2_2(0,0)*t1_2(2)
+		   + t3as_2(1,2,0)*t2_2(0,1)*t1_2(2)
+		   + t3as_2(2,2,0)*t2_2(0,2)*t1_2(2)
+		   + t3as_2(0,0,1)*t2_2(1,0)*t1_2(0)
+		   + t3as_2(1,0,1)*t2_2(1,1)*t1_2(0)
+		   + t3as_2(2,0,1)*t2_2(1,2)*t1_2(0)
+		   + t3as_2(0,2,1)*t2_2(1,0)*t1_2(2)
+		   + t3as_2(1,2,1)*t2_2(1,1)*t1_2(2)
+		   + t3as_2(2,2,1)*t2_2(1,2)*t1_2(2)
+		   + t3as_2(0,0,2)*t2_2(2,0)*t1_2(0)
+		   + t3as_2(1,0,2)*t2_2(2,1)*t1_2(0)
+		   + t3as_2(2,0,2)*t2_2(2,2)*t1_2(0)
+		   + t3as_2(0,1,2)*t2_2(2,0)*t1_2(1)
+		   + t3as_2(1,1,2)*t2_2(2,1)*t1_2(1)
+		   + t3as_2(2,1,2)*t2_2(2,2)*t1_2(1))
+		,"T3dg(k,i,j)*T3as(i,j,k)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asXII.C
--- a/tests/conformance/T3as/test_T3asXII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3asXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  test_for_zero(t3as_2(i,j,k)*(t2_2(j,i)*t1_2(k))
-		- (t3as_2(0,1,0)*t2_2(1,0)*t1_2(0)
-		   + t3as_2(1,1,0)*t2_2(1,1)*t1_2(0)
-		   + t3as_2(2,1,0)*t2_2(1,2)*t1_2(0)
-		   + t3as_2(0,2,0)*t2_2(2,0)*t1_2(0)
-		   + t3as_2(1,2,0)*t2_2(2,1)*t1_2(0)
-		   + t3as_2(2,2,0)*t2_2(2,2)*t1_2(0)
-		   + t3as_2(0,0,1)*t2_2(0,0)*t1_2(1)
-		   + t3as_2(1,0,1)*t2_2(0,1)*t1_2(1)
-		   + t3as_2(2,0,1)*t2_2(0,2)*t1_2(1)
-		   + t3as_2(0,2,1)*t2_2(2,0)*t1_2(1)
-		   + t3as_2(1,2,1)*t2_2(2,1)*t1_2(1)
-		   + t3as_2(2,2,1)*t2_2(2,2)*t1_2(1)
-		   + t3as_2(0,0,2)*t2_2(0,0)*t1_2(2)
-		   + t3as_2(1,0,2)*t2_2(0,1)*t1_2(2)
-		   + t3as_2(2,0,2)*t2_2(0,2)*t1_2(2)
-		   + t3as_2(0,1,2)*t2_2(1,0)*t1_2(2)
-		   + t3as_2(1,1,2)*t2_2(1,1)*t1_2(2)
-		   + t3as_2(2,1,2)*t2_2(1,2)*t1_2(2))
-		,"T3as(i,j,k)*T3dg(j,i,k)");
-  test_for_zero((t2_2(j,i)*t1_2(k)*t3as_2(i,j,k))
-		- (t3as_2(0,1,0)*t2_2(1,0)*t1_2(0)
-		   + t3as_2(1,1,0)*t2_2(1,1)*t1_2(0)
-		   + t3as_2(2,1,0)*t2_2(1,2)*t1_2(0)
-		   + t3as_2(0,2,0)*t2_2(2,0)*t1_2(0)
-		   + t3as_2(1,2,0)*t2_2(2,1)*t1_2(0)
-		   + t3as_2(2,2,0)*t2_2(2,2)*t1_2(0)
-		   + t3as_2(0,0,1)*t2_2(0,0)*t1_2(1)
-		   + t3as_2(1,0,1)*t2_2(0,1)*t1_2(1)
-		   + t3as_2(2,0,1)*t2_2(0,2)*t1_2(1)
-		   + t3as_2(0,2,1)*t2_2(2,0)*t1_2(1)
-		   + t3as_2(1,2,1)*t2_2(2,1)*t1_2(1)
-		   + t3as_2(2,2,1)*t2_2(2,2)*t1_2(1)
-		   + t3as_2(0,0,2)*t2_2(0,0)*t1_2(2)
-		   + t3as_2(1,0,2)*t2_2(0,1)*t1_2(2)
-		   + t3as_2(2,0,2)*t2_2(0,2)*t1_2(2)
-		   + t3as_2(0,1,2)*t2_2(1,0)*t1_2(2)
-		   + t3as_2(1,1,2)*t2_2(1,1)*t1_2(2)
-		   + t3as_2(2,1,2)*t2_2(1,2)*t1_2(2))
-		,"T3dg(j,i,k)*T3as(i,j,k)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asXII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3as/test_T3asXII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,72 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3asXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  test_for_zero(t3as_2(i,j,k)*(t2_2(j,i)*t1_2(k))
+		- (t3as_2(0,1,0)*t2_2(1,0)*t1_2(0)
+		   + t3as_2(1,1,0)*t2_2(1,1)*t1_2(0)
+		   + t3as_2(2,1,0)*t2_2(1,2)*t1_2(0)
+		   + t3as_2(0,2,0)*t2_2(2,0)*t1_2(0)
+		   + t3as_2(1,2,0)*t2_2(2,1)*t1_2(0)
+		   + t3as_2(2,2,0)*t2_2(2,2)*t1_2(0)
+		   + t3as_2(0,0,1)*t2_2(0,0)*t1_2(1)
+		   + t3as_2(1,0,1)*t2_2(0,1)*t1_2(1)
+		   + t3as_2(2,0,1)*t2_2(0,2)*t1_2(1)
+		   + t3as_2(0,2,1)*t2_2(2,0)*t1_2(1)
+		   + t3as_2(1,2,1)*t2_2(2,1)*t1_2(1)
+		   + t3as_2(2,2,1)*t2_2(2,2)*t1_2(1)
+		   + t3as_2(0,0,2)*t2_2(0,0)*t1_2(2)
+		   + t3as_2(1,0,2)*t2_2(0,1)*t1_2(2)
+		   + t3as_2(2,0,2)*t2_2(0,2)*t1_2(2)
+		   + t3as_2(0,1,2)*t2_2(1,0)*t1_2(2)
+		   + t3as_2(1,1,2)*t2_2(1,1)*t1_2(2)
+		   + t3as_2(2,1,2)*t2_2(1,2)*t1_2(2))
+		,"T3as(i,j,k)*T3dg(j,i,k)");
+  test_for_zero((t2_2(j,i)*t1_2(k)*t3as_2(i,j,k))
+		- (t3as_2(0,1,0)*t2_2(1,0)*t1_2(0)
+		   + t3as_2(1,1,0)*t2_2(1,1)*t1_2(0)
+		   + t3as_2(2,1,0)*t2_2(1,2)*t1_2(0)
+		   + t3as_2(0,2,0)*t2_2(2,0)*t1_2(0)
+		   + t3as_2(1,2,0)*t2_2(2,1)*t1_2(0)
+		   + t3as_2(2,2,0)*t2_2(2,2)*t1_2(0)
+		   + t3as_2(0,0,1)*t2_2(0,0)*t1_2(1)
+		   + t3as_2(1,0,1)*t2_2(0,1)*t1_2(1)
+		   + t3as_2(2,0,1)*t2_2(0,2)*t1_2(1)
+		   + t3as_2(0,2,1)*t2_2(2,0)*t1_2(1)
+		   + t3as_2(1,2,1)*t2_2(2,1)*t1_2(1)
+		   + t3as_2(2,2,1)*t2_2(2,2)*t1_2(1)
+		   + t3as_2(0,0,2)*t2_2(0,0)*t1_2(2)
+		   + t3as_2(1,0,2)*t2_2(0,1)*t1_2(2)
+		   + t3as_2(2,0,2)*t2_2(0,2)*t1_2(2)
+		   + t3as_2(0,1,2)*t2_2(1,0)*t1_2(2)
+		   + t3as_2(1,1,2)*t2_2(1,1)*t1_2(2)
+		   + t3as_2(2,1,2)*t2_2(1,2)*t1_2(2))
+		,"T3dg(j,i,k)*T3as(i,j,k)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asXIII.C
--- a/tests/conformance/T3as/test_T3asXIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3asXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  test_for_zero(t3as_2(i,j,k)*(t2_2(k,j)*t1_2(i))
-		- (t3as_2(0,1,0)*t2_2(0,1)*t1_2(0)
-		   + t3as_2(1,1,0)*t2_2(0,1)*t1_2(1)
-		   + t3as_2(2,1,0)*t2_2(0,1)*t1_2(2)
-		   + t3as_2(0,2,0)*t2_2(0,2)*t1_2(0)
-		   + t3as_2(1,2,0)*t2_2(0,2)*t1_2(1)
-		   + t3as_2(2,2,0)*t2_2(0,2)*t1_2(2)
-		   + t3as_2(0,0,1)*t2_2(1,0)*t1_2(0)
-		   + t3as_2(1,0,1)*t2_2(1,0)*t1_2(1)
-		   + t3as_2(2,0,1)*t2_2(1,0)*t1_2(2)
-		   + t3as_2(0,2,1)*t2_2(1,2)*t1_2(0)
-		   + t3as_2(1,2,1)*t2_2(1,2)*t1_2(1)
-		   + t3as_2(2,2,1)*t2_2(1,2)*t1_2(2)
-		   + t3as_2(0,0,2)*t2_2(2,0)*t1_2(0)
-		   + t3as_2(1,0,2)*t2_2(2,0)*t1_2(1)
-		   + t3as_2(2,0,2)*t2_2(2,0)*t1_2(2)
-		   + t3as_2(0,1,2)*t2_2(2,1)*t1_2(0)
-		   + t3as_2(1,1,2)*t2_2(2,1)*t1_2(1)
-		   + t3as_2(2,1,2)*t2_2(2,1)*t1_2(2))
-		,"T3as(i,j,k)*T3dg(k,j,i)");
-  test_for_zero((t2_2(k,j)*t1_2(i)*t3as_2(i,j,k))
-		- (t3as_2(0,1,0)*t2_2(0,1)*t1_2(0)
-		   + t3as_2(1,1,0)*t2_2(0,1)*t1_2(1)
-		   + t3as_2(2,1,0)*t2_2(0,1)*t1_2(2)
-		   + t3as_2(0,2,0)*t2_2(0,2)*t1_2(0)
-		   + t3as_2(1,2,0)*t2_2(0,2)*t1_2(1)
-		   + t3as_2(2,2,0)*t2_2(0,2)*t1_2(2)
-		   + t3as_2(0,0,1)*t2_2(1,0)*t1_2(0)
-		   + t3as_2(1,0,1)*t2_2(1,0)*t1_2(1)
-		   + t3as_2(2,0,1)*t2_2(1,0)*t1_2(2)
-		   + t3as_2(0,2,1)*t2_2(1,2)*t1_2(0)
-		   + t3as_2(1,2,1)*t2_2(1,2)*t1_2(1)
-		   + t3as_2(2,2,1)*t2_2(1,2)*t1_2(2)
-		   + t3as_2(0,0,2)*t2_2(2,0)*t1_2(0)
-		   + t3as_2(1,0,2)*t2_2(2,0)*t1_2(1)
-		   + t3as_2(2,0,2)*t2_2(2,0)*t1_2(2)
-		   + t3as_2(0,1,2)*t2_2(2,1)*t1_2(0)
-		   + t3as_2(1,1,2)*t2_2(2,1)*t1_2(1)
-		   + t3as_2(2,1,2)*t2_2(2,1)*t1_2(2))
-		,"T3dg(k,j,i)*T3as(i,j,k)");
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asXIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3as/test_T3asXIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,72 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3asXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  test_for_zero(t3as_2(i,j,k)*(t2_2(k,j)*t1_2(i))
+		- (t3as_2(0,1,0)*t2_2(0,1)*t1_2(0)
+		   + t3as_2(1,1,0)*t2_2(0,1)*t1_2(1)
+		   + t3as_2(2,1,0)*t2_2(0,1)*t1_2(2)
+		   + t3as_2(0,2,0)*t2_2(0,2)*t1_2(0)
+		   + t3as_2(1,2,0)*t2_2(0,2)*t1_2(1)
+		   + t3as_2(2,2,0)*t2_2(0,2)*t1_2(2)
+		   + t3as_2(0,0,1)*t2_2(1,0)*t1_2(0)
+		   + t3as_2(1,0,1)*t2_2(1,0)*t1_2(1)
+		   + t3as_2(2,0,1)*t2_2(1,0)*t1_2(2)
+		   + t3as_2(0,2,1)*t2_2(1,2)*t1_2(0)
+		   + t3as_2(1,2,1)*t2_2(1,2)*t1_2(1)
+		   + t3as_2(2,2,1)*t2_2(1,2)*t1_2(2)
+		   + t3as_2(0,0,2)*t2_2(2,0)*t1_2(0)
+		   + t3as_2(1,0,2)*t2_2(2,0)*t1_2(1)
+		   + t3as_2(2,0,2)*t2_2(2,0)*t1_2(2)
+		   + t3as_2(0,1,2)*t2_2(2,1)*t1_2(0)
+		   + t3as_2(1,1,2)*t2_2(2,1)*t1_2(1)
+		   + t3as_2(2,1,2)*t2_2(2,1)*t1_2(2))
+		,"T3as(i,j,k)*T3dg(k,j,i)");
+  test_for_zero((t2_2(k,j)*t1_2(i)*t3as_2(i,j,k))
+		- (t3as_2(0,1,0)*t2_2(0,1)*t1_2(0)
+		   + t3as_2(1,1,0)*t2_2(0,1)*t1_2(1)
+		   + t3as_2(2,1,0)*t2_2(0,1)*t1_2(2)
+		   + t3as_2(0,2,0)*t2_2(0,2)*t1_2(0)
+		   + t3as_2(1,2,0)*t2_2(0,2)*t1_2(1)
+		   + t3as_2(2,2,0)*t2_2(0,2)*t1_2(2)
+		   + t3as_2(0,0,1)*t2_2(1,0)*t1_2(0)
+		   + t3as_2(1,0,1)*t2_2(1,0)*t1_2(1)
+		   + t3as_2(2,0,1)*t2_2(1,0)*t1_2(2)
+		   + t3as_2(0,2,1)*t2_2(1,2)*t1_2(0)
+		   + t3as_2(1,2,1)*t2_2(1,2)*t1_2(1)
+		   + t3as_2(2,2,1)*t2_2(1,2)*t1_2(2)
+		   + t3as_2(0,0,2)*t2_2(2,0)*t1_2(0)
+		   + t3as_2(1,0,2)*t2_2(2,0)*t1_2(1)
+		   + t3as_2(2,0,2)*t2_2(2,0)*t1_2(2)
+		   + t3as_2(0,1,2)*t2_2(2,1)*t1_2(0)
+		   + t3as_2(1,1,2)*t2_2(2,1)*t1_2(1)
+		   + t3as_2(2,1,2)*t2_2(2,1)*t1_2(2))
+		,"T3dg(k,j,i)*T3as(i,j,k)");
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asXIV.C
--- a/tests/conformance/T3as/test_T3asXIV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3asXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  test_for_zero(t3as_2(i,j,k)*(t2_2(j,k)*t1_2(i))
-		- (t3as_2(0,1,0)*t2_2(1,0)*t1_2(0)
-		   + t3as_2(1,1,0)*t2_2(1,0)*t1_2(1)
-		   + t3as_2(2,1,0)*t2_2(1,0)*t1_2(2)
-		   + t3as_2(0,2,0)*t2_2(2,0)*t1_2(0)
-		   + t3as_2(1,2,0)*t2_2(2,0)*t1_2(1)
-		   + t3as_2(2,2,0)*t2_2(2,0)*t1_2(2)
-		   + t3as_2(0,0,1)*t2_2(0,1)*t1_2(0)
-		   + t3as_2(1,0,1)*t2_2(0,1)*t1_2(1)
-		   + t3as_2(2,0,1)*t2_2(0,1)*t1_2(2)
-		   + t3as_2(0,2,1)*t2_2(2,1)*t1_2(0)
-		   + t3as_2(1,2,1)*t2_2(2,1)*t1_2(1)
-		   + t3as_2(2,2,1)*t2_2(2,1)*t1_2(2)
-		   + t3as_2(0,0,2)*t2_2(0,2)*t1_2(0)
-		   + t3as_2(1,0,2)*t2_2(0,2)*t1_2(1)
-		   + t3as_2(2,0,2)*t2_2(0,2)*t1_2(2)
-		   + t3as_2(0,1,2)*t2_2(1,2)*t1_2(0)
-		   + t3as_2(1,1,2)*t2_2(1,2)*t1_2(1)
-		   + t3as_2(2,1,2)*t2_2(1,2)*t1_2(2))
-		,"T3as(i,j,k)*T3dg(j,k,i)");
-  test_for_zero((t2_2(j,k)*t1_2(i)*t3as_2(i,j,k))
-		- (t3as_2(0,1,0)*t2_2(1,0)*t1_2(0)
-		   + t3as_2(1,1,0)*t2_2(1,0)*t1_2(1)
-		   + t3as_2(2,1,0)*t2_2(1,0)*t1_2(2)
-		   + t3as_2(0,2,0)*t2_2(2,0)*t1_2(0)
-		   + t3as_2(1,2,0)*t2_2(2,0)*t1_2(1)
-		   + t3as_2(2,2,0)*t2_2(2,0)*t1_2(2)
-		   + t3as_2(0,0,1)*t2_2(0,1)*t1_2(0)
-		   + t3as_2(1,0,1)*t2_2(0,1)*t1_2(1)
-		   + t3as_2(2,0,1)*t2_2(0,1)*t1_2(2)
-		   + t3as_2(0,2,1)*t2_2(2,1)*t1_2(0)
-		   + t3as_2(1,2,1)*t2_2(2,1)*t1_2(1)
-		   + t3as_2(2,2,1)*t2_2(2,1)*t1_2(2)
-		   + t3as_2(0,0,2)*t2_2(0,2)*t1_2(0)
-		   + t3as_2(1,0,2)*t2_2(0,2)*t1_2(1)
-		   + t3as_2(2,0,2)*t2_2(0,2)*t1_2(2)
-		   + t3as_2(0,1,2)*t2_2(1,2)*t1_2(0)
-		   + t3as_2(1,1,2)*t2_2(1,2)*t1_2(1)
-		   + t3as_2(2,1,2)*t2_2(1,2)*t1_2(2))
-		,"T3dg(j,k,i)*T3as(i,j,k)");
-
-  cout << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3as/test_T3asXIV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3as/test_T3asXIV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,74 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3asXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  test_for_zero(t3as_2(i,j,k)*(t2_2(j,k)*t1_2(i))
+		- (t3as_2(0,1,0)*t2_2(1,0)*t1_2(0)
+		   + t3as_2(1,1,0)*t2_2(1,0)*t1_2(1)
+		   + t3as_2(2,1,0)*t2_2(1,0)*t1_2(2)
+		   + t3as_2(0,2,0)*t2_2(2,0)*t1_2(0)
+		   + t3as_2(1,2,0)*t2_2(2,0)*t1_2(1)
+		   + t3as_2(2,2,0)*t2_2(2,0)*t1_2(2)
+		   + t3as_2(0,0,1)*t2_2(0,1)*t1_2(0)
+		   + t3as_2(1,0,1)*t2_2(0,1)*t1_2(1)
+		   + t3as_2(2,0,1)*t2_2(0,1)*t1_2(2)
+		   + t3as_2(0,2,1)*t2_2(2,1)*t1_2(0)
+		   + t3as_2(1,2,1)*t2_2(2,1)*t1_2(1)
+		   + t3as_2(2,2,1)*t2_2(2,1)*t1_2(2)
+		   + t3as_2(0,0,2)*t2_2(0,2)*t1_2(0)
+		   + t3as_2(1,0,2)*t2_2(0,2)*t1_2(1)
+		   + t3as_2(2,0,2)*t2_2(0,2)*t1_2(2)
+		   + t3as_2(0,1,2)*t2_2(1,2)*t1_2(0)
+		   + t3as_2(1,1,2)*t2_2(1,2)*t1_2(1)
+		   + t3as_2(2,1,2)*t2_2(1,2)*t1_2(2))
+		,"T3as(i,j,k)*T3dg(j,k,i)");
+  test_for_zero((t2_2(j,k)*t1_2(i)*t3as_2(i,j,k))
+		- (t3as_2(0,1,0)*t2_2(1,0)*t1_2(0)
+		   + t3as_2(1,1,0)*t2_2(1,0)*t1_2(1)
+		   + t3as_2(2,1,0)*t2_2(1,0)*t1_2(2)
+		   + t3as_2(0,2,0)*t2_2(2,0)*t1_2(0)
+		   + t3as_2(1,2,0)*t2_2(2,0)*t1_2(1)
+		   + t3as_2(2,2,0)*t2_2(2,0)*t1_2(2)
+		   + t3as_2(0,0,1)*t2_2(0,1)*t1_2(0)
+		   + t3as_2(1,0,1)*t2_2(0,1)*t1_2(1)
+		   + t3as_2(2,0,1)*t2_2(0,1)*t1_2(2)
+		   + t3as_2(0,2,1)*t2_2(2,1)*t1_2(0)
+		   + t3as_2(1,2,1)*t2_2(2,1)*t1_2(1)
+		   + t3as_2(2,2,1)*t2_2(2,1)*t1_2(2)
+		   + t3as_2(0,0,2)*t2_2(0,2)*t1_2(0)
+		   + t3as_2(1,0,2)*t2_2(0,2)*t1_2(1)
+		   + t3as_2(2,0,2)*t2_2(0,2)*t1_2(2)
+		   + t3as_2(0,1,2)*t2_2(1,2)*t1_2(0)
+		   + t3as_2(1,1,2)*t2_2(1,2)*t1_2(1)
+		   + t3as_2(2,1,2)*t2_2(1,2)*t1_2(2))
+		,"T3dg(j,k,i)*T3as(i,j,k)");
+
+  cout << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dg.C
--- a/tests/conformance/T3dg/test_T3dg.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,656 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-extern
-void test_T3dgI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXXX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXXXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXXXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXXXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXXXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgXXXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgCII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-extern
-void test_T3dgCIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
-
-
-void test_T3dg(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  
-  test_T3dgI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXXI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXXII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXXIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXXIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXXV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXXVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXXVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXXVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXXIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXXX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXXXI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXXXII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXXXIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
-		  t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXXXIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgXXXV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-
-  test_T3dgCII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dgCIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
-	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-
-  cout << endl;
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dg.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dg.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,656 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+extern
+void test_T3dgI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXXX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXXXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXXXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXXXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXXXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgXXXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgCII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+extern
+void test_T3dgCIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
+
+
+void test_T3dg(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  
+  test_T3dgI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXXI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXXII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXXIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXXIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXXV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXXVI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXXVII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXXVIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXXIX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXXX(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXXXI(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXXXII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXXXIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
+		  t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXXXIV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgXXXV(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+
+  test_T3dgCII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dgCIII(T,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,t3dg_1,
+	     t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+
+  cout << endl;
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgCII.C
--- a/tests/conformance/T3dg/test_T3dgCII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,626 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgCII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-		 Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-		 Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-		 const Tensor2<double,3,3> &t2_3,
-		 Tensor2_symmetric<double,3> &t2s_1,
-		 const Tensor2_symmetric<double,3> &t2s_2,
-		 const Tensor2_symmetric<double,3> &t2s_3,
-		 Tensor3_dg<double,3,3> &t3dg_1,
-		 const Tensor3_dg<double,3,3> &t3dg_2,
-		 const Tensor3_dg<double,3,3> &t3dg_3,
-		 Tensor3_christof<double,3,3> &t3ch_1,
-		 const Tensor3_christof<double,3,3> &t3ch_2,
-		 const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-  
-  t3dg_1(j,k,i)=(t3dg_2(i,j,k) || t3dg_2(i,k,j));
-  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0) + t3dg_2(0,0,0))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(0,0,0)");
-  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,0,1) + t3dg_2(0,1,0))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(0,0,1)");
-  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,0,2) + t3dg_2(0,2,0))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(0,0,2)");
-  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(0,1,0) + t3dg_2(0,0,1))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(0,1,0)");
-  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(0,1,1) + t3dg_2(0,1,1))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(0,1,1)");
-  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(0,1,2) + t3dg_2(0,2,1))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(0,1,2)");
-  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(0,2,0) + t3dg_2(0,0,2))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(0,2,0)");
-  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(0,2,1) + t3dg_2(0,1,2))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(0,2,1)");
-  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(0,2,2) + t3dg_2(0,2,2))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(0,2,2)");
-  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(1,0,0) + t3dg_2(1,0,0))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(1,0,0)");
-  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(1,0,1) + t3dg_2(1,1,0))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(1,0,1)");
-  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(1,0,2) + t3dg_2(1,2,0))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(1,0,2)");
-  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,1,0) + t3dg_2(1,0,1))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,1) + t3dg_2(1,1,1))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(1,1,1)");
-  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,1,2) + t3dg_2(1,2,1))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(1,1,2)");
-  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(1,2,0) + t3dg_2(1,0,2))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(1,2,0)");
-  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(1,2,1) + t3dg_2(1,1,2))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(1,2,1)");
-  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(1,2,2) + t3dg_2(1,2,2))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(1,2,2)");
-  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(2,0,0) + t3dg_2(2,0,0))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(2,0,0)");
-  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(2,0,1) + t3dg_2(2,1,0))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(2,0,1)");
-  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(2,0,2) + t3dg_2(2,2,0))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(2,0,2)");
-  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(2,1,0) + t3dg_2(2,0,1))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(2,1,0)");
-  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(2,1,1) + t3dg_2(2,1,1))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(2,1,1)");
-  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(2,1,2) + t3dg_2(2,2,1))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(2,1,2)");
-  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,2,0) + t3dg_2(2,0,2))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(2,2,0)");
-  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,2,1) + t3dg_2(2,1,2))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,2) + t3dg_2(2,2,2))
-		,"T3dg(i,j,k)||T3dg(i,k,j)(2,2,2)");
-
-  t3dg_1(j,k,i)=(t3dg_2(j,i,k) || t3dg_2(k,i,j));
-  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0) + t3dg_2(0,0,0))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(0,0,0)");
-  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,0,1) + t3dg_2(1,0,0))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(0,0,1)");
-  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,0,2) + t3dg_2(2,0,0))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(0,0,2)");
-  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(0,1,0) + t3dg_2(0,0,1))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(0,1,0)");
-  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(0,1,1) + t3dg_2(1,0,1))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(0,1,1)");
-  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(0,1,2) + t3dg_2(2,0,1))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(0,1,2)");
-  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(0,2,0) + t3dg_2(0,0,2))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(0,2,0)");
-  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(0,2,1) + t3dg_2(1,0,2))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(0,2,1)");
-  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(0,2,2) + t3dg_2(2,0,2))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(0,2,2)");
-  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(1,0,0) + t3dg_2(0,1,0))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(1,0,0)");
-  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(1,0,1) + t3dg_2(1,1,0))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(1,0,1)");
-  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(1,0,2) + t3dg_2(2,1,0))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(1,0,2)");
-  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,1,0) + t3dg_2(0,1,1))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,1) + t3dg_2(1,1,1))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(1,1,1)");
-  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,1,2) + t3dg_2(2,1,1))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(1,1,2)");
-  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(1,2,0) + t3dg_2(0,1,2))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(1,2,0)");
-  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(1,2,1) + t3dg_2(1,1,2))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(1,2,1)");
-  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(1,2,2) + t3dg_2(2,1,2))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(1,2,2)");
-  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(2,0,0) + t3dg_2(0,2,0))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(2,0,0)");
-  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(2,0,1) + t3dg_2(1,2,0))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(2,0,1)");
-  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(2,0,2) + t3dg_2(2,2,0))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(2,0,2)");
-  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(2,1,0) + t3dg_2(0,2,1))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(2,1,0)");
-  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(2,1,1) + t3dg_2(1,2,1))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(2,1,1)");
-  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(2,1,2) + t3dg_2(2,2,1))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(2,1,2)");
-  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,2,0) + t3dg_2(0,2,2))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(2,2,0)");
-  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,2,1) + t3dg_2(1,2,2))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,2) + t3dg_2(2,2,2))
-		,"T3dg(j,i,k)||T3dg(k,i,j)(2,2,2)");
-
-  t3dg_1(i,j,k)=t3dg_2(i,j,k)&t2s_2(i,j);
-  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0)*t2s_2(0,0))
-		,"T3dg(j,i,k)&T2s(i,j)(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(0,0,1)*t2s_2(0,0))
-		,"T3dg(j,i,k)&T2s(i,j)(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(0,0,2)*t2s_2(0,0))
-		,"T3dg(j,i,k)&T2s(i,j)(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,1,0)*t2s_2(0,1))
-		,"T3dg(j,i,k)&T2s(i,j)(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(0,1,1)*t2s_2(0,1))
-		,"T3dg(j,i,k)&T2s(i,j)(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(0,1,2)*t2s_2(0,1))
-		,"T3dg(j,i,k)&T2s(i,j)(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,2,0)*t2s_2(0,2))
-		,"T3dg(j,i,k)&T2s(i,j)(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(0,2,1)*t2s_2(0,2))
-		,"T3dg(j,i,k)&T2s(i,j)(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(0,2,2)*t2s_2(0,2))
-		,"T3dg(j,i,k)&T2s(i,j)(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(1,0,0)*t2s_2(1,0))
-		,"T3dg(j,i,k)&T2s(i,j)(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,0,1)*t2s_2(1,0))
-		,"T3dg(j,i,k)&T2s(i,j)(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(1,0,2)*t2s_2(1,0))
-		,"T3dg(j,i,k)&T2s(i,j)(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(1,1,0)*t2s_2(1,1))
-		,"T3dg(j,i,k)&T2s(i,j)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,1)*t2s_2(1,1))
-		,"T3dg(j,i,k)&T2s(i,j)(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(1,1,2)*t2s_2(1,1))
-		,"T3dg(j,i,k)&T2s(i,j)(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(1,2,0)*t2s_2(1,2))
-		,"T3dg(j,i,k)&T2s(i,j)(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,2,1)*t2s_2(1,2))
-		,"T3dg(j,i,k)&T2s(i,j)(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(1,2,2)*t2s_2(1,2))
-		,"T3dg(j,i,k)&T2s(i,j)(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(2,0,0)*t2s_2(2,0))
-		,"T3dg(j,i,k)&T2s(i,j)(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(2,0,1)*t2s_2(2,0))
-		,"T3dg(j,i,k)&T2s(i,j)(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,0,2)*t2s_2(2,0))
-		,"T3dg(j,i,k)&T2s(i,j)(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(2,1,0)*t2s_2(2,1))
-		,"T3dg(j,i,k)&T2s(i,j)(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(2,1,1)*t2s_2(2,1))
-		,"T3dg(j,i,k)&T2s(i,j)(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,1,2)*t2s_2(2,1))
-		,"T3dg(j,i,k)&T2s(i,j)(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(2,2,0)*t2s_2(2,2))
-		,"T3dg(j,i,k)&T2s(i,j)(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(2,2,1)*t2s_2(2,2))
-		,"T3dg(j,i,k)&T2s(i,j)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,2)*t2s_2(2,2))
-		,"T3dg(j,i,k)&T2s(i,j)(2,2,2)");
-
-  t3dg_1(i,j,k)=t2s_2(i,j)&t3dg_2(i,j,k);
-  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0)*t2s_2(0,0))
-		,"T2s(i,j)&T3dg(j,i,k)(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(0,0,1)*t2s_2(0,0))
-		,"T2s(i,j)&T3dg(j,i,k)(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(0,0,2)*t2s_2(0,0))
-		,"T2s(i,j)&T3dg(j,i,k)(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,1,0)*t2s_2(0,1))
-		,"T2s(i,j)&T3dg(j,i,k)(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(0,1,1)*t2s_2(0,1))
-		,"T2s(i,j)&T3dg(j,i,k)(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(0,1,2)*t2s_2(0,1))
-		,"T2s(i,j)&T3dg(j,i,k)(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,2,0)*t2s_2(0,2))
-		,"T2s(i,j)&T3dg(j,i,k)(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(0,2,1)*t2s_2(0,2))
-		,"T2s(i,j)&T3dg(j,i,k)(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(0,2,2)*t2s_2(0,2))
-		,"T2s(i,j)&T3dg(j,i,k)(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(1,0,0)*t2s_2(1,0))
-		,"T2s(i,j)&T3dg(j,i,k)(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,0,1)*t2s_2(1,0))
-		,"T2s(i,j)&T3dg(j,i,k)(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(1,0,2)*t2s_2(1,0))
-		,"T2s(i,j)&T3dg(j,i,k)(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(1,1,0)*t2s_2(1,1))
-		,"T2s(i,j)&T3dg(j,i,k)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,1)*t2s_2(1,1))
-		,"T2s(i,j)&T3dg(j,i,k)(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(1,1,2)*t2s_2(1,1))
-		,"T2s(i,j)&T3dg(j,i,k)(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(1,2,0)*t2s_2(1,2))
-		,"T2s(i,j)&T3dg(j,i,k)(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,2,1)*t2s_2(1,2))
-		,"T2s(i,j)&T3dg(j,i,k)(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(1,2,2)*t2s_2(1,2))
-		,"T2s(i,j)&T3dg(j,i,k)(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(2,0,0)*t2s_2(2,0))
-		,"T2s(i,j)&T3dg(j,i,k)(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(2,0,1)*t2s_2(2,0))
-		,"T2s(i,j)&T3dg(j,i,k)(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,0,2)*t2s_2(2,0))
-		,"T2s(i,j)&T3dg(j,i,k)(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(2,1,0)*t2s_2(2,1))
-		,"T2s(i,j)&T3dg(j,i,k)(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(2,1,1)*t2s_2(2,1))
-		,"T2s(i,j)&T3dg(j,i,k)(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,1,2)*t2s_2(2,1))
-		,"T2s(i,j)&T3dg(j,i,k)(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(2,2,0)*t2s_2(2,2))
-		,"T2s(i,j)&T3dg(j,i,k)(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(2,2,1)*t2s_2(2,2))
-		,"T2s(i,j)&T3dg(j,i,k)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,2)*t2s_2(2,2))
-		,"T2s(i,j)&T3dg(j,i,k)(2,2,2)");
-
-  t2_1(i,l)=t3dg_2(i,j,k)*t3dg_3(j,k,l);
-  test_for_zero(t2_1(0,0) - (t3dg_2(0,0,0)*t3dg_3(0,0,0)
-			     + t3dg_2(0,0,1)*t3dg_3(0,1,0)
-			     + t3dg_2(0,0,2)*t3dg_3(0,2,0)
-			     + t3dg_2(0,1,0)*t3dg_3(1,0,0)
-			     + t3dg_2(0,1,1)*t3dg_3(1,1,0)
-			     + t3dg_2(0,1,2)*t3dg_3(1,2,0)
-			     + t3dg_2(0,2,0)*t3dg_3(2,0,0)
-			     + t3dg_2(0,2,1)*t3dg_3(2,1,0)
-			     + t3dg_2(0,2,2)*t3dg_3(2,2,0))
-		,"T3dg(i,j,k)*T3dg(j,k,l)(0,0)");
-  test_for_zero(t2_1(0,1) - (t3dg_2(0,0,0)*t3dg_3(0,0,1)
-			     + t3dg_2(0,0,1)*t3dg_3(0,1,1)
-			     + t3dg_2(0,0,2)*t3dg_3(0,2,1)
-			     + t3dg_2(0,1,0)*t3dg_3(1,0,1)
-			     + t3dg_2(0,1,1)*t3dg_3(1,1,1)
-			     + t3dg_2(0,1,2)*t3dg_3(1,2,1)
-			     + t3dg_2(0,2,0)*t3dg_3(2,0,1)
-			     + t3dg_2(0,2,1)*t3dg_3(2,1,1)
-			     + t3dg_2(0,2,2)*t3dg_3(2,2,1))
-		,"T3dg(i,j,k)*T3dg(j,k,l)(0,1)");
-  test_for_zero(t2_1(0,2) - (t3dg_2(0,0,0)*t3dg_3(0,0,2)
-			     + t3dg_2(0,0,1)*t3dg_3(0,1,2)
-			     + t3dg_2(0,0,2)*t3dg_3(0,2,2)
-			     + t3dg_2(0,1,0)*t3dg_3(1,0,2)
-			     + t3dg_2(0,1,1)*t3dg_3(1,1,2)
-			     + t3dg_2(0,1,2)*t3dg_3(1,2,2)
-			     + t3dg_2(0,2,0)*t3dg_3(2,0,2)
-			     + t3dg_2(0,2,1)*t3dg_3(2,1,2)
-			     + t3dg_2(0,2,2)*t3dg_3(2,2,2))
-		,"T3dg(i,j,k)*T3dg(j,k,l)(0,2)");
-  test_for_zero(t2_1(1,0) - (t3dg_2(1,0,0)*t3dg_3(0,0,0)
-			     + t3dg_2(1,0,1)*t3dg_3(0,1,0)
-			     + t3dg_2(1,0,2)*t3dg_3(0,2,0)
-			     + t3dg_2(1,1,0)*t3dg_3(1,0,0)
-			     + t3dg_2(1,1,1)*t3dg_3(1,1,0)
-			     + t3dg_2(1,1,2)*t3dg_3(1,2,0)
-			     + t3dg_2(1,2,0)*t3dg_3(2,0,0)
-			     + t3dg_2(1,2,1)*t3dg_3(2,1,0)
-			     + t3dg_2(1,2,2)*t3dg_3(2,2,0))
-		,"T3dg(i,j,k)*T3dg(j,k,l)(1,0)");
-  test_for_zero(t2_1(1,1) - (t3dg_2(1,0,0)*t3dg_3(0,0,1)
-			     + t3dg_2(1,0,1)*t3dg_3(0,1,1)
-			     + t3dg_2(1,0,2)*t3dg_3(0,2,1)
-			     + t3dg_2(1,1,0)*t3dg_3(1,0,1)
-			     + t3dg_2(1,1,1)*t3dg_3(1,1,1)
-			     + t3dg_2(1,1,2)*t3dg_3(1,2,1)
-			     + t3dg_2(1,2,0)*t3dg_3(2,0,1)
-			     + t3dg_2(1,2,1)*t3dg_3(2,1,1)
-			     + t3dg_2(1,2,2)*t3dg_3(2,2,1))
-		,"T3dg(i,j,k)*T3dg(j,k,l)(1,1)");
-  test_for_zero(t2_1(1,2) - (t3dg_2(1,0,0)*t3dg_3(0,0,2)
-			     + t3dg_2(1,0,1)*t3dg_3(0,1,2)
-			     + t3dg_2(1,0,2)*t3dg_3(0,2,2)
-			     + t3dg_2(1,1,0)*t3dg_3(1,0,2)
-			     + t3dg_2(1,1,1)*t3dg_3(1,1,2)
-			     + t3dg_2(1,1,2)*t3dg_3(1,2,2)
-			     + t3dg_2(1,2,0)*t3dg_3(2,0,2)
-			     + t3dg_2(1,2,1)*t3dg_3(2,1,2)
-			     + t3dg_2(1,2,2)*t3dg_3(2,2,2))
-		,"T3dg(i,j,k)*T3dg(j,k,l)(1,2)");
-  test_for_zero(t2_1(2,0) - (t3dg_2(2,0,0)*t3dg_3(0,0,0)
-			     + t3dg_2(2,0,1)*t3dg_3(0,1,0)
-			     + t3dg_2(2,0,2)*t3dg_3(0,2,0)
-			     + t3dg_2(2,1,0)*t3dg_3(1,0,0)
-			     + t3dg_2(2,1,1)*t3dg_3(1,1,0)
-			     + t3dg_2(2,1,2)*t3dg_3(1,2,0)
-			     + t3dg_2(2,2,0)*t3dg_3(2,0,0)
-			     + t3dg_2(2,2,1)*t3dg_3(2,1,0)
-			     + t3dg_2(2,2,2)*t3dg_3(2,2,0))
-		,"T3dg(i,j,k)*T3dg(j,k,l)(2,0)");
-  test_for_zero(t2_1(2,1) - (t3dg_2(2,0,0)*t3dg_3(0,0,1)
-			     + t3dg_2(2,0,1)*t3dg_3(0,1,1)
-			     + t3dg_2(2,0,2)*t3dg_3(0,2,1)
-			     + t3dg_2(2,1,0)*t3dg_3(1,0,1)
-			     + t3dg_2(2,1,1)*t3dg_3(1,1,1)
-			     + t3dg_2(2,1,2)*t3dg_3(1,2,1)
-			     + t3dg_2(2,2,0)*t3dg_3(2,0,1)
-			     + t3dg_2(2,2,1)*t3dg_3(2,1,1)
-			     + t3dg_2(2,2,2)*t3dg_3(2,2,1))
-		,"T3dg(i,j,k)*T3dg(j,k,l)(2,1)");
-  test_for_zero(t2_1(2,2) - (t3dg_2(2,0,0)*t3dg_3(0,0,2)
-			     + t3dg_2(2,0,1)*t3dg_3(0,1,2)
-			     + t3dg_2(2,0,2)*t3dg_3(0,2,2)
-			     + t3dg_2(2,1,0)*t3dg_3(1,0,2)
-			     + t3dg_2(2,1,1)*t3dg_3(1,1,2)
-			     + t3dg_2(2,1,2)*t3dg_3(1,2,2)
-			     + t3dg_2(2,2,0)*t3dg_3(2,0,2)
-			     + t3dg_2(2,2,1)*t3dg_3(2,1,2)
-			     + t3dg_2(2,2,2)*t3dg_3(2,2,2))
-		,"T3dg(i,j,k)*T3dg(j,k,l)(2,2)");
-
-  t2_1(i,l)=t3dg_2(j,k,l)*t3dg_3(i,j,k);
-  test_for_zero(t2_1(0,0) - (t3dg_3(0,0,0)*t3dg_2(0,0,0)
-			     + t3dg_3(0,0,1)*t3dg_2(0,1,0)
-			     + t3dg_3(0,0,2)*t3dg_2(0,2,0)
-			     + t3dg_3(0,1,0)*t3dg_2(1,0,0)
-			     + t3dg_3(0,1,1)*t3dg_2(1,1,0)
-			     + t3dg_3(0,1,2)*t3dg_2(1,2,0)
-			     + t3dg_3(0,2,0)*t3dg_2(2,0,0)
-			     + t3dg_3(0,2,1)*t3dg_2(2,1,0)
-			     + t3dg_3(0,2,2)*t3dg_2(2,2,0))
-		,"T3dg(j,k,l)*T3dg(i,j,k)(0,0)");
-  test_for_zero(t2_1(0,1) - (t3dg_3(0,0,0)*t3dg_2(0,0,1)
-			     + t3dg_3(0,0,1)*t3dg_2(0,1,1)
-			     + t3dg_3(0,0,2)*t3dg_2(0,2,1)
-			     + t3dg_3(0,1,0)*t3dg_2(1,0,1)
-			     + t3dg_3(0,1,1)*t3dg_2(1,1,1)
-			     + t3dg_3(0,1,2)*t3dg_2(1,2,1)
-			     + t3dg_3(0,2,0)*t3dg_2(2,0,1)
-			     + t3dg_3(0,2,1)*t3dg_2(2,1,1)
-			     + t3dg_3(0,2,2)*t3dg_2(2,2,1))
-		,"T3dg(j,k,l)*T3dg(i,j,k)(0,1)");
-  test_for_zero(t2_1(0,2) - (t3dg_3(0,0,0)*t3dg_2(0,0,2)
-			     + t3dg_3(0,0,1)*t3dg_2(0,1,2)
-			     + t3dg_3(0,0,2)*t3dg_2(0,2,2)
-			     + t3dg_3(0,1,0)*t3dg_2(1,0,2)
-			     + t3dg_3(0,1,1)*t3dg_2(1,1,2)
-			     + t3dg_3(0,1,2)*t3dg_2(1,2,2)
-			     + t3dg_3(0,2,0)*t3dg_2(2,0,2)
-			     + t3dg_3(0,2,1)*t3dg_2(2,1,2)
-			     + t3dg_3(0,2,2)*t3dg_2(2,2,2))
-		,"T3dg(j,k,l)*T3dg(i,j,k)(0,2)");
-  test_for_zero(t2_1(1,0) - (t3dg_3(1,0,0)*t3dg_2(0,0,0)
-			     + t3dg_3(1,0,1)*t3dg_2(0,1,0)
-			     + t3dg_3(1,0,2)*t3dg_2(0,2,0)
-			     + t3dg_3(1,1,0)*t3dg_2(1,0,0)
-			     + t3dg_3(1,1,1)*t3dg_2(1,1,0)
-			     + t3dg_3(1,1,2)*t3dg_2(1,2,0)
-			     + t3dg_3(1,2,0)*t3dg_2(2,0,0)
-			     + t3dg_3(1,2,1)*t3dg_2(2,1,0)
-			     + t3dg_3(1,2,2)*t3dg_2(2,2,0))
-		,"T3dg(j,k,l)*T3dg(i,j,k)(1,0)");
-  test_for_zero(t2_1(1,1) - (t3dg_3(1,0,0)*t3dg_2(0,0,1)
-			     + t3dg_3(1,0,1)*t3dg_2(0,1,1)
-			     + t3dg_3(1,0,2)*t3dg_2(0,2,1)
-			     + t3dg_3(1,1,0)*t3dg_2(1,0,1)
-			     + t3dg_3(1,1,1)*t3dg_2(1,1,1)
-			     + t3dg_3(1,1,2)*t3dg_2(1,2,1)
-			     + t3dg_3(1,2,0)*t3dg_2(2,0,1)
-			     + t3dg_3(1,2,1)*t3dg_2(2,1,1)
-			     + t3dg_3(1,2,2)*t3dg_2(2,2,1))
-		,"T3dg(j,k,l)*T3dg(i,j,k)(1,1)");
-  test_for_zero(t2_1(1,2) - (t3dg_3(1,0,0)*t3dg_2(0,0,2)
-			     + t3dg_3(1,0,1)*t3dg_2(0,1,2)
-			     + t3dg_3(1,0,2)*t3dg_2(0,2,2)
-			     + t3dg_3(1,1,0)*t3dg_2(1,0,2)
-			     + t3dg_3(1,1,1)*t3dg_2(1,1,2)
-			     + t3dg_3(1,1,2)*t3dg_2(1,2,2)
-			     + t3dg_3(1,2,0)*t3dg_2(2,0,2)
-			     + t3dg_3(1,2,1)*t3dg_2(2,1,2)
-			     + t3dg_3(1,2,2)*t3dg_2(2,2,2))
-		,"T3dg(j,k,l)*T3dg(i,j,k)(1,2)");
-  test_for_zero(t2_1(2,0) - (t3dg_3(2,0,0)*t3dg_2(0,0,0)
-			     + t3dg_3(2,0,1)*t3dg_2(0,1,0)
-			     + t3dg_3(2,0,2)*t3dg_2(0,2,0)
-			     + t3dg_3(2,1,0)*t3dg_2(1,0,0)
-			     + t3dg_3(2,1,1)*t3dg_2(1,1,0)
-			     + t3dg_3(2,1,2)*t3dg_2(1,2,0)
-			     + t3dg_3(2,2,0)*t3dg_2(2,0,0)
-			     + t3dg_3(2,2,1)*t3dg_2(2,1,0)
-			     + t3dg_3(2,2,2)*t3dg_2(2,2,0))
-		,"T3dg(j,k,l)*T3dg(i,j,k)(2,0)");
-  test_for_zero(t2_1(2,1) - (t3dg_3(2,0,0)*t3dg_2(0,0,1)
-			     + t3dg_3(2,0,1)*t3dg_2(0,1,1)
-			     + t3dg_3(2,0,2)*t3dg_2(0,2,1)
-			     + t3dg_3(2,1,0)*t3dg_2(1,0,1)
-			     + t3dg_3(2,1,1)*t3dg_2(1,1,1)
-			     + t3dg_3(2,1,2)*t3dg_2(1,2,1)
-			     + t3dg_3(2,2,0)*t3dg_2(2,0,1)
-			     + t3dg_3(2,2,1)*t3dg_2(2,1,1)
-			     + t3dg_3(2,2,2)*t3dg_2(2,2,1))
-		,"T3dg(j,k,l)*T3dg(i,j,k)(2,1)");
-  test_for_zero(t2_1(2,2) - (t3dg_3(2,0,0)*t3dg_2(0,0,2)
-			     + t3dg_3(2,0,1)*t3dg_2(0,1,2)
-			     + t3dg_3(2,0,2)*t3dg_2(0,2,2)
-			     + t3dg_3(2,1,0)*t3dg_2(1,0,2)
-			     + t3dg_3(2,1,1)*t3dg_2(1,1,2)
-			     + t3dg_3(2,1,2)*t3dg_2(1,2,2)
-			     + t3dg_3(2,2,0)*t3dg_2(2,0,2)
-			     + t3dg_3(2,2,1)*t3dg_2(2,1,2)
-			     + t3dg_3(2,2,2)*t3dg_2(2,2,2))
-		,"T3dg(j,k,l)*T3dg(i,j,k)(2,2)");
-
-
-  t2_1(i,l)=t3dg_2(i,j,k)*t3dg_3(k,l,j);
-  test_for_zero(t2_1(0,0) - (t3dg_2(0,0,0)*t3dg_3(0,0,0)
-			     + t3dg_2(0,0,1)*t3dg_3(1,0,0)
-			     + t3dg_2(0,0,2)*t3dg_3(2,0,0)
-			     + t3dg_2(0,1,0)*t3dg_3(0,0,1)
-			     + t3dg_2(0,1,1)*t3dg_3(1,0,1)
-			     + t3dg_2(0,1,2)*t3dg_3(2,0,1)
-			     + t3dg_2(0,2,0)*t3dg_3(0,0,2)
-			     + t3dg_2(0,2,1)*t3dg_3(1,0,2)
-			     + t3dg_2(0,2,2)*t3dg_3(2,0,2))
-		,"T3dg(i,j,k)*T3dg(k,l,j)(0,0)");
-  test_for_zero(t2_1(0,1) - (t3dg_2(0,0,0)*t3dg_3(0,1,0)
-			     + t3dg_2(0,0,1)*t3dg_3(1,1,0)
-			     + t3dg_2(0,0,2)*t3dg_3(2,1,0)
-			     + t3dg_2(0,1,0)*t3dg_3(0,1,1)
-			     + t3dg_2(0,1,1)*t3dg_3(1,1,1)
-			     + t3dg_2(0,1,2)*t3dg_3(2,1,1)
-			     + t3dg_2(0,2,0)*t3dg_3(0,1,2)
-			     + t3dg_2(0,2,1)*t3dg_3(1,1,2)
-			     + t3dg_2(0,2,2)*t3dg_3(2,1,2))
-		,"T3dg(i,j,k)*T3dg(k,l,j)(0,1)");
-  test_for_zero(t2_1(0,2) - (t3dg_2(0,0,0)*t3dg_3(0,2,0)
-			     + t3dg_2(0,0,1)*t3dg_3(1,2,0)
-			     + t3dg_2(0,0,2)*t3dg_3(2,2,0)
-			     + t3dg_2(0,1,0)*t3dg_3(0,2,1)
-			     + t3dg_2(0,1,1)*t3dg_3(1,2,1)
-			     + t3dg_2(0,1,2)*t3dg_3(2,2,1)
-			     + t3dg_2(0,2,0)*t3dg_3(0,2,2)
-			     + t3dg_2(0,2,1)*t3dg_3(1,2,2)
-			     + t3dg_2(0,2,2)*t3dg_3(2,2,2))
-		,"T3dg(i,j,k)*T3dg(k,l,j)(0,2)");
-  test_for_zero(t2_1(1,0) - (t3dg_2(1,0,0)*t3dg_3(0,0,0)
-			     + t3dg_2(1,0,1)*t3dg_3(1,0,0)
-			     + t3dg_2(1,0,2)*t3dg_3(2,0,0)
-			     + t3dg_2(1,1,0)*t3dg_3(0,0,1)
-			     + t3dg_2(1,1,1)*t3dg_3(1,0,1)
-			     + t3dg_2(1,1,2)*t3dg_3(2,0,1)
-			     + t3dg_2(1,2,0)*t3dg_3(0,0,2)
-			     + t3dg_2(1,2,1)*t3dg_3(1,0,2)
-			     + t3dg_2(1,2,2)*t3dg_3(2,0,2))
-		,"T3dg(i,j,k)*T3dg(k,l,j)(1,0)");
-  test_for_zero(t2_1(1,1) - (t3dg_2(1,0,0)*t3dg_3(0,1,0)
-			     + t3dg_2(1,0,1)*t3dg_3(1,1,0)
-			     + t3dg_2(1,0,2)*t3dg_3(2,1,0)
-			     + t3dg_2(1,1,0)*t3dg_3(0,1,1)
-			     + t3dg_2(1,1,1)*t3dg_3(1,1,1)
-			     + t3dg_2(1,1,2)*t3dg_3(2,1,1)
-			     + t3dg_2(1,2,0)*t3dg_3(0,1,2)
-			     + t3dg_2(1,2,1)*t3dg_3(1,1,2)
-			     + t3dg_2(1,2,2)*t3dg_3(2,1,2))
-		,"T3dg(i,j,k)*T3dg(k,l,j)(1,1)");
-  test_for_zero(t2_1(1,2) - (t3dg_2(1,0,0)*t3dg_3(0,2,0)
-			     + t3dg_2(1,0,1)*t3dg_3(1,2,0)
-			     + t3dg_2(1,0,2)*t3dg_3(2,2,0)
-			     + t3dg_2(1,1,0)*t3dg_3(0,2,1)
-			     + t3dg_2(1,1,1)*t3dg_3(1,2,1)
-			     + t3dg_2(1,1,2)*t3dg_3(2,2,1)
-			     + t3dg_2(1,2,0)*t3dg_3(0,2,2)
-			     + t3dg_2(1,2,1)*t3dg_3(1,2,2)
-			     + t3dg_2(1,2,2)*t3dg_3(2,2,2))
-		,"T3dg(i,j,k)*T3dg(k,l,j)(1,2)");
-  test_for_zero(t2_1(2,0) - (t3dg_2(2,0,0)*t3dg_3(0,0,0)
-			     + t3dg_2(2,0,1)*t3dg_3(1,0,0)
-			     + t3dg_2(2,0,2)*t3dg_3(2,0,0)
-			     + t3dg_2(2,1,0)*t3dg_3(0,0,1)
-			     + t3dg_2(2,1,1)*t3dg_3(1,0,1)
-			     + t3dg_2(2,1,2)*t3dg_3(2,0,1)
-			     + t3dg_2(2,2,0)*t3dg_3(0,0,2)
-			     + t3dg_2(2,2,1)*t3dg_3(1,0,2)
-			     + t3dg_2(2,2,2)*t3dg_3(2,0,2))
-		,"T3dg(i,j,k)*T3dg(k,l,j)(2,0)");
-  test_for_zero(t2_1(2,1) - (t3dg_2(2,0,0)*t3dg_3(0,1,0)
-			     + t3dg_2(2,0,1)*t3dg_3(1,1,0)
-			     + t3dg_2(2,0,2)*t3dg_3(2,1,0)
-			     + t3dg_2(2,1,0)*t3dg_3(0,1,1)
-			     + t3dg_2(2,1,1)*t3dg_3(1,1,1)
-			     + t3dg_2(2,1,2)*t3dg_3(2,1,1)
-			     + t3dg_2(2,2,0)*t3dg_3(0,1,2)
-			     + t3dg_2(2,2,1)*t3dg_3(1,1,2)
-			     + t3dg_2(2,2,2)*t3dg_3(2,1,2))
-		,"T3dg(i,j,k)*T3dg(k,l,j)(2,1)");
-  test_for_zero(t2_1(2,2) - (t3dg_2(2,0,0)*t3dg_3(0,2,0)
-			     + t3dg_2(2,0,1)*t3dg_3(1,2,0)
-			     + t3dg_2(2,0,2)*t3dg_3(2,2,0)
-			     + t3dg_2(2,1,0)*t3dg_3(0,2,1)
-			     + t3dg_2(2,1,1)*t3dg_3(1,2,1)
-			     + t3dg_2(2,1,2)*t3dg_3(2,2,1)
-			     + t3dg_2(2,2,0)*t3dg_3(0,2,2)
-			     + t3dg_2(2,2,1)*t3dg_3(1,2,2)
-			     + t3dg_2(2,2,2)*t3dg_3(2,2,2))
-		,"T3dg(i,j,k)*T3dg(k,l,j)(2,2)");
-
-  t2_1(i,l)=t3dg_2(k,l,j)*t3dg_3(i,j,k);
-  test_for_zero(t2_1(0,0) - (t3dg_3(0,0,0)*t3dg_2(0,0,0)
-			     + t3dg_3(0,0,1)*t3dg_2(1,0,0)
-			     + t3dg_3(0,0,2)*t3dg_2(2,0,0)
-			     + t3dg_3(0,1,0)*t3dg_2(0,0,1)
-			     + t3dg_3(0,1,1)*t3dg_2(1,0,1)
-			     + t3dg_3(0,1,2)*t3dg_2(2,0,1)
-			     + t3dg_3(0,2,0)*t3dg_2(0,0,2)
-			     + t3dg_3(0,2,1)*t3dg_2(1,0,2)
-			     + t3dg_3(0,2,2)*t3dg_2(2,0,2))
-		,"T3dg(k,l,j)*T3dg(i,j,k)(0,0)");
-  test_for_zero(t2_1(0,1) - (t3dg_3(0,0,0)*t3dg_2(0,1,0)
-			     + t3dg_3(0,0,1)*t3dg_2(1,1,0)
-			     + t3dg_3(0,0,2)*t3dg_2(2,1,0)
-			     + t3dg_3(0,1,0)*t3dg_2(0,1,1)
-			     + t3dg_3(0,1,1)*t3dg_2(1,1,1)
-			     + t3dg_3(0,1,2)*t3dg_2(2,1,1)
-			     + t3dg_3(0,2,0)*t3dg_2(0,1,2)
-			     + t3dg_3(0,2,1)*t3dg_2(1,1,2)
-			     + t3dg_3(0,2,2)*t3dg_2(2,1,2))
-		,"T3dg(k,l,j)*T3dg(i,j,k)(0,1)");
-  test_for_zero(t2_1(0,2) - (t3dg_3(0,0,0)*t3dg_2(0,2,0)
-			     + t3dg_3(0,0,1)*t3dg_2(1,2,0)
-			     + t3dg_3(0,0,2)*t3dg_2(2,2,0)
-			     + t3dg_3(0,1,0)*t3dg_2(0,2,1)
-			     + t3dg_3(0,1,1)*t3dg_2(1,2,1)
-			     + t3dg_3(0,1,2)*t3dg_2(2,2,1)
-			     + t3dg_3(0,2,0)*t3dg_2(0,2,2)
-			     + t3dg_3(0,2,1)*t3dg_2(1,2,2)
-			     + t3dg_3(0,2,2)*t3dg_2(2,2,2))
-		,"T3dg(k,l,j)*T3dg(i,j,k)(0,2)");
-  test_for_zero(t2_1(1,0) - (t3dg_3(1,0,0)*t3dg_2(0,0,0)
-			     + t3dg_3(1,0,1)*t3dg_2(1,0,0)
-			     + t3dg_3(1,0,2)*t3dg_2(2,0,0)
-			     + t3dg_3(1,1,0)*t3dg_2(0,0,1)
-			     + t3dg_3(1,1,1)*t3dg_2(1,0,1)
-			     + t3dg_3(1,1,2)*t3dg_2(2,0,1)
-			     + t3dg_3(1,2,0)*t3dg_2(0,0,2)
-			     + t3dg_3(1,2,1)*t3dg_2(1,0,2)
-			     + t3dg_3(1,2,2)*t3dg_2(2,0,2))
-		,"T3dg(k,l,j)*T3dg(i,j,k)(1,0)");
-  test_for_zero(t2_1(1,1) - (t3dg_3(1,0,0)*t3dg_2(0,1,0)
-			     + t3dg_3(1,0,1)*t3dg_2(1,1,0)
-			     + t3dg_3(1,0,2)*t3dg_2(2,1,0)
-			     + t3dg_3(1,1,0)*t3dg_2(0,1,1)
-			     + t3dg_3(1,1,1)*t3dg_2(1,1,1)
-			     + t3dg_3(1,1,2)*t3dg_2(2,1,1)
-			     + t3dg_3(1,2,0)*t3dg_2(0,1,2)
-			     + t3dg_3(1,2,1)*t3dg_2(1,1,2)
-			     + t3dg_3(1,2,2)*t3dg_2(2,1,2))
-		,"T3dg(k,l,j)*T3dg(i,j,k)(1,1)");
-  test_for_zero(t2_1(1,2) - (t3dg_3(1,0,0)*t3dg_2(0,2,0)
-			     + t3dg_3(1,0,1)*t3dg_2(1,2,0)
-			     + t3dg_3(1,0,2)*t3dg_2(2,2,0)
-			     + t3dg_3(1,1,0)*t3dg_2(0,2,1)
-			     + t3dg_3(1,1,1)*t3dg_2(1,2,1)
-			     + t3dg_3(1,1,2)*t3dg_2(2,2,1)
-			     + t3dg_3(1,2,0)*t3dg_2(0,2,2)
-			     + t3dg_3(1,2,1)*t3dg_2(1,2,2)
-			     + t3dg_3(1,2,2)*t3dg_2(2,2,2))
-		,"T3dg(k,l,j)*T3dg(i,j,k)(1,2)");
-  test_for_zero(t2_1(2,0) - (t3dg_3(2,0,0)*t3dg_2(0,0,0)
-			     + t3dg_3(2,0,1)*t3dg_2(1,0,0)
-			     + t3dg_3(2,0,2)*t3dg_2(2,0,0)
-			     + t3dg_3(2,1,0)*t3dg_2(0,0,1)
-			     + t3dg_3(2,1,1)*t3dg_2(1,0,1)
-			     + t3dg_3(2,1,2)*t3dg_2(2,0,1)
-			     + t3dg_3(2,2,0)*t3dg_2(0,0,2)
-			     + t3dg_3(2,2,1)*t3dg_2(1,0,2)
-			     + t3dg_3(2,2,2)*t3dg_2(2,0,2))
-		,"T3dg(k,l,j)*T3dg(i,j,k)(2,0)");
-  test_for_zero(t2_1(2,1) - (t3dg_3(2,0,0)*t3dg_2(0,1,0)
-			     + t3dg_3(2,0,1)*t3dg_2(1,1,0)
-			     + t3dg_3(2,0,2)*t3dg_2(2,1,0)
-			     + t3dg_3(2,1,0)*t3dg_2(0,1,1)
-			     + t3dg_3(2,1,1)*t3dg_2(1,1,1)
-			     + t3dg_3(2,1,2)*t3dg_2(2,1,1)
-			     + t3dg_3(2,2,0)*t3dg_2(0,1,2)
-			     + t3dg_3(2,2,1)*t3dg_2(1,1,2)
-			     + t3dg_3(2,2,2)*t3dg_2(2,1,2))
-		,"T3dg(k,l,j)*T3dg(i,j,k)(2,1)");
-  test_for_zero(t2_1(2,2) - (t3dg_3(2,0,0)*t3dg_2(0,2,0)
-			     + t3dg_3(2,0,1)*t3dg_2(1,2,0)
-			     + t3dg_3(2,0,2)*t3dg_2(2,2,0)
-			     + t3dg_3(2,1,0)*t3dg_2(0,2,1)
-			     + t3dg_3(2,1,1)*t3dg_2(1,2,1)
-			     + t3dg_3(2,1,2)*t3dg_2(2,2,1)
-			     + t3dg_3(2,2,0)*t3dg_2(0,2,2)
-			     + t3dg_3(2,2,1)*t3dg_2(1,2,2)
-			     + t3dg_3(2,2,2)*t3dg_2(2,2,2))
-		,"T3dg(k,l,j)*T3dg(i,j,k)(2,2)");
-
-  cout << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgCII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgCII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,626 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgCII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+		 Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+		 Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+		 const Tensor2<double,3,3> &t2_3,
+		 Tensor2_symmetric<double,3> &t2s_1,
+		 const Tensor2_symmetric<double,3> &t2s_2,
+		 const Tensor2_symmetric<double,3> &t2s_3,
+		 Tensor3_dg<double,3,3> &t3dg_1,
+		 const Tensor3_dg<double,3,3> &t3dg_2,
+		 const Tensor3_dg<double,3,3> &t3dg_3,
+		 Tensor3_christof<double,3,3> &t3ch_1,
+		 const Tensor3_christof<double,3,3> &t3ch_2,
+		 const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+  
+  t3dg_1(j,k,i)=(t3dg_2(i,j,k) || t3dg_2(i,k,j));
+  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0) + t3dg_2(0,0,0))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(0,0,0)");
+  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,0,1) + t3dg_2(0,1,0))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(0,0,1)");
+  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,0,2) + t3dg_2(0,2,0))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(0,0,2)");
+  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(0,1,0) + t3dg_2(0,0,1))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(0,1,0)");
+  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(0,1,1) + t3dg_2(0,1,1))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(0,1,1)");
+  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(0,1,2) + t3dg_2(0,2,1))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(0,1,2)");
+  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(0,2,0) + t3dg_2(0,0,2))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(0,2,0)");
+  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(0,2,1) + t3dg_2(0,1,2))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(0,2,1)");
+  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(0,2,2) + t3dg_2(0,2,2))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(0,2,2)");
+  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(1,0,0) + t3dg_2(1,0,0))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(1,0,0)");
+  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(1,0,1) + t3dg_2(1,1,0))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(1,0,1)");
+  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(1,0,2) + t3dg_2(1,2,0))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(1,0,2)");
+  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,1,0) + t3dg_2(1,0,1))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,1) + t3dg_2(1,1,1))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(1,1,1)");
+  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,1,2) + t3dg_2(1,2,1))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(1,1,2)");
+  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(1,2,0) + t3dg_2(1,0,2))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(1,2,0)");
+  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(1,2,1) + t3dg_2(1,1,2))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(1,2,1)");
+  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(1,2,2) + t3dg_2(1,2,2))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(1,2,2)");
+  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(2,0,0) + t3dg_2(2,0,0))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(2,0,0)");
+  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(2,0,1) + t3dg_2(2,1,0))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(2,0,1)");
+  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(2,0,2) + t3dg_2(2,2,0))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(2,0,2)");
+  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(2,1,0) + t3dg_2(2,0,1))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(2,1,0)");
+  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(2,1,1) + t3dg_2(2,1,1))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(2,1,1)");
+  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(2,1,2) + t3dg_2(2,2,1))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(2,1,2)");
+  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,2,0) + t3dg_2(2,0,2))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(2,2,0)");
+  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,2,1) + t3dg_2(2,1,2))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,2) + t3dg_2(2,2,2))
+		,"T3dg(i,j,k)||T3dg(i,k,j)(2,2,2)");
+
+  t3dg_1(j,k,i)=(t3dg_2(j,i,k) || t3dg_2(k,i,j));
+  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0) + t3dg_2(0,0,0))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(0,0,0)");
+  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,0,1) + t3dg_2(1,0,0))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(0,0,1)");
+  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,0,2) + t3dg_2(2,0,0))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(0,0,2)");
+  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(0,1,0) + t3dg_2(0,0,1))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(0,1,0)");
+  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(0,1,1) + t3dg_2(1,0,1))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(0,1,1)");
+  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(0,1,2) + t3dg_2(2,0,1))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(0,1,2)");
+  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(0,2,0) + t3dg_2(0,0,2))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(0,2,0)");
+  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(0,2,1) + t3dg_2(1,0,2))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(0,2,1)");
+  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(0,2,2) + t3dg_2(2,0,2))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(0,2,2)");
+  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(1,0,0) + t3dg_2(0,1,0))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(1,0,0)");
+  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(1,0,1) + t3dg_2(1,1,0))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(1,0,1)");
+  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(1,0,2) + t3dg_2(2,1,0))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(1,0,2)");
+  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,1,0) + t3dg_2(0,1,1))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,1) + t3dg_2(1,1,1))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(1,1,1)");
+  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,1,2) + t3dg_2(2,1,1))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(1,1,2)");
+  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(1,2,0) + t3dg_2(0,1,2))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(1,2,0)");
+  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(1,2,1) + t3dg_2(1,1,2))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(1,2,1)");
+  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(1,2,2) + t3dg_2(2,1,2))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(1,2,2)");
+  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(2,0,0) + t3dg_2(0,2,0))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(2,0,0)");
+  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(2,0,1) + t3dg_2(1,2,0))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(2,0,1)");
+  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(2,0,2) + t3dg_2(2,2,0))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(2,0,2)");
+  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(2,1,0) + t3dg_2(0,2,1))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(2,1,0)");
+  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(2,1,1) + t3dg_2(1,2,1))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(2,1,1)");
+  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(2,1,2) + t3dg_2(2,2,1))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(2,1,2)");
+  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,2,0) + t3dg_2(0,2,2))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(2,2,0)");
+  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,2,1) + t3dg_2(1,2,2))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,2) + t3dg_2(2,2,2))
+		,"T3dg(j,i,k)||T3dg(k,i,j)(2,2,2)");
+
+  t3dg_1(i,j,k)=t3dg_2(i,j,k)&t2s_2(i,j);
+  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0)*t2s_2(0,0))
+		,"T3dg(j,i,k)&T2s(i,j)(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(0,0,1)*t2s_2(0,0))
+		,"T3dg(j,i,k)&T2s(i,j)(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(0,0,2)*t2s_2(0,0))
+		,"T3dg(j,i,k)&T2s(i,j)(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,1,0)*t2s_2(0,1))
+		,"T3dg(j,i,k)&T2s(i,j)(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(0,1,1)*t2s_2(0,1))
+		,"T3dg(j,i,k)&T2s(i,j)(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(0,1,2)*t2s_2(0,1))
+		,"T3dg(j,i,k)&T2s(i,j)(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,2,0)*t2s_2(0,2))
+		,"T3dg(j,i,k)&T2s(i,j)(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(0,2,1)*t2s_2(0,2))
+		,"T3dg(j,i,k)&T2s(i,j)(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(0,2,2)*t2s_2(0,2))
+		,"T3dg(j,i,k)&T2s(i,j)(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(1,0,0)*t2s_2(1,0))
+		,"T3dg(j,i,k)&T2s(i,j)(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,0,1)*t2s_2(1,0))
+		,"T3dg(j,i,k)&T2s(i,j)(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(1,0,2)*t2s_2(1,0))
+		,"T3dg(j,i,k)&T2s(i,j)(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(1,1,0)*t2s_2(1,1))
+		,"T3dg(j,i,k)&T2s(i,j)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,1)*t2s_2(1,1))
+		,"T3dg(j,i,k)&T2s(i,j)(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(1,1,2)*t2s_2(1,1))
+		,"T3dg(j,i,k)&T2s(i,j)(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(1,2,0)*t2s_2(1,2))
+		,"T3dg(j,i,k)&T2s(i,j)(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,2,1)*t2s_2(1,2))
+		,"T3dg(j,i,k)&T2s(i,j)(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(1,2,2)*t2s_2(1,2))
+		,"T3dg(j,i,k)&T2s(i,j)(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(2,0,0)*t2s_2(2,0))
+		,"T3dg(j,i,k)&T2s(i,j)(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(2,0,1)*t2s_2(2,0))
+		,"T3dg(j,i,k)&T2s(i,j)(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,0,2)*t2s_2(2,0))
+		,"T3dg(j,i,k)&T2s(i,j)(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(2,1,0)*t2s_2(2,1))
+		,"T3dg(j,i,k)&T2s(i,j)(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(2,1,1)*t2s_2(2,1))
+		,"T3dg(j,i,k)&T2s(i,j)(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,1,2)*t2s_2(2,1))
+		,"T3dg(j,i,k)&T2s(i,j)(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(2,2,0)*t2s_2(2,2))
+		,"T3dg(j,i,k)&T2s(i,j)(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(2,2,1)*t2s_2(2,2))
+		,"T3dg(j,i,k)&T2s(i,j)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,2)*t2s_2(2,2))
+		,"T3dg(j,i,k)&T2s(i,j)(2,2,2)");
+
+  t3dg_1(i,j,k)=t2s_2(i,j)&t3dg_2(i,j,k);
+  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0)*t2s_2(0,0))
+		,"T2s(i,j)&T3dg(j,i,k)(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(0,0,1)*t2s_2(0,0))
+		,"T2s(i,j)&T3dg(j,i,k)(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(0,0,2)*t2s_2(0,0))
+		,"T2s(i,j)&T3dg(j,i,k)(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,1,0)*t2s_2(0,1))
+		,"T2s(i,j)&T3dg(j,i,k)(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(0,1,1)*t2s_2(0,1))
+		,"T2s(i,j)&T3dg(j,i,k)(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(0,1,2)*t2s_2(0,1))
+		,"T2s(i,j)&T3dg(j,i,k)(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,2,0)*t2s_2(0,2))
+		,"T2s(i,j)&T3dg(j,i,k)(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(0,2,1)*t2s_2(0,2))
+		,"T2s(i,j)&T3dg(j,i,k)(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(0,2,2)*t2s_2(0,2))
+		,"T2s(i,j)&T3dg(j,i,k)(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(1,0,0)*t2s_2(1,0))
+		,"T2s(i,j)&T3dg(j,i,k)(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,0,1)*t2s_2(1,0))
+		,"T2s(i,j)&T3dg(j,i,k)(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(1,0,2)*t2s_2(1,0))
+		,"T2s(i,j)&T3dg(j,i,k)(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(1,1,0)*t2s_2(1,1))
+		,"T2s(i,j)&T3dg(j,i,k)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,1)*t2s_2(1,1))
+		,"T2s(i,j)&T3dg(j,i,k)(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(1,1,2)*t2s_2(1,1))
+		,"T2s(i,j)&T3dg(j,i,k)(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(1,2,0)*t2s_2(1,2))
+		,"T2s(i,j)&T3dg(j,i,k)(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,2,1)*t2s_2(1,2))
+		,"T2s(i,j)&T3dg(j,i,k)(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(1,2,2)*t2s_2(1,2))
+		,"T2s(i,j)&T3dg(j,i,k)(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(2,0,0)*t2s_2(2,0))
+		,"T2s(i,j)&T3dg(j,i,k)(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(2,0,1)*t2s_2(2,0))
+		,"T2s(i,j)&T3dg(j,i,k)(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,0,2)*t2s_2(2,0))
+		,"T2s(i,j)&T3dg(j,i,k)(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(2,1,0)*t2s_2(2,1))
+		,"T2s(i,j)&T3dg(j,i,k)(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(2,1,1)*t2s_2(2,1))
+		,"T2s(i,j)&T3dg(j,i,k)(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,1,2)*t2s_2(2,1))
+		,"T2s(i,j)&T3dg(j,i,k)(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(2,2,0)*t2s_2(2,2))
+		,"T2s(i,j)&T3dg(j,i,k)(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(2,2,1)*t2s_2(2,2))
+		,"T2s(i,j)&T3dg(j,i,k)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,2)*t2s_2(2,2))
+		,"T2s(i,j)&T3dg(j,i,k)(2,2,2)");
+
+  t2_1(i,l)=t3dg_2(i,j,k)*t3dg_3(j,k,l);
+  test_for_zero(t2_1(0,0) - (t3dg_2(0,0,0)*t3dg_3(0,0,0)
+			     + t3dg_2(0,0,1)*t3dg_3(0,1,0)
+			     + t3dg_2(0,0,2)*t3dg_3(0,2,0)
+			     + t3dg_2(0,1,0)*t3dg_3(1,0,0)
+			     + t3dg_2(0,1,1)*t3dg_3(1,1,0)
+			     + t3dg_2(0,1,2)*t3dg_3(1,2,0)
+			     + t3dg_2(0,2,0)*t3dg_3(2,0,0)
+			     + t3dg_2(0,2,1)*t3dg_3(2,1,0)
+			     + t3dg_2(0,2,2)*t3dg_3(2,2,0))
+		,"T3dg(i,j,k)*T3dg(j,k,l)(0,0)");
+  test_for_zero(t2_1(0,1) - (t3dg_2(0,0,0)*t3dg_3(0,0,1)
+			     + t3dg_2(0,0,1)*t3dg_3(0,1,1)
+			     + t3dg_2(0,0,2)*t3dg_3(0,2,1)
+			     + t3dg_2(0,1,0)*t3dg_3(1,0,1)
+			     + t3dg_2(0,1,1)*t3dg_3(1,1,1)
+			     + t3dg_2(0,1,2)*t3dg_3(1,2,1)
+			     + t3dg_2(0,2,0)*t3dg_3(2,0,1)
+			     + t3dg_2(0,2,1)*t3dg_3(2,1,1)
+			     + t3dg_2(0,2,2)*t3dg_3(2,2,1))
+		,"T3dg(i,j,k)*T3dg(j,k,l)(0,1)");
+  test_for_zero(t2_1(0,2) - (t3dg_2(0,0,0)*t3dg_3(0,0,2)
+			     + t3dg_2(0,0,1)*t3dg_3(0,1,2)
+			     + t3dg_2(0,0,2)*t3dg_3(0,2,2)
+			     + t3dg_2(0,1,0)*t3dg_3(1,0,2)
+			     + t3dg_2(0,1,1)*t3dg_3(1,1,2)
+			     + t3dg_2(0,1,2)*t3dg_3(1,2,2)
+			     + t3dg_2(0,2,0)*t3dg_3(2,0,2)
+			     + t3dg_2(0,2,1)*t3dg_3(2,1,2)
+			     + t3dg_2(0,2,2)*t3dg_3(2,2,2))
+		,"T3dg(i,j,k)*T3dg(j,k,l)(0,2)");
+  test_for_zero(t2_1(1,0) - (t3dg_2(1,0,0)*t3dg_3(0,0,0)
+			     + t3dg_2(1,0,1)*t3dg_3(0,1,0)
+			     + t3dg_2(1,0,2)*t3dg_3(0,2,0)
+			     + t3dg_2(1,1,0)*t3dg_3(1,0,0)
+			     + t3dg_2(1,1,1)*t3dg_3(1,1,0)
+			     + t3dg_2(1,1,2)*t3dg_3(1,2,0)
+			     + t3dg_2(1,2,0)*t3dg_3(2,0,0)
+			     + t3dg_2(1,2,1)*t3dg_3(2,1,0)
+			     + t3dg_2(1,2,2)*t3dg_3(2,2,0))
+		,"T3dg(i,j,k)*T3dg(j,k,l)(1,0)");
+  test_for_zero(t2_1(1,1) - (t3dg_2(1,0,0)*t3dg_3(0,0,1)
+			     + t3dg_2(1,0,1)*t3dg_3(0,1,1)
+			     + t3dg_2(1,0,2)*t3dg_3(0,2,1)
+			     + t3dg_2(1,1,0)*t3dg_3(1,0,1)
+			     + t3dg_2(1,1,1)*t3dg_3(1,1,1)
+			     + t3dg_2(1,1,2)*t3dg_3(1,2,1)
+			     + t3dg_2(1,2,0)*t3dg_3(2,0,1)
+			     + t3dg_2(1,2,1)*t3dg_3(2,1,1)
+			     + t3dg_2(1,2,2)*t3dg_3(2,2,1))
+		,"T3dg(i,j,k)*T3dg(j,k,l)(1,1)");
+  test_for_zero(t2_1(1,2) - (t3dg_2(1,0,0)*t3dg_3(0,0,2)
+			     + t3dg_2(1,0,1)*t3dg_3(0,1,2)
+			     + t3dg_2(1,0,2)*t3dg_3(0,2,2)
+			     + t3dg_2(1,1,0)*t3dg_3(1,0,2)
+			     + t3dg_2(1,1,1)*t3dg_3(1,1,2)
+			     + t3dg_2(1,1,2)*t3dg_3(1,2,2)
+			     + t3dg_2(1,2,0)*t3dg_3(2,0,2)
+			     + t3dg_2(1,2,1)*t3dg_3(2,1,2)
+			     + t3dg_2(1,2,2)*t3dg_3(2,2,2))
+		,"T3dg(i,j,k)*T3dg(j,k,l)(1,2)");
+  test_for_zero(t2_1(2,0) - (t3dg_2(2,0,0)*t3dg_3(0,0,0)
+			     + t3dg_2(2,0,1)*t3dg_3(0,1,0)
+			     + t3dg_2(2,0,2)*t3dg_3(0,2,0)
+			     + t3dg_2(2,1,0)*t3dg_3(1,0,0)
+			     + t3dg_2(2,1,1)*t3dg_3(1,1,0)
+			     + t3dg_2(2,1,2)*t3dg_3(1,2,0)
+			     + t3dg_2(2,2,0)*t3dg_3(2,0,0)
+			     + t3dg_2(2,2,1)*t3dg_3(2,1,0)
+			     + t3dg_2(2,2,2)*t3dg_3(2,2,0))
+		,"T3dg(i,j,k)*T3dg(j,k,l)(2,0)");
+  test_for_zero(t2_1(2,1) - (t3dg_2(2,0,0)*t3dg_3(0,0,1)
+			     + t3dg_2(2,0,1)*t3dg_3(0,1,1)
+			     + t3dg_2(2,0,2)*t3dg_3(0,2,1)
+			     + t3dg_2(2,1,0)*t3dg_3(1,0,1)
+			     + t3dg_2(2,1,1)*t3dg_3(1,1,1)
+			     + t3dg_2(2,1,2)*t3dg_3(1,2,1)
+			     + t3dg_2(2,2,0)*t3dg_3(2,0,1)
+			     + t3dg_2(2,2,1)*t3dg_3(2,1,1)
+			     + t3dg_2(2,2,2)*t3dg_3(2,2,1))
+		,"T3dg(i,j,k)*T3dg(j,k,l)(2,1)");
+  test_for_zero(t2_1(2,2) - (t3dg_2(2,0,0)*t3dg_3(0,0,2)
+			     + t3dg_2(2,0,1)*t3dg_3(0,1,2)
+			     + t3dg_2(2,0,2)*t3dg_3(0,2,2)
+			     + t3dg_2(2,1,0)*t3dg_3(1,0,2)
+			     + t3dg_2(2,1,1)*t3dg_3(1,1,2)
+			     + t3dg_2(2,1,2)*t3dg_3(1,2,2)
+			     + t3dg_2(2,2,0)*t3dg_3(2,0,2)
+			     + t3dg_2(2,2,1)*t3dg_3(2,1,2)
+			     + t3dg_2(2,2,2)*t3dg_3(2,2,2))
+		,"T3dg(i,j,k)*T3dg(j,k,l)(2,2)");
+
+  t2_1(i,l)=t3dg_2(j,k,l)*t3dg_3(i,j,k);
+  test_for_zero(t2_1(0,0) - (t3dg_3(0,0,0)*t3dg_2(0,0,0)
+			     + t3dg_3(0,0,1)*t3dg_2(0,1,0)
+			     + t3dg_3(0,0,2)*t3dg_2(0,2,0)
+			     + t3dg_3(0,1,0)*t3dg_2(1,0,0)
+			     + t3dg_3(0,1,1)*t3dg_2(1,1,0)
+			     + t3dg_3(0,1,2)*t3dg_2(1,2,0)
+			     + t3dg_3(0,2,0)*t3dg_2(2,0,0)
+			     + t3dg_3(0,2,1)*t3dg_2(2,1,0)
+			     + t3dg_3(0,2,2)*t3dg_2(2,2,0))
+		,"T3dg(j,k,l)*T3dg(i,j,k)(0,0)");
+  test_for_zero(t2_1(0,1) - (t3dg_3(0,0,0)*t3dg_2(0,0,1)
+			     + t3dg_3(0,0,1)*t3dg_2(0,1,1)
+			     + t3dg_3(0,0,2)*t3dg_2(0,2,1)
+			     + t3dg_3(0,1,0)*t3dg_2(1,0,1)
+			     + t3dg_3(0,1,1)*t3dg_2(1,1,1)
+			     + t3dg_3(0,1,2)*t3dg_2(1,2,1)
+			     + t3dg_3(0,2,0)*t3dg_2(2,0,1)
+			     + t3dg_3(0,2,1)*t3dg_2(2,1,1)
+			     + t3dg_3(0,2,2)*t3dg_2(2,2,1))
+		,"T3dg(j,k,l)*T3dg(i,j,k)(0,1)");
+  test_for_zero(t2_1(0,2) - (t3dg_3(0,0,0)*t3dg_2(0,0,2)
+			     + t3dg_3(0,0,1)*t3dg_2(0,1,2)
+			     + t3dg_3(0,0,2)*t3dg_2(0,2,2)
+			     + t3dg_3(0,1,0)*t3dg_2(1,0,2)
+			     + t3dg_3(0,1,1)*t3dg_2(1,1,2)
+			     + t3dg_3(0,1,2)*t3dg_2(1,2,2)
+			     + t3dg_3(0,2,0)*t3dg_2(2,0,2)
+			     + t3dg_3(0,2,1)*t3dg_2(2,1,2)
+			     + t3dg_3(0,2,2)*t3dg_2(2,2,2))
+		,"T3dg(j,k,l)*T3dg(i,j,k)(0,2)");
+  test_for_zero(t2_1(1,0) - (t3dg_3(1,0,0)*t3dg_2(0,0,0)
+			     + t3dg_3(1,0,1)*t3dg_2(0,1,0)
+			     + t3dg_3(1,0,2)*t3dg_2(0,2,0)
+			     + t3dg_3(1,1,0)*t3dg_2(1,0,0)
+			     + t3dg_3(1,1,1)*t3dg_2(1,1,0)
+			     + t3dg_3(1,1,2)*t3dg_2(1,2,0)
+			     + t3dg_3(1,2,0)*t3dg_2(2,0,0)
+			     + t3dg_3(1,2,1)*t3dg_2(2,1,0)
+			     + t3dg_3(1,2,2)*t3dg_2(2,2,0))
+		,"T3dg(j,k,l)*T3dg(i,j,k)(1,0)");
+  test_for_zero(t2_1(1,1) - (t3dg_3(1,0,0)*t3dg_2(0,0,1)
+			     + t3dg_3(1,0,1)*t3dg_2(0,1,1)
+			     + t3dg_3(1,0,2)*t3dg_2(0,2,1)
+			     + t3dg_3(1,1,0)*t3dg_2(1,0,1)
+			     + t3dg_3(1,1,1)*t3dg_2(1,1,1)
+			     + t3dg_3(1,1,2)*t3dg_2(1,2,1)
+			     + t3dg_3(1,2,0)*t3dg_2(2,0,1)
+			     + t3dg_3(1,2,1)*t3dg_2(2,1,1)
+			     + t3dg_3(1,2,2)*t3dg_2(2,2,1))
+		,"T3dg(j,k,l)*T3dg(i,j,k)(1,1)");
+  test_for_zero(t2_1(1,2) - (t3dg_3(1,0,0)*t3dg_2(0,0,2)
+			     + t3dg_3(1,0,1)*t3dg_2(0,1,2)
+			     + t3dg_3(1,0,2)*t3dg_2(0,2,2)
+			     + t3dg_3(1,1,0)*t3dg_2(1,0,2)
+			     + t3dg_3(1,1,1)*t3dg_2(1,1,2)
+			     + t3dg_3(1,1,2)*t3dg_2(1,2,2)
+			     + t3dg_3(1,2,0)*t3dg_2(2,0,2)
+			     + t3dg_3(1,2,1)*t3dg_2(2,1,2)
+			     + t3dg_3(1,2,2)*t3dg_2(2,2,2))
+		,"T3dg(j,k,l)*T3dg(i,j,k)(1,2)");
+  test_for_zero(t2_1(2,0) - (t3dg_3(2,0,0)*t3dg_2(0,0,0)
+			     + t3dg_3(2,0,1)*t3dg_2(0,1,0)
+			     + t3dg_3(2,0,2)*t3dg_2(0,2,0)
+			     + t3dg_3(2,1,0)*t3dg_2(1,0,0)
+			     + t3dg_3(2,1,1)*t3dg_2(1,1,0)
+			     + t3dg_3(2,1,2)*t3dg_2(1,2,0)
+			     + t3dg_3(2,2,0)*t3dg_2(2,0,0)
+			     + t3dg_3(2,2,1)*t3dg_2(2,1,0)
+			     + t3dg_3(2,2,2)*t3dg_2(2,2,0))
+		,"T3dg(j,k,l)*T3dg(i,j,k)(2,0)");
+  test_for_zero(t2_1(2,1) - (t3dg_3(2,0,0)*t3dg_2(0,0,1)
+			     + t3dg_3(2,0,1)*t3dg_2(0,1,1)
+			     + t3dg_3(2,0,2)*t3dg_2(0,2,1)
+			     + t3dg_3(2,1,0)*t3dg_2(1,0,1)
+			     + t3dg_3(2,1,1)*t3dg_2(1,1,1)
+			     + t3dg_3(2,1,2)*t3dg_2(1,2,1)
+			     + t3dg_3(2,2,0)*t3dg_2(2,0,1)
+			     + t3dg_3(2,2,1)*t3dg_2(2,1,1)
+			     + t3dg_3(2,2,2)*t3dg_2(2,2,1))
+		,"T3dg(j,k,l)*T3dg(i,j,k)(2,1)");
+  test_for_zero(t2_1(2,2) - (t3dg_3(2,0,0)*t3dg_2(0,0,2)
+			     + t3dg_3(2,0,1)*t3dg_2(0,1,2)
+			     + t3dg_3(2,0,2)*t3dg_2(0,2,2)
+			     + t3dg_3(2,1,0)*t3dg_2(1,0,2)
+			     + t3dg_3(2,1,1)*t3dg_2(1,1,2)
+			     + t3dg_3(2,1,2)*t3dg_2(1,2,2)
+			     + t3dg_3(2,2,0)*t3dg_2(2,0,2)
+			     + t3dg_3(2,2,1)*t3dg_2(2,1,2)
+			     + t3dg_3(2,2,2)*t3dg_2(2,2,2))
+		,"T3dg(j,k,l)*T3dg(i,j,k)(2,2)");
+
+
+  t2_1(i,l)=t3dg_2(i,j,k)*t3dg_3(k,l,j);
+  test_for_zero(t2_1(0,0) - (t3dg_2(0,0,0)*t3dg_3(0,0,0)
+			     + t3dg_2(0,0,1)*t3dg_3(1,0,0)
+			     + t3dg_2(0,0,2)*t3dg_3(2,0,0)
+			     + t3dg_2(0,1,0)*t3dg_3(0,0,1)
+			     + t3dg_2(0,1,1)*t3dg_3(1,0,1)
+			     + t3dg_2(0,1,2)*t3dg_3(2,0,1)
+			     + t3dg_2(0,2,0)*t3dg_3(0,0,2)
+			     + t3dg_2(0,2,1)*t3dg_3(1,0,2)
+			     + t3dg_2(0,2,2)*t3dg_3(2,0,2))
+		,"T3dg(i,j,k)*T3dg(k,l,j)(0,0)");
+  test_for_zero(t2_1(0,1) - (t3dg_2(0,0,0)*t3dg_3(0,1,0)
+			     + t3dg_2(0,0,1)*t3dg_3(1,1,0)
+			     + t3dg_2(0,0,2)*t3dg_3(2,1,0)
+			     + t3dg_2(0,1,0)*t3dg_3(0,1,1)
+			     + t3dg_2(0,1,1)*t3dg_3(1,1,1)
+			     + t3dg_2(0,1,2)*t3dg_3(2,1,1)
+			     + t3dg_2(0,2,0)*t3dg_3(0,1,2)
+			     + t3dg_2(0,2,1)*t3dg_3(1,1,2)
+			     + t3dg_2(0,2,2)*t3dg_3(2,1,2))
+		,"T3dg(i,j,k)*T3dg(k,l,j)(0,1)");
+  test_for_zero(t2_1(0,2) - (t3dg_2(0,0,0)*t3dg_3(0,2,0)
+			     + t3dg_2(0,0,1)*t3dg_3(1,2,0)
+			     + t3dg_2(0,0,2)*t3dg_3(2,2,0)
+			     + t3dg_2(0,1,0)*t3dg_3(0,2,1)
+			     + t3dg_2(0,1,1)*t3dg_3(1,2,1)
+			     + t3dg_2(0,1,2)*t3dg_3(2,2,1)
+			     + t3dg_2(0,2,0)*t3dg_3(0,2,2)
+			     + t3dg_2(0,2,1)*t3dg_3(1,2,2)
+			     + t3dg_2(0,2,2)*t3dg_3(2,2,2))
+		,"T3dg(i,j,k)*T3dg(k,l,j)(0,2)");
+  test_for_zero(t2_1(1,0) - (t3dg_2(1,0,0)*t3dg_3(0,0,0)
+			     + t3dg_2(1,0,1)*t3dg_3(1,0,0)
+			     + t3dg_2(1,0,2)*t3dg_3(2,0,0)
+			     + t3dg_2(1,1,0)*t3dg_3(0,0,1)
+			     + t3dg_2(1,1,1)*t3dg_3(1,0,1)
+			     + t3dg_2(1,1,2)*t3dg_3(2,0,1)
+			     + t3dg_2(1,2,0)*t3dg_3(0,0,2)
+			     + t3dg_2(1,2,1)*t3dg_3(1,0,2)
+			     + t3dg_2(1,2,2)*t3dg_3(2,0,2))
+		,"T3dg(i,j,k)*T3dg(k,l,j)(1,0)");
+  test_for_zero(t2_1(1,1) - (t3dg_2(1,0,0)*t3dg_3(0,1,0)
+			     + t3dg_2(1,0,1)*t3dg_3(1,1,0)
+			     + t3dg_2(1,0,2)*t3dg_3(2,1,0)
+			     + t3dg_2(1,1,0)*t3dg_3(0,1,1)
+			     + t3dg_2(1,1,1)*t3dg_3(1,1,1)
+			     + t3dg_2(1,1,2)*t3dg_3(2,1,1)
+			     + t3dg_2(1,2,0)*t3dg_3(0,1,2)
+			     + t3dg_2(1,2,1)*t3dg_3(1,1,2)
+			     + t3dg_2(1,2,2)*t3dg_3(2,1,2))
+		,"T3dg(i,j,k)*T3dg(k,l,j)(1,1)");
+  test_for_zero(t2_1(1,2) - (t3dg_2(1,0,0)*t3dg_3(0,2,0)
+			     + t3dg_2(1,0,1)*t3dg_3(1,2,0)
+			     + t3dg_2(1,0,2)*t3dg_3(2,2,0)
+			     + t3dg_2(1,1,0)*t3dg_3(0,2,1)
+			     + t3dg_2(1,1,1)*t3dg_3(1,2,1)
+			     + t3dg_2(1,1,2)*t3dg_3(2,2,1)
+			     + t3dg_2(1,2,0)*t3dg_3(0,2,2)
+			     + t3dg_2(1,2,1)*t3dg_3(1,2,2)
+			     + t3dg_2(1,2,2)*t3dg_3(2,2,2))
+		,"T3dg(i,j,k)*T3dg(k,l,j)(1,2)");
+  test_for_zero(t2_1(2,0) - (t3dg_2(2,0,0)*t3dg_3(0,0,0)
+			     + t3dg_2(2,0,1)*t3dg_3(1,0,0)
+			     + t3dg_2(2,0,2)*t3dg_3(2,0,0)
+			     + t3dg_2(2,1,0)*t3dg_3(0,0,1)
+			     + t3dg_2(2,1,1)*t3dg_3(1,0,1)
+			     + t3dg_2(2,1,2)*t3dg_3(2,0,1)
+			     + t3dg_2(2,2,0)*t3dg_3(0,0,2)
+			     + t3dg_2(2,2,1)*t3dg_3(1,0,2)
+			     + t3dg_2(2,2,2)*t3dg_3(2,0,2))
+		,"T3dg(i,j,k)*T3dg(k,l,j)(2,0)");
+  test_for_zero(t2_1(2,1) - (t3dg_2(2,0,0)*t3dg_3(0,1,0)
+			     + t3dg_2(2,0,1)*t3dg_3(1,1,0)
+			     + t3dg_2(2,0,2)*t3dg_3(2,1,0)
+			     + t3dg_2(2,1,0)*t3dg_3(0,1,1)
+			     + t3dg_2(2,1,1)*t3dg_3(1,1,1)
+			     + t3dg_2(2,1,2)*t3dg_3(2,1,1)
+			     + t3dg_2(2,2,0)*t3dg_3(0,1,2)
+			     + t3dg_2(2,2,1)*t3dg_3(1,1,2)
+			     + t3dg_2(2,2,2)*t3dg_3(2,1,2))
+		,"T3dg(i,j,k)*T3dg(k,l,j)(2,1)");
+  test_for_zero(t2_1(2,2) - (t3dg_2(2,0,0)*t3dg_3(0,2,0)
+			     + t3dg_2(2,0,1)*t3dg_3(1,2,0)
+			     + t3dg_2(2,0,2)*t3dg_3(2,2,0)
+			     + t3dg_2(2,1,0)*t3dg_3(0,2,1)
+			     + t3dg_2(2,1,1)*t3dg_3(1,2,1)
+			     + t3dg_2(2,1,2)*t3dg_3(2,2,1)
+			     + t3dg_2(2,2,0)*t3dg_3(0,2,2)
+			     + t3dg_2(2,2,1)*t3dg_3(1,2,2)
+			     + t3dg_2(2,2,2)*t3dg_3(2,2,2))
+		,"T3dg(i,j,k)*T3dg(k,l,j)(2,2)");
+
+  t2_1(i,l)=t3dg_2(k,l,j)*t3dg_3(i,j,k);
+  test_for_zero(t2_1(0,0) - (t3dg_3(0,0,0)*t3dg_2(0,0,0)
+			     + t3dg_3(0,0,1)*t3dg_2(1,0,0)
+			     + t3dg_3(0,0,2)*t3dg_2(2,0,0)
+			     + t3dg_3(0,1,0)*t3dg_2(0,0,1)
+			     + t3dg_3(0,1,1)*t3dg_2(1,0,1)
+			     + t3dg_3(0,1,2)*t3dg_2(2,0,1)
+			     + t3dg_3(0,2,0)*t3dg_2(0,0,2)
+			     + t3dg_3(0,2,1)*t3dg_2(1,0,2)
+			     + t3dg_3(0,2,2)*t3dg_2(2,0,2))
+		,"T3dg(k,l,j)*T3dg(i,j,k)(0,0)");
+  test_for_zero(t2_1(0,1) - (t3dg_3(0,0,0)*t3dg_2(0,1,0)
+			     + t3dg_3(0,0,1)*t3dg_2(1,1,0)
+			     + t3dg_3(0,0,2)*t3dg_2(2,1,0)
+			     + t3dg_3(0,1,0)*t3dg_2(0,1,1)
+			     + t3dg_3(0,1,1)*t3dg_2(1,1,1)
+			     + t3dg_3(0,1,2)*t3dg_2(2,1,1)
+			     + t3dg_3(0,2,0)*t3dg_2(0,1,2)
+			     + t3dg_3(0,2,1)*t3dg_2(1,1,2)
+			     + t3dg_3(0,2,2)*t3dg_2(2,1,2))
+		,"T3dg(k,l,j)*T3dg(i,j,k)(0,1)");
+  test_for_zero(t2_1(0,2) - (t3dg_3(0,0,0)*t3dg_2(0,2,0)
+			     + t3dg_3(0,0,1)*t3dg_2(1,2,0)
+			     + t3dg_3(0,0,2)*t3dg_2(2,2,0)
+			     + t3dg_3(0,1,0)*t3dg_2(0,2,1)
+			     + t3dg_3(0,1,1)*t3dg_2(1,2,1)
+			     + t3dg_3(0,1,2)*t3dg_2(2,2,1)
+			     + t3dg_3(0,2,0)*t3dg_2(0,2,2)
+			     + t3dg_3(0,2,1)*t3dg_2(1,2,2)
+			     + t3dg_3(0,2,2)*t3dg_2(2,2,2))
+		,"T3dg(k,l,j)*T3dg(i,j,k)(0,2)");
+  test_for_zero(t2_1(1,0) - (t3dg_3(1,0,0)*t3dg_2(0,0,0)
+			     + t3dg_3(1,0,1)*t3dg_2(1,0,0)
+			     + t3dg_3(1,0,2)*t3dg_2(2,0,0)
+			     + t3dg_3(1,1,0)*t3dg_2(0,0,1)
+			     + t3dg_3(1,1,1)*t3dg_2(1,0,1)
+			     + t3dg_3(1,1,2)*t3dg_2(2,0,1)
+			     + t3dg_3(1,2,0)*t3dg_2(0,0,2)
+			     + t3dg_3(1,2,1)*t3dg_2(1,0,2)
+			     + t3dg_3(1,2,2)*t3dg_2(2,0,2))
+		,"T3dg(k,l,j)*T3dg(i,j,k)(1,0)");
+  test_for_zero(t2_1(1,1) - (t3dg_3(1,0,0)*t3dg_2(0,1,0)
+			     + t3dg_3(1,0,1)*t3dg_2(1,1,0)
+			     + t3dg_3(1,0,2)*t3dg_2(2,1,0)
+			     + t3dg_3(1,1,0)*t3dg_2(0,1,1)
+			     + t3dg_3(1,1,1)*t3dg_2(1,1,1)
+			     + t3dg_3(1,1,2)*t3dg_2(2,1,1)
+			     + t3dg_3(1,2,0)*t3dg_2(0,1,2)
+			     + t3dg_3(1,2,1)*t3dg_2(1,1,2)
+			     + t3dg_3(1,2,2)*t3dg_2(2,1,2))
+		,"T3dg(k,l,j)*T3dg(i,j,k)(1,1)");
+  test_for_zero(t2_1(1,2) - (t3dg_3(1,0,0)*t3dg_2(0,2,0)
+			     + t3dg_3(1,0,1)*t3dg_2(1,2,0)
+			     + t3dg_3(1,0,2)*t3dg_2(2,2,0)
+			     + t3dg_3(1,1,0)*t3dg_2(0,2,1)
+			     + t3dg_3(1,1,1)*t3dg_2(1,2,1)
+			     + t3dg_3(1,1,2)*t3dg_2(2,2,1)
+			     + t3dg_3(1,2,0)*t3dg_2(0,2,2)
+			     + t3dg_3(1,2,1)*t3dg_2(1,2,2)
+			     + t3dg_3(1,2,2)*t3dg_2(2,2,2))
+		,"T3dg(k,l,j)*T3dg(i,j,k)(1,2)");
+  test_for_zero(t2_1(2,0) - (t3dg_3(2,0,0)*t3dg_2(0,0,0)
+			     + t3dg_3(2,0,1)*t3dg_2(1,0,0)
+			     + t3dg_3(2,0,2)*t3dg_2(2,0,0)
+			     + t3dg_3(2,1,0)*t3dg_2(0,0,1)
+			     + t3dg_3(2,1,1)*t3dg_2(1,0,1)
+			     + t3dg_3(2,1,2)*t3dg_2(2,0,1)
+			     + t3dg_3(2,2,0)*t3dg_2(0,0,2)
+			     + t3dg_3(2,2,1)*t3dg_2(1,0,2)
+			     + t3dg_3(2,2,2)*t3dg_2(2,0,2))
+		,"T3dg(k,l,j)*T3dg(i,j,k)(2,0)");
+  test_for_zero(t2_1(2,1) - (t3dg_3(2,0,0)*t3dg_2(0,1,0)
+			     + t3dg_3(2,0,1)*t3dg_2(1,1,0)
+			     + t3dg_3(2,0,2)*t3dg_2(2,1,0)
+			     + t3dg_3(2,1,0)*t3dg_2(0,1,1)
+			     + t3dg_3(2,1,1)*t3dg_2(1,1,1)
+			     + t3dg_3(2,1,2)*t3dg_2(2,1,1)
+			     + t3dg_3(2,2,0)*t3dg_2(0,1,2)
+			     + t3dg_3(2,2,1)*t3dg_2(1,1,2)
+			     + t3dg_3(2,2,2)*t3dg_2(2,1,2))
+		,"T3dg(k,l,j)*T3dg(i,j,k)(2,1)");
+  test_for_zero(t2_1(2,2) - (t3dg_3(2,0,0)*t3dg_2(0,2,0)
+			     + t3dg_3(2,0,1)*t3dg_2(1,2,0)
+			     + t3dg_3(2,0,2)*t3dg_2(2,2,0)
+			     + t3dg_3(2,1,0)*t3dg_2(0,2,1)
+			     + t3dg_3(2,1,1)*t3dg_2(1,2,1)
+			     + t3dg_3(2,1,2)*t3dg_2(2,2,1)
+			     + t3dg_3(2,2,0)*t3dg_2(0,2,2)
+			     + t3dg_3(2,2,1)*t3dg_2(1,2,2)
+			     + t3dg_3(2,2,2)*t3dg_2(2,2,2))
+		,"T3dg(k,l,j)*T3dg(i,j,k)(2,2)");
+
+  cout << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgCIII.C
--- a/tests/conformance/T3dg/test_T3dgCIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1288 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgCIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-		  Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-		  Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-		  const Tensor2<double,3,3> &t2_3,
-		  Tensor2_symmetric<double,3> &t2s_1,
-		  const Tensor2_symmetric<double,3> &t2s_2,
-		  const Tensor2_symmetric<double,3> &t2s_3,
-		  Tensor3_dg<double,3,3> &t3dg_1,
-		  const Tensor3_dg<double,3,3> &t3dg_2,
-		  const Tensor3_dg<double,3,3> &t3dg_3,
-		  Tensor3_christof<double,3,3> &t3ch_1,
-		  const Tensor3_christof<double,3,3> &t3ch_2,
-		  const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(0,0,0)
-		- (t3dg_2(0,0,0)+t3dg_3(0,0,0))
-		,"T3dg(i,j,k)+T3(k,j,i)(0,0,0)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(0,0,1)
-		- (t3dg_2(0,0,1)+t3dg_3(1,0,0))
-		,"T3dg(i,j,k)+T3(k,j,i)(0,0,1)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(0,0,2)
-		- (t3dg_2(0,0,2)+t3dg_3(2,0,0))
-		,"T3dg(i,j,k)+T3(k,j,i)(0,0,2)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(0,1,0)
-		- (t3dg_2(0,1,0)+t3dg_3(0,1,0))
-		,"T3dg(i,j,k)+T3(k,j,i)(0,1,0)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(0,1,1)
-		- (t3dg_2(0,1,1)+t3dg_3(1,1,0))
-		,"T3dg(i,j,k)+T3(k,j,i)(0,1,1)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(0,1,2)
-		- (t3dg_2(0,1,2)+t3dg_3(2,1,0))
-		,"T3dg(i,j,k)+T3(k,j,i)(0,1,2)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(0,2,0)
-		- (t3dg_2(0,2,0)+t3dg_3(0,2,0))
-		,"T3dg(i,j,k)+T3(k,j,i)(0,2,0)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(0,2,1)
-		- (t3dg_2(0,2,1)+t3dg_3(1,2,0))
-		,"T3dg(i,j,k)+T3(k,j,i)(0,2,1)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(0,2,2)
-		- (t3dg_2(0,2,2)+t3dg_3(2,2,0))
-		,"T3dg(i,j,k)+T3(k,j,i)(0,2,2)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(1,0,0)
-		- (t3dg_2(1,0,0)+t3dg_3(0,0,1))
-		,"T3dg(i,j,k)+T3(k,j,i)(1,0,0)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(1,0,1)
-		- (t3dg_2(1,0,1)+t3dg_3(1,0,1))
-		,"T3dg(i,j,k)+T3(k,j,i)(1,0,1)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(1,0,2)
-		- (t3dg_2(1,0,2)+t3dg_3(2,0,1))
-		,"T3dg(i,j,k)+T3(k,j,i)(1,0,2)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(1,1,0)
-		- (t3dg_2(1,1,0)+t3dg_3(0,1,1))
-		,"T3dg(i,j,k)+T3(k,j,i)(1,1,0)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(1,1,1)
-		- (t3dg_2(1,1,1)+t3dg_3(1,1,1))
-		,"T3dg(i,j,k)+T3(k,j,i)(1,1,1)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(1,1,2)
-		- (t3dg_2(1,1,2)+t3dg_3(2,1,1))
-		,"T3dg(i,j,k)+T3(k,j,i)(1,1,2)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(1,2,0)
-		- (t3dg_2(1,2,0)+t3dg_3(0,2,1))
-		,"T3dg(i,j,k)+T3(k,j,i)(1,2,0)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(1,2,1)
-		- (t3dg_2(1,2,1)+t3dg_3(1,2,1))
-		,"T3dg(i,j,k)+T3(k,j,i)(1,2,1)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(1,2,2)
-		- (t3dg_2(1,2,2)+t3dg_3(2,2,1))
-		,"T3dg(i,j,k)+T3(k,j,i)(1,2,2)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(2,0,0)
-		- (t3dg_2(2,0,0)+t3dg_3(0,0,2))
-		,"T3dg(i,j,k)+T3(k,j,i)(2,0,0)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(2,0,1)
-		- (t3dg_2(2,0,1)+t3dg_3(1,0,2))
-		,"T3dg(i,j,k)+T3(k,j,i)(2,0,1)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(2,0,2)
-		- (t3dg_2(2,0,2)+t3dg_3(2,0,2))
-		,"T3dg(i,j,k)+T3(k,j,i)(2,0,2)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(2,1,0)
-		- (t3dg_2(2,1,0)+t3dg_3(0,1,2))
-		,"T3dg(i,j,k)+T3(k,j,i)(2,1,0)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(2,1,1)
-		- (t3dg_2(2,1,1)+t3dg_3(1,1,2))
-		,"T3dg(i,j,k)+T3(k,j,i)(2,1,1)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(2,1,2)
-		- (t3dg_2(2,1,2)+t3dg_3(2,1,2))
-		,"T3dg(i,j,k)+T3(k,j,i)(2,1,2)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(2,2,0)
-		- (t3dg_2(2,2,0)+t3dg_3(0,2,2))
-		,"T3dg(i,j,k)+T3(k,j,i)(2,2,0)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(2,2,1)
-		- (t3dg_2(2,2,1)+t3dg_3(1,2,2))
-		,"T3dg(i,j,k)+T3(k,j,i)(2,2,1)");
-  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(2,2,2)
-		- (t3dg_2(2,2,2)+t3dg_3(2,2,2))
-		,"T3dg(i,j,k)+T3(k,j,i)(2,2,2)");
-
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(0,0,0)
-		- (t3dg_2(0,0,0)-t3dg_3(0,0,0))
-		,"T3dg(i,j,k)-T3(k,j,i)(0,0,0)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(0,0,1)
-		- (t3dg_2(0,0,1)-t3dg_3(1,0,0))
-		,"T3dg(i,j,k)-T3(k,j,i)(0,0,1)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(0,0,2)
-		- (t3dg_2(0,0,2)-t3dg_3(2,0,0))
-		,"T3dg(i,j,k)-T3(k,j,i)(0,0,2)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(0,1,0)
-		- (t3dg_2(0,1,0)-t3dg_3(0,1,0))
-		,"T3dg(i,j,k)-T3(k,j,i)(0,1,0)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(0,1,1)
-		- (t3dg_2(0,1,1)-t3dg_3(1,1,0))
-		,"T3dg(i,j,k)-T3(k,j,i)(0,1,1)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(0,1,2)
-		- (t3dg_2(0,1,2)-t3dg_3(2,1,0))
-		,"T3dg(i,j,k)-T3(k,j,i)(0,1,2)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(0,2,0)
-		- (t3dg_2(0,2,0)-t3dg_3(0,2,0))
-		,"T3dg(i,j,k)-T3(k,j,i)(0,2,0)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(0,2,1)
-		- (t3dg_2(0,2,1)-t3dg_3(1,2,0))
-		,"T3dg(i,j,k)-T3(k,j,i)(0,2,1)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(0,2,2)
-		- (t3dg_2(0,2,2)-t3dg_3(2,2,0))
-		,"T3dg(i,j,k)-T3(k,j,i)(0,2,2)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(1,0,0)
-		- (t3dg_2(1,0,0)-t3dg_3(0,0,1))
-		,"T3dg(i,j,k)-T3(k,j,i)(1,0,0)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(1,0,1)
-		- (t3dg_2(1,0,1)-t3dg_3(1,0,1))
-		,"T3dg(i,j,k)-T3(k,j,i)(1,0,1)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(1,0,2)
-		- (t3dg_2(1,0,2)-t3dg_3(2,0,1))
-		,"T3dg(i,j,k)-T3(k,j,i)(1,0,2)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(1,1,0)
-		- (t3dg_2(1,1,0)-t3dg_3(0,1,1))
-		,"T3dg(i,j,k)-T3(k,j,i)(1,1,0)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(1,1,1)
-		- (t3dg_2(1,1,1)-t3dg_3(1,1,1))
-		,"T3dg(i,j,k)-T3(k,j,i)(1,1,1)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(1,1,2)
-		- (t3dg_2(1,1,2)-t3dg_3(2,1,1))
-		,"T3dg(i,j,k)-T3(k,j,i)(1,1,2)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(1,2,0)
-		- (t3dg_2(1,2,0)-t3dg_3(0,2,1))
-		,"T3dg(i,j,k)-T3(k,j,i)(1,2,0)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(1,2,1)
-		- (t3dg_2(1,2,1)-t3dg_3(1,2,1))
-		,"T3dg(i,j,k)-T3(k,j,i)(1,2,1)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(1,2,2)
-		- (t3dg_2(1,2,2)-t3dg_3(2,2,1))
-		,"T3dg(i,j,k)-T3(k,j,i)(1,2,2)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(2,0,0)
-		- (t3dg_2(2,0,0)-t3dg_3(0,0,2))
-		,"T3dg(i,j,k)-T3(k,j,i)(2,0,0)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(2,0,1)
-		- (t3dg_2(2,0,1)-t3dg_3(1,0,2))
-		,"T3dg(i,j,k)-T3(k,j,i)(2,0,1)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(2,0,2)
-		- (t3dg_2(2,0,2)-t3dg_3(2,0,2))
-		,"T3dg(i,j,k)-T3(k,j,i)(2,0,2)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(2,1,0)
-		- (t3dg_2(2,1,0)-t3dg_3(0,1,2))
-		,"T3dg(i,j,k)-T3(k,j,i)(2,1,0)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(2,1,1)
-		- (t3dg_2(2,1,1)-t3dg_3(1,1,2))
-		,"T3dg(i,j,k)-T3(k,j,i)(2,1,1)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(2,1,2)
-		- (t3dg_2(2,1,2)-t3dg_3(2,1,2))
-		,"T3dg(i,j,k)-T3(k,j,i)(2,1,2)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(2,2,0)
-		- (t3dg_2(2,2,0)-t3dg_3(0,2,2))
-		,"T3dg(i,j,k)-T3(k,j,i)(2,2,0)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(2,2,1)
-		- (t3dg_2(2,2,1)-t3dg_3(1,2,2))
-		,"T3dg(i,j,k)-T3(k,j,i)(2,2,1)");
-  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(2,2,2)
-		- (t3dg_2(2,2,2)-t3dg_3(2,2,2))
-		,"T3dg(i,j,k)-T3(k,j,i)(2,2,2)");
-
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(0,0,0)
-		- (t3dg_2(0,0,0)*t2_2(0,0)
-		   + t3dg_2(0,1,0)*t2_2(1,0)
-		   + t3dg_2(0,2,0)*t2_2(2,0))
-		,"T3dg(i,j,k)*T2(j,l)(0,0,0)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(0,0,1)
-		- (t3dg_2(0,0,0)*t2_2(0,1)
-		   + t3dg_2(0,1,0)*t2_2(1,1)
-		   + t3dg_2(0,2,0)*t2_2(2,1))
-		,"T3dg(i,j,k)*T2(j,l)(0,0,1)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(0,0,2)
-		- (t3dg_2(0,0,0)*t2_2(0,2)
-		   + t3dg_2(0,1,0)*t2_2(1,2)
-		   + t3dg_2(0,2,0)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(j,l)(0,0,2)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(0,1,0)
-		- (t3dg_2(0,0,1)*t2_2(0,0)
-		   + t3dg_2(0,1,1)*t2_2(1,0)
-		   + t3dg_2(0,2,1)*t2_2(2,0))
-		,"T3dg(i,j,k)*T2(j,l)(0,1,0)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(0,1,1)
-		- (t3dg_2(0,0,1)*t2_2(0,1)
-		   + t3dg_2(0,1,1)*t2_2(1,1)
-		   + t3dg_2(0,2,1)*t2_2(2,1))
-		,"T3dg(i,j,k)*T2(j,l)(0,1,1)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(0,1,2)
-		- (t3dg_2(0,0,1)*t2_2(0,2)
-		   + t3dg_2(0,1,1)*t2_2(1,2)
-		   + t3dg_2(0,2,1)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(j,l)(0,1,2)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(0,2,0)
-		- (t3dg_2(0,0,2)*t2_2(0,0)
-		   + t3dg_2(0,1,2)*t2_2(1,0)
-		   + t3dg_2(0,2,2)*t2_2(2,0))
-		,"T3dg(i,j,k)*T2(j,l)(0,2,0)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(0,2,1)
-		- (t3dg_2(0,0,2)*t2_2(0,1)
-		   + t3dg_2(0,1,2)*t2_2(1,1)
-		   + t3dg_2(0,2,2)*t2_2(2,1))
-		,"T3dg(i,j,k)*T2(j,l)(0,2,1)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(0,2,2)
-		- (t3dg_2(0,0,2)*t2_2(0,2)
-		   + t3dg_2(0,1,2)*t2_2(1,2)
-		   + t3dg_2(0,2,2)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(j,l)(0,2,2)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(1,0,0)
-		- (t3dg_2(1,0,0)*t2_2(0,0)
-		   + t3dg_2(1,1,0)*t2_2(1,0)
-		   + t3dg_2(1,2,0)*t2_2(2,0))
-		,"T3dg(i,j,k)*T2(j,l)(1,0,0)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(1,0,1)
-		- (t3dg_2(1,0,0)*t2_2(0,1)
-		   + t3dg_2(1,1,0)*t2_2(1,1)
-		   + t3dg_2(1,2,0)*t2_2(2,1))
-		,"T3dg(i,j,k)*T2(j,l)(1,0,1)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(1,0,2)
-		- (t3dg_2(1,0,0)*t2_2(0,2)
-		   + t3dg_2(1,1,0)*t2_2(1,2)
-		   + t3dg_2(1,2,0)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(j,l)(1,0,2)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(1,1,0)
-		- (t3dg_2(1,0,1)*t2_2(0,0)
-		   + t3dg_2(1,1,1)*t2_2(1,0)
-		   + t3dg_2(1,2,1)*t2_2(2,0))
-		,"T3dg(i,j,k)*T2(j,l)(1,1,0)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(1,1,1)
-		- (t3dg_2(1,0,1)*t2_2(0,1)
-		   + t3dg_2(1,1,1)*t2_2(1,1)
-		   + t3dg_2(1,2,1)*t2_2(2,1))
-		,"T3dg(i,j,k)*T2(j,l)(1,1,1)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(1,1,2)
-		- (t3dg_2(1,0,1)*t2_2(0,2)
-		   + t3dg_2(1,1,1)*t2_2(1,2)
-		   + t3dg_2(1,2,1)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(j,l)(1,1,2)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(1,2,0)
-		- (t3dg_2(1,0,2)*t2_2(0,0)
-		   + t3dg_2(1,1,2)*t2_2(1,0)
-		   + t3dg_2(1,2,2)*t2_2(2,0))
-		,"T3dg(i,j,k)*T2(j,l)(1,2,0)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(1,2,1)
-		- (t3dg_2(1,0,2)*t2_2(0,1)
-		   + t3dg_2(1,1,2)*t2_2(1,1)
-		   + t3dg_2(1,2,2)*t2_2(2,1))
-		,"T3dg(i,j,k)*T2(j,l)(1,2,1)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(1,2,2)
-		- (t3dg_2(1,0,2)*t2_2(0,2)
-		   + t3dg_2(1,1,2)*t2_2(1,2)
-		   + t3dg_2(1,2,2)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(j,l)(1,2,2)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(2,0,0)
-		- (t3dg_2(2,0,0)*t2_2(0,0)
-		   + t3dg_2(2,1,0)*t2_2(1,0)
-		   + t3dg_2(2,2,0)*t2_2(2,0))
-		,"T3dg(i,j,k)*T2(j,l)(2,0,0)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(2,0,1)
-		- (t3dg_2(2,0,0)*t2_2(0,1)
-		   + t3dg_2(2,1,0)*t2_2(1,1)
-		   + t3dg_2(2,2,0)*t2_2(2,1))
-		,"T3dg(i,j,k)*T2(j,l)(2,0,1)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(2,0,2)
-		- (t3dg_2(2,0,0)*t2_2(0,2)
-		   + t3dg_2(2,1,0)*t2_2(1,2)
-		   + t3dg_2(2,2,0)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(j,l)(2,0,2)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(2,1,0)
-		- (t3dg_2(2,0,1)*t2_2(0,0)
-		   + t3dg_2(2,1,1)*t2_2(1,0)
-		   + t3dg_2(2,2,1)*t2_2(2,0))
-		,"T3dg(i,j,k)*T2(j,l)(2,1,0)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(2,1,1)
-		- (t3dg_2(2,0,1)*t2_2(0,1)
-		   + t3dg_2(2,1,1)*t2_2(1,1)
-		   + t3dg_2(2,2,1)*t2_2(2,1))
-		,"T3dg(i,j,k)*T2(j,l)(2,1,1)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(2,1,2)
-		- (t3dg_2(2,0,1)*t2_2(0,2)
-		   + t3dg_2(2,1,1)*t2_2(1,2)
-		   + t3dg_2(2,2,1)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(j,l)(2,1,2)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(2,2,0)
-		- (t3dg_2(2,0,2)*t2_2(0,0)
-		   + t3dg_2(2,1,2)*t2_2(1,0)
-		   + t3dg_2(2,2,2)*t2_2(2,0))
-		,"T3dg(i,j,k)*T2(j,l)(2,2,0)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(2,2,1)
-		- (t3dg_2(2,0,2)*t2_2(0,1)
-		   + t3dg_2(2,1,2)*t2_2(1,1)
-		   + t3dg_2(2,2,2)*t2_2(2,1))
-		,"T3dg(i,j,k)*T2(j,l)(2,2,1)");
-  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(2,2,2)
-		- (t3dg_2(2,0,2)*t2_2(0,2)
-		   + t3dg_2(2,1,2)*t2_2(1,2)
-		   + t3dg_2(2,2,2)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(j,l)(2,2,2)");
-
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(0,0,0)
-		- (t3dg_3(0,0,0)*t2_2(0,0)
-		   + t3dg_3(0,1,0)*t2_2(0,1)
-		   + t3dg_3(0,2,0)*t2_2(0,2))
-		,"T3dg(i,j,k)*T2(l,j)(0,0,0)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(0,0,1)
-		- (t3dg_3(0,0,0)*t2_2(1,0)
-		   + t3dg_3(0,1,0)*t2_2(1,1)
-		   + t3dg_3(0,2,0)*t2_2(1,2))
-		,"T3dg(i,j,k)*T2(l,j)(0,0,1)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(0,0,2)
-		- (t3dg_3(0,0,0)*t2_2(2,0)
-		   + t3dg_3(0,1,0)*t2_2(2,1)
-		   + t3dg_3(0,2,0)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(l,j)(0,0,2)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(0,1,0)
-		- (t3dg_3(0,0,1)*t2_2(0,0)
-		   + t3dg_3(0,1,1)*t2_2(0,1)
-		   + t3dg_3(0,2,1)*t2_2(0,2))
-		,"T3dg(i,j,k)*T2(l,j)(0,1,0)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(0,1,1)
-		- (t3dg_3(0,0,1)*t2_2(1,0)
-		   + t3dg_3(0,1,1)*t2_2(1,1)
-		   + t3dg_3(0,2,1)*t2_2(1,2))
-		,"T3dg(i,j,k)*T2(l,j)(0,1,1)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(0,1,2)
-		- (t3dg_3(0,0,1)*t2_2(2,0)
-		   + t3dg_3(0,1,1)*t2_2(2,1)
-		   + t3dg_3(0,2,1)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(l,j)(0,1,2)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(0,2,0)
-		- (t3dg_3(0,0,2)*t2_2(0,0)
-		   + t3dg_3(0,1,2)*t2_2(0,1)
-		   + t3dg_3(0,2,2)*t2_2(0,2))
-		,"T3dg(i,j,k)*T2(l,j)(0,2,0)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(0,2,1)
-		- (t3dg_3(0,0,2)*t2_2(1,0)
-		   + t3dg_3(0,1,2)*t2_2(1,1)
-		   + t3dg_3(0,2,2)*t2_2(1,2))
-		,"T3dg(i,j,k)*T2(l,j)(0,2,1)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(0,2,2)
-		- (t3dg_3(0,0,2)*t2_2(2,0)
-		   + t3dg_3(0,1,2)*t2_2(2,1)
-		   + t3dg_3(0,2,2)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(l,j)(0,2,2)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(1,0,0)
-		- (t3dg_3(1,0,0)*t2_2(0,0)
-		   + t3dg_3(1,1,0)*t2_2(0,1)
-		   + t3dg_3(1,2,0)*t2_2(0,2))
-		,"T3dg(i,j,k)*T2(l,j)(1,0,0)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(1,0,1)
-		- (t3dg_3(1,0,0)*t2_2(1,0)
-		   + t3dg_3(1,1,0)*t2_2(1,1)
-		   + t3dg_3(1,2,0)*t2_2(1,2))
-		,"T3dg(i,j,k)*T2(l,j)(1,0,1)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(1,0,2)
-		- (t3dg_3(1,0,0)*t2_2(2,0)
-		   + t3dg_3(1,1,0)*t2_2(2,1)
-		   + t3dg_3(1,2,0)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(l,j)(1,0,2)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(1,1,0)
-		- (t3dg_3(1,0,1)*t2_2(0,0)
-		   + t3dg_3(1,1,1)*t2_2(0,1)
-		   + t3dg_3(1,2,1)*t2_2(0,2))
-		,"T3dg(i,j,k)*T2(l,j)(1,1,0)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(1,1,1)
-		- (t3dg_3(1,0,1)*t2_2(1,0)
-		   + t3dg_3(1,1,1)*t2_2(1,1)
-		   + t3dg_3(1,2,1)*t2_2(1,2))
-		,"T3dg(i,j,k)*T2(l,j)(1,1,1)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(1,1,2)
-		- (t3dg_3(1,0,1)*t2_2(2,0)
-		   + t3dg_3(1,1,1)*t2_2(2,1)
-		   + t3dg_3(1,2,1)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(l,j)(1,1,2)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(1,2,0)
-		- (t3dg_3(1,0,2)*t2_2(0,0)
-		   + t3dg_3(1,1,2)*t2_2(0,1)
-		   + t3dg_3(1,2,2)*t2_2(0,2))
-		,"T3dg(i,j,k)*T2(l,j)(1,2,0)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(1,2,1)
-		- (t3dg_3(1,0,2)*t2_2(1,0)
-		   + t3dg_3(1,1,2)*t2_2(1,1)
-		   + t3dg_3(1,2,2)*t2_2(1,2))
-		,"T3dg(i,j,k)*T2(l,j)(1,2,1)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(1,2,2)
-		- (t3dg_3(1,0,2)*t2_2(2,0)
-		   + t3dg_3(1,1,2)*t2_2(2,1)
-		   + t3dg_3(1,2,2)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(l,j)(1,2,2)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(2,0,0)
-		- (t3dg_3(2,0,0)*t2_2(0,0)
-		   + t3dg_3(2,1,0)*t2_2(0,1)
-		   + t3dg_3(2,2,0)*t2_2(0,2))
-		,"T3dg(i,j,k)*T2(l,j)(2,0,0)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(2,0,1)
-		- (t3dg_3(2,0,0)*t2_2(1,0)
-		   + t3dg_3(2,1,0)*t2_2(1,1)
-		   + t3dg_3(2,2,0)*t2_2(1,2))
-		,"T3dg(i,j,k)*T2(l,j)(2,0,1)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(2,0,2)
-		- (t3dg_3(2,0,0)*t2_2(2,0)
-		   + t3dg_3(2,1,0)*t2_2(2,1)
-		   + t3dg_3(2,2,0)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(l,j)(2,0,2)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(2,1,0)
-		- (t3dg_3(2,0,1)*t2_2(0,0)
-		   + t3dg_3(2,1,1)*t2_2(0,1)
-		   + t3dg_3(2,2,1)*t2_2(0,2))
-		,"T3dg(i,j,k)*T2(l,j)(2,1,0)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(2,1,1)
-		- (t3dg_3(2,0,1)*t2_2(1,0)
-		   + t3dg_3(2,1,1)*t2_2(1,1)
-		   + t3dg_3(2,2,1)*t2_2(1,2))
-		,"T3dg(i,j,k)*T2(l,j)(2,1,1)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(2,1,2)
-		- (t3dg_3(2,0,1)*t2_2(2,0)
-		   + t3dg_3(2,1,1)*t2_2(2,1)
-		   + t3dg_3(2,2,1)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(l,j)(2,1,2)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(2,2,0)
-		- (t3dg_3(2,0,2)*t2_2(0,0)
-		   + t3dg_3(2,1,2)*t2_2(0,1)
-		   + t3dg_3(2,2,2)*t2_2(0,2))
-		,"T3dg(i,j,k)*T2(l,j)(2,2,0)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(2,2,1)
-		- (t3dg_3(2,0,2)*t2_2(1,0)
-		   + t3dg_3(2,1,2)*t2_2(1,1)
-		   + t3dg_3(2,2,2)*t2_2(1,2))
-		,"T3dg(i,j,k)*T2(l,j)(2,2,1)");
-  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(2,2,2)
-		- (t3dg_3(2,0,2)*t2_2(2,0)
-		   + t3dg_3(2,1,2)*t2_2(2,1)
-		   + t3dg_3(2,2,2)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(l,j)(2,2,2)");
-
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(0,0,0)
-		- (t3dg_3(0,0,0)*t2_2(0,0)
-		   + t3dg_3(0,1,0)*t2_2(1,0)
-		   + t3dg_3(0,2,0)*t2_2(2,0))
-		,"T2(j,l)*T3dg(i,j,k)(0,0,0)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(0,0,1)
-		- (t3dg_3(0,0,0)*t2_2(0,1)
-		   + t3dg_3(0,1,0)*t2_2(1,1)
-		   + t3dg_3(0,2,0)*t2_2(2,1))
-		,"T2(j,l)*T3dg(i,j,k)(0,0,1)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(0,0,2)
-		- (t3dg_3(0,0,0)*t2_2(0,2)
-		   + t3dg_3(0,1,0)*t2_2(1,2)
-		   + t3dg_3(0,2,0)*t2_2(2,2))
-		,"T2(j,l)*T3dg(i,j,k)(0,0,2)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(0,1,0)
-		- (t3dg_3(0,0,1)*t2_2(0,0)
-		   + t3dg_3(0,1,1)*t2_2(1,0)
-		   + t3dg_3(0,2,1)*t2_2(2,0))
-		,"T2(j,l)*T3dg(i,j,k)(0,1,0)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(0,1,1)
-		- (t3dg_3(0,0,1)*t2_2(0,1)
-		   + t3dg_3(0,1,1)*t2_2(1,1)
-		   + t3dg_3(0,2,1)*t2_2(2,1))
-		,"T2(j,l)*T3dg(i,j,k)(0,1,1)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(0,1,2)
-		- (t3dg_3(0,0,1)*t2_2(0,2)
-		   + t3dg_3(0,1,1)*t2_2(1,2)
-		   + t3dg_3(0,2,1)*t2_2(2,2))
-		,"T2(j,l)*T3dg(i,j,k)(0,1,2)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(0,2,0)
-		- (t3dg_3(0,0,2)*t2_2(0,0)
-		   + t3dg_3(0,1,2)*t2_2(1,0)
-		   + t3dg_3(0,2,2)*t2_2(2,0))
-		,"T2(j,l)*T3dg(i,j,k)(0,2,0)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(0,2,1)
-		- (t3dg_3(0,0,2)*t2_2(0,1)
-		   + t3dg_3(0,1,2)*t2_2(1,1)
-		   + t3dg_3(0,2,2)*t2_2(2,1))
-		,"T2(j,l)*T3dg(i,j,k)(0,2,1)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(0,2,2)
-		- (t3dg_3(0,0,2)*t2_2(0,2)
-		   + t3dg_3(0,1,2)*t2_2(1,2)
-		   + t3dg_3(0,2,2)*t2_2(2,2))
-		,"T2(j,l)*T3dg(i,j,k)(0,2,2)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(1,0,0)
-		- (t3dg_3(1,0,0)*t2_2(0,0)
-		   + t3dg_3(1,1,0)*t2_2(1,0)
-		   + t3dg_3(1,2,0)*t2_2(2,0))
-		,"T2(j,l)*T3dg(i,j,k)(1,0,0)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(1,0,1)
-		- (t3dg_3(1,0,0)*t2_2(0,1)
-		   + t3dg_3(1,1,0)*t2_2(1,1)
-		   + t3dg_3(1,2,0)*t2_2(2,1))
-		,"T2(j,l)*T3dg(i,j,k)(1,0,1)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(1,0,2)
-		- (t3dg_3(1,0,0)*t2_2(0,2)
-		   + t3dg_3(1,1,0)*t2_2(1,2)
-		   + t3dg_3(1,2,0)*t2_2(2,2))
-		,"T2(j,l)*T3dg(i,j,k)(1,0,2)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(1,1,0)
-		- (t3dg_3(1,0,1)*t2_2(0,0)
-		   + t3dg_3(1,1,1)*t2_2(1,0)
-		   + t3dg_3(1,2,1)*t2_2(2,0))
-		,"T2(j,l)*T3dg(i,j,k)(1,1,0)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(1,1,1)
-		- (t3dg_3(1,0,1)*t2_2(0,1)
-		   + t3dg_3(1,1,1)*t2_2(1,1)
-		   + t3dg_3(1,2,1)*t2_2(2,1))
-		,"T2(j,l)*T3dg(i,j,k)(1,1,1)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(1,1,2)
-		- (t3dg_3(1,0,1)*t2_2(0,2)
-		   + t3dg_3(1,1,1)*t2_2(1,2)
-		   + t3dg_3(1,2,1)*t2_2(2,2))
-		,"T2(j,l)*T3dg(i,j,k)(1,1,2)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(1,2,0)
-		- (t3dg_3(1,0,2)*t2_2(0,0)
-		   + t3dg_3(1,1,2)*t2_2(1,0)
-		   + t3dg_3(1,2,2)*t2_2(2,0))
-		,"T2(j,l)*T3dg(i,j,k)(1,2,0)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(1,2,1)
-		- (t3dg_3(1,0,2)*t2_2(0,1)
-		   + t3dg_3(1,1,2)*t2_2(1,1)
-		   + t3dg_3(1,2,2)*t2_2(2,1))
-		,"T2(j,l)*T3dg(i,j,k)(1,2,1)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(1,2,2)
-		- (t3dg_3(1,0,2)*t2_2(0,2)
-		   + t3dg_3(1,1,2)*t2_2(1,2)
-		   + t3dg_3(1,2,2)*t2_2(2,2))
-		,"T2(j,l)*T3dg(i,j,k)(1,2,2)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(2,0,0)
-		- (t3dg_3(2,0,0)*t2_2(0,0)
-		   + t3dg_3(2,1,0)*t2_2(1,0)
-		   + t3dg_3(2,2,0)*t2_2(2,0))
-		,"T2(j,l)*T3dg(i,j,k)(2,0,0)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(2,0,1)
-		- (t3dg_3(2,0,0)*t2_2(0,1)
-		   + t3dg_3(2,1,0)*t2_2(1,1)
-		   + t3dg_3(2,2,0)*t2_2(2,1))
-		,"T2(j,l)*T3dg(i,j,k)(2,0,1)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(2,0,2)
-		- (t3dg_3(2,0,0)*t2_2(0,2)
-		   + t3dg_3(2,1,0)*t2_2(1,2)
-		   + t3dg_3(2,2,0)*t2_2(2,2))
-		,"T2(j,l)*T3dg(i,j,k)(2,0,2)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(2,1,0)
-		- (t3dg_3(2,0,1)*t2_2(0,0)
-		   + t3dg_3(2,1,1)*t2_2(1,0)
-		   + t3dg_3(2,2,1)*t2_2(2,0))
-		,"T2(j,l)*T3dg(i,j,k)(2,1,0)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(2,1,1)
-		- (t3dg_3(2,0,1)*t2_2(0,1)
-		   + t3dg_3(2,1,1)*t2_2(1,1)
-		   + t3dg_3(2,2,1)*t2_2(2,1))
-		,"T2(j,l)*T3dg(i,j,k)(2,1,1)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(2,1,2)
-		- (t3dg_3(2,0,1)*t2_2(0,2)
-		   + t3dg_3(2,1,1)*t2_2(1,2)
-		   + t3dg_3(2,2,1)*t2_2(2,2))
-		,"T2(j,l)*T3dg(i,j,k)(2,1,2)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(2,2,0)
-		- (t3dg_3(2,0,2)*t2_2(0,0)
-		   + t3dg_3(2,1,2)*t2_2(1,0)
-		   + t3dg_3(2,2,2)*t2_2(2,0))
-		,"T2(j,l)*T3dg(i,j,k)(2,2,0)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(2,2,1)
-		- (t3dg_3(2,0,2)*t2_2(0,1)
-		   + t3dg_3(2,1,2)*t2_2(1,1)
-		   + t3dg_3(2,2,2)*t2_2(2,1))
-		,"T2(j,l)*T3dg(i,j,k)(2,2,1)");
-  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(2,2,2)
-		- (t3dg_3(2,0,2)*t2_2(0,2)
-		   + t3dg_3(2,1,2)*t2_2(1,2)
-		   + t3dg_3(2,2,2)*t2_2(2,2))
-		,"T2(j,l)*T3dg(i,j,k)(2,2,2)");
-
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(0,0,0)
-		- (t3dg_3(0,0,0)*t2_2(0,0)
-		   + t3dg_3(0,1,0)*t2_2(0,1)
-		   + t3dg_3(0,2,0)*t2_2(0,2))
-		,"T2(l,j)*T3dg(i,j,k)(0,0,0)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(0,0,1)
-		- (t3dg_3(0,0,0)*t2_2(1,0)
-		   + t3dg_3(0,1,0)*t2_2(1,1)
-		   + t3dg_3(0,2,0)*t2_2(1,2))
-		,"T2(l,j)*T3dg(i,j,k)(0,0,1)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(0,0,2)
-		- (t3dg_3(0,0,0)*t2_2(2,0)
-		   + t3dg_3(0,1,0)*t2_2(2,1)
-		   + t3dg_3(0,2,0)*t2_2(2,2))
-		,"T2(l,j)*T3dg(i,j,k)(0,0,2)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(0,1,0)
-		- (t3dg_3(0,0,1)*t2_2(0,0)
-		   + t3dg_3(0,1,1)*t2_2(0,1)
-		   + t3dg_3(0,2,1)*t2_2(0,2))
-		,"T2(l,j)*T3dg(i,j,k)(0,1,0)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(0,1,1)
-		- (t3dg_3(0,0,1)*t2_2(1,0)
-		   + t3dg_3(0,1,1)*t2_2(1,1)
-		   + t3dg_3(0,2,1)*t2_2(1,2))
-		,"T2(l,j)*T3dg(i,j,k)(0,1,1)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(0,1,2)
-		- (t3dg_3(0,0,1)*t2_2(2,0)
-		   + t3dg_3(0,1,1)*t2_2(2,1)
-		   + t3dg_3(0,2,1)*t2_2(2,2))
-		,"T2(l,j)*T3dg(i,j,k)(0,1,2)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(0,2,0)
-		- (t3dg_3(0,0,2)*t2_2(0,0)
-		   + t3dg_3(0,1,2)*t2_2(0,1)
-		   + t3dg_3(0,2,2)*t2_2(0,2))
-		,"T2(l,j)*T3dg(i,j,k)(0,2,0)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(0,2,1)
-		- (t3dg_3(0,0,2)*t2_2(1,0)
-		   + t3dg_3(0,1,2)*t2_2(1,1)
-		   + t3dg_3(0,2,2)*t2_2(1,2))
-		,"T2(l,j)*T3dg(i,j,k)(0,2,1)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(0,2,2)
-		- (t3dg_3(0,0,2)*t2_2(2,0)
-		   + t3dg_3(0,1,2)*t2_2(2,1)
-		   + t3dg_3(0,2,2)*t2_2(2,2))
-		,"T2(l,j)*T3dg(i,j,k)(0,2,2)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(1,0,0)
-		- (t3dg_3(1,0,0)*t2_2(0,0)
-		   + t3dg_3(1,1,0)*t2_2(0,1)
-		   + t3dg_3(1,2,0)*t2_2(0,2))
-		,"T2(l,j)*T3dg(i,j,k)(1,0,0)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(1,0,1)
-		- (t3dg_3(1,0,0)*t2_2(1,0)
-		   + t3dg_3(1,1,0)*t2_2(1,1)
-		   + t3dg_3(1,2,0)*t2_2(1,2))
-		,"T2(l,j)*T3dg(i,j,k)(1,0,1)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(1,0,2)
-		- (t3dg_3(1,0,0)*t2_2(2,0)
-		   + t3dg_3(1,1,0)*t2_2(2,1)
-		   + t3dg_3(1,2,0)*t2_2(2,2))
-		,"T2(l,j)*T3dg(i,j,k)(1,0,2)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(1,1,0)
-		- (t3dg_3(1,0,1)*t2_2(0,0)
-		   + t3dg_3(1,1,1)*t2_2(0,1)
-		   + t3dg_3(1,2,1)*t2_2(0,2))
-		,"T2(l,j)*T3dg(i,j,k)(1,1,0)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(1,1,1)
-		- (t3dg_3(1,0,1)*t2_2(1,0)
-		   + t3dg_3(1,1,1)*t2_2(1,1)
-		   + t3dg_3(1,2,1)*t2_2(1,2))
-		,"T2(l,j)*T3dg(i,j,k)(1,1,1)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(1,1,2)
-		- (t3dg_3(1,0,1)*t2_2(2,0)
-		   + t3dg_3(1,1,1)*t2_2(2,1)
-		   + t3dg_3(1,2,1)*t2_2(2,2))
-		,"T2(l,j)*T3dg(i,j,k)(1,1,2)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(1,2,0)
-		- (t3dg_3(1,0,2)*t2_2(0,0)
-		   + t3dg_3(1,1,2)*t2_2(0,1)
-		   + t3dg_3(1,2,2)*t2_2(0,2))
-		,"T2(l,j)*T3dg(i,j,k)(1,2,0)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(1,2,1)
-		- (t3dg_3(1,0,2)*t2_2(1,0)
-		   + t3dg_3(1,1,2)*t2_2(1,1)
-		   + t3dg_3(1,2,2)*t2_2(1,2))
-		,"T2(l,j)*T3dg(i,j,k)(1,2,1)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(1,2,2)
-		- (t3dg_3(1,0,2)*t2_2(2,0)
-		   + t3dg_3(1,1,2)*t2_2(2,1)
-		   + t3dg_3(1,2,2)*t2_2(2,2))
-		,"T2(l,j)*T3dg(i,j,k)(1,2,2)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(2,0,0)
-		- (t3dg_3(2,0,0)*t2_2(0,0)
-		   + t3dg_3(2,1,0)*t2_2(0,1)
-		   + t3dg_3(2,2,0)*t2_2(0,2))
-		,"T2(l,j)*T3dg(i,j,k)(2,0,0)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(2,0,1)
-		- (t3dg_3(2,0,0)*t2_2(1,0)
-		   + t3dg_3(2,1,0)*t2_2(1,1)
-		   + t3dg_3(2,2,0)*t2_2(1,2))
-		,"T2(l,j)*T3dg(i,j,k)(2,0,1)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(2,0,2)
-		- (t3dg_3(2,0,0)*t2_2(2,0)
-		   + t3dg_3(2,1,0)*t2_2(2,1)
-		   + t3dg_3(2,2,0)*t2_2(2,2))
-		,"T2(l,j)*T3dg(i,j,k)(2,0,2)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(2,1,0)
-		- (t3dg_3(2,0,1)*t2_2(0,0)
-		   + t3dg_3(2,1,1)*t2_2(0,1)
-		   + t3dg_3(2,2,1)*t2_2(0,2))
-		,"T2(l,j)*T3dg(i,j,k)(2,1,0)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(2,1,1)
-		- (t3dg_3(2,0,1)*t2_2(1,0)
-		   + t3dg_3(2,1,1)*t2_2(1,1)
-		   + t3dg_3(2,2,1)*t2_2(1,2))
-		,"T2(l,j)*T3dg(i,j,k)(2,1,1)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(2,1,2)
-		- (t3dg_3(2,0,1)*t2_2(2,0)
-		   + t3dg_3(2,1,1)*t2_2(2,1)
-		   + t3dg_3(2,2,1)*t2_2(2,2))
-		,"T2(l,j)*T3dg(i,j,k)(2,1,2)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(2,2,0)
-		- (t3dg_3(2,0,2)*t2_2(0,0)
-		   + t3dg_3(2,1,2)*t2_2(0,1)
-		   + t3dg_3(2,2,2)*t2_2(0,2))
-		,"T2(l,j)*T3dg(i,j,k)(2,2,0)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(2,2,1)
-		- (t3dg_3(2,0,2)*t2_2(1,0)
-		   + t3dg_3(2,1,2)*t2_2(1,1)
-		   + t3dg_3(2,2,2)*t2_2(1,2))
-		,"T2(l,j)*T3dg(i,j,k)(2,2,1)");
-  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(2,2,2)
-		- (t3dg_3(2,0,2)*t2_2(2,0)
-		   + t3dg_3(2,1,2)*t2_2(2,1)
-		   + t3dg_3(2,2,2)*t2_2(2,2))
-		,"T2(l,j)*T3dg(i,j,k)(2,2,2)");
-
-
-
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(0,0,0)
-		- (t3dg_2(0,0,0)*t2s_2(0,0)
-		   + t3dg_2(0,1,0)*t2s_2(1,0)
-		   + t3dg_2(0,2,0)*t2s_2(2,0))
-		,"T3dg(i,j,k)*T2s(j,l)(0,0,0)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(0,0,1)
-		- (t3dg_2(0,0,0)*t2s_2(0,1)
-		   + t3dg_2(0,1,0)*t2s_2(1,1)
-		   + t3dg_2(0,2,0)*t2s_2(2,1))
-		,"T3dg(i,j,k)*T2s(j,l)(0,0,1)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(0,0,2)
-		- (t3dg_2(0,0,0)*t2s_2(0,2)
-		   + t3dg_2(0,1,0)*t2s_2(1,2)
-		   + t3dg_2(0,2,0)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(j,l)(0,0,2)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(0,1,0)
-		- (t3dg_2(0,0,1)*t2s_2(0,0)
-		   + t3dg_2(0,1,1)*t2s_2(1,0)
-		   + t3dg_2(0,2,1)*t2s_2(2,0))
-		,"T3dg(i,j,k)*T2s(j,l)(0,1,0)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(0,1,1)
-		- (t3dg_2(0,0,1)*t2s_2(0,1)
-		   + t3dg_2(0,1,1)*t2s_2(1,1)
-		   + t3dg_2(0,2,1)*t2s_2(2,1))
-		,"T3dg(i,j,k)*T2s(j,l)(0,1,1)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(0,1,2)
-		- (t3dg_2(0,0,1)*t2s_2(0,2)
-		   + t3dg_2(0,1,1)*t2s_2(1,2)
-		   + t3dg_2(0,2,1)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(j,l)(0,1,2)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(0,2,0)
-		- (t3dg_2(0,0,2)*t2s_2(0,0)
-		   + t3dg_2(0,1,2)*t2s_2(1,0)
-		   + t3dg_2(0,2,2)*t2s_2(2,0))
-		,"T3dg(i,j,k)*T2s(j,l)(0,2,0)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(0,2,1)
-		- (t3dg_2(0,0,2)*t2s_2(0,1)
-		   + t3dg_2(0,1,2)*t2s_2(1,1)
-		   + t3dg_2(0,2,2)*t2s_2(2,1))
-		,"T3dg(i,j,k)*T2s(j,l)(0,2,1)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(0,2,2)
-		- (t3dg_2(0,0,2)*t2s_2(0,2)
-		   + t3dg_2(0,1,2)*t2s_2(1,2)
-		   + t3dg_2(0,2,2)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(j,l)(0,2,2)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(1,0,0)
-		- (t3dg_2(1,0,0)*t2s_2(0,0)
-		   + t3dg_2(1,1,0)*t2s_2(1,0)
-		   + t3dg_2(1,2,0)*t2s_2(2,0))
-		,"T3dg(i,j,k)*T2s(j,l)(1,0,0)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(1,0,1)
-		- (t3dg_2(1,0,0)*t2s_2(0,1)
-		   + t3dg_2(1,1,0)*t2s_2(1,1)
-		   + t3dg_2(1,2,0)*t2s_2(2,1))
-		,"T3dg(i,j,k)*T2s(j,l)(1,0,1)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(1,0,2)
-		- (t3dg_2(1,0,0)*t2s_2(0,2)
-		   + t3dg_2(1,1,0)*t2s_2(1,2)
-		   + t3dg_2(1,2,0)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(j,l)(1,0,2)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(1,1,0)
-		- (t3dg_2(1,0,1)*t2s_2(0,0)
-		   + t3dg_2(1,1,1)*t2s_2(1,0)
-		   + t3dg_2(1,2,1)*t2s_2(2,0))
-		,"T3dg(i,j,k)*T2s(j,l)(1,1,0)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(1,1,1)
-		- (t3dg_2(1,0,1)*t2s_2(0,1)
-		   + t3dg_2(1,1,1)*t2s_2(1,1)
-		   + t3dg_2(1,2,1)*t2s_2(2,1))
-		,"T3dg(i,j,k)*T2s(j,l)(1,1,1)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(1,1,2)
-		- (t3dg_2(1,0,1)*t2s_2(0,2)
-		   + t3dg_2(1,1,1)*t2s_2(1,2)
-		   + t3dg_2(1,2,1)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(j,l)(1,1,2)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(1,2,0)
-		- (t3dg_2(1,0,2)*t2s_2(0,0)
-		   + t3dg_2(1,1,2)*t2s_2(1,0)
-		   + t3dg_2(1,2,2)*t2s_2(2,0))
-		,"T3dg(i,j,k)*T2s(j,l)(1,2,0)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(1,2,1)
-		- (t3dg_2(1,0,2)*t2s_2(0,1)
-		   + t3dg_2(1,1,2)*t2s_2(1,1)
-		   + t3dg_2(1,2,2)*t2s_2(2,1))
-		,"T3dg(i,j,k)*T2s(j,l)(1,2,1)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(1,2,2)
-		- (t3dg_2(1,0,2)*t2s_2(0,2)
-		   + t3dg_2(1,1,2)*t2s_2(1,2)
-		   + t3dg_2(1,2,2)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(j,l)(1,2,2)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(2,0,0)
-		- (t3dg_2(2,0,0)*t2s_2(0,0)
-		   + t3dg_2(2,1,0)*t2s_2(1,0)
-		   + t3dg_2(2,2,0)*t2s_2(2,0))
-		,"T3dg(i,j,k)*T2s(j,l)(2,0,0)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(2,0,1)
-		- (t3dg_2(2,0,0)*t2s_2(0,1)
-		   + t3dg_2(2,1,0)*t2s_2(1,1)
-		   + t3dg_2(2,2,0)*t2s_2(2,1))
-		,"T3dg(i,j,k)*T2s(j,l)(2,0,1)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(2,0,2)
-		- (t3dg_2(2,0,0)*t2s_2(0,2)
-		   + t3dg_2(2,1,0)*t2s_2(1,2)
-		   + t3dg_2(2,2,0)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(j,l)(2,0,2)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(2,1,0)
-		- (t3dg_2(2,0,1)*t2s_2(0,0)
-		   + t3dg_2(2,1,1)*t2s_2(1,0)
-		   + t3dg_2(2,2,1)*t2s_2(2,0))
-		,"T3dg(i,j,k)*T2s(j,l)(2,1,0)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(2,1,1)
-		- (t3dg_2(2,0,1)*t2s_2(0,1)
-		   + t3dg_2(2,1,1)*t2s_2(1,1)
-		   + t3dg_2(2,2,1)*t2s_2(2,1))
-		,"T3dg(i,j,k)*T2s(j,l)(2,1,1)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(2,1,2)
-		- (t3dg_2(2,0,1)*t2s_2(0,2)
-		   + t3dg_2(2,1,1)*t2s_2(1,2)
-		   + t3dg_2(2,2,1)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(j,l)(2,1,2)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(2,2,0)
-		- (t3dg_2(2,0,2)*t2s_2(0,0)
-		   + t3dg_2(2,1,2)*t2s_2(1,0)
-		   + t3dg_2(2,2,2)*t2s_2(2,0))
-		,"T3dg(i,j,k)*T2s(j,l)(2,2,0)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(2,2,1)
-		- (t3dg_2(2,0,2)*t2s_2(0,1)
-		   + t3dg_2(2,1,2)*t2s_2(1,1)
-		   + t3dg_2(2,2,2)*t2s_2(2,1))
-		,"T3dg(i,j,k)*T2s(j,l)(2,2,1)");
-  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(2,2,2)
-		- (t3dg_2(2,0,2)*t2s_2(0,2)
-		   + t3dg_2(2,1,2)*t2s_2(1,2)
-		   + t3dg_2(2,2,2)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(j,l)(2,2,2)");
-
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(0,0,0)
-		- (t3dg_3(0,0,0)*t2s_2(0,0)
-		   + t3dg_3(0,1,0)*t2s_2(0,1)
-		   + t3dg_3(0,2,0)*t2s_2(0,2))
-		,"T3dg(i,j,k)*T2s(l,j)(0,0,0)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(0,0,1)
-		- (t3dg_3(0,0,0)*t2s_2(1,0)
-		   + t3dg_3(0,1,0)*t2s_2(1,1)
-		   + t3dg_3(0,2,0)*t2s_2(1,2))
-		,"T3dg(i,j,k)*T2s(l,j)(0,0,1)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(0,0,2)
-		- (t3dg_3(0,0,0)*t2s_2(2,0)
-		   + t3dg_3(0,1,0)*t2s_2(2,1)
-		   + t3dg_3(0,2,0)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(l,j)(0,0,2)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(0,1,0)
-		- (t3dg_3(0,0,1)*t2s_2(0,0)
-		   + t3dg_3(0,1,1)*t2s_2(0,1)
-		   + t3dg_3(0,2,1)*t2s_2(0,2))
-		,"T3dg(i,j,k)*T2s(l,j)(0,1,0)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(0,1,1)
-		- (t3dg_3(0,0,1)*t2s_2(1,0)
-		   + t3dg_3(0,1,1)*t2s_2(1,1)
-		   + t3dg_3(0,2,1)*t2s_2(1,2))
-		,"T3dg(i,j,k)*T2s(l,j)(0,1,1)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(0,1,2)
-		- (t3dg_3(0,0,1)*t2s_2(2,0)
-		   + t3dg_3(0,1,1)*t2s_2(2,1)
-		   + t3dg_3(0,2,1)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(l,j)(0,1,2)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(0,2,0)
-		- (t3dg_3(0,0,2)*t2s_2(0,0)
-		   + t3dg_3(0,1,2)*t2s_2(0,1)
-		   + t3dg_3(0,2,2)*t2s_2(0,2))
-		,"T3dg(i,j,k)*T2s(l,j)(0,2,0)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(0,2,1)
-		- (t3dg_3(0,0,2)*t2s_2(1,0)
-		   + t3dg_3(0,1,2)*t2s_2(1,1)
-		   + t3dg_3(0,2,2)*t2s_2(1,2))
-		,"T3dg(i,j,k)*T2s(l,j)(0,2,1)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(0,2,2)
-		- (t3dg_3(0,0,2)*t2s_2(2,0)
-		   + t3dg_3(0,1,2)*t2s_2(2,1)
-		   + t3dg_3(0,2,2)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(l,j)(0,2,2)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(1,0,0)
-		- (t3dg_3(1,0,0)*t2s_2(0,0)
-		   + t3dg_3(1,1,0)*t2s_2(0,1)
-		   + t3dg_3(1,2,0)*t2s_2(0,2))
-		,"T3dg(i,j,k)*T2s(l,j)(1,0,0)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(1,0,1)
-		- (t3dg_3(1,0,0)*t2s_2(1,0)
-		   + t3dg_3(1,1,0)*t2s_2(1,1)
-		   + t3dg_3(1,2,0)*t2s_2(1,2))
-		,"T3dg(i,j,k)*T2s(l,j)(1,0,1)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(1,0,2)
-		- (t3dg_3(1,0,0)*t2s_2(2,0)
-		   + t3dg_3(1,1,0)*t2s_2(2,1)
-		   + t3dg_3(1,2,0)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(l,j)(1,0,2)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(1,1,0)
-		- (t3dg_3(1,0,1)*t2s_2(0,0)
-		   + t3dg_3(1,1,1)*t2s_2(0,1)
-		   + t3dg_3(1,2,1)*t2s_2(0,2))
-		,"T3dg(i,j,k)*T2s(l,j)(1,1,0)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(1,1,1)
-		- (t3dg_3(1,0,1)*t2s_2(1,0)
-		   + t3dg_3(1,1,1)*t2s_2(1,1)
-		   + t3dg_3(1,2,1)*t2s_2(1,2))
-		,"T3dg(i,j,k)*T2s(l,j)(1,1,1)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(1,1,2)
-		- (t3dg_3(1,0,1)*t2s_2(2,0)
-		   + t3dg_3(1,1,1)*t2s_2(2,1)
-		   + t3dg_3(1,2,1)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(l,j)(1,1,2)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(1,2,0)
-		- (t3dg_3(1,0,2)*t2s_2(0,0)
-		   + t3dg_3(1,1,2)*t2s_2(0,1)
-		   + t3dg_3(1,2,2)*t2s_2(0,2))
-		,"T3dg(i,j,k)*T2s(l,j)(1,2,0)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(1,2,1)
-		- (t3dg_3(1,0,2)*t2s_2(1,0)
-		   + t3dg_3(1,1,2)*t2s_2(1,1)
-		   + t3dg_3(1,2,2)*t2s_2(1,2))
-		,"T3dg(i,j,k)*T2s(l,j)(1,2,1)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(1,2,2)
-		- (t3dg_3(1,0,2)*t2s_2(2,0)
-		   + t3dg_3(1,1,2)*t2s_2(2,1)
-		   + t3dg_3(1,2,2)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(l,j)(1,2,2)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(2,0,0)
-		- (t3dg_3(2,0,0)*t2s_2(0,0)
-		   + t3dg_3(2,1,0)*t2s_2(0,1)
-		   + t3dg_3(2,2,0)*t2s_2(0,2))
-		,"T3dg(i,j,k)*T2s(l,j)(2,0,0)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(2,0,1)
-		- (t3dg_3(2,0,0)*t2s_2(1,0)
-		   + t3dg_3(2,1,0)*t2s_2(1,1)
-		   + t3dg_3(2,2,0)*t2s_2(1,2))
-		,"T3dg(i,j,k)*T2s(l,j)(2,0,1)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(2,0,2)
-		- (t3dg_3(2,0,0)*t2s_2(2,0)
-		   + t3dg_3(2,1,0)*t2s_2(2,1)
-		   + t3dg_3(2,2,0)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(l,j)(2,0,2)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(2,1,0)
-		- (t3dg_3(2,0,1)*t2s_2(0,0)
-		   + t3dg_3(2,1,1)*t2s_2(0,1)
-		   + t3dg_3(2,2,1)*t2s_2(0,2))
-		,"T3dg(i,j,k)*T2s(l,j)(2,1,0)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(2,1,1)
-		- (t3dg_3(2,0,1)*t2s_2(1,0)
-		   + t3dg_3(2,1,1)*t2s_2(1,1)
-		   + t3dg_3(2,2,1)*t2s_2(1,2))
-		,"T3dg(i,j,k)*T2s(l,j)(2,1,1)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(2,1,2)
-		- (t3dg_3(2,0,1)*t2s_2(2,0)
-		   + t3dg_3(2,1,1)*t2s_2(2,1)
-		   + t3dg_3(2,2,1)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(l,j)(2,1,2)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(2,2,0)
-		- (t3dg_3(2,0,2)*t2s_2(0,0)
-		   + t3dg_3(2,1,2)*t2s_2(0,1)
-		   + t3dg_3(2,2,2)*t2s_2(0,2))
-		,"T3dg(i,j,k)*T2s(l,j)(2,2,0)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(2,2,1)
-		- (t3dg_3(2,0,2)*t2s_2(1,0)
-		   + t3dg_3(2,1,2)*t2s_2(1,1)
-		   + t3dg_3(2,2,2)*t2s_2(1,2))
-		,"T3dg(i,j,k)*T2s(l,j)(2,2,1)");
-  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(2,2,2)
-		- (t3dg_3(2,0,2)*t2s_2(2,0)
-		   + t3dg_3(2,1,2)*t2s_2(2,1)
-		   + t3dg_3(2,2,2)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(l,j)(2,2,2)");
-
-
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(0,0,0)
-		- (t3dg_3(0,0,0)*t2s_2(0,0)
-		   + t3dg_3(0,1,0)*t2s_2(1,0)
-		   + t3dg_3(0,2,0)*t2s_2(2,0))
-		,"T2s(j,l)*T3dg(i,j,k)(0,0,0)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(0,0,1)
-		- (t3dg_3(0,0,0)*t2s_2(0,1)
-		   + t3dg_3(0,1,0)*t2s_2(1,1)
-		   + t3dg_3(0,2,0)*t2s_2(2,1))
-		,"T2s(j,l)*T3dg(i,j,k)(0,0,1)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(0,0,2)
-		- (t3dg_3(0,0,0)*t2s_2(0,2)
-		   + t3dg_3(0,1,0)*t2s_2(1,2)
-		   + t3dg_3(0,2,0)*t2s_2(2,2))
-		,"T2s(j,l)*T3dg(i,j,k)(0,0,2)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(0,1,0)
-		- (t3dg_3(0,0,1)*t2s_2(0,0)
-		   + t3dg_3(0,1,1)*t2s_2(1,0)
-		   + t3dg_3(0,2,1)*t2s_2(2,0))
-		,"T2s(j,l)*T3dg(i,j,k)(0,1,0)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(0,1,1)
-		- (t3dg_3(0,0,1)*t2s_2(0,1)
-		   + t3dg_3(0,1,1)*t2s_2(1,1)
-		   + t3dg_3(0,2,1)*t2s_2(2,1))
-		,"T2s(j,l)*T3dg(i,j,k)(0,1,1)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(0,1,2)
-		- (t3dg_3(0,0,1)*t2s_2(0,2)
-		   + t3dg_3(0,1,1)*t2s_2(1,2)
-		   + t3dg_3(0,2,1)*t2s_2(2,2))
-		,"T2s(j,l)*T3dg(i,j,k)(0,1,2)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(0,2,0)
-		- (t3dg_3(0,0,2)*t2s_2(0,0)
-		   + t3dg_3(0,1,2)*t2s_2(1,0)
-		   + t3dg_3(0,2,2)*t2s_2(2,0))
-		,"T2s(j,l)*T3dg(i,j,k)(0,2,0)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(0,2,1)
-		- (t3dg_3(0,0,2)*t2s_2(0,1)
-		   + t3dg_3(0,1,2)*t2s_2(1,1)
-		   + t3dg_3(0,2,2)*t2s_2(2,1))
-		,"T2s(j,l)*T3dg(i,j,k)(0,2,1)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(0,2,2)
-		- (t3dg_3(0,0,2)*t2s_2(0,2)
-		   + t3dg_3(0,1,2)*t2s_2(1,2)
-		   + t3dg_3(0,2,2)*t2s_2(2,2))
-		,"T2s(j,l)*T3dg(i,j,k)(0,2,2)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(1,0,0)
-		- (t3dg_3(1,0,0)*t2s_2(0,0)
-		   + t3dg_3(1,1,0)*t2s_2(1,0)
-		   + t3dg_3(1,2,0)*t2s_2(2,0))
-		,"T2s(j,l)*T3dg(i,j,k)(1,0,0)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(1,0,1)
-		- (t3dg_3(1,0,0)*t2s_2(0,1)
-		   + t3dg_3(1,1,0)*t2s_2(1,1)
-		   + t3dg_3(1,2,0)*t2s_2(2,1))
-		,"T2s(j,l)*T3dg(i,j,k)(1,0,1)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(1,0,2)
-		- (t3dg_3(1,0,0)*t2s_2(0,2)
-		   + t3dg_3(1,1,0)*t2s_2(1,2)
-		   + t3dg_3(1,2,0)*t2s_2(2,2))
-		,"T2s(j,l)*T3dg(i,j,k)(1,0,2)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(1,1,0)
-		- (t3dg_3(1,0,1)*t2s_2(0,0)
-		   + t3dg_3(1,1,1)*t2s_2(1,0)
-		   + t3dg_3(1,2,1)*t2s_2(2,0))
-		,"T2s(j,l)*T3dg(i,j,k)(1,1,0)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(1,1,1)
-		- (t3dg_3(1,0,1)*t2s_2(0,1)
-		   + t3dg_3(1,1,1)*t2s_2(1,1)
-		   + t3dg_3(1,2,1)*t2s_2(2,1))
-		,"T2s(j,l)*T3dg(i,j,k)(1,1,1)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(1,1,2)
-		- (t3dg_3(1,0,1)*t2s_2(0,2)
-		   + t3dg_3(1,1,1)*t2s_2(1,2)
-		   + t3dg_3(1,2,1)*t2s_2(2,2))
-		,"T2s(j,l)*T3dg(i,j,k)(1,1,2)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(1,2,0)
-		- (t3dg_3(1,0,2)*t2s_2(0,0)
-		   + t3dg_3(1,1,2)*t2s_2(1,0)
-		   + t3dg_3(1,2,2)*t2s_2(2,0))
-		,"T2s(j,l)*T3dg(i,j,k)(1,2,0)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(1,2,1)
-		- (t3dg_3(1,0,2)*t2s_2(0,1)
-		   + t3dg_3(1,1,2)*t2s_2(1,1)
-		   + t3dg_3(1,2,2)*t2s_2(2,1))
-		,"T2s(j,l)*T3dg(i,j,k)(1,2,1)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(1,2,2)
-		- (t3dg_3(1,0,2)*t2s_2(0,2)
-		   + t3dg_3(1,1,2)*t2s_2(1,2)
-		   + t3dg_3(1,2,2)*t2s_2(2,2))
-		,"T2s(j,l)*T3dg(i,j,k)(1,2,2)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(2,0,0)
-		- (t3dg_3(2,0,0)*t2s_2(0,0)
-		   + t3dg_3(2,1,0)*t2s_2(1,0)
-		   + t3dg_3(2,2,0)*t2s_2(2,0))
-		,"T2s(j,l)*T3dg(i,j,k)(2,0,0)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(2,0,1)
-		- (t3dg_3(2,0,0)*t2s_2(0,1)
-		   + t3dg_3(2,1,0)*t2s_2(1,1)
-		   + t3dg_3(2,2,0)*t2s_2(2,1))
-		,"T2s(j,l)*T3dg(i,j,k)(2,0,1)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(2,0,2)
-		- (t3dg_3(2,0,0)*t2s_2(0,2)
-		   + t3dg_3(2,1,0)*t2s_2(1,2)
-		   + t3dg_3(2,2,0)*t2s_2(2,2))
-		,"T2s(j,l)*T3dg(i,j,k)(2,0,2)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(2,1,0)
-		- (t3dg_3(2,0,1)*t2s_2(0,0)
-		   + t3dg_3(2,1,1)*t2s_2(1,0)
-		   + t3dg_3(2,2,1)*t2s_2(2,0))
-		,"T2s(j,l)*T3dg(i,j,k)(2,1,0)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(2,1,1)
-		- (t3dg_3(2,0,1)*t2s_2(0,1)
-		   + t3dg_3(2,1,1)*t2s_2(1,1)
-		   + t3dg_3(2,2,1)*t2s_2(2,1))
-		,"T2s(j,l)*T3dg(i,j,k)(2,1,1)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(2,1,2)
-		- (t3dg_3(2,0,1)*t2s_2(0,2)
-		   + t3dg_3(2,1,1)*t2s_2(1,2)
-		   + t3dg_3(2,2,1)*t2s_2(2,2))
-		,"T2s(j,l)*T3dg(i,j,k)(2,1,2)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(2,2,0)
-		- (t3dg_3(2,0,2)*t2s_2(0,0)
-		   + t3dg_3(2,1,2)*t2s_2(1,0)
-		   + t3dg_3(2,2,2)*t2s_2(2,0))
-		,"T2s(j,l)*T3dg(i,j,k)(2,2,0)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(2,2,1)
-		- (t3dg_3(2,0,2)*t2s_2(0,1)
-		   + t3dg_3(2,1,2)*t2s_2(1,1)
-		   + t3dg_3(2,2,2)*t2s_2(2,1))
-		,"T2s(j,l)*T3dg(i,j,k)(2,2,1)");
-  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(2,2,2)
-		- (t3dg_3(2,0,2)*t2s_2(0,2)
-		   + t3dg_3(2,1,2)*t2s_2(1,2)
-		   + t3dg_3(2,2,2)*t2s_2(2,2))
-		,"T2s(j,l)*T3dg(i,j,k)(2,2,2)");
-
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(0,0,0)
-		- (t3dg_3(0,0,0)*t2s_2(0,0)
-		   + t3dg_3(0,1,0)*t2s_2(0,1)
-		   + t3dg_3(0,2,0)*t2s_2(0,2))
-		,"T2s(l,j)*T3dg(i,j,k)(0,0,0)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(0,0,1)
-		- (t3dg_3(0,0,0)*t2s_2(1,0)
-		   + t3dg_3(0,1,0)*t2s_2(1,1)
-		   + t3dg_3(0,2,0)*t2s_2(1,2))
-		,"T2s(l,j)*T3dg(i,j,k)(0,0,1)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(0,0,2)
-		- (t3dg_3(0,0,0)*t2s_2(2,0)
-		   + t3dg_3(0,1,0)*t2s_2(2,1)
-		   + t3dg_3(0,2,0)*t2s_2(2,2))
-		,"T2s(l,j)*T3dg(i,j,k)(0,0,2)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(0,1,0)
-		- (t3dg_3(0,0,1)*t2s_2(0,0)
-		   + t3dg_3(0,1,1)*t2s_2(0,1)
-		   + t3dg_3(0,2,1)*t2s_2(0,2))
-		,"T2s(l,j)*T3dg(i,j,k)(0,1,0)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(0,1,1)
-		- (t3dg_3(0,0,1)*t2s_2(1,0)
-		   + t3dg_3(0,1,1)*t2s_2(1,1)
-		   + t3dg_3(0,2,1)*t2s_2(1,2))
-		,"T2s(l,j)*T3dg(i,j,k)(0,1,1)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(0,1,2)
-		- (t3dg_3(0,0,1)*t2s_2(2,0)
-		   + t3dg_3(0,1,1)*t2s_2(2,1)
-		   + t3dg_3(0,2,1)*t2s_2(2,2))
-		,"T2s(l,j)*T3dg(i,j,k)(0,1,2)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(0,2,0)
-		- (t3dg_3(0,0,2)*t2s_2(0,0)
-		   + t3dg_3(0,1,2)*t2s_2(0,1)
-		   + t3dg_3(0,2,2)*t2s_2(0,2))
-		,"T2s(l,j)*T3dg(i,j,k)(0,2,0)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(0,2,1)
-		- (t3dg_3(0,0,2)*t2s_2(1,0)
-		   + t3dg_3(0,1,2)*t2s_2(1,1)
-		   + t3dg_3(0,2,2)*t2s_2(1,2))
-		,"T2s(l,j)*T3dg(i,j,k)(0,2,1)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(0,2,2)
-		- (t3dg_3(0,0,2)*t2s_2(2,0)
-		   + t3dg_3(0,1,2)*t2s_2(2,1)
-		   + t3dg_3(0,2,2)*t2s_2(2,2))
-		,"T2s(l,j)*T3dg(i,j,k)(0,2,2)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(1,0,0)
-		- (t3dg_3(1,0,0)*t2s_2(0,0)
-		   + t3dg_3(1,1,0)*t2s_2(0,1)
-		   + t3dg_3(1,2,0)*t2s_2(0,2))
-		,"T2s(l,j)*T3dg(i,j,k)(1,0,0)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(1,0,1)
-		- (t3dg_3(1,0,0)*t2s_2(1,0)
-		   + t3dg_3(1,1,0)*t2s_2(1,1)
-		   + t3dg_3(1,2,0)*t2s_2(1,2))
-		,"T2s(l,j)*T3dg(i,j,k)(1,0,1)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(1,0,2)
-		- (t3dg_3(1,0,0)*t2s_2(2,0)
-		   + t3dg_3(1,1,0)*t2s_2(2,1)
-		   + t3dg_3(1,2,0)*t2s_2(2,2))
-		,"T2s(l,j)*T3dg(i,j,k)(1,0,2)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(1,1,0)
-		- (t3dg_3(1,0,1)*t2s_2(0,0)
-		   + t3dg_3(1,1,1)*t2s_2(0,1)
-		   + t3dg_3(1,2,1)*t2s_2(0,2))
-		,"T2s(l,j)*T3dg(i,j,k)(1,1,0)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(1,1,1)
-		- (t3dg_3(1,0,1)*t2s_2(1,0)
-		   + t3dg_3(1,1,1)*t2s_2(1,1)
-		   + t3dg_3(1,2,1)*t2s_2(1,2))
-		,"T2s(l,j)*T3dg(i,j,k)(1,1,1)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(1,1,2)
-		- (t3dg_3(1,0,1)*t2s_2(2,0)
-		   + t3dg_3(1,1,1)*t2s_2(2,1)
-		   + t3dg_3(1,2,1)*t2s_2(2,2))
-		,"T2s(l,j)*T3dg(i,j,k)(1,1,2)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(1,2,0)
-		- (t3dg_3(1,0,2)*t2s_2(0,0)
-		   + t3dg_3(1,1,2)*t2s_2(0,1)
-		   + t3dg_3(1,2,2)*t2s_2(0,2))
-		,"T2s(l,j)*T3dg(i,j,k)(1,2,0)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(1,2,1)
-		- (t3dg_3(1,0,2)*t2s_2(1,0)
-		   + t3dg_3(1,1,2)*t2s_2(1,1)
-		   + t3dg_3(1,2,2)*t2s_2(1,2))
-		,"T2s(l,j)*T3dg(i,j,k)(1,2,1)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(1,2,2)
-		- (t3dg_3(1,0,2)*t2s_2(2,0)
-		   + t3dg_3(1,1,2)*t2s_2(2,1)
-		   + t3dg_3(1,2,2)*t2s_2(2,2))
-		,"T2s(l,j)*T3dg(i,j,k)(1,2,2)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(2,0,0)
-		- (t3dg_3(2,0,0)*t2s_2(0,0)
-		   + t3dg_3(2,1,0)*t2s_2(0,1)
-		   + t3dg_3(2,2,0)*t2s_2(0,2))
-		,"T2s(l,j)*T3dg(i,j,k)(2,0,0)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(2,0,1)
-		- (t3dg_3(2,0,0)*t2s_2(1,0)
-		   + t3dg_3(2,1,0)*t2s_2(1,1)
-		   + t3dg_3(2,2,0)*t2s_2(1,2))
-		,"T2s(l,j)*T3dg(i,j,k)(2,0,1)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(2,0,2)
-		- (t3dg_3(2,0,0)*t2s_2(2,0)
-		   + t3dg_3(2,1,0)*t2s_2(2,1)
-		   + t3dg_3(2,2,0)*t2s_2(2,2))
-		,"T2s(l,j)*T3dg(i,j,k)(2,0,2)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(2,1,0)
-		- (t3dg_3(2,0,1)*t2s_2(0,0)
-		   + t3dg_3(2,1,1)*t2s_2(0,1)
-		   + t3dg_3(2,2,1)*t2s_2(0,2))
-		,"T2s(l,j)*T3dg(i,j,k)(2,1,0)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(2,1,1)
-		- (t3dg_3(2,0,1)*t2s_2(1,0)
-		   + t3dg_3(2,1,1)*t2s_2(1,1)
-		   + t3dg_3(2,2,1)*t2s_2(1,2))
-		,"T2s(l,j)*T3dg(i,j,k)(2,1,1)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(2,1,2)
-		- (t3dg_3(2,0,1)*t2s_2(2,0)
-		   + t3dg_3(2,1,1)*t2s_2(2,1)
-		   + t3dg_3(2,2,1)*t2s_2(2,2))
-		,"T2s(l,j)*T3dg(i,j,k)(2,1,2)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(2,2,0)
-		- (t3dg_3(2,0,2)*t2s_2(0,0)
-		   + t3dg_3(2,1,2)*t2s_2(0,1)
-		   + t3dg_3(2,2,2)*t2s_2(0,2))
-		,"T2s(l,j)*T3dg(i,j,k)(2,2,0)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(2,2,1)
-		- (t3dg_3(2,0,2)*t2s_2(1,0)
-		   + t3dg_3(2,1,2)*t2s_2(1,1)
-		   + t3dg_3(2,2,2)*t2s_2(1,2))
-		,"T2s(l,j)*T3dg(i,j,k)(2,2,1)");
-  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(2,2,2)
-		- (t3dg_3(2,0,2)*t2s_2(2,0)
-		   + t3dg_3(2,1,2)*t2s_2(2,1)
-		   + t3dg_3(2,2,2)*t2s_2(2,2))
-		,"T2s(l,j)*T3dg(i,j,k)(2,2,2)");
-  cout << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgCIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgCIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,1288 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgCIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+		  Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+		  Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+		  const Tensor2<double,3,3> &t2_3,
+		  Tensor2_symmetric<double,3> &t2s_1,
+		  const Tensor2_symmetric<double,3> &t2s_2,
+		  const Tensor2_symmetric<double,3> &t2s_3,
+		  Tensor3_dg<double,3,3> &t3dg_1,
+		  const Tensor3_dg<double,3,3> &t3dg_2,
+		  const Tensor3_dg<double,3,3> &t3dg_3,
+		  Tensor3_christof<double,3,3> &t3ch_1,
+		  const Tensor3_christof<double,3,3> &t3ch_2,
+		  const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(0,0,0)
+		- (t3dg_2(0,0,0)+t3dg_3(0,0,0))
+		,"T3dg(i,j,k)+T3(k,j,i)(0,0,0)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(0,0,1)
+		- (t3dg_2(0,0,1)+t3dg_3(1,0,0))
+		,"T3dg(i,j,k)+T3(k,j,i)(0,0,1)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(0,0,2)
+		- (t3dg_2(0,0,2)+t3dg_3(2,0,0))
+		,"T3dg(i,j,k)+T3(k,j,i)(0,0,2)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(0,1,0)
+		- (t3dg_2(0,1,0)+t3dg_3(0,1,0))
+		,"T3dg(i,j,k)+T3(k,j,i)(0,1,0)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(0,1,1)
+		- (t3dg_2(0,1,1)+t3dg_3(1,1,0))
+		,"T3dg(i,j,k)+T3(k,j,i)(0,1,1)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(0,1,2)
+		- (t3dg_2(0,1,2)+t3dg_3(2,1,0))
+		,"T3dg(i,j,k)+T3(k,j,i)(0,1,2)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(0,2,0)
+		- (t3dg_2(0,2,0)+t3dg_3(0,2,0))
+		,"T3dg(i,j,k)+T3(k,j,i)(0,2,0)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(0,2,1)
+		- (t3dg_2(0,2,1)+t3dg_3(1,2,0))
+		,"T3dg(i,j,k)+T3(k,j,i)(0,2,1)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(0,2,2)
+		- (t3dg_2(0,2,2)+t3dg_3(2,2,0))
+		,"T3dg(i,j,k)+T3(k,j,i)(0,2,2)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(1,0,0)
+		- (t3dg_2(1,0,0)+t3dg_3(0,0,1))
+		,"T3dg(i,j,k)+T3(k,j,i)(1,0,0)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(1,0,1)
+		- (t3dg_2(1,0,1)+t3dg_3(1,0,1))
+		,"T3dg(i,j,k)+T3(k,j,i)(1,0,1)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(1,0,2)
+		- (t3dg_2(1,0,2)+t3dg_3(2,0,1))
+		,"T3dg(i,j,k)+T3(k,j,i)(1,0,2)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(1,1,0)
+		- (t3dg_2(1,1,0)+t3dg_3(0,1,1))
+		,"T3dg(i,j,k)+T3(k,j,i)(1,1,0)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(1,1,1)
+		- (t3dg_2(1,1,1)+t3dg_3(1,1,1))
+		,"T3dg(i,j,k)+T3(k,j,i)(1,1,1)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(1,1,2)
+		- (t3dg_2(1,1,2)+t3dg_3(2,1,1))
+		,"T3dg(i,j,k)+T3(k,j,i)(1,1,2)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(1,2,0)
+		- (t3dg_2(1,2,0)+t3dg_3(0,2,1))
+		,"T3dg(i,j,k)+T3(k,j,i)(1,2,0)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(1,2,1)
+		- (t3dg_2(1,2,1)+t3dg_3(1,2,1))
+		,"T3dg(i,j,k)+T3(k,j,i)(1,2,1)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(1,2,2)
+		- (t3dg_2(1,2,2)+t3dg_3(2,2,1))
+		,"T3dg(i,j,k)+T3(k,j,i)(1,2,2)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(2,0,0)
+		- (t3dg_2(2,0,0)+t3dg_3(0,0,2))
+		,"T3dg(i,j,k)+T3(k,j,i)(2,0,0)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(2,0,1)
+		- (t3dg_2(2,0,1)+t3dg_3(1,0,2))
+		,"T3dg(i,j,k)+T3(k,j,i)(2,0,1)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(2,0,2)
+		- (t3dg_2(2,0,2)+t3dg_3(2,0,2))
+		,"T3dg(i,j,k)+T3(k,j,i)(2,0,2)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(2,1,0)
+		- (t3dg_2(2,1,0)+t3dg_3(0,1,2))
+		,"T3dg(i,j,k)+T3(k,j,i)(2,1,0)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(2,1,1)
+		- (t3dg_2(2,1,1)+t3dg_3(1,1,2))
+		,"T3dg(i,j,k)+T3(k,j,i)(2,1,1)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(2,1,2)
+		- (t3dg_2(2,1,2)+t3dg_3(2,1,2))
+		,"T3dg(i,j,k)+T3(k,j,i)(2,1,2)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(2,2,0)
+		- (t3dg_2(2,2,0)+t3dg_3(0,2,2))
+		,"T3dg(i,j,k)+T3(k,j,i)(2,2,0)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(2,2,1)
+		- (t3dg_2(2,2,1)+t3dg_3(1,2,2))
+		,"T3dg(i,j,k)+T3(k,j,i)(2,2,1)");
+  test_for_zero((t3dg_2(i,j,k)+t3dg_3(k,j,i))(2,2,2)
+		- (t3dg_2(2,2,2)+t3dg_3(2,2,2))
+		,"T3dg(i,j,k)+T3(k,j,i)(2,2,2)");
+
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(0,0,0)
+		- (t3dg_2(0,0,0)-t3dg_3(0,0,0))
+		,"T3dg(i,j,k)-T3(k,j,i)(0,0,0)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(0,0,1)
+		- (t3dg_2(0,0,1)-t3dg_3(1,0,0))
+		,"T3dg(i,j,k)-T3(k,j,i)(0,0,1)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(0,0,2)
+		- (t3dg_2(0,0,2)-t3dg_3(2,0,0))
+		,"T3dg(i,j,k)-T3(k,j,i)(0,0,2)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(0,1,0)
+		- (t3dg_2(0,1,0)-t3dg_3(0,1,0))
+		,"T3dg(i,j,k)-T3(k,j,i)(0,1,0)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(0,1,1)
+		- (t3dg_2(0,1,1)-t3dg_3(1,1,0))
+		,"T3dg(i,j,k)-T3(k,j,i)(0,1,1)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(0,1,2)
+		- (t3dg_2(0,1,2)-t3dg_3(2,1,0))
+		,"T3dg(i,j,k)-T3(k,j,i)(0,1,2)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(0,2,0)
+		- (t3dg_2(0,2,0)-t3dg_3(0,2,0))
+		,"T3dg(i,j,k)-T3(k,j,i)(0,2,0)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(0,2,1)
+		- (t3dg_2(0,2,1)-t3dg_3(1,2,0))
+		,"T3dg(i,j,k)-T3(k,j,i)(0,2,1)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(0,2,2)
+		- (t3dg_2(0,2,2)-t3dg_3(2,2,0))
+		,"T3dg(i,j,k)-T3(k,j,i)(0,2,2)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(1,0,0)
+		- (t3dg_2(1,0,0)-t3dg_3(0,0,1))
+		,"T3dg(i,j,k)-T3(k,j,i)(1,0,0)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(1,0,1)
+		- (t3dg_2(1,0,1)-t3dg_3(1,0,1))
+		,"T3dg(i,j,k)-T3(k,j,i)(1,0,1)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(1,0,2)
+		- (t3dg_2(1,0,2)-t3dg_3(2,0,1))
+		,"T3dg(i,j,k)-T3(k,j,i)(1,0,2)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(1,1,0)
+		- (t3dg_2(1,1,0)-t3dg_3(0,1,1))
+		,"T3dg(i,j,k)-T3(k,j,i)(1,1,0)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(1,1,1)
+		- (t3dg_2(1,1,1)-t3dg_3(1,1,1))
+		,"T3dg(i,j,k)-T3(k,j,i)(1,1,1)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(1,1,2)
+		- (t3dg_2(1,1,2)-t3dg_3(2,1,1))
+		,"T3dg(i,j,k)-T3(k,j,i)(1,1,2)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(1,2,0)
+		- (t3dg_2(1,2,0)-t3dg_3(0,2,1))
+		,"T3dg(i,j,k)-T3(k,j,i)(1,2,0)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(1,2,1)
+		- (t3dg_2(1,2,1)-t3dg_3(1,2,1))
+		,"T3dg(i,j,k)-T3(k,j,i)(1,2,1)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(1,2,2)
+		- (t3dg_2(1,2,2)-t3dg_3(2,2,1))
+		,"T3dg(i,j,k)-T3(k,j,i)(1,2,2)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(2,0,0)
+		- (t3dg_2(2,0,0)-t3dg_3(0,0,2))
+		,"T3dg(i,j,k)-T3(k,j,i)(2,0,0)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(2,0,1)
+		- (t3dg_2(2,0,1)-t3dg_3(1,0,2))
+		,"T3dg(i,j,k)-T3(k,j,i)(2,0,1)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(2,0,2)
+		- (t3dg_2(2,0,2)-t3dg_3(2,0,2))
+		,"T3dg(i,j,k)-T3(k,j,i)(2,0,2)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(2,1,0)
+		- (t3dg_2(2,1,0)-t3dg_3(0,1,2))
+		,"T3dg(i,j,k)-T3(k,j,i)(2,1,0)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(2,1,1)
+		- (t3dg_2(2,1,1)-t3dg_3(1,1,2))
+		,"T3dg(i,j,k)-T3(k,j,i)(2,1,1)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(2,1,2)
+		- (t3dg_2(2,1,2)-t3dg_3(2,1,2))
+		,"T3dg(i,j,k)-T3(k,j,i)(2,1,2)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(2,2,0)
+		- (t3dg_2(2,2,0)-t3dg_3(0,2,2))
+		,"T3dg(i,j,k)-T3(k,j,i)(2,2,0)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(2,2,1)
+		- (t3dg_2(2,2,1)-t3dg_3(1,2,2))
+		,"T3dg(i,j,k)-T3(k,j,i)(2,2,1)");
+  test_for_zero((t3dg_2(i,j,k)-t3dg_3(k,j,i))(2,2,2)
+		- (t3dg_2(2,2,2)-t3dg_3(2,2,2))
+		,"T3dg(i,j,k)-T3(k,j,i)(2,2,2)");
+
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(0,0,0)
+		- (t3dg_2(0,0,0)*t2_2(0,0)
+		   + t3dg_2(0,1,0)*t2_2(1,0)
+		   + t3dg_2(0,2,0)*t2_2(2,0))
+		,"T3dg(i,j,k)*T2(j,l)(0,0,0)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(0,0,1)
+		- (t3dg_2(0,0,0)*t2_2(0,1)
+		   + t3dg_2(0,1,0)*t2_2(1,1)
+		   + t3dg_2(0,2,0)*t2_2(2,1))
+		,"T3dg(i,j,k)*T2(j,l)(0,0,1)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(0,0,2)
+		- (t3dg_2(0,0,0)*t2_2(0,2)
+		   + t3dg_2(0,1,0)*t2_2(1,2)
+		   + t3dg_2(0,2,0)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(j,l)(0,0,2)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(0,1,0)
+		- (t3dg_2(0,0,1)*t2_2(0,0)
+		   + t3dg_2(0,1,1)*t2_2(1,0)
+		   + t3dg_2(0,2,1)*t2_2(2,0))
+		,"T3dg(i,j,k)*T2(j,l)(0,1,0)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(0,1,1)
+		- (t3dg_2(0,0,1)*t2_2(0,1)
+		   + t3dg_2(0,1,1)*t2_2(1,1)
+		   + t3dg_2(0,2,1)*t2_2(2,1))
+		,"T3dg(i,j,k)*T2(j,l)(0,1,1)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(0,1,2)
+		- (t3dg_2(0,0,1)*t2_2(0,2)
+		   + t3dg_2(0,1,1)*t2_2(1,2)
+		   + t3dg_2(0,2,1)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(j,l)(0,1,2)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(0,2,0)
+		- (t3dg_2(0,0,2)*t2_2(0,0)
+		   + t3dg_2(0,1,2)*t2_2(1,0)
+		   + t3dg_2(0,2,2)*t2_2(2,0))
+		,"T3dg(i,j,k)*T2(j,l)(0,2,0)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(0,2,1)
+		- (t3dg_2(0,0,2)*t2_2(0,1)
+		   + t3dg_2(0,1,2)*t2_2(1,1)
+		   + t3dg_2(0,2,2)*t2_2(2,1))
+		,"T3dg(i,j,k)*T2(j,l)(0,2,1)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(0,2,2)
+		- (t3dg_2(0,0,2)*t2_2(0,2)
+		   + t3dg_2(0,1,2)*t2_2(1,2)
+		   + t3dg_2(0,2,2)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(j,l)(0,2,2)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(1,0,0)
+		- (t3dg_2(1,0,0)*t2_2(0,0)
+		   + t3dg_2(1,1,0)*t2_2(1,0)
+		   + t3dg_2(1,2,0)*t2_2(2,0))
+		,"T3dg(i,j,k)*T2(j,l)(1,0,0)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(1,0,1)
+		- (t3dg_2(1,0,0)*t2_2(0,1)
+		   + t3dg_2(1,1,0)*t2_2(1,1)
+		   + t3dg_2(1,2,0)*t2_2(2,1))
+		,"T3dg(i,j,k)*T2(j,l)(1,0,1)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(1,0,2)
+		- (t3dg_2(1,0,0)*t2_2(0,2)
+		   + t3dg_2(1,1,0)*t2_2(1,2)
+		   + t3dg_2(1,2,0)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(j,l)(1,0,2)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(1,1,0)
+		- (t3dg_2(1,0,1)*t2_2(0,0)
+		   + t3dg_2(1,1,1)*t2_2(1,0)
+		   + t3dg_2(1,2,1)*t2_2(2,0))
+		,"T3dg(i,j,k)*T2(j,l)(1,1,0)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(1,1,1)
+		- (t3dg_2(1,0,1)*t2_2(0,1)
+		   + t3dg_2(1,1,1)*t2_2(1,1)
+		   + t3dg_2(1,2,1)*t2_2(2,1))
+		,"T3dg(i,j,k)*T2(j,l)(1,1,1)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(1,1,2)
+		- (t3dg_2(1,0,1)*t2_2(0,2)
+		   + t3dg_2(1,1,1)*t2_2(1,2)
+		   + t3dg_2(1,2,1)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(j,l)(1,1,2)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(1,2,0)
+		- (t3dg_2(1,0,2)*t2_2(0,0)
+		   + t3dg_2(1,1,2)*t2_2(1,0)
+		   + t3dg_2(1,2,2)*t2_2(2,0))
+		,"T3dg(i,j,k)*T2(j,l)(1,2,0)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(1,2,1)
+		- (t3dg_2(1,0,2)*t2_2(0,1)
+		   + t3dg_2(1,1,2)*t2_2(1,1)
+		   + t3dg_2(1,2,2)*t2_2(2,1))
+		,"T3dg(i,j,k)*T2(j,l)(1,2,1)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(1,2,2)
+		- (t3dg_2(1,0,2)*t2_2(0,2)
+		   + t3dg_2(1,1,2)*t2_2(1,2)
+		   + t3dg_2(1,2,2)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(j,l)(1,2,2)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(2,0,0)
+		- (t3dg_2(2,0,0)*t2_2(0,0)
+		   + t3dg_2(2,1,0)*t2_2(1,0)
+		   + t3dg_2(2,2,0)*t2_2(2,0))
+		,"T3dg(i,j,k)*T2(j,l)(2,0,0)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(2,0,1)
+		- (t3dg_2(2,0,0)*t2_2(0,1)
+		   + t3dg_2(2,1,0)*t2_2(1,1)
+		   + t3dg_2(2,2,0)*t2_2(2,1))
+		,"T3dg(i,j,k)*T2(j,l)(2,0,1)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(2,0,2)
+		- (t3dg_2(2,0,0)*t2_2(0,2)
+		   + t3dg_2(2,1,0)*t2_2(1,2)
+		   + t3dg_2(2,2,0)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(j,l)(2,0,2)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(2,1,0)
+		- (t3dg_2(2,0,1)*t2_2(0,0)
+		   + t3dg_2(2,1,1)*t2_2(1,0)
+		   + t3dg_2(2,2,1)*t2_2(2,0))
+		,"T3dg(i,j,k)*T2(j,l)(2,1,0)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(2,1,1)
+		- (t3dg_2(2,0,1)*t2_2(0,1)
+		   + t3dg_2(2,1,1)*t2_2(1,1)
+		   + t3dg_2(2,2,1)*t2_2(2,1))
+		,"T3dg(i,j,k)*T2(j,l)(2,1,1)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(2,1,2)
+		- (t3dg_2(2,0,1)*t2_2(0,2)
+		   + t3dg_2(2,1,1)*t2_2(1,2)
+		   + t3dg_2(2,2,1)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(j,l)(2,1,2)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(2,2,0)
+		- (t3dg_2(2,0,2)*t2_2(0,0)
+		   + t3dg_2(2,1,2)*t2_2(1,0)
+		   + t3dg_2(2,2,2)*t2_2(2,0))
+		,"T3dg(i,j,k)*T2(j,l)(2,2,0)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(2,2,1)
+		- (t3dg_2(2,0,2)*t2_2(0,1)
+		   + t3dg_2(2,1,2)*t2_2(1,1)
+		   + t3dg_2(2,2,2)*t2_2(2,1))
+		,"T3dg(i,j,k)*T2(j,l)(2,2,1)");
+  test_for_zero((t3dg_2(i,j,k)*t2_2(j,l))(2,2,2)
+		- (t3dg_2(2,0,2)*t2_2(0,2)
+		   + t3dg_2(2,1,2)*t2_2(1,2)
+		   + t3dg_2(2,2,2)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(j,l)(2,2,2)");
+
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(0,0,0)
+		- (t3dg_3(0,0,0)*t2_2(0,0)
+		   + t3dg_3(0,1,0)*t2_2(0,1)
+		   + t3dg_3(0,2,0)*t2_2(0,2))
+		,"T3dg(i,j,k)*T2(l,j)(0,0,0)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(0,0,1)
+		- (t3dg_3(0,0,0)*t2_2(1,0)
+		   + t3dg_3(0,1,0)*t2_2(1,1)
+		   + t3dg_3(0,2,0)*t2_2(1,2))
+		,"T3dg(i,j,k)*T2(l,j)(0,0,1)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(0,0,2)
+		- (t3dg_3(0,0,0)*t2_2(2,0)
+		   + t3dg_3(0,1,0)*t2_2(2,1)
+		   + t3dg_3(0,2,0)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(l,j)(0,0,2)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(0,1,0)
+		- (t3dg_3(0,0,1)*t2_2(0,0)
+		   + t3dg_3(0,1,1)*t2_2(0,1)
+		   + t3dg_3(0,2,1)*t2_2(0,2))
+		,"T3dg(i,j,k)*T2(l,j)(0,1,0)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(0,1,1)
+		- (t3dg_3(0,0,1)*t2_2(1,0)
+		   + t3dg_3(0,1,1)*t2_2(1,1)
+		   + t3dg_3(0,2,1)*t2_2(1,2))
+		,"T3dg(i,j,k)*T2(l,j)(0,1,1)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(0,1,2)
+		- (t3dg_3(0,0,1)*t2_2(2,0)
+		   + t3dg_3(0,1,1)*t2_2(2,1)
+		   + t3dg_3(0,2,1)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(l,j)(0,1,2)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(0,2,0)
+		- (t3dg_3(0,0,2)*t2_2(0,0)
+		   + t3dg_3(0,1,2)*t2_2(0,1)
+		   + t3dg_3(0,2,2)*t2_2(0,2))
+		,"T3dg(i,j,k)*T2(l,j)(0,2,0)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(0,2,1)
+		- (t3dg_3(0,0,2)*t2_2(1,0)
+		   + t3dg_3(0,1,2)*t2_2(1,1)
+		   + t3dg_3(0,2,2)*t2_2(1,2))
+		,"T3dg(i,j,k)*T2(l,j)(0,2,1)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(0,2,2)
+		- (t3dg_3(0,0,2)*t2_2(2,0)
+		   + t3dg_3(0,1,2)*t2_2(2,1)
+		   + t3dg_3(0,2,2)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(l,j)(0,2,2)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(1,0,0)
+		- (t3dg_3(1,0,0)*t2_2(0,0)
+		   + t3dg_3(1,1,0)*t2_2(0,1)
+		   + t3dg_3(1,2,0)*t2_2(0,2))
+		,"T3dg(i,j,k)*T2(l,j)(1,0,0)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(1,0,1)
+		- (t3dg_3(1,0,0)*t2_2(1,0)
+		   + t3dg_3(1,1,0)*t2_2(1,1)
+		   + t3dg_3(1,2,0)*t2_2(1,2))
+		,"T3dg(i,j,k)*T2(l,j)(1,0,1)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(1,0,2)
+		- (t3dg_3(1,0,0)*t2_2(2,0)
+		   + t3dg_3(1,1,0)*t2_2(2,1)
+		   + t3dg_3(1,2,0)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(l,j)(1,0,2)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(1,1,0)
+		- (t3dg_3(1,0,1)*t2_2(0,0)
+		   + t3dg_3(1,1,1)*t2_2(0,1)
+		   + t3dg_3(1,2,1)*t2_2(0,2))
+		,"T3dg(i,j,k)*T2(l,j)(1,1,0)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(1,1,1)
+		- (t3dg_3(1,0,1)*t2_2(1,0)
+		   + t3dg_3(1,1,1)*t2_2(1,1)
+		   + t3dg_3(1,2,1)*t2_2(1,2))
+		,"T3dg(i,j,k)*T2(l,j)(1,1,1)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(1,1,2)
+		- (t3dg_3(1,0,1)*t2_2(2,0)
+		   + t3dg_3(1,1,1)*t2_2(2,1)
+		   + t3dg_3(1,2,1)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(l,j)(1,1,2)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(1,2,0)
+		- (t3dg_3(1,0,2)*t2_2(0,0)
+		   + t3dg_3(1,1,2)*t2_2(0,1)
+		   + t3dg_3(1,2,2)*t2_2(0,2))
+		,"T3dg(i,j,k)*T2(l,j)(1,2,0)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(1,2,1)
+		- (t3dg_3(1,0,2)*t2_2(1,0)
+		   + t3dg_3(1,1,2)*t2_2(1,1)
+		   + t3dg_3(1,2,2)*t2_2(1,2))
+		,"T3dg(i,j,k)*T2(l,j)(1,2,1)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(1,2,2)
+		- (t3dg_3(1,0,2)*t2_2(2,0)
+		   + t3dg_3(1,1,2)*t2_2(2,1)
+		   + t3dg_3(1,2,2)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(l,j)(1,2,2)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(2,0,0)
+		- (t3dg_3(2,0,0)*t2_2(0,0)
+		   + t3dg_3(2,1,0)*t2_2(0,1)
+		   + t3dg_3(2,2,0)*t2_2(0,2))
+		,"T3dg(i,j,k)*T2(l,j)(2,0,0)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(2,0,1)
+		- (t3dg_3(2,0,0)*t2_2(1,0)
+		   + t3dg_3(2,1,0)*t2_2(1,1)
+		   + t3dg_3(2,2,0)*t2_2(1,2))
+		,"T3dg(i,j,k)*T2(l,j)(2,0,1)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(2,0,2)
+		- (t3dg_3(2,0,0)*t2_2(2,0)
+		   + t3dg_3(2,1,0)*t2_2(2,1)
+		   + t3dg_3(2,2,0)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(l,j)(2,0,2)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(2,1,0)
+		- (t3dg_3(2,0,1)*t2_2(0,0)
+		   + t3dg_3(2,1,1)*t2_2(0,1)
+		   + t3dg_3(2,2,1)*t2_2(0,2))
+		,"T3dg(i,j,k)*T2(l,j)(2,1,0)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(2,1,1)
+		- (t3dg_3(2,0,1)*t2_2(1,0)
+		   + t3dg_3(2,1,1)*t2_2(1,1)
+		   + t3dg_3(2,2,1)*t2_2(1,2))
+		,"T3dg(i,j,k)*T2(l,j)(2,1,1)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(2,1,2)
+		- (t3dg_3(2,0,1)*t2_2(2,0)
+		   + t3dg_3(2,1,1)*t2_2(2,1)
+		   + t3dg_3(2,2,1)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(l,j)(2,1,2)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(2,2,0)
+		- (t3dg_3(2,0,2)*t2_2(0,0)
+		   + t3dg_3(2,1,2)*t2_2(0,1)
+		   + t3dg_3(2,2,2)*t2_2(0,2))
+		,"T3dg(i,j,k)*T2(l,j)(2,2,0)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(2,2,1)
+		- (t3dg_3(2,0,2)*t2_2(1,0)
+		   + t3dg_3(2,1,2)*t2_2(1,1)
+		   + t3dg_3(2,2,2)*t2_2(1,2))
+		,"T3dg(i,j,k)*T2(l,j)(2,2,1)");
+  test_for_zero((t3dg_3(i,j,k)*t2_2(l,j))(2,2,2)
+		- (t3dg_3(2,0,2)*t2_2(2,0)
+		   + t3dg_3(2,1,2)*t2_2(2,1)
+		   + t3dg_3(2,2,2)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(l,j)(2,2,2)");
+
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(0,0,0)
+		- (t3dg_3(0,0,0)*t2_2(0,0)
+		   + t3dg_3(0,1,0)*t2_2(1,0)
+		   + t3dg_3(0,2,0)*t2_2(2,0))
+		,"T2(j,l)*T3dg(i,j,k)(0,0,0)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(0,0,1)
+		- (t3dg_3(0,0,0)*t2_2(0,1)
+		   + t3dg_3(0,1,0)*t2_2(1,1)
+		   + t3dg_3(0,2,0)*t2_2(2,1))
+		,"T2(j,l)*T3dg(i,j,k)(0,0,1)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(0,0,2)
+		- (t3dg_3(0,0,0)*t2_2(0,2)
+		   + t3dg_3(0,1,0)*t2_2(1,2)
+		   + t3dg_3(0,2,0)*t2_2(2,2))
+		,"T2(j,l)*T3dg(i,j,k)(0,0,2)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(0,1,0)
+		- (t3dg_3(0,0,1)*t2_2(0,0)
+		   + t3dg_3(0,1,1)*t2_2(1,0)
+		   + t3dg_3(0,2,1)*t2_2(2,0))
+		,"T2(j,l)*T3dg(i,j,k)(0,1,0)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(0,1,1)
+		- (t3dg_3(0,0,1)*t2_2(0,1)
+		   + t3dg_3(0,1,1)*t2_2(1,1)
+		   + t3dg_3(0,2,1)*t2_2(2,1))
+		,"T2(j,l)*T3dg(i,j,k)(0,1,1)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(0,1,2)
+		- (t3dg_3(0,0,1)*t2_2(0,2)
+		   + t3dg_3(0,1,1)*t2_2(1,2)
+		   + t3dg_3(0,2,1)*t2_2(2,2))
+		,"T2(j,l)*T3dg(i,j,k)(0,1,2)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(0,2,0)
+		- (t3dg_3(0,0,2)*t2_2(0,0)
+		   + t3dg_3(0,1,2)*t2_2(1,0)
+		   + t3dg_3(0,2,2)*t2_2(2,0))
+		,"T2(j,l)*T3dg(i,j,k)(0,2,0)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(0,2,1)
+		- (t3dg_3(0,0,2)*t2_2(0,1)
+		   + t3dg_3(0,1,2)*t2_2(1,1)
+		   + t3dg_3(0,2,2)*t2_2(2,1))
+		,"T2(j,l)*T3dg(i,j,k)(0,2,1)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(0,2,2)
+		- (t3dg_3(0,0,2)*t2_2(0,2)
+		   + t3dg_3(0,1,2)*t2_2(1,2)
+		   + t3dg_3(0,2,2)*t2_2(2,2))
+		,"T2(j,l)*T3dg(i,j,k)(0,2,2)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(1,0,0)
+		- (t3dg_3(1,0,0)*t2_2(0,0)
+		   + t3dg_3(1,1,0)*t2_2(1,0)
+		   + t3dg_3(1,2,0)*t2_2(2,0))
+		,"T2(j,l)*T3dg(i,j,k)(1,0,0)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(1,0,1)
+		- (t3dg_3(1,0,0)*t2_2(0,1)
+		   + t3dg_3(1,1,0)*t2_2(1,1)
+		   + t3dg_3(1,2,0)*t2_2(2,1))
+		,"T2(j,l)*T3dg(i,j,k)(1,0,1)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(1,0,2)
+		- (t3dg_3(1,0,0)*t2_2(0,2)
+		   + t3dg_3(1,1,0)*t2_2(1,2)
+		   + t3dg_3(1,2,0)*t2_2(2,2))
+		,"T2(j,l)*T3dg(i,j,k)(1,0,2)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(1,1,0)
+		- (t3dg_3(1,0,1)*t2_2(0,0)
+		   + t3dg_3(1,1,1)*t2_2(1,0)
+		   + t3dg_3(1,2,1)*t2_2(2,0))
+		,"T2(j,l)*T3dg(i,j,k)(1,1,0)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(1,1,1)
+		- (t3dg_3(1,0,1)*t2_2(0,1)
+		   + t3dg_3(1,1,1)*t2_2(1,1)
+		   + t3dg_3(1,2,1)*t2_2(2,1))
+		,"T2(j,l)*T3dg(i,j,k)(1,1,1)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(1,1,2)
+		- (t3dg_3(1,0,1)*t2_2(0,2)
+		   + t3dg_3(1,1,1)*t2_2(1,2)
+		   + t3dg_3(1,2,1)*t2_2(2,2))
+		,"T2(j,l)*T3dg(i,j,k)(1,1,2)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(1,2,0)
+		- (t3dg_3(1,0,2)*t2_2(0,0)
+		   + t3dg_3(1,1,2)*t2_2(1,0)
+		   + t3dg_3(1,2,2)*t2_2(2,0))
+		,"T2(j,l)*T3dg(i,j,k)(1,2,0)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(1,2,1)
+		- (t3dg_3(1,0,2)*t2_2(0,1)
+		   + t3dg_3(1,1,2)*t2_2(1,1)
+		   + t3dg_3(1,2,2)*t2_2(2,1))
+		,"T2(j,l)*T3dg(i,j,k)(1,2,1)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(1,2,2)
+		- (t3dg_3(1,0,2)*t2_2(0,2)
+		   + t3dg_3(1,1,2)*t2_2(1,2)
+		   + t3dg_3(1,2,2)*t2_2(2,2))
+		,"T2(j,l)*T3dg(i,j,k)(1,2,2)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(2,0,0)
+		- (t3dg_3(2,0,0)*t2_2(0,0)
+		   + t3dg_3(2,1,0)*t2_2(1,0)
+		   + t3dg_3(2,2,0)*t2_2(2,0))
+		,"T2(j,l)*T3dg(i,j,k)(2,0,0)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(2,0,1)
+		- (t3dg_3(2,0,0)*t2_2(0,1)
+		   + t3dg_3(2,1,0)*t2_2(1,1)
+		   + t3dg_3(2,2,0)*t2_2(2,1))
+		,"T2(j,l)*T3dg(i,j,k)(2,0,1)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(2,0,2)
+		- (t3dg_3(2,0,0)*t2_2(0,2)
+		   + t3dg_3(2,1,0)*t2_2(1,2)
+		   + t3dg_3(2,2,0)*t2_2(2,2))
+		,"T2(j,l)*T3dg(i,j,k)(2,0,2)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(2,1,0)
+		- (t3dg_3(2,0,1)*t2_2(0,0)
+		   + t3dg_3(2,1,1)*t2_2(1,0)
+		   + t3dg_3(2,2,1)*t2_2(2,0))
+		,"T2(j,l)*T3dg(i,j,k)(2,1,0)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(2,1,1)
+		- (t3dg_3(2,0,1)*t2_2(0,1)
+		   + t3dg_3(2,1,1)*t2_2(1,1)
+		   + t3dg_3(2,2,1)*t2_2(2,1))
+		,"T2(j,l)*T3dg(i,j,k)(2,1,1)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(2,1,2)
+		- (t3dg_3(2,0,1)*t2_2(0,2)
+		   + t3dg_3(2,1,1)*t2_2(1,2)
+		   + t3dg_3(2,2,1)*t2_2(2,2))
+		,"T2(j,l)*T3dg(i,j,k)(2,1,2)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(2,2,0)
+		- (t3dg_3(2,0,2)*t2_2(0,0)
+		   + t3dg_3(2,1,2)*t2_2(1,0)
+		   + t3dg_3(2,2,2)*t2_2(2,0))
+		,"T2(j,l)*T3dg(i,j,k)(2,2,0)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(2,2,1)
+		- (t3dg_3(2,0,2)*t2_2(0,1)
+		   + t3dg_3(2,1,2)*t2_2(1,1)
+		   + t3dg_3(2,2,2)*t2_2(2,1))
+		,"T2(j,l)*T3dg(i,j,k)(2,2,1)");
+  test_for_zero((t2_2(j,l)*t3dg_3(i,j,k))(2,2,2)
+		- (t3dg_3(2,0,2)*t2_2(0,2)
+		   + t3dg_3(2,1,2)*t2_2(1,2)
+		   + t3dg_3(2,2,2)*t2_2(2,2))
+		,"T2(j,l)*T3dg(i,j,k)(2,2,2)");
+
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(0,0,0)
+		- (t3dg_3(0,0,0)*t2_2(0,0)
+		   + t3dg_3(0,1,0)*t2_2(0,1)
+		   + t3dg_3(0,2,0)*t2_2(0,2))
+		,"T2(l,j)*T3dg(i,j,k)(0,0,0)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(0,0,1)
+		- (t3dg_3(0,0,0)*t2_2(1,0)
+		   + t3dg_3(0,1,0)*t2_2(1,1)
+		   + t3dg_3(0,2,0)*t2_2(1,2))
+		,"T2(l,j)*T3dg(i,j,k)(0,0,1)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(0,0,2)
+		- (t3dg_3(0,0,0)*t2_2(2,0)
+		   + t3dg_3(0,1,0)*t2_2(2,1)
+		   + t3dg_3(0,2,0)*t2_2(2,2))
+		,"T2(l,j)*T3dg(i,j,k)(0,0,2)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(0,1,0)
+		- (t3dg_3(0,0,1)*t2_2(0,0)
+		   + t3dg_3(0,1,1)*t2_2(0,1)
+		   + t3dg_3(0,2,1)*t2_2(0,2))
+		,"T2(l,j)*T3dg(i,j,k)(0,1,0)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(0,1,1)
+		- (t3dg_3(0,0,1)*t2_2(1,0)
+		   + t3dg_3(0,1,1)*t2_2(1,1)
+		   + t3dg_3(0,2,1)*t2_2(1,2))
+		,"T2(l,j)*T3dg(i,j,k)(0,1,1)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(0,1,2)
+		- (t3dg_3(0,0,1)*t2_2(2,0)
+		   + t3dg_3(0,1,1)*t2_2(2,1)
+		   + t3dg_3(0,2,1)*t2_2(2,2))
+		,"T2(l,j)*T3dg(i,j,k)(0,1,2)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(0,2,0)
+		- (t3dg_3(0,0,2)*t2_2(0,0)
+		   + t3dg_3(0,1,2)*t2_2(0,1)
+		   + t3dg_3(0,2,2)*t2_2(0,2))
+		,"T2(l,j)*T3dg(i,j,k)(0,2,0)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(0,2,1)
+		- (t3dg_3(0,0,2)*t2_2(1,0)
+		   + t3dg_3(0,1,2)*t2_2(1,1)
+		   + t3dg_3(0,2,2)*t2_2(1,2))
+		,"T2(l,j)*T3dg(i,j,k)(0,2,1)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(0,2,2)
+		- (t3dg_3(0,0,2)*t2_2(2,0)
+		   + t3dg_3(0,1,2)*t2_2(2,1)
+		   + t3dg_3(0,2,2)*t2_2(2,2))
+		,"T2(l,j)*T3dg(i,j,k)(0,2,2)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(1,0,0)
+		- (t3dg_3(1,0,0)*t2_2(0,0)
+		   + t3dg_3(1,1,0)*t2_2(0,1)
+		   + t3dg_3(1,2,0)*t2_2(0,2))
+		,"T2(l,j)*T3dg(i,j,k)(1,0,0)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(1,0,1)
+		- (t3dg_3(1,0,0)*t2_2(1,0)
+		   + t3dg_3(1,1,0)*t2_2(1,1)
+		   + t3dg_3(1,2,0)*t2_2(1,2))
+		,"T2(l,j)*T3dg(i,j,k)(1,0,1)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(1,0,2)
+		- (t3dg_3(1,0,0)*t2_2(2,0)
+		   + t3dg_3(1,1,0)*t2_2(2,1)
+		   + t3dg_3(1,2,0)*t2_2(2,2))
+		,"T2(l,j)*T3dg(i,j,k)(1,0,2)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(1,1,0)
+		- (t3dg_3(1,0,1)*t2_2(0,0)
+		   + t3dg_3(1,1,1)*t2_2(0,1)
+		   + t3dg_3(1,2,1)*t2_2(0,2))
+		,"T2(l,j)*T3dg(i,j,k)(1,1,0)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(1,1,1)
+		- (t3dg_3(1,0,1)*t2_2(1,0)
+		   + t3dg_3(1,1,1)*t2_2(1,1)
+		   + t3dg_3(1,2,1)*t2_2(1,2))
+		,"T2(l,j)*T3dg(i,j,k)(1,1,1)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(1,1,2)
+		- (t3dg_3(1,0,1)*t2_2(2,0)
+		   + t3dg_3(1,1,1)*t2_2(2,1)
+		   + t3dg_3(1,2,1)*t2_2(2,2))
+		,"T2(l,j)*T3dg(i,j,k)(1,1,2)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(1,2,0)
+		- (t3dg_3(1,0,2)*t2_2(0,0)
+		   + t3dg_3(1,1,2)*t2_2(0,1)
+		   + t3dg_3(1,2,2)*t2_2(0,2))
+		,"T2(l,j)*T3dg(i,j,k)(1,2,0)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(1,2,1)
+		- (t3dg_3(1,0,2)*t2_2(1,0)
+		   + t3dg_3(1,1,2)*t2_2(1,1)
+		   + t3dg_3(1,2,2)*t2_2(1,2))
+		,"T2(l,j)*T3dg(i,j,k)(1,2,1)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(1,2,2)
+		- (t3dg_3(1,0,2)*t2_2(2,0)
+		   + t3dg_3(1,1,2)*t2_2(2,1)
+		   + t3dg_3(1,2,2)*t2_2(2,2))
+		,"T2(l,j)*T3dg(i,j,k)(1,2,2)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(2,0,0)
+		- (t3dg_3(2,0,0)*t2_2(0,0)
+		   + t3dg_3(2,1,0)*t2_2(0,1)
+		   + t3dg_3(2,2,0)*t2_2(0,2))
+		,"T2(l,j)*T3dg(i,j,k)(2,0,0)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(2,0,1)
+		- (t3dg_3(2,0,0)*t2_2(1,0)
+		   + t3dg_3(2,1,0)*t2_2(1,1)
+		   + t3dg_3(2,2,0)*t2_2(1,2))
+		,"T2(l,j)*T3dg(i,j,k)(2,0,1)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(2,0,2)
+		- (t3dg_3(2,0,0)*t2_2(2,0)
+		   + t3dg_3(2,1,0)*t2_2(2,1)
+		   + t3dg_3(2,2,0)*t2_2(2,2))
+		,"T2(l,j)*T3dg(i,j,k)(2,0,2)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(2,1,0)
+		- (t3dg_3(2,0,1)*t2_2(0,0)
+		   + t3dg_3(2,1,1)*t2_2(0,1)
+		   + t3dg_3(2,2,1)*t2_2(0,2))
+		,"T2(l,j)*T3dg(i,j,k)(2,1,0)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(2,1,1)
+		- (t3dg_3(2,0,1)*t2_2(1,0)
+		   + t3dg_3(2,1,1)*t2_2(1,1)
+		   + t3dg_3(2,2,1)*t2_2(1,2))
+		,"T2(l,j)*T3dg(i,j,k)(2,1,1)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(2,1,2)
+		- (t3dg_3(2,0,1)*t2_2(2,0)
+		   + t3dg_3(2,1,1)*t2_2(2,1)
+		   + t3dg_3(2,2,1)*t2_2(2,2))
+		,"T2(l,j)*T3dg(i,j,k)(2,1,2)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(2,2,0)
+		- (t3dg_3(2,0,2)*t2_2(0,0)
+		   + t3dg_3(2,1,2)*t2_2(0,1)
+		   + t3dg_3(2,2,2)*t2_2(0,2))
+		,"T2(l,j)*T3dg(i,j,k)(2,2,0)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(2,2,1)
+		- (t3dg_3(2,0,2)*t2_2(1,0)
+		   + t3dg_3(2,1,2)*t2_2(1,1)
+		   + t3dg_3(2,2,2)*t2_2(1,2))
+		,"T2(l,j)*T3dg(i,j,k)(2,2,1)");
+  test_for_zero((t2_2(l,j)*t3dg_3(i,j,k))(2,2,2)
+		- (t3dg_3(2,0,2)*t2_2(2,0)
+		   + t3dg_3(2,1,2)*t2_2(2,1)
+		   + t3dg_3(2,2,2)*t2_2(2,2))
+		,"T2(l,j)*T3dg(i,j,k)(2,2,2)");
+
+
+
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(0,0,0)
+		- (t3dg_2(0,0,0)*t2s_2(0,0)
+		   + t3dg_2(0,1,0)*t2s_2(1,0)
+		   + t3dg_2(0,2,0)*t2s_2(2,0))
+		,"T3dg(i,j,k)*T2s(j,l)(0,0,0)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(0,0,1)
+		- (t3dg_2(0,0,0)*t2s_2(0,1)
+		   + t3dg_2(0,1,0)*t2s_2(1,1)
+		   + t3dg_2(0,2,0)*t2s_2(2,1))
+		,"T3dg(i,j,k)*T2s(j,l)(0,0,1)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(0,0,2)
+		- (t3dg_2(0,0,0)*t2s_2(0,2)
+		   + t3dg_2(0,1,0)*t2s_2(1,2)
+		   + t3dg_2(0,2,0)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(j,l)(0,0,2)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(0,1,0)
+		- (t3dg_2(0,0,1)*t2s_2(0,0)
+		   + t3dg_2(0,1,1)*t2s_2(1,0)
+		   + t3dg_2(0,2,1)*t2s_2(2,0))
+		,"T3dg(i,j,k)*T2s(j,l)(0,1,0)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(0,1,1)
+		- (t3dg_2(0,0,1)*t2s_2(0,1)
+		   + t3dg_2(0,1,1)*t2s_2(1,1)
+		   + t3dg_2(0,2,1)*t2s_2(2,1))
+		,"T3dg(i,j,k)*T2s(j,l)(0,1,1)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(0,1,2)
+		- (t3dg_2(0,0,1)*t2s_2(0,2)
+		   + t3dg_2(0,1,1)*t2s_2(1,2)
+		   + t3dg_2(0,2,1)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(j,l)(0,1,2)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(0,2,0)
+		- (t3dg_2(0,0,2)*t2s_2(0,0)
+		   + t3dg_2(0,1,2)*t2s_2(1,0)
+		   + t3dg_2(0,2,2)*t2s_2(2,0))
+		,"T3dg(i,j,k)*T2s(j,l)(0,2,0)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(0,2,1)
+		- (t3dg_2(0,0,2)*t2s_2(0,1)
+		   + t3dg_2(0,1,2)*t2s_2(1,1)
+		   + t3dg_2(0,2,2)*t2s_2(2,1))
+		,"T3dg(i,j,k)*T2s(j,l)(0,2,1)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(0,2,2)
+		- (t3dg_2(0,0,2)*t2s_2(0,2)
+		   + t3dg_2(0,1,2)*t2s_2(1,2)
+		   + t3dg_2(0,2,2)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(j,l)(0,2,2)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(1,0,0)
+		- (t3dg_2(1,0,0)*t2s_2(0,0)
+		   + t3dg_2(1,1,0)*t2s_2(1,0)
+		   + t3dg_2(1,2,0)*t2s_2(2,0))
+		,"T3dg(i,j,k)*T2s(j,l)(1,0,0)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(1,0,1)
+		- (t3dg_2(1,0,0)*t2s_2(0,1)
+		   + t3dg_2(1,1,0)*t2s_2(1,1)
+		   + t3dg_2(1,2,0)*t2s_2(2,1))
+		,"T3dg(i,j,k)*T2s(j,l)(1,0,1)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(1,0,2)
+		- (t3dg_2(1,0,0)*t2s_2(0,2)
+		   + t3dg_2(1,1,0)*t2s_2(1,2)
+		   + t3dg_2(1,2,0)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(j,l)(1,0,2)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(1,1,0)
+		- (t3dg_2(1,0,1)*t2s_2(0,0)
+		   + t3dg_2(1,1,1)*t2s_2(1,0)
+		   + t3dg_2(1,2,1)*t2s_2(2,0))
+		,"T3dg(i,j,k)*T2s(j,l)(1,1,0)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(1,1,1)
+		- (t3dg_2(1,0,1)*t2s_2(0,1)
+		   + t3dg_2(1,1,1)*t2s_2(1,1)
+		   + t3dg_2(1,2,1)*t2s_2(2,1))
+		,"T3dg(i,j,k)*T2s(j,l)(1,1,1)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(1,1,2)
+		- (t3dg_2(1,0,1)*t2s_2(0,2)
+		   + t3dg_2(1,1,1)*t2s_2(1,2)
+		   + t3dg_2(1,2,1)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(j,l)(1,1,2)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(1,2,0)
+		- (t3dg_2(1,0,2)*t2s_2(0,0)
+		   + t3dg_2(1,1,2)*t2s_2(1,0)
+		   + t3dg_2(1,2,2)*t2s_2(2,0))
+		,"T3dg(i,j,k)*T2s(j,l)(1,2,0)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(1,2,1)
+		- (t3dg_2(1,0,2)*t2s_2(0,1)
+		   + t3dg_2(1,1,2)*t2s_2(1,1)
+		   + t3dg_2(1,2,2)*t2s_2(2,1))
+		,"T3dg(i,j,k)*T2s(j,l)(1,2,1)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(1,2,2)
+		- (t3dg_2(1,0,2)*t2s_2(0,2)
+		   + t3dg_2(1,1,2)*t2s_2(1,2)
+		   + t3dg_2(1,2,2)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(j,l)(1,2,2)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(2,0,0)
+		- (t3dg_2(2,0,0)*t2s_2(0,0)
+		   + t3dg_2(2,1,0)*t2s_2(1,0)
+		   + t3dg_2(2,2,0)*t2s_2(2,0))
+		,"T3dg(i,j,k)*T2s(j,l)(2,0,0)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(2,0,1)
+		- (t3dg_2(2,0,0)*t2s_2(0,1)
+		   + t3dg_2(2,1,0)*t2s_2(1,1)
+		   + t3dg_2(2,2,0)*t2s_2(2,1))
+		,"T3dg(i,j,k)*T2s(j,l)(2,0,1)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(2,0,2)
+		- (t3dg_2(2,0,0)*t2s_2(0,2)
+		   + t3dg_2(2,1,0)*t2s_2(1,2)
+		   + t3dg_2(2,2,0)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(j,l)(2,0,2)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(2,1,0)
+		- (t3dg_2(2,0,1)*t2s_2(0,0)
+		   + t3dg_2(2,1,1)*t2s_2(1,0)
+		   + t3dg_2(2,2,1)*t2s_2(2,0))
+		,"T3dg(i,j,k)*T2s(j,l)(2,1,0)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(2,1,1)
+		- (t3dg_2(2,0,1)*t2s_2(0,1)
+		   + t3dg_2(2,1,1)*t2s_2(1,1)
+		   + t3dg_2(2,2,1)*t2s_2(2,1))
+		,"T3dg(i,j,k)*T2s(j,l)(2,1,1)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(2,1,2)
+		- (t3dg_2(2,0,1)*t2s_2(0,2)
+		   + t3dg_2(2,1,1)*t2s_2(1,2)
+		   + t3dg_2(2,2,1)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(j,l)(2,1,2)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(2,2,0)
+		- (t3dg_2(2,0,2)*t2s_2(0,0)
+		   + t3dg_2(2,1,2)*t2s_2(1,0)
+		   + t3dg_2(2,2,2)*t2s_2(2,0))
+		,"T3dg(i,j,k)*T2s(j,l)(2,2,0)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(2,2,1)
+		- (t3dg_2(2,0,2)*t2s_2(0,1)
+		   + t3dg_2(2,1,2)*t2s_2(1,1)
+		   + t3dg_2(2,2,2)*t2s_2(2,1))
+		,"T3dg(i,j,k)*T2s(j,l)(2,2,1)");
+  test_for_zero((t3dg_2(i,j,k)*t2s_2(j,l))(2,2,2)
+		- (t3dg_2(2,0,2)*t2s_2(0,2)
+		   + t3dg_2(2,1,2)*t2s_2(1,2)
+		   + t3dg_2(2,2,2)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(j,l)(2,2,2)");
+
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(0,0,0)
+		- (t3dg_3(0,0,0)*t2s_2(0,0)
+		   + t3dg_3(0,1,0)*t2s_2(0,1)
+		   + t3dg_3(0,2,0)*t2s_2(0,2))
+		,"T3dg(i,j,k)*T2s(l,j)(0,0,0)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(0,0,1)
+		- (t3dg_3(0,0,0)*t2s_2(1,0)
+		   + t3dg_3(0,1,0)*t2s_2(1,1)
+		   + t3dg_3(0,2,0)*t2s_2(1,2))
+		,"T3dg(i,j,k)*T2s(l,j)(0,0,1)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(0,0,2)
+		- (t3dg_3(0,0,0)*t2s_2(2,0)
+		   + t3dg_3(0,1,0)*t2s_2(2,1)
+		   + t3dg_3(0,2,0)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(l,j)(0,0,2)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(0,1,0)
+		- (t3dg_3(0,0,1)*t2s_2(0,0)
+		   + t3dg_3(0,1,1)*t2s_2(0,1)
+		   + t3dg_3(0,2,1)*t2s_2(0,2))
+		,"T3dg(i,j,k)*T2s(l,j)(0,1,0)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(0,1,1)
+		- (t3dg_3(0,0,1)*t2s_2(1,0)
+		   + t3dg_3(0,1,1)*t2s_2(1,1)
+		   + t3dg_3(0,2,1)*t2s_2(1,2))
+		,"T3dg(i,j,k)*T2s(l,j)(0,1,1)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(0,1,2)
+		- (t3dg_3(0,0,1)*t2s_2(2,0)
+		   + t3dg_3(0,1,1)*t2s_2(2,1)
+		   + t3dg_3(0,2,1)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(l,j)(0,1,2)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(0,2,0)
+		- (t3dg_3(0,0,2)*t2s_2(0,0)
+		   + t3dg_3(0,1,2)*t2s_2(0,1)
+		   + t3dg_3(0,2,2)*t2s_2(0,2))
+		,"T3dg(i,j,k)*T2s(l,j)(0,2,0)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(0,2,1)
+		- (t3dg_3(0,0,2)*t2s_2(1,0)
+		   + t3dg_3(0,1,2)*t2s_2(1,1)
+		   + t3dg_3(0,2,2)*t2s_2(1,2))
+		,"T3dg(i,j,k)*T2s(l,j)(0,2,1)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(0,2,2)
+		- (t3dg_3(0,0,2)*t2s_2(2,0)
+		   + t3dg_3(0,1,2)*t2s_2(2,1)
+		   + t3dg_3(0,2,2)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(l,j)(0,2,2)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(1,0,0)
+		- (t3dg_3(1,0,0)*t2s_2(0,0)
+		   + t3dg_3(1,1,0)*t2s_2(0,1)
+		   + t3dg_3(1,2,0)*t2s_2(0,2))
+		,"T3dg(i,j,k)*T2s(l,j)(1,0,0)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(1,0,1)
+		- (t3dg_3(1,0,0)*t2s_2(1,0)
+		   + t3dg_3(1,1,0)*t2s_2(1,1)
+		   + t3dg_3(1,2,0)*t2s_2(1,2))
+		,"T3dg(i,j,k)*T2s(l,j)(1,0,1)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(1,0,2)
+		- (t3dg_3(1,0,0)*t2s_2(2,0)
+		   + t3dg_3(1,1,0)*t2s_2(2,1)
+		   + t3dg_3(1,2,0)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(l,j)(1,0,2)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(1,1,0)
+		- (t3dg_3(1,0,1)*t2s_2(0,0)
+		   + t3dg_3(1,1,1)*t2s_2(0,1)
+		   + t3dg_3(1,2,1)*t2s_2(0,2))
+		,"T3dg(i,j,k)*T2s(l,j)(1,1,0)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(1,1,1)
+		- (t3dg_3(1,0,1)*t2s_2(1,0)
+		   + t3dg_3(1,1,1)*t2s_2(1,1)
+		   + t3dg_3(1,2,1)*t2s_2(1,2))
+		,"T3dg(i,j,k)*T2s(l,j)(1,1,1)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(1,1,2)
+		- (t3dg_3(1,0,1)*t2s_2(2,0)
+		   + t3dg_3(1,1,1)*t2s_2(2,1)
+		   + t3dg_3(1,2,1)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(l,j)(1,1,2)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(1,2,0)
+		- (t3dg_3(1,0,2)*t2s_2(0,0)
+		   + t3dg_3(1,1,2)*t2s_2(0,1)
+		   + t3dg_3(1,2,2)*t2s_2(0,2))
+		,"T3dg(i,j,k)*T2s(l,j)(1,2,0)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(1,2,1)
+		- (t3dg_3(1,0,2)*t2s_2(1,0)
+		   + t3dg_3(1,1,2)*t2s_2(1,1)
+		   + t3dg_3(1,2,2)*t2s_2(1,2))
+		,"T3dg(i,j,k)*T2s(l,j)(1,2,1)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(1,2,2)
+		- (t3dg_3(1,0,2)*t2s_2(2,0)
+		   + t3dg_3(1,1,2)*t2s_2(2,1)
+		   + t3dg_3(1,2,2)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(l,j)(1,2,2)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(2,0,0)
+		- (t3dg_3(2,0,0)*t2s_2(0,0)
+		   + t3dg_3(2,1,0)*t2s_2(0,1)
+		   + t3dg_3(2,2,0)*t2s_2(0,2))
+		,"T3dg(i,j,k)*T2s(l,j)(2,0,0)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(2,0,1)
+		- (t3dg_3(2,0,0)*t2s_2(1,0)
+		   + t3dg_3(2,1,0)*t2s_2(1,1)
+		   + t3dg_3(2,2,0)*t2s_2(1,2))
+		,"T3dg(i,j,k)*T2s(l,j)(2,0,1)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(2,0,2)
+		- (t3dg_3(2,0,0)*t2s_2(2,0)
+		   + t3dg_3(2,1,0)*t2s_2(2,1)
+		   + t3dg_3(2,2,0)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(l,j)(2,0,2)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(2,1,0)
+		- (t3dg_3(2,0,1)*t2s_2(0,0)
+		   + t3dg_3(2,1,1)*t2s_2(0,1)
+		   + t3dg_3(2,2,1)*t2s_2(0,2))
+		,"T3dg(i,j,k)*T2s(l,j)(2,1,0)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(2,1,1)
+		- (t3dg_3(2,0,1)*t2s_2(1,0)
+		   + t3dg_3(2,1,1)*t2s_2(1,1)
+		   + t3dg_3(2,2,1)*t2s_2(1,2))
+		,"T3dg(i,j,k)*T2s(l,j)(2,1,1)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(2,1,2)
+		- (t3dg_3(2,0,1)*t2s_2(2,0)
+		   + t3dg_3(2,1,1)*t2s_2(2,1)
+		   + t3dg_3(2,2,1)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(l,j)(2,1,2)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(2,2,0)
+		- (t3dg_3(2,0,2)*t2s_2(0,0)
+		   + t3dg_3(2,1,2)*t2s_2(0,1)
+		   + t3dg_3(2,2,2)*t2s_2(0,2))
+		,"T3dg(i,j,k)*T2s(l,j)(2,2,0)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(2,2,1)
+		- (t3dg_3(2,0,2)*t2s_2(1,0)
+		   + t3dg_3(2,1,2)*t2s_2(1,1)
+		   + t3dg_3(2,2,2)*t2s_2(1,2))
+		,"T3dg(i,j,k)*T2s(l,j)(2,2,1)");
+  test_for_zero((t3dg_3(i,j,k)*t2s_2(l,j))(2,2,2)
+		- (t3dg_3(2,0,2)*t2s_2(2,0)
+		   + t3dg_3(2,1,2)*t2s_2(2,1)
+		   + t3dg_3(2,2,2)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(l,j)(2,2,2)");
+
+
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(0,0,0)
+		- (t3dg_3(0,0,0)*t2s_2(0,0)
+		   + t3dg_3(0,1,0)*t2s_2(1,0)
+		   + t3dg_3(0,2,0)*t2s_2(2,0))
+		,"T2s(j,l)*T3dg(i,j,k)(0,0,0)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(0,0,1)
+		- (t3dg_3(0,0,0)*t2s_2(0,1)
+		   + t3dg_3(0,1,0)*t2s_2(1,1)
+		   + t3dg_3(0,2,0)*t2s_2(2,1))
+		,"T2s(j,l)*T3dg(i,j,k)(0,0,1)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(0,0,2)
+		- (t3dg_3(0,0,0)*t2s_2(0,2)
+		   + t3dg_3(0,1,0)*t2s_2(1,2)
+		   + t3dg_3(0,2,0)*t2s_2(2,2))
+		,"T2s(j,l)*T3dg(i,j,k)(0,0,2)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(0,1,0)
+		- (t3dg_3(0,0,1)*t2s_2(0,0)
+		   + t3dg_3(0,1,1)*t2s_2(1,0)
+		   + t3dg_3(0,2,1)*t2s_2(2,0))
+		,"T2s(j,l)*T3dg(i,j,k)(0,1,0)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(0,1,1)
+		- (t3dg_3(0,0,1)*t2s_2(0,1)
+		   + t3dg_3(0,1,1)*t2s_2(1,1)
+		   + t3dg_3(0,2,1)*t2s_2(2,1))
+		,"T2s(j,l)*T3dg(i,j,k)(0,1,1)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(0,1,2)
+		- (t3dg_3(0,0,1)*t2s_2(0,2)
+		   + t3dg_3(0,1,1)*t2s_2(1,2)
+		   + t3dg_3(0,2,1)*t2s_2(2,2))
+		,"T2s(j,l)*T3dg(i,j,k)(0,1,2)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(0,2,0)
+		- (t3dg_3(0,0,2)*t2s_2(0,0)
+		   + t3dg_3(0,1,2)*t2s_2(1,0)
+		   + t3dg_3(0,2,2)*t2s_2(2,0))
+		,"T2s(j,l)*T3dg(i,j,k)(0,2,0)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(0,2,1)
+		- (t3dg_3(0,0,2)*t2s_2(0,1)
+		   + t3dg_3(0,1,2)*t2s_2(1,1)
+		   + t3dg_3(0,2,2)*t2s_2(2,1))
+		,"T2s(j,l)*T3dg(i,j,k)(0,2,1)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(0,2,2)
+		- (t3dg_3(0,0,2)*t2s_2(0,2)
+		   + t3dg_3(0,1,2)*t2s_2(1,2)
+		   + t3dg_3(0,2,2)*t2s_2(2,2))
+		,"T2s(j,l)*T3dg(i,j,k)(0,2,2)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(1,0,0)
+		- (t3dg_3(1,0,0)*t2s_2(0,0)
+		   + t3dg_3(1,1,0)*t2s_2(1,0)
+		   + t3dg_3(1,2,0)*t2s_2(2,0))
+		,"T2s(j,l)*T3dg(i,j,k)(1,0,0)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(1,0,1)
+		- (t3dg_3(1,0,0)*t2s_2(0,1)
+		   + t3dg_3(1,1,0)*t2s_2(1,1)
+		   + t3dg_3(1,2,0)*t2s_2(2,1))
+		,"T2s(j,l)*T3dg(i,j,k)(1,0,1)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(1,0,2)
+		- (t3dg_3(1,0,0)*t2s_2(0,2)
+		   + t3dg_3(1,1,0)*t2s_2(1,2)
+		   + t3dg_3(1,2,0)*t2s_2(2,2))
+		,"T2s(j,l)*T3dg(i,j,k)(1,0,2)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(1,1,0)
+		- (t3dg_3(1,0,1)*t2s_2(0,0)
+		   + t3dg_3(1,1,1)*t2s_2(1,0)
+		   + t3dg_3(1,2,1)*t2s_2(2,0))
+		,"T2s(j,l)*T3dg(i,j,k)(1,1,0)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(1,1,1)
+		- (t3dg_3(1,0,1)*t2s_2(0,1)
+		   + t3dg_3(1,1,1)*t2s_2(1,1)
+		   + t3dg_3(1,2,1)*t2s_2(2,1))
+		,"T2s(j,l)*T3dg(i,j,k)(1,1,1)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(1,1,2)
+		- (t3dg_3(1,0,1)*t2s_2(0,2)
+		   + t3dg_3(1,1,1)*t2s_2(1,2)
+		   + t3dg_3(1,2,1)*t2s_2(2,2))
+		,"T2s(j,l)*T3dg(i,j,k)(1,1,2)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(1,2,0)
+		- (t3dg_3(1,0,2)*t2s_2(0,0)
+		   + t3dg_3(1,1,2)*t2s_2(1,0)
+		   + t3dg_3(1,2,2)*t2s_2(2,0))
+		,"T2s(j,l)*T3dg(i,j,k)(1,2,0)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(1,2,1)
+		- (t3dg_3(1,0,2)*t2s_2(0,1)
+		   + t3dg_3(1,1,2)*t2s_2(1,1)
+		   + t3dg_3(1,2,2)*t2s_2(2,1))
+		,"T2s(j,l)*T3dg(i,j,k)(1,2,1)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(1,2,2)
+		- (t3dg_3(1,0,2)*t2s_2(0,2)
+		   + t3dg_3(1,1,2)*t2s_2(1,2)
+		   + t3dg_3(1,2,2)*t2s_2(2,2))
+		,"T2s(j,l)*T3dg(i,j,k)(1,2,2)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(2,0,0)
+		- (t3dg_3(2,0,0)*t2s_2(0,0)
+		   + t3dg_3(2,1,0)*t2s_2(1,0)
+		   + t3dg_3(2,2,0)*t2s_2(2,0))
+		,"T2s(j,l)*T3dg(i,j,k)(2,0,0)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(2,0,1)
+		- (t3dg_3(2,0,0)*t2s_2(0,1)
+		   + t3dg_3(2,1,0)*t2s_2(1,1)
+		   + t3dg_3(2,2,0)*t2s_2(2,1))
+		,"T2s(j,l)*T3dg(i,j,k)(2,0,1)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(2,0,2)
+		- (t3dg_3(2,0,0)*t2s_2(0,2)
+		   + t3dg_3(2,1,0)*t2s_2(1,2)
+		   + t3dg_3(2,2,0)*t2s_2(2,2))
+		,"T2s(j,l)*T3dg(i,j,k)(2,0,2)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(2,1,0)
+		- (t3dg_3(2,0,1)*t2s_2(0,0)
+		   + t3dg_3(2,1,1)*t2s_2(1,0)
+		   + t3dg_3(2,2,1)*t2s_2(2,0))
+		,"T2s(j,l)*T3dg(i,j,k)(2,1,0)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(2,1,1)
+		- (t3dg_3(2,0,1)*t2s_2(0,1)
+		   + t3dg_3(2,1,1)*t2s_2(1,1)
+		   + t3dg_3(2,2,1)*t2s_2(2,1))
+		,"T2s(j,l)*T3dg(i,j,k)(2,1,1)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(2,1,2)
+		- (t3dg_3(2,0,1)*t2s_2(0,2)
+		   + t3dg_3(2,1,1)*t2s_2(1,2)
+		   + t3dg_3(2,2,1)*t2s_2(2,2))
+		,"T2s(j,l)*T3dg(i,j,k)(2,1,2)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(2,2,0)
+		- (t3dg_3(2,0,2)*t2s_2(0,0)
+		   + t3dg_3(2,1,2)*t2s_2(1,0)
+		   + t3dg_3(2,2,2)*t2s_2(2,0))
+		,"T2s(j,l)*T3dg(i,j,k)(2,2,0)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(2,2,1)
+		- (t3dg_3(2,0,2)*t2s_2(0,1)
+		   + t3dg_3(2,1,2)*t2s_2(1,1)
+		   + t3dg_3(2,2,2)*t2s_2(2,1))
+		,"T2s(j,l)*T3dg(i,j,k)(2,2,1)");
+  test_for_zero((t2s_2(j,l)*t3dg_3(i,j,k))(2,2,2)
+		- (t3dg_3(2,0,2)*t2s_2(0,2)
+		   + t3dg_3(2,1,2)*t2s_2(1,2)
+		   + t3dg_3(2,2,2)*t2s_2(2,2))
+		,"T2s(j,l)*T3dg(i,j,k)(2,2,2)");
+
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(0,0,0)
+		- (t3dg_3(0,0,0)*t2s_2(0,0)
+		   + t3dg_3(0,1,0)*t2s_2(0,1)
+		   + t3dg_3(0,2,0)*t2s_2(0,2))
+		,"T2s(l,j)*T3dg(i,j,k)(0,0,0)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(0,0,1)
+		- (t3dg_3(0,0,0)*t2s_2(1,0)
+		   + t3dg_3(0,1,0)*t2s_2(1,1)
+		   + t3dg_3(0,2,0)*t2s_2(1,2))
+		,"T2s(l,j)*T3dg(i,j,k)(0,0,1)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(0,0,2)
+		- (t3dg_3(0,0,0)*t2s_2(2,0)
+		   + t3dg_3(0,1,0)*t2s_2(2,1)
+		   + t3dg_3(0,2,0)*t2s_2(2,2))
+		,"T2s(l,j)*T3dg(i,j,k)(0,0,2)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(0,1,0)
+		- (t3dg_3(0,0,1)*t2s_2(0,0)
+		   + t3dg_3(0,1,1)*t2s_2(0,1)
+		   + t3dg_3(0,2,1)*t2s_2(0,2))
+		,"T2s(l,j)*T3dg(i,j,k)(0,1,0)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(0,1,1)
+		- (t3dg_3(0,0,1)*t2s_2(1,0)
+		   + t3dg_3(0,1,1)*t2s_2(1,1)
+		   + t3dg_3(0,2,1)*t2s_2(1,2))
+		,"T2s(l,j)*T3dg(i,j,k)(0,1,1)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(0,1,2)
+		- (t3dg_3(0,0,1)*t2s_2(2,0)
+		   + t3dg_3(0,1,1)*t2s_2(2,1)
+		   + t3dg_3(0,2,1)*t2s_2(2,2))
+		,"T2s(l,j)*T3dg(i,j,k)(0,1,2)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(0,2,0)
+		- (t3dg_3(0,0,2)*t2s_2(0,0)
+		   + t3dg_3(0,1,2)*t2s_2(0,1)
+		   + t3dg_3(0,2,2)*t2s_2(0,2))
+		,"T2s(l,j)*T3dg(i,j,k)(0,2,0)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(0,2,1)
+		- (t3dg_3(0,0,2)*t2s_2(1,0)
+		   + t3dg_3(0,1,2)*t2s_2(1,1)
+		   + t3dg_3(0,2,2)*t2s_2(1,2))
+		,"T2s(l,j)*T3dg(i,j,k)(0,2,1)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(0,2,2)
+		- (t3dg_3(0,0,2)*t2s_2(2,0)
+		   + t3dg_3(0,1,2)*t2s_2(2,1)
+		   + t3dg_3(0,2,2)*t2s_2(2,2))
+		,"T2s(l,j)*T3dg(i,j,k)(0,2,2)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(1,0,0)
+		- (t3dg_3(1,0,0)*t2s_2(0,0)
+		   + t3dg_3(1,1,0)*t2s_2(0,1)
+		   + t3dg_3(1,2,0)*t2s_2(0,2))
+		,"T2s(l,j)*T3dg(i,j,k)(1,0,0)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(1,0,1)
+		- (t3dg_3(1,0,0)*t2s_2(1,0)
+		   + t3dg_3(1,1,0)*t2s_2(1,1)
+		   + t3dg_3(1,2,0)*t2s_2(1,2))
+		,"T2s(l,j)*T3dg(i,j,k)(1,0,1)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(1,0,2)
+		- (t3dg_3(1,0,0)*t2s_2(2,0)
+		   + t3dg_3(1,1,0)*t2s_2(2,1)
+		   + t3dg_3(1,2,0)*t2s_2(2,2))
+		,"T2s(l,j)*T3dg(i,j,k)(1,0,2)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(1,1,0)
+		- (t3dg_3(1,0,1)*t2s_2(0,0)
+		   + t3dg_3(1,1,1)*t2s_2(0,1)
+		   + t3dg_3(1,2,1)*t2s_2(0,2))
+		,"T2s(l,j)*T3dg(i,j,k)(1,1,0)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(1,1,1)
+		- (t3dg_3(1,0,1)*t2s_2(1,0)
+		   + t3dg_3(1,1,1)*t2s_2(1,1)
+		   + t3dg_3(1,2,1)*t2s_2(1,2))
+		,"T2s(l,j)*T3dg(i,j,k)(1,1,1)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(1,1,2)
+		- (t3dg_3(1,0,1)*t2s_2(2,0)
+		   + t3dg_3(1,1,1)*t2s_2(2,1)
+		   + t3dg_3(1,2,1)*t2s_2(2,2))
+		,"T2s(l,j)*T3dg(i,j,k)(1,1,2)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(1,2,0)
+		- (t3dg_3(1,0,2)*t2s_2(0,0)
+		   + t3dg_3(1,1,2)*t2s_2(0,1)
+		   + t3dg_3(1,2,2)*t2s_2(0,2))
+		,"T2s(l,j)*T3dg(i,j,k)(1,2,0)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(1,2,1)
+		- (t3dg_3(1,0,2)*t2s_2(1,0)
+		   + t3dg_3(1,1,2)*t2s_2(1,1)
+		   + t3dg_3(1,2,2)*t2s_2(1,2))
+		,"T2s(l,j)*T3dg(i,j,k)(1,2,1)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(1,2,2)
+		- (t3dg_3(1,0,2)*t2s_2(2,0)
+		   + t3dg_3(1,1,2)*t2s_2(2,1)
+		   + t3dg_3(1,2,2)*t2s_2(2,2))
+		,"T2s(l,j)*T3dg(i,j,k)(1,2,2)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(2,0,0)
+		- (t3dg_3(2,0,0)*t2s_2(0,0)
+		   + t3dg_3(2,1,0)*t2s_2(0,1)
+		   + t3dg_3(2,2,0)*t2s_2(0,2))
+		,"T2s(l,j)*T3dg(i,j,k)(2,0,0)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(2,0,1)
+		- (t3dg_3(2,0,0)*t2s_2(1,0)
+		   + t3dg_3(2,1,0)*t2s_2(1,1)
+		   + t3dg_3(2,2,0)*t2s_2(1,2))
+		,"T2s(l,j)*T3dg(i,j,k)(2,0,1)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(2,0,2)
+		- (t3dg_3(2,0,0)*t2s_2(2,0)
+		   + t3dg_3(2,1,0)*t2s_2(2,1)
+		   + t3dg_3(2,2,0)*t2s_2(2,2))
+		,"T2s(l,j)*T3dg(i,j,k)(2,0,2)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(2,1,0)
+		- (t3dg_3(2,0,1)*t2s_2(0,0)
+		   + t3dg_3(2,1,1)*t2s_2(0,1)
+		   + t3dg_3(2,2,1)*t2s_2(0,2))
+		,"T2s(l,j)*T3dg(i,j,k)(2,1,0)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(2,1,1)
+		- (t3dg_3(2,0,1)*t2s_2(1,0)
+		   + t3dg_3(2,1,1)*t2s_2(1,1)
+		   + t3dg_3(2,2,1)*t2s_2(1,2))
+		,"T2s(l,j)*T3dg(i,j,k)(2,1,1)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(2,1,2)
+		- (t3dg_3(2,0,1)*t2s_2(2,0)
+		   + t3dg_3(2,1,1)*t2s_2(2,1)
+		   + t3dg_3(2,2,1)*t2s_2(2,2))
+		,"T2s(l,j)*T3dg(i,j,k)(2,1,2)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(2,2,0)
+		- (t3dg_3(2,0,2)*t2s_2(0,0)
+		   + t3dg_3(2,1,2)*t2s_2(0,1)
+		   + t3dg_3(2,2,2)*t2s_2(0,2))
+		,"T2s(l,j)*T3dg(i,j,k)(2,2,0)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(2,2,1)
+		- (t3dg_3(2,0,2)*t2s_2(1,0)
+		   + t3dg_3(2,1,2)*t2s_2(1,1)
+		   + t3dg_3(2,2,2)*t2s_2(1,2))
+		,"T2s(l,j)*T3dg(i,j,k)(2,2,1)");
+  test_for_zero((t2s_2(l,j)*t3dg_3(i,j,k))(2,2,2)
+		- (t3dg_3(2,0,2)*t2s_2(2,0)
+		   + t3dg_3(2,1,2)*t2s_2(2,1)
+		   + t3dg_3(2,2,2)*t2s_2(2,2))
+		,"T2s(l,j)*T3dg(i,j,k)(2,2,2)");
+  cout << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgI.C
--- a/tests/conformance/T3dg/test_T3dgI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t1_1(i)=t3dg_2(i,j,j);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0) + t3dg_2(0,1,1) + t3dg_2(0,2,2))
-		,"T3dg(i,j,j)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(1,0,0) + t3dg_2(1,1,1) + t3dg_2(1,2,2))
-		,"T3dg(i,j,j)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(2,0,0) + t3dg_2(2,1,1) + t3dg_2(2,2,2))
-		,"T3dg(i,j,j)(2)");
-  t1_1(i)=t3dg_2(j,i,j);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0) + t3dg_2(1,0,1) + t3dg_2(2,0,2))
-		,"T3dg(j,i,j)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(0,1,0) + t3dg_2(1,1,1) + t3dg_2(2,1,2))
-		,"T3dg(j,i,j)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(0,2,0) + t3dg_2(1,2,1) + t3dg_2(2,2,2))
-		,"T3dg(j,i,j)(2)");
-  t1_1(i)=t3dg_2(j,j,i);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0) + t3dg_2(1,1,0) + t3dg_2(2,2,0))
-		,"T3dg(j,j,i)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(0,0,1) + t3dg_2(1,1,1) + t3dg_2(2,2,1))
-		,"T3dg(j,j,i)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(0,0,2) + t3dg_2(1,1,2) + t3dg_2(2,2,2))
-		,"T3dg(j,j,i)(2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,56 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t1_1(i)=t3dg_2(i,j,j);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0) + t3dg_2(0,1,1) + t3dg_2(0,2,2))
+		,"T3dg(i,j,j)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(1,0,0) + t3dg_2(1,1,1) + t3dg_2(1,2,2))
+		,"T3dg(i,j,j)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(2,0,0) + t3dg_2(2,1,1) + t3dg_2(2,2,2))
+		,"T3dg(i,j,j)(2)");
+  t1_1(i)=t3dg_2(j,i,j);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0) + t3dg_2(1,0,1) + t3dg_2(2,0,2))
+		,"T3dg(j,i,j)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(0,1,0) + t3dg_2(1,1,1) + t3dg_2(2,1,2))
+		,"T3dg(j,i,j)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(0,2,0) + t3dg_2(1,2,1) + t3dg_2(2,2,2))
+		,"T3dg(j,i,j)(2)");
+  t1_1(i)=t3dg_2(j,j,i);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0) + t3dg_2(1,1,0) + t3dg_2(2,2,0))
+		,"T3dg(j,j,i)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(0,0,1) + t3dg_2(1,1,1) + t3dg_2(2,2,1))
+		,"T3dg(j,j,i)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(0,0,2) + t3dg_2(1,1,2) + t3dg_2(2,2,2))
+		,"T3dg(j,j,i)(2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgII.C
--- a/tests/conformance/T3dg/test_T3dgII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-
-  /* First Number<> tests */
-
-  t3dg_1(i,j,N0)=t2s_1(i,j);
-  t3dg_1(i,j,N1)=t2s_2(i,j);
-  t3dg_1(i,j,N2)=t2s_3(i,j);
-  test_for_zero(t3dg_1(0,0,0)-t2s_1(0,0)
-		,"T3dg(i,j,N)=T2s(i,j)(0,0,0)");
-  test_for_zero(t3dg_1(0,1,0)-t2s_1(0,1)
-		,"T3dg(i,j,N)=T2s(i,j)(0,1,0)");
-  test_for_zero(t3dg_1(0,2,0)-t2s_1(0,2)
-		,"T3dg(i,j,N)=T2s(i,j)(0,2,0)");
-  test_for_zero(t3dg_1(1,1,0)-t2s_1(1,1)
-		,"T3dg(i,j,N)=T2s(i,j)(1,1,0)");
-  test_for_zero(t3dg_1(1,2,0)-t2s_1(1,2)
-		,"T3dg(i,j,N)=T2s(i,j)(1,2,0)");
-  test_for_zero(t3dg_1(2,2,0)-t2s_1(2,2)
-		,"T3dg(i,j,N)=T2s(i,j)(2,2,0)");
-  test_for_zero(t3dg_1(0,0,1)-t2s_2(0,0)
-		,"T3dg(i,j,N)=T2s(i,j)(0,0,1)");
-  test_for_zero(t3dg_1(0,1,1)-t2s_2(0,1)
-		,"T3dg(i,j,N)=T2s(i,j)(0,1,1)");
-  test_for_zero(t3dg_1(0,2,1)-t2s_2(0,2)
-		,"T3dg(i,j,N)=T2s(i,j)(0,2,1)");
-  test_for_zero(t3dg_1(1,1,1)-t2s_2(1,1)
-		,"T3dg(i,j,N)=T2s(i,j)(1,1,1)");
-  test_for_zero(t3dg_1(1,2,1)-t2s_2(1,2)
-		,"T3dg(i,j,N)=T2s(i,j)(1,2,1)");
-  test_for_zero(t3dg_1(2,2,1)-t2s_2(2,2)
-		,"T3dg(i,j,N)=T2s(i,j)(2,2,1)");
-  test_for_zero(t3dg_1(0,0,2)-t2s_3(0,0)
-		,"T3dg(i,j,N)=T2s(i,j)(0,0,2)");
-  test_for_zero(t3dg_1(0,1,2)-t2s_3(0,1)
-		,"T3dg(i,j,N)=T2s(i,j)(0,1,2)");
-  test_for_zero(t3dg_1(0,2,2)-t2s_3(0,2)
-		,"T3dg(i,j,N)=T2s(i,j)(0,2,2)");
-  test_for_zero(t3dg_1(1,1,2)-t2s_3(1,1)
-		,"T3dg(i,j,N)=T2s(i,j)(1,1,2)");
-  test_for_zero(t3dg_1(1,2,2)-t2s_3(1,2)
-		,"T3dg(i,j,N)=T2s(i,j)(1,2,2)");
-  test_for_zero(t3dg_1(2,2,2)-t2s_3(2,2)
-		,"T3dg(i,j,N)=T2s(i,j)(2,2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,75 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+
+  /* First Number<> tests */
+
+  t3dg_1(i,j,N0)=t2s_1(i,j);
+  t3dg_1(i,j,N1)=t2s_2(i,j);
+  t3dg_1(i,j,N2)=t2s_3(i,j);
+  test_for_zero(t3dg_1(0,0,0)-t2s_1(0,0)
+		,"T3dg(i,j,N)=T2s(i,j)(0,0,0)");
+  test_for_zero(t3dg_1(0,1,0)-t2s_1(0,1)
+		,"T3dg(i,j,N)=T2s(i,j)(0,1,0)");
+  test_for_zero(t3dg_1(0,2,0)-t2s_1(0,2)
+		,"T3dg(i,j,N)=T2s(i,j)(0,2,0)");
+  test_for_zero(t3dg_1(1,1,0)-t2s_1(1,1)
+		,"T3dg(i,j,N)=T2s(i,j)(1,1,0)");
+  test_for_zero(t3dg_1(1,2,0)-t2s_1(1,2)
+		,"T3dg(i,j,N)=T2s(i,j)(1,2,0)");
+  test_for_zero(t3dg_1(2,2,0)-t2s_1(2,2)
+		,"T3dg(i,j,N)=T2s(i,j)(2,2,0)");
+  test_for_zero(t3dg_1(0,0,1)-t2s_2(0,0)
+		,"T3dg(i,j,N)=T2s(i,j)(0,0,1)");
+  test_for_zero(t3dg_1(0,1,1)-t2s_2(0,1)
+		,"T3dg(i,j,N)=T2s(i,j)(0,1,1)");
+  test_for_zero(t3dg_1(0,2,1)-t2s_2(0,2)
+		,"T3dg(i,j,N)=T2s(i,j)(0,2,1)");
+  test_for_zero(t3dg_1(1,1,1)-t2s_2(1,1)
+		,"T3dg(i,j,N)=T2s(i,j)(1,1,1)");
+  test_for_zero(t3dg_1(1,2,1)-t2s_2(1,2)
+		,"T3dg(i,j,N)=T2s(i,j)(1,2,1)");
+  test_for_zero(t3dg_1(2,2,1)-t2s_2(2,2)
+		,"T3dg(i,j,N)=T2s(i,j)(2,2,1)");
+  test_for_zero(t3dg_1(0,0,2)-t2s_3(0,0)
+		,"T3dg(i,j,N)=T2s(i,j)(0,0,2)");
+  test_for_zero(t3dg_1(0,1,2)-t2s_3(0,1)
+		,"T3dg(i,j,N)=T2s(i,j)(0,1,2)");
+  test_for_zero(t3dg_1(0,2,2)-t2s_3(0,2)
+		,"T3dg(i,j,N)=T2s(i,j)(0,2,2)");
+  test_for_zero(t3dg_1(1,1,2)-t2s_3(1,1)
+		,"T3dg(i,j,N)=T2s(i,j)(1,1,2)");
+  test_for_zero(t3dg_1(1,2,2)-t2s_3(1,2)
+		,"T3dg(i,j,N)=T2s(i,j)(1,2,2)");
+  test_for_zero(t3dg_1(2,2,2)-t2s_3(2,2)
+		,"T3dg(i,j,N)=T2s(i,j)(2,2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgIII.C
--- a/tests/conformance/T3dg/test_T3dgIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,94 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-
-
-  t2s_1(i,j)=t3dg_2(i,j,N0);
-  test_for_zero(t3dg_2(0,0,0)-t2s_1(0,0)
-		,"T2s(i,j)=T3dg(i,j,N)(0,0,0)");
-  test_for_zero(t3dg_2(0,1,0)-t2s_1(0,1)
-		,"T2s(i,j)=T3dg(i,j,N)(0,0,1)");
-  test_for_zero(t3dg_2(0,2,0)-t2s_1(0,2)
-		,"T2s(i,j)=T3dg(i,j,N)(0,0,2)");
-  test_for_zero(t3dg_2(1,0,0)-t2s_1(1,0)
-		,"T2s(i,j)=T3dg(i,j,N)(0,1,0)");
-  test_for_zero(t3dg_2(1,1,0)-t2s_1(1,1)
-		,"T2s(i,j)=T3dg(i,j,N)(0,1,1)");
-  test_for_zero(t3dg_2(1,2,0)-t2s_1(1,2)
-		,"T2s(i,j)=T3dg(i,j,N)(0,1,2)");
-  test_for_zero(t3dg_2(2,0,0)-t2s_1(2,0)
-		,"T2s(i,j)=T3dg(i,j,N)(0,2,0)");
-  test_for_zero(t3dg_2(2,1,0)-t2s_1(2,1)
-		,"T2s(i,j)=T3dg(i,j,N)(0,2,1)");
-  test_for_zero(t3dg_2(2,2,0)-t2s_1(2,2)
-		,"T2s(i,j)=T3dg(i,j,N)(0,2,2)");
-
-  t2s_1(i,j)=t3dg_2(i,j,N1);
-  test_for_zero(t3dg_2(0,0,1)-t2s_1(0,0)
-		,"T2s(i,j)=T3dg(i,j,N)(1,0,0)");
-  test_for_zero(t3dg_2(0,1,1)-t2s_1(0,1)
-		,"T2s(i,j)=T3dg(i,j,N)(1,0,1)");
-  test_for_zero(t3dg_2(0,2,1)-t2s_1(0,2)
-		,"T2s(i,j)=T3dg(i,j,N)(1,0,2)");
-  test_for_zero(t3dg_2(1,0,1)-t2s_1(1,0)
-		,"T2s(i,j)=T3dg(i,j,N)(1,1,0)");
-  test_for_zero(t3dg_2(1,1,1)-t2s_1(1,1)
-		,"T2s(i,j)=T3dg(i,j,N)(1,1,1)");
-  test_for_zero(t3dg_2(1,2,1)-t2s_1(1,2)
-		,"T2s(i,j)=T3dg(i,j,N)(1,1,2)");
-  test_for_zero(t3dg_2(2,0,1)-t2s_1(2,0)
-		,"T2s(i,j)=T3dg(i,j,N)(1,2,0)");
-  test_for_zero(t3dg_2(2,1,1)-t2s_1(2,1)
-		,"T2s(i,j)=T3dg(i,j,N)(1,2,1)");
-  test_for_zero(t3dg_2(2,2,1)-t2s_1(2,2)
-		,"T2s(i,j)=T3dg(i,j,N)(1,2,2)");
-
-  t2s_1(i,j)=t3dg_2(i,j,N2);
-  test_for_zero(t3dg_2(0,0,2)-t2s_1(0,0)
-		,"T2s(i,j)=T3dg(i,j,N)(2,0,0)");
-  test_for_zero(t3dg_2(0,1,2)-t2s_1(0,1)
-		,"T2s(i,j)=T3dg(i,j,N)(2,0,1)");
-  test_for_zero(t3dg_2(0,2,2)-t2s_1(0,2)
-		,"T2s(i,j)=T3dg(i,j,N)(2,0,2)");
-  test_for_zero(t3dg_2(1,0,2)-t2s_1(1,0)
-		,"T2s(i,j)=T3dg(i,j,N)(2,1,0)");
-  test_for_zero(t3dg_2(1,1,2)-t2s_1(1,1)
-		,"T2s(i,j)=T3dg(i,j,N)(2,1,1)");
-  test_for_zero(t3dg_2(1,2,2)-t2s_1(1,2)
-		,"T2s(i,j)=T3dg(i,j,N)(2,1,2)");
-  test_for_zero(t3dg_2(2,0,2)-t2s_1(2,0)
-		,"T2s(i,j)=T3dg(i,j,N)(2,2,0)");
-  test_for_zero(t3dg_2(2,1,2)-t2s_1(2,1)
-		,"T2s(i,j)=T3dg(i,j,N)(2,2,1)");
-  test_for_zero(t3dg_2(2,2,2)-t2s_1(2,2)
-		,"T2s(i,j)=T3dg(i,j,N)(2,2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,94 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+
+
+  t2s_1(i,j)=t3dg_2(i,j,N0);
+  test_for_zero(t3dg_2(0,0,0)-t2s_1(0,0)
+		,"T2s(i,j)=T3dg(i,j,N)(0,0,0)");
+  test_for_zero(t3dg_2(0,1,0)-t2s_1(0,1)
+		,"T2s(i,j)=T3dg(i,j,N)(0,0,1)");
+  test_for_zero(t3dg_2(0,2,0)-t2s_1(0,2)
+		,"T2s(i,j)=T3dg(i,j,N)(0,0,2)");
+  test_for_zero(t3dg_2(1,0,0)-t2s_1(1,0)
+		,"T2s(i,j)=T3dg(i,j,N)(0,1,0)");
+  test_for_zero(t3dg_2(1,1,0)-t2s_1(1,1)
+		,"T2s(i,j)=T3dg(i,j,N)(0,1,1)");
+  test_for_zero(t3dg_2(1,2,0)-t2s_1(1,2)
+		,"T2s(i,j)=T3dg(i,j,N)(0,1,2)");
+  test_for_zero(t3dg_2(2,0,0)-t2s_1(2,0)
+		,"T2s(i,j)=T3dg(i,j,N)(0,2,0)");
+  test_for_zero(t3dg_2(2,1,0)-t2s_1(2,1)
+		,"T2s(i,j)=T3dg(i,j,N)(0,2,1)");
+  test_for_zero(t3dg_2(2,2,0)-t2s_1(2,2)
+		,"T2s(i,j)=T3dg(i,j,N)(0,2,2)");
+
+  t2s_1(i,j)=t3dg_2(i,j,N1);
+  test_for_zero(t3dg_2(0,0,1)-t2s_1(0,0)
+		,"T2s(i,j)=T3dg(i,j,N)(1,0,0)");
+  test_for_zero(t3dg_2(0,1,1)-t2s_1(0,1)
+		,"T2s(i,j)=T3dg(i,j,N)(1,0,1)");
+  test_for_zero(t3dg_2(0,2,1)-t2s_1(0,2)
+		,"T2s(i,j)=T3dg(i,j,N)(1,0,2)");
+  test_for_zero(t3dg_2(1,0,1)-t2s_1(1,0)
+		,"T2s(i,j)=T3dg(i,j,N)(1,1,0)");
+  test_for_zero(t3dg_2(1,1,1)-t2s_1(1,1)
+		,"T2s(i,j)=T3dg(i,j,N)(1,1,1)");
+  test_for_zero(t3dg_2(1,2,1)-t2s_1(1,2)
+		,"T2s(i,j)=T3dg(i,j,N)(1,1,2)");
+  test_for_zero(t3dg_2(2,0,1)-t2s_1(2,0)
+		,"T2s(i,j)=T3dg(i,j,N)(1,2,0)");
+  test_for_zero(t3dg_2(2,1,1)-t2s_1(2,1)
+		,"T2s(i,j)=T3dg(i,j,N)(1,2,1)");
+  test_for_zero(t3dg_2(2,2,1)-t2s_1(2,2)
+		,"T2s(i,j)=T3dg(i,j,N)(1,2,2)");
+
+  t2s_1(i,j)=t3dg_2(i,j,N2);
+  test_for_zero(t3dg_2(0,0,2)-t2s_1(0,0)
+		,"T2s(i,j)=T3dg(i,j,N)(2,0,0)");
+  test_for_zero(t3dg_2(0,1,2)-t2s_1(0,1)
+		,"T2s(i,j)=T3dg(i,j,N)(2,0,1)");
+  test_for_zero(t3dg_2(0,2,2)-t2s_1(0,2)
+		,"T2s(i,j)=T3dg(i,j,N)(2,0,2)");
+  test_for_zero(t3dg_2(1,0,2)-t2s_1(1,0)
+		,"T2s(i,j)=T3dg(i,j,N)(2,1,0)");
+  test_for_zero(t3dg_2(1,1,2)-t2s_1(1,1)
+		,"T2s(i,j)=T3dg(i,j,N)(2,1,1)");
+  test_for_zero(t3dg_2(1,2,2)-t2s_1(1,2)
+		,"T2s(i,j)=T3dg(i,j,N)(2,1,2)");
+  test_for_zero(t3dg_2(2,0,2)-t2s_1(2,0)
+		,"T2s(i,j)=T3dg(i,j,N)(2,2,0)");
+  test_for_zero(t3dg_2(2,1,2)-t2s_1(2,1)
+		,"T2s(i,j)=T3dg(i,j,N)(2,2,1)");
+  test_for_zero(t3dg_2(2,2,2)-t2s_1(2,2)
+		,"T2s(i,j)=T3dg(i,j,N)(2,2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgIV.C
--- a/tests/conformance/T3dg/test_T3dgIV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,94 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t2_1(i,j)=t3dg_2(N0,i,j);
-  test_for_zero(t3dg_2(0,0,0)-t2_1(0,0)
-		,"T2(i,j)=T3dg(N,i,j)(0,0,0)");
-  test_for_zero(t3dg_2(0,0,1)-t2_1(0,1)
-		,"T2(i,j)=T3dg(N,i,j)(0,0,1)");
-  test_for_zero(t3dg_2(0,0,2)-t2_1(0,2)
-		,"T2(i,j)=T3dg(N,i,j)(0,0,2)");
-  test_for_zero(t3dg_2(0,1,0)-t2_1(1,0)
-		,"T2(i,j)=T3dg(N,i,j)(0,1,0)");
-  test_for_zero(t3dg_2(0,1,1)-t2_1(1,1)
-		,"T2(i,j)=T3dg(N,i,j)(0,1,1)");
-  test_for_zero(t3dg_2(0,1,2)-t2_1(1,2)
-		,"T2(i,j)=T3dg(N,i,j)(0,1,2)");
-  test_for_zero(t3dg_2(0,2,0)-t2_1(2,0)
-		,"T2(i,j)=T3dg(N,i,j)(0,2,0)");
-  test_for_zero(t3dg_2(0,2,1)-t2_1(2,1)
-		,"T2(i,j)=T3dg(N,i,j)(0,2,1)");
-  test_for_zero(t3dg_2(0,2,2)-t2_1(2,2)
-		,"T2(i,j)=T3dg(N,i,j)(0,2,2)");
-
-  t2_1(i,j)=t3dg_2(N1,i,j);
-  test_for_zero(t3dg_2(1,0,0)-t2_1(0,0)
-		,"T2(i,j)=T3dg(N,i,j)(1,0,0)");
-  test_for_zero(t3dg_2(1,0,1)-t2_1(0,1)
-		,"T2(i,j)=T3dg(N,i,j)(1,0,1)");
-  test_for_zero(t3dg_2(1,0,2)-t2_1(0,2)
-		,"T2(i,j)=T3dg(N,i,j)(1,0,2)");
-  test_for_zero(t3dg_2(1,1,0)-t2_1(1,0)
-		,"T2(i,j)=T3dg(N,i,j)(1,1,0)");
-  test_for_zero(t3dg_2(1,1,1)-t2_1(1,1)
-		,"T2(i,j)=T3dg(N,i,j)(1,1,1)");
-  test_for_zero(t3dg_2(1,1,2)-t2_1(1,2)
-		,"T2(i,j)=T3dg(N,i,j)(1,1,2)");
-  test_for_zero(t3dg_2(1,2,0)-t2_1(2,0)
-		,"T2(i,j)=T3dg(N,i,j)(1,2,0)");
-  test_for_zero(t3dg_2(1,2,1)-t2_1(2,1)
-		,"T2(i,j)=T3dg(N,i,j)(1,2,1)");
-  test_for_zero(t3dg_2(1,2,2)-t2_1(2,2)
-		,"T2(i,j)=T3dg(N,i,j)(1,2,2)");
-
-  t2_1(i,j)=t3dg_2(N2,i,j);
-  test_for_zero(t3dg_2(2,0,0)-t2_1(0,0)
-		,"T2(i,j)=T3dg(N,i,j)(2,0,0)");
-  test_for_zero(t3dg_2(2,0,1)-t2_1(0,1)
-		,"T2(i,j)=T3dg(N,i,j)(2,0,1)");
-  test_for_zero(t3dg_2(2,0,2)-t2_1(0,2)
-		,"T2(i,j)=T3dg(N,i,j)(2,0,2)");
-  test_for_zero(t3dg_2(2,1,0)-t2_1(1,0)
-		,"T2(i,j)=T3dg(N,i,j)(2,1,0)");
-  test_for_zero(t3dg_2(2,1,1)-t2_1(1,1)
-		,"T2(i,j)=T3dg(N,i,j)(2,1,1)");
-  test_for_zero(t3dg_2(2,1,2)-t2_1(1,2)
-		,"T2(i,j)=T3dg(N,i,j)(2,1,2)");
-  test_for_zero(t3dg_2(2,2,0)-t2_1(2,0)
-		,"T2(i,j)=T3dg(N,i,j)(2,2,0)");
-  test_for_zero(t3dg_2(2,2,1)-t2_1(2,1)
-		,"T2(i,j)=T3dg(N,i,j)(2,2,1)");
-  test_for_zero(t3dg_2(2,2,2)-t2_1(2,2)
-		,"T2(i,j)=T3dg(N,i,j)(2,2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgIV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgIV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,94 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t2_1(i,j)=t3dg_2(N0,i,j);
+  test_for_zero(t3dg_2(0,0,0)-t2_1(0,0)
+		,"T2(i,j)=T3dg(N,i,j)(0,0,0)");
+  test_for_zero(t3dg_2(0,0,1)-t2_1(0,1)
+		,"T2(i,j)=T3dg(N,i,j)(0,0,1)");
+  test_for_zero(t3dg_2(0,0,2)-t2_1(0,2)
+		,"T2(i,j)=T3dg(N,i,j)(0,0,2)");
+  test_for_zero(t3dg_2(0,1,0)-t2_1(1,0)
+		,"T2(i,j)=T3dg(N,i,j)(0,1,0)");
+  test_for_zero(t3dg_2(0,1,1)-t2_1(1,1)
+		,"T2(i,j)=T3dg(N,i,j)(0,1,1)");
+  test_for_zero(t3dg_2(0,1,2)-t2_1(1,2)
+		,"T2(i,j)=T3dg(N,i,j)(0,1,2)");
+  test_for_zero(t3dg_2(0,2,0)-t2_1(2,0)
+		,"T2(i,j)=T3dg(N,i,j)(0,2,0)");
+  test_for_zero(t3dg_2(0,2,1)-t2_1(2,1)
+		,"T2(i,j)=T3dg(N,i,j)(0,2,1)");
+  test_for_zero(t3dg_2(0,2,2)-t2_1(2,2)
+		,"T2(i,j)=T3dg(N,i,j)(0,2,2)");
+
+  t2_1(i,j)=t3dg_2(N1,i,j);
+  test_for_zero(t3dg_2(1,0,0)-t2_1(0,0)
+		,"T2(i,j)=T3dg(N,i,j)(1,0,0)");
+  test_for_zero(t3dg_2(1,0,1)-t2_1(0,1)
+		,"T2(i,j)=T3dg(N,i,j)(1,0,1)");
+  test_for_zero(t3dg_2(1,0,2)-t2_1(0,2)
+		,"T2(i,j)=T3dg(N,i,j)(1,0,2)");
+  test_for_zero(t3dg_2(1,1,0)-t2_1(1,0)
+		,"T2(i,j)=T3dg(N,i,j)(1,1,0)");
+  test_for_zero(t3dg_2(1,1,1)-t2_1(1,1)
+		,"T2(i,j)=T3dg(N,i,j)(1,1,1)");
+  test_for_zero(t3dg_2(1,1,2)-t2_1(1,2)
+		,"T2(i,j)=T3dg(N,i,j)(1,1,2)");
+  test_for_zero(t3dg_2(1,2,0)-t2_1(2,0)
+		,"T2(i,j)=T3dg(N,i,j)(1,2,0)");
+  test_for_zero(t3dg_2(1,2,1)-t2_1(2,1)
+		,"T2(i,j)=T3dg(N,i,j)(1,2,1)");
+  test_for_zero(t3dg_2(1,2,2)-t2_1(2,2)
+		,"T2(i,j)=T3dg(N,i,j)(1,2,2)");
+
+  t2_1(i,j)=t3dg_2(N2,i,j);
+  test_for_zero(t3dg_2(2,0,0)-t2_1(0,0)
+		,"T2(i,j)=T3dg(N,i,j)(2,0,0)");
+  test_for_zero(t3dg_2(2,0,1)-t2_1(0,1)
+		,"T2(i,j)=T3dg(N,i,j)(2,0,1)");
+  test_for_zero(t3dg_2(2,0,2)-t2_1(0,2)
+		,"T2(i,j)=T3dg(N,i,j)(2,0,2)");
+  test_for_zero(t3dg_2(2,1,0)-t2_1(1,0)
+		,"T2(i,j)=T3dg(N,i,j)(2,1,0)");
+  test_for_zero(t3dg_2(2,1,1)-t2_1(1,1)
+		,"T2(i,j)=T3dg(N,i,j)(2,1,1)");
+  test_for_zero(t3dg_2(2,1,2)-t2_1(1,2)
+		,"T2(i,j)=T3dg(N,i,j)(2,1,2)");
+  test_for_zero(t3dg_2(2,2,0)-t2_1(2,0)
+		,"T2(i,j)=T3dg(N,i,j)(2,2,0)");
+  test_for_zero(t3dg_2(2,2,1)-t2_1(2,1)
+		,"T2(i,j)=T3dg(N,i,j)(2,2,1)");
+  test_for_zero(t3dg_2(2,2,2)-t2_1(2,2)
+		,"T2(i,j)=T3dg(N,i,j)(2,2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgIX.C
--- a/tests/conformance/T3dg/test_T3dgIX.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t3dg_1(i,j,k)=t2s_2(i,j)*t1_2(k);
-  test_for_zero(t3dg_1(0,0,0) - t2s_2(0,0)*t1_2(0)
-		,"T2s(i,j)*T1(k)(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) - t2s_2(0,0)*t1_2(1)
-		,"T2s(i,j)*T1(k)(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) - t2s_2(0,0)*t1_2(2)
-		,"T2s(i,j)*T1(k)(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) - t2s_2(0,1)*t1_2(0)
-		,"T2s(i,j)*T1(k)(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - t2s_2(0,1)*t1_2(1)
-		,"T2s(i,j)*T1(k)(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) - t2s_2(0,1)*t1_2(2)
-		,"T2s(i,j)*T1(k)(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) - t2s_2(0,2)*t1_2(0)
-		,"T2s(i,j)*T1(k)(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) - t2s_2(0,2)*t1_2(1)
-		,"T2s(i,j)*T1(k)(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - t2s_2(0,2)*t1_2(2)
-		,"T2s(i,j)*T1(k)(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - t2s_2(1,0)*t1_2(0)
-		,"T2s(i,j)*T1(k)(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) - t2s_2(1,0)*t1_2(1)
-		,"T2s(i,j)*T1(k)(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) - t2s_2(1,0)*t1_2(2)
-		,"T2s(i,j)*T1(k)(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) - t2s_2(1,1)*t1_2(0)
-		,"T2s(i,j)*T1(k)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - t2s_2(1,1)*t1_2(1)
-		,"T2s(i,j)*T1(k)(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) - t2s_2(1,1)*t1_2(2)
-		,"T2s(i,j)*T1(k)(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) - t2s_2(1,2)*t1_2(0)
-		,"T2s(i,j)*T1(k)(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) - t2s_2(1,2)*t1_2(1)
-		,"T2s(i,j)*T1(k)(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - t2s_2(1,2)*t1_2(2)
-		,"T2s(i,j)*T1(k)(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - t2s_2(2,0)*t1_2(0)
-		,"T2s(i,j)*T1(k)(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) - t2s_2(2,0)*t1_2(1)
-		,"T2s(i,j)*T1(k)(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) - t2s_2(2,0)*t1_2(2)
-		,"T2s(i,j)*T1(k)(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) - t2s_2(2,1)*t1_2(0)
-		,"T2s(i,j)*T1(k)(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - t2s_2(2,1)*t1_2(1)
-		,"T2s(i,j)*T1(k)(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) - t2s_2(2,1)*t1_2(2)
-		,"T2s(i,j)*T1(k)(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) - t2s_2(2,2)*t1_2(0)
-		,"T2s(i,j)*T1(k)(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) - t2s_2(2,2)*t1_2(1)
-		,"T2s(i,j)*T1(k)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - t2s_2(2,2)*t1_2(2)
-		,"T2s(i,j)*T1(k)(2,2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgIX.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgIX.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,90 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t3dg_1(i,j,k)=t2s_2(i,j)*t1_2(k);
+  test_for_zero(t3dg_1(0,0,0) - t2s_2(0,0)*t1_2(0)
+		,"T2s(i,j)*T1(k)(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) - t2s_2(0,0)*t1_2(1)
+		,"T2s(i,j)*T1(k)(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) - t2s_2(0,0)*t1_2(2)
+		,"T2s(i,j)*T1(k)(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) - t2s_2(0,1)*t1_2(0)
+		,"T2s(i,j)*T1(k)(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - t2s_2(0,1)*t1_2(1)
+		,"T2s(i,j)*T1(k)(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) - t2s_2(0,1)*t1_2(2)
+		,"T2s(i,j)*T1(k)(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) - t2s_2(0,2)*t1_2(0)
+		,"T2s(i,j)*T1(k)(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) - t2s_2(0,2)*t1_2(1)
+		,"T2s(i,j)*T1(k)(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - t2s_2(0,2)*t1_2(2)
+		,"T2s(i,j)*T1(k)(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - t2s_2(1,0)*t1_2(0)
+		,"T2s(i,j)*T1(k)(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) - t2s_2(1,0)*t1_2(1)
+		,"T2s(i,j)*T1(k)(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) - t2s_2(1,0)*t1_2(2)
+		,"T2s(i,j)*T1(k)(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) - t2s_2(1,1)*t1_2(0)
+		,"T2s(i,j)*T1(k)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - t2s_2(1,1)*t1_2(1)
+		,"T2s(i,j)*T1(k)(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) - t2s_2(1,1)*t1_2(2)
+		,"T2s(i,j)*T1(k)(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) - t2s_2(1,2)*t1_2(0)
+		,"T2s(i,j)*T1(k)(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) - t2s_2(1,2)*t1_2(1)
+		,"T2s(i,j)*T1(k)(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - t2s_2(1,2)*t1_2(2)
+		,"T2s(i,j)*T1(k)(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - t2s_2(2,0)*t1_2(0)
+		,"T2s(i,j)*T1(k)(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) - t2s_2(2,0)*t1_2(1)
+		,"T2s(i,j)*T1(k)(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) - t2s_2(2,0)*t1_2(2)
+		,"T2s(i,j)*T1(k)(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) - t2s_2(2,1)*t1_2(0)
+		,"T2s(i,j)*T1(k)(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - t2s_2(2,1)*t1_2(1)
+		,"T2s(i,j)*T1(k)(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) - t2s_2(2,1)*t1_2(2)
+		,"T2s(i,j)*T1(k)(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) - t2s_2(2,2)*t1_2(0)
+		,"T2s(i,j)*T1(k)(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) - t2s_2(2,2)*t1_2(1)
+		,"T2s(i,j)*T1(k)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - t2s_2(2,2)*t1_2(2)
+		,"T2s(i,j)*T1(k)(2,2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgV.C
--- a/tests/conformance/T3dg/test_T3dgV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,94 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t2_1(i,j)=t3dg_2(i,N0,j);
-  test_for_zero(t3dg_2(0,0,0)-t2_1(0,0)
-		,"T2(i,j)=T3dg(i,N,j)(0,0,0)");
-  test_for_zero(t3dg_2(0,0,1)-t2_1(0,1)
-		,"T2(i,j)=T3dg(i,N,j)(0,0,1)");
-  test_for_zero(t3dg_2(0,0,2)-t2_1(0,2)
-		,"T2(i,j)=T3dg(i,N,j)(0,0,2)");
-  test_for_zero(t3dg_2(1,0,0)-t2_1(1,0)
-		,"T2(i,j)=T3dg(i,N,j)(0,1,0)");
-  test_for_zero(t3dg_2(1,0,1)-t2_1(1,1)
-		,"T2(i,j)=T3dg(i,N,j)(0,1,1)");
-  test_for_zero(t3dg_2(1,0,2)-t2_1(1,2)
-		,"T2(i,j)=T3dg(i,N,j)(0,1,2)");
-  test_for_zero(t3dg_2(2,0,0)-t2_1(2,0)
-		,"T2(i,j)=T3dg(i,N,j)(0,2,0)");
-  test_for_zero(t3dg_2(2,0,1)-t2_1(2,1)
-		,"T2(i,j)=T3dg(i,N,j)(0,2,1)");
-  test_for_zero(t3dg_2(2,0,2)-t2_1(2,2)
-		,"T2(i,j)=T3dg(i,N,j)(0,2,2)");
-
-  t2_1(i,j)=t3dg_2(i,N1,j);
-  test_for_zero(t3dg_2(0,1,0)-t2_1(0,0)
-		,"T2(i,j)=T3dg(i,N,j)(1,0,0)");
-  test_for_zero(t3dg_2(0,1,1)-t2_1(0,1)
-		,"T2(i,j)=T3dg(i,N,j)(1,0,1)");
-  test_for_zero(t3dg_2(0,1,2)-t2_1(0,2)
-		,"T2(i,j)=T3dg(i,N,j)(1,0,2)");
-  test_for_zero(t3dg_2(1,1,0)-t2_1(1,0)
-		,"T2(i,j)=T3dg(i,N,j)(1,1,0)");
-  test_for_zero(t3dg_2(1,1,1)-t2_1(1,1)
-		,"T2(i,j)=T3dg(i,N,j)(1,1,1)");
-  test_for_zero(t3dg_2(1,1,2)-t2_1(1,2)
-		,"T2(i,j)=T3dg(i,N,j)(1,1,2)");
-  test_for_zero(t3dg_2(2,1,0)-t2_1(2,0)
-		,"T2(i,j)=T3dg(i,N,j)(1,2,0)");
-  test_for_zero(t3dg_2(2,1,1)-t2_1(2,1)
-		,"T2(i,j)=T3dg(i,N,j)(1,2,1)");
-  test_for_zero(t3dg_2(2,1,2)-t2_1(2,2)
-		,"T2(i,j)=T3dg(i,N,j)(1,2,2)");
-
-  t2_1(i,j)=t3dg_2(i,N2,j);
-  test_for_zero(t3dg_2(0,2,0)-t2_1(0,0)
-		,"T2(i,j)=T3dg(i,N,j)(2,0,0)");
-  test_for_zero(t3dg_2(0,2,1)-t2_1(0,1)
-		,"T2(i,j)=T3dg(i,N,j)(2,0,1)");
-  test_for_zero(t3dg_2(0,2,2)-t2_1(0,2)
-		,"T2(i,j)=T3dg(i,N,j)(2,0,2)");
-  test_for_zero(t3dg_2(1,2,0)-t2_1(1,0)
-		,"T2(i,j)=T3dg(i,N,j)(2,1,0)");
-  test_for_zero(t3dg_2(1,2,1)-t2_1(1,1)
-		,"T2(i,j)=T3dg(i,N,j)(2,1,1)");
-  test_for_zero(t3dg_2(1,2,2)-t2_1(1,2)
-		,"T2(i,j)=T3dg(i,N,j)(2,1,2)");
-  test_for_zero(t3dg_2(2,2,0)-t2_1(2,0)
-		,"T2(i,j)=T3dg(i,N,j)(2,2,0)");
-  test_for_zero(t3dg_2(2,2,1)-t2_1(2,1)
-		,"T2(i,j)=T3dg(i,N,j)(2,2,1)");
-  test_for_zero(t3dg_2(2,2,2)-t2_1(2,2)
-		,"T2(i,j)=T3dg(i,N,j)(2,2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,94 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t2_1(i,j)=t3dg_2(i,N0,j);
+  test_for_zero(t3dg_2(0,0,0)-t2_1(0,0)
+		,"T2(i,j)=T3dg(i,N,j)(0,0,0)");
+  test_for_zero(t3dg_2(0,0,1)-t2_1(0,1)
+		,"T2(i,j)=T3dg(i,N,j)(0,0,1)");
+  test_for_zero(t3dg_2(0,0,2)-t2_1(0,2)
+		,"T2(i,j)=T3dg(i,N,j)(0,0,2)");
+  test_for_zero(t3dg_2(1,0,0)-t2_1(1,0)
+		,"T2(i,j)=T3dg(i,N,j)(0,1,0)");
+  test_for_zero(t3dg_2(1,0,1)-t2_1(1,1)
+		,"T2(i,j)=T3dg(i,N,j)(0,1,1)");
+  test_for_zero(t3dg_2(1,0,2)-t2_1(1,2)
+		,"T2(i,j)=T3dg(i,N,j)(0,1,2)");
+  test_for_zero(t3dg_2(2,0,0)-t2_1(2,0)
+		,"T2(i,j)=T3dg(i,N,j)(0,2,0)");
+  test_for_zero(t3dg_2(2,0,1)-t2_1(2,1)
+		,"T2(i,j)=T3dg(i,N,j)(0,2,1)");
+  test_for_zero(t3dg_2(2,0,2)-t2_1(2,2)
+		,"T2(i,j)=T3dg(i,N,j)(0,2,2)");
+
+  t2_1(i,j)=t3dg_2(i,N1,j);
+  test_for_zero(t3dg_2(0,1,0)-t2_1(0,0)
+		,"T2(i,j)=T3dg(i,N,j)(1,0,0)");
+  test_for_zero(t3dg_2(0,1,1)-t2_1(0,1)
+		,"T2(i,j)=T3dg(i,N,j)(1,0,1)");
+  test_for_zero(t3dg_2(0,1,2)-t2_1(0,2)
+		,"T2(i,j)=T3dg(i,N,j)(1,0,2)");
+  test_for_zero(t3dg_2(1,1,0)-t2_1(1,0)
+		,"T2(i,j)=T3dg(i,N,j)(1,1,0)");
+  test_for_zero(t3dg_2(1,1,1)-t2_1(1,1)
+		,"T2(i,j)=T3dg(i,N,j)(1,1,1)");
+  test_for_zero(t3dg_2(1,1,2)-t2_1(1,2)
+		,"T2(i,j)=T3dg(i,N,j)(1,1,2)");
+  test_for_zero(t3dg_2(2,1,0)-t2_1(2,0)
+		,"T2(i,j)=T3dg(i,N,j)(1,2,0)");
+  test_for_zero(t3dg_2(2,1,1)-t2_1(2,1)
+		,"T2(i,j)=T3dg(i,N,j)(1,2,1)");
+  test_for_zero(t3dg_2(2,1,2)-t2_1(2,2)
+		,"T2(i,j)=T3dg(i,N,j)(1,2,2)");
+
+  t2_1(i,j)=t3dg_2(i,N2,j);
+  test_for_zero(t3dg_2(0,2,0)-t2_1(0,0)
+		,"T2(i,j)=T3dg(i,N,j)(2,0,0)");
+  test_for_zero(t3dg_2(0,2,1)-t2_1(0,1)
+		,"T2(i,j)=T3dg(i,N,j)(2,0,1)");
+  test_for_zero(t3dg_2(0,2,2)-t2_1(0,2)
+		,"T2(i,j)=T3dg(i,N,j)(2,0,2)");
+  test_for_zero(t3dg_2(1,2,0)-t2_1(1,0)
+		,"T2(i,j)=T3dg(i,N,j)(2,1,0)");
+  test_for_zero(t3dg_2(1,2,1)-t2_1(1,1)
+		,"T2(i,j)=T3dg(i,N,j)(2,1,1)");
+  test_for_zero(t3dg_2(1,2,2)-t2_1(1,2)
+		,"T2(i,j)=T3dg(i,N,j)(2,1,2)");
+  test_for_zero(t3dg_2(2,2,0)-t2_1(2,0)
+		,"T2(i,j)=T3dg(i,N,j)(2,2,0)");
+  test_for_zero(t3dg_2(2,2,1)-t2_1(2,1)
+		,"T2(i,j)=T3dg(i,N,j)(2,2,1)");
+  test_for_zero(t3dg_2(2,2,2)-t2_1(2,2)
+		,"T2(i,j)=T3dg(i,N,j)(2,2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgVI.C
--- a/tests/conformance/T3dg/test_T3dgVI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  /* Now, test with actual numbers. */
-
-  t2s_1(i,j)=t3dg_2(i,j,0);
-  test_for_zero(t3dg_2(0,0,0)-t2s_1(0,0)
-		,"T3dg(i,j,Num)(0,0,0)");
-  test_for_zero(t3dg_2(0,1,0)-t2s_1(0,1)
-		,"T3dg(i,j,Num)(0,0,1)");
-  test_for_zero(t3dg_2(0,2,0)-t2s_1(0,2)
-		,"T3dg(i,j,Num)(0,0,2)");
-  test_for_zero(t3dg_2(1,0,0)-t2s_1(1,0)
-		,"T3dg(i,j,Num)(0,1,0)");
-  test_for_zero(t3dg_2(1,1,0)-t2s_1(1,1)
-		,"T3dg(i,j,Num)(0,1,1)");
-  test_for_zero(t3dg_2(1,2,0)-t2s_1(1,2)
-		,"T3dg(i,j,Num)(0,1,2)");
-  test_for_zero(t3dg_2(2,0,0)-t2s_1(2,0)
-		,"T3dg(i,j,Num)(0,2,0)");
-  test_for_zero(t3dg_2(2,1,0)-t2s_1(2,1)
-		,"T3dg(i,j,Num)(0,2,1)");
-  test_for_zero(t3dg_2(2,2,0)-t2s_1(2,2)
-		,"T3dg(i,j,Num)(0,2,2)");
-
-  t2s_1(i,j)=t3dg_2(i,j,1);
-  test_for_zero(t3dg_2(0,0,1)-t2s_1(0,0)
-		,"T3dg(i,j,Num)(1,0,0)");
-  test_for_zero(t3dg_2(0,1,1)-t2s_1(0,1)
-		,"T3dg(i,j,Num)(1,0,1)");
-  test_for_zero(t3dg_2(0,2,1)-t2s_1(0,2)
-		,"T3dg(i,j,Num)(1,0,2)");
-  test_for_zero(t3dg_2(1,0,1)-t2s_1(1,0)
-		,"T3dg(i,j,Num)(1,1,0)");
-  test_for_zero(t3dg_2(1,1,1)-t2s_1(1,1)
-		,"T3dg(i,j,Num)(1,1,1)");
-  test_for_zero(t3dg_2(1,2,1)-t2s_1(1,2)
-		,"T3dg(i,j,Num)(1,1,2)");
-  test_for_zero(t3dg_2(2,0,1)-t2s_1(2,0)
-		,"T3dg(i,j,Num)(1,2,0)");
-  test_for_zero(t3dg_2(2,1,1)-t2s_1(2,1)
-		,"T3dg(i,j,Num)(1,2,1)");
-  test_for_zero(t3dg_2(2,2,1)-t2s_1(2,2)
-		,"T3dg(i,j,Num)(1,2,2)");
-
-  t2s_1(i,j)=t3dg_2(i,j,2);
-  test_for_zero(t3dg_2(0,0,2)-t2s_1(0,0)
-		,"T3dg(i,j,Num)(2,0,0)");
-  test_for_zero(t3dg_2(0,1,2)-t2s_1(0,1)
-		,"T3dg(i,j,Num)(2,0,1)");
-  test_for_zero(t3dg_2(0,2,2)-t2s_1(0,2)
-		,"T3dg(i,j,Num)(2,0,2)");
-  test_for_zero(t3dg_2(1,0,2)-t2s_1(1,0)
-		,"T3dg(i,j,Num)(2,1,0)");
-  test_for_zero(t3dg_2(1,1,2)-t2s_1(1,1)
-		,"T3dg(i,j,Num)(2,1,1)");
-  test_for_zero(t3dg_2(1,2,2)-t2s_1(1,2)
-		,"T3dg(i,j,Num)(2,1,2)");
-  test_for_zero(t3dg_2(2,0,2)-t2s_1(2,0)
-		,"T3dg(i,j,Num)(2,2,0)");
-  test_for_zero(t3dg_2(2,1,2)-t2s_1(2,1)
-		,"T3dg(i,j,Num)(2,2,1)");
-  test_for_zero(t3dg_2(2,2,2)-t2s_1(2,2)
-		,"T3dg(i,j,Num)(2,2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgVI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgVI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,96 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  /* Now, test with actual numbers. */
+
+  t2s_1(i,j)=t3dg_2(i,j,0);
+  test_for_zero(t3dg_2(0,0,0)-t2s_1(0,0)
+		,"T3dg(i,j,Num)(0,0,0)");
+  test_for_zero(t3dg_2(0,1,0)-t2s_1(0,1)
+		,"T3dg(i,j,Num)(0,0,1)");
+  test_for_zero(t3dg_2(0,2,0)-t2s_1(0,2)
+		,"T3dg(i,j,Num)(0,0,2)");
+  test_for_zero(t3dg_2(1,0,0)-t2s_1(1,0)
+		,"T3dg(i,j,Num)(0,1,0)");
+  test_for_zero(t3dg_2(1,1,0)-t2s_1(1,1)
+		,"T3dg(i,j,Num)(0,1,1)");
+  test_for_zero(t3dg_2(1,2,0)-t2s_1(1,2)
+		,"T3dg(i,j,Num)(0,1,2)");
+  test_for_zero(t3dg_2(2,0,0)-t2s_1(2,0)
+		,"T3dg(i,j,Num)(0,2,0)");
+  test_for_zero(t3dg_2(2,1,0)-t2s_1(2,1)
+		,"T3dg(i,j,Num)(0,2,1)");
+  test_for_zero(t3dg_2(2,2,0)-t2s_1(2,2)
+		,"T3dg(i,j,Num)(0,2,2)");
+
+  t2s_1(i,j)=t3dg_2(i,j,1);
+  test_for_zero(t3dg_2(0,0,1)-t2s_1(0,0)
+		,"T3dg(i,j,Num)(1,0,0)");
+  test_for_zero(t3dg_2(0,1,1)-t2s_1(0,1)
+		,"T3dg(i,j,Num)(1,0,1)");
+  test_for_zero(t3dg_2(0,2,1)-t2s_1(0,2)
+		,"T3dg(i,j,Num)(1,0,2)");
+  test_for_zero(t3dg_2(1,0,1)-t2s_1(1,0)
+		,"T3dg(i,j,Num)(1,1,0)");
+  test_for_zero(t3dg_2(1,1,1)-t2s_1(1,1)
+		,"T3dg(i,j,Num)(1,1,1)");
+  test_for_zero(t3dg_2(1,2,1)-t2s_1(1,2)
+		,"T3dg(i,j,Num)(1,1,2)");
+  test_for_zero(t3dg_2(2,0,1)-t2s_1(2,0)
+		,"T3dg(i,j,Num)(1,2,0)");
+  test_for_zero(t3dg_2(2,1,1)-t2s_1(2,1)
+		,"T3dg(i,j,Num)(1,2,1)");
+  test_for_zero(t3dg_2(2,2,1)-t2s_1(2,2)
+		,"T3dg(i,j,Num)(1,2,2)");
+
+  t2s_1(i,j)=t3dg_2(i,j,2);
+  test_for_zero(t3dg_2(0,0,2)-t2s_1(0,0)
+		,"T3dg(i,j,Num)(2,0,0)");
+  test_for_zero(t3dg_2(0,1,2)-t2s_1(0,1)
+		,"T3dg(i,j,Num)(2,0,1)");
+  test_for_zero(t3dg_2(0,2,2)-t2s_1(0,2)
+		,"T3dg(i,j,Num)(2,0,2)");
+  test_for_zero(t3dg_2(1,0,2)-t2s_1(1,0)
+		,"T3dg(i,j,Num)(2,1,0)");
+  test_for_zero(t3dg_2(1,1,2)-t2s_1(1,1)
+		,"T3dg(i,j,Num)(2,1,1)");
+  test_for_zero(t3dg_2(1,2,2)-t2s_1(1,2)
+		,"T3dg(i,j,Num)(2,1,2)");
+  test_for_zero(t3dg_2(2,0,2)-t2s_1(2,0)
+		,"T3dg(i,j,Num)(2,2,0)");
+  test_for_zero(t3dg_2(2,1,2)-t2s_1(2,1)
+		,"T3dg(i,j,Num)(2,2,1)");
+  test_for_zero(t3dg_2(2,2,2)-t2s_1(2,2)
+		,"T3dg(i,j,Num)(2,2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgVII.C
--- a/tests/conformance/T3dg/test_T3dgVII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  /* Now, test with actual numbers. */
-
-  t2_1(i,j)=t3dg_2(0,i,j);
-  test_for_zero(t3dg_2(0,0,0)-t2_1(0,0)
-		,"T3dg(Num,i,j)(0,0,0)");
-  test_for_zero(t3dg_2(0,0,1)-t2_1(0,1)
-		,"T3dg(Num,i,j)(0,0,1)");
-  test_for_zero(t3dg_2(0,0,2)-t2_1(0,2)
-		,"T3dg(Num,i,j)(0,0,2)");
-  test_for_zero(t3dg_2(0,1,0)-t2_1(1,0)
-		,"T3dg(Num,i,j)(0,1,0)");
-  test_for_zero(t3dg_2(0,1,1)-t2_1(1,1)
-		,"T3dg(Num,i,j)(0,1,1)");
-  test_for_zero(t3dg_2(0,1,2)-t2_1(1,2)
-		,"T3dg(Num,i,j)(0,1,2)");
-  test_for_zero(t3dg_2(0,2,0)-t2_1(2,0)
-		,"T3dg(Num,i,j)(0,2,0)");
-  test_for_zero(t3dg_2(0,2,1)-t2_1(2,1)
-		,"T3dg(Num,i,j)(0,2,1)");
-  test_for_zero(t3dg_2(0,2,2)-t2_1(2,2)
-		,"T3dg(Num,i,j)(0,2,2)");
-
-  t2_1(i,j)=t3dg_2(1,i,j);
-  test_for_zero(t3dg_2(1,0,0)-t2_1(0,0)
-		,"T3dg(Num,i,j)(1,0,0)");
-  test_for_zero(t3dg_2(1,0,1)-t2_1(0,1)
-		,"T3dg(Num,i,j)(1,0,1)");
-  test_for_zero(t3dg_2(1,0,2)-t2_1(0,2)
-		,"T3dg(Num,i,j)(1,0,2)");
-  test_for_zero(t3dg_2(1,1,0)-t2_1(1,0)
-		,"T3dg(Num,i,j)(1,1,0)");
-  test_for_zero(t3dg_2(1,1,1)-t2_1(1,1)
-		,"T3dg(Num,i,j)(1,1,1)");
-  test_for_zero(t3dg_2(1,1,2)-t2_1(1,2)
-		,"T3dg(Num,i,j)(1,1,2)");
-  test_for_zero(t3dg_2(1,2,0)-t2_1(2,0)
-		,"T3dg(Num,i,j)(1,2,0)");
-  test_for_zero(t3dg_2(1,2,1)-t2_1(2,1)
-		,"T3dg(Num,i,j)(1,2,1)");
-  test_for_zero(t3dg_2(1,2,2)-t2_1(2,2)
-		,"T3dg(Num,i,j)(1,2,2)");
-
-  t2_1(i,j)=t3dg_2(2,i,j);
-  test_for_zero(t3dg_2(2,0,0)-t2_1(0,0)
-		,"T3dg(Num,i,j)(2,0,0)");
-  test_for_zero(t3dg_2(2,0,1)-t2_1(0,1)
-		,"T3dg(Num,i,j)(2,0,1)");
-  test_for_zero(t3dg_2(2,0,2)-t2_1(0,2)
-		,"T3dg(Num,i,j)(2,0,2)");
-  test_for_zero(t3dg_2(2,1,0)-t2_1(1,0)
-		,"T3dg(Num,i,j)(2,1,0)");
-  test_for_zero(t3dg_2(2,1,1)-t2_1(1,1)
-		,"T3dg(Num,i,j)(2,1,1)");
-  test_for_zero(t3dg_2(2,1,2)-t2_1(1,2)
-		,"T3dg(Num,i,j)(2,1,2)");
-  test_for_zero(t3dg_2(2,2,0)-t2_1(2,0)
-		,"T3dg(Num,i,j)(2,2,0)");
-  test_for_zero(t3dg_2(2,2,1)-t2_1(2,1)
-		,"T3dg(Num,i,j)(2,2,1)");
-  test_for_zero(t3dg_2(2,2,2)-t2_1(2,2)
-		,"T3dg(Num,i,j)(2,2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgVII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgVII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,96 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  /* Now, test with actual numbers. */
+
+  t2_1(i,j)=t3dg_2(0,i,j);
+  test_for_zero(t3dg_2(0,0,0)-t2_1(0,0)
+		,"T3dg(Num,i,j)(0,0,0)");
+  test_for_zero(t3dg_2(0,0,1)-t2_1(0,1)
+		,"T3dg(Num,i,j)(0,0,1)");
+  test_for_zero(t3dg_2(0,0,2)-t2_1(0,2)
+		,"T3dg(Num,i,j)(0,0,2)");
+  test_for_zero(t3dg_2(0,1,0)-t2_1(1,0)
+		,"T3dg(Num,i,j)(0,1,0)");
+  test_for_zero(t3dg_2(0,1,1)-t2_1(1,1)
+		,"T3dg(Num,i,j)(0,1,1)");
+  test_for_zero(t3dg_2(0,1,2)-t2_1(1,2)
+		,"T3dg(Num,i,j)(0,1,2)");
+  test_for_zero(t3dg_2(0,2,0)-t2_1(2,0)
+		,"T3dg(Num,i,j)(0,2,0)");
+  test_for_zero(t3dg_2(0,2,1)-t2_1(2,1)
+		,"T3dg(Num,i,j)(0,2,1)");
+  test_for_zero(t3dg_2(0,2,2)-t2_1(2,2)
+		,"T3dg(Num,i,j)(0,2,2)");
+
+  t2_1(i,j)=t3dg_2(1,i,j);
+  test_for_zero(t3dg_2(1,0,0)-t2_1(0,0)
+		,"T3dg(Num,i,j)(1,0,0)");
+  test_for_zero(t3dg_2(1,0,1)-t2_1(0,1)
+		,"T3dg(Num,i,j)(1,0,1)");
+  test_for_zero(t3dg_2(1,0,2)-t2_1(0,2)
+		,"T3dg(Num,i,j)(1,0,2)");
+  test_for_zero(t3dg_2(1,1,0)-t2_1(1,0)
+		,"T3dg(Num,i,j)(1,1,0)");
+  test_for_zero(t3dg_2(1,1,1)-t2_1(1,1)
+		,"T3dg(Num,i,j)(1,1,1)");
+  test_for_zero(t3dg_2(1,1,2)-t2_1(1,2)
+		,"T3dg(Num,i,j)(1,1,2)");
+  test_for_zero(t3dg_2(1,2,0)-t2_1(2,0)
+		,"T3dg(Num,i,j)(1,2,0)");
+  test_for_zero(t3dg_2(1,2,1)-t2_1(2,1)
+		,"T3dg(Num,i,j)(1,2,1)");
+  test_for_zero(t3dg_2(1,2,2)-t2_1(2,2)
+		,"T3dg(Num,i,j)(1,2,2)");
+
+  t2_1(i,j)=t3dg_2(2,i,j);
+  test_for_zero(t3dg_2(2,0,0)-t2_1(0,0)
+		,"T3dg(Num,i,j)(2,0,0)");
+  test_for_zero(t3dg_2(2,0,1)-t2_1(0,1)
+		,"T3dg(Num,i,j)(2,0,1)");
+  test_for_zero(t3dg_2(2,0,2)-t2_1(0,2)
+		,"T3dg(Num,i,j)(2,0,2)");
+  test_for_zero(t3dg_2(2,1,0)-t2_1(1,0)
+		,"T3dg(Num,i,j)(2,1,0)");
+  test_for_zero(t3dg_2(2,1,1)-t2_1(1,1)
+		,"T3dg(Num,i,j)(2,1,1)");
+  test_for_zero(t3dg_2(2,1,2)-t2_1(1,2)
+		,"T3dg(Num,i,j)(2,1,2)");
+  test_for_zero(t3dg_2(2,2,0)-t2_1(2,0)
+		,"T3dg(Num,i,j)(2,2,0)");
+  test_for_zero(t3dg_2(2,2,1)-t2_1(2,1)
+		,"T3dg(Num,i,j)(2,2,1)");
+  test_for_zero(t3dg_2(2,2,2)-t2_1(2,2)
+		,"T3dg(Num,i,j)(2,2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgVIII.C
--- a/tests/conformance/T3dg/test_T3dgVIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  /* Now, test with actual numbers. */
-
-  t2_1(i,j)=t3dg_2(i,0,j);
-  test_for_zero(t3dg_2(0,0,0)-t2_1(0,0)
-		,"T3dg(i,Num,j)(0,0,0)");
-  test_for_zero(t3dg_2(0,0,1)-t2_1(0,1)
-		,"T3dg(i,Num,j)(0,0,1)");
-  test_for_zero(t3dg_2(0,0,2)-t2_1(0,2)
-		,"T3dg(i,Num,j)(0,0,2)");
-  test_for_zero(t3dg_2(1,0,0)-t2_1(1,0)
-		,"T3dg(i,Num,j)(0,1,0)");
-  test_for_zero(t3dg_2(1,0,1)-t2_1(1,1)
-		,"T3dg(i,Num,j)(0,1,1)");
-  test_for_zero(t3dg_2(1,0,2)-t2_1(1,2)
-		,"T3dg(i,Num,j)(0,1,2)");
-  test_for_zero(t3dg_2(2,0,0)-t2_1(2,0)
-		,"T3dg(i,Num,j)(0,2,0)");
-  test_for_zero(t3dg_2(2,0,1)-t2_1(2,1)
-		,"T3dg(i,Num,j)(0,2,1)");
-  test_for_zero(t3dg_2(2,0,2)-t2_1(2,2)
-		,"T3dg(i,Num,j)(0,2,2)");
-
-  t2_1(i,j)=t3dg_2(i,1,j);
-  test_for_zero(t3dg_2(0,1,0)-t2_1(0,0)
-		,"T3dg(i,Num,j)(1,0,0)");
-  test_for_zero(t3dg_2(0,1,1)-t2_1(0,1)
-		,"T3dg(i,Num,j)(1,0,1)");
-  test_for_zero(t3dg_2(0,1,2)-t2_1(0,2)
-		,"T3dg(i,Num,j)(1,0,2)");
-  test_for_zero(t3dg_2(1,1,0)-t2_1(1,0)
-		,"T3dg(i,Num,j)(1,1,0)");
-  test_for_zero(t3dg_2(1,1,1)-t2_1(1,1)
-		,"T3dg(i,Num,j)(1,1,1)");
-  test_for_zero(t3dg_2(1,1,2)-t2_1(1,2)
-		,"T3dg(i,Num,j)(1,1,2)");
-  test_for_zero(t3dg_2(2,1,0)-t2_1(2,0)
-		,"T3dg(i,Num,j)(1,2,0)");
-  test_for_zero(t3dg_2(2,1,1)-t2_1(2,1)
-		,"T3dg(i,Num,j)(1,2,1)");
-  test_for_zero(t3dg_2(2,1,2)-t2_1(2,2)
-		,"T3dg(i,Num,j)(1,2,2)");
-
-  t2_1(i,j)=t3dg_2(i,2,j);
-  test_for_zero(t3dg_2(0,2,0)-t2_1(0,0)
-		,"T3dg(i,Num,j)(2,0,0)");
-  test_for_zero(t3dg_2(0,2,1)-t2_1(0,1)
-		,"T3dg(i,Num,j)(2,0,1)");
-  test_for_zero(t3dg_2(0,2,2)-t2_1(0,2)
-		,"T3dg(i,Num,j)(2,0,2)");
-  test_for_zero(t3dg_2(1,2,0)-t2_1(1,0)
-		,"T3dg(i,Num,j)(2,1,0)");
-  test_for_zero(t3dg_2(1,2,1)-t2_1(1,1)
-		,"T3dg(i,Num,j)(2,1,1)");
-  test_for_zero(t3dg_2(1,2,2)-t2_1(1,2)
-		,"T3dg(i,Num,j)(2,1,2)");
-  test_for_zero(t3dg_2(2,2,0)-t2_1(2,0)
-		,"T3dg(i,Num,j)(2,2,0)");
-  test_for_zero(t3dg_2(2,2,1)-t2_1(2,1)
-		,"T3dg(i,Num,j)(2,2,1)");
-  test_for_zero(t3dg_2(2,2,2)-t2_1(2,2)
-		,"T3dg(i,Num,j)(2,2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgVIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgVIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,96 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  /* Now, test with actual numbers. */
+
+  t2_1(i,j)=t3dg_2(i,0,j);
+  test_for_zero(t3dg_2(0,0,0)-t2_1(0,0)
+		,"T3dg(i,Num,j)(0,0,0)");
+  test_for_zero(t3dg_2(0,0,1)-t2_1(0,1)
+		,"T3dg(i,Num,j)(0,0,1)");
+  test_for_zero(t3dg_2(0,0,2)-t2_1(0,2)
+		,"T3dg(i,Num,j)(0,0,2)");
+  test_for_zero(t3dg_2(1,0,0)-t2_1(1,0)
+		,"T3dg(i,Num,j)(0,1,0)");
+  test_for_zero(t3dg_2(1,0,1)-t2_1(1,1)
+		,"T3dg(i,Num,j)(0,1,1)");
+  test_for_zero(t3dg_2(1,0,2)-t2_1(1,2)
+		,"T3dg(i,Num,j)(0,1,2)");
+  test_for_zero(t3dg_2(2,0,0)-t2_1(2,0)
+		,"T3dg(i,Num,j)(0,2,0)");
+  test_for_zero(t3dg_2(2,0,1)-t2_1(2,1)
+		,"T3dg(i,Num,j)(0,2,1)");
+  test_for_zero(t3dg_2(2,0,2)-t2_1(2,2)
+		,"T3dg(i,Num,j)(0,2,2)");
+
+  t2_1(i,j)=t3dg_2(i,1,j);
+  test_for_zero(t3dg_2(0,1,0)-t2_1(0,0)
+		,"T3dg(i,Num,j)(1,0,0)");
+  test_for_zero(t3dg_2(0,1,1)-t2_1(0,1)
+		,"T3dg(i,Num,j)(1,0,1)");
+  test_for_zero(t3dg_2(0,1,2)-t2_1(0,2)
+		,"T3dg(i,Num,j)(1,0,2)");
+  test_for_zero(t3dg_2(1,1,0)-t2_1(1,0)
+		,"T3dg(i,Num,j)(1,1,0)");
+  test_for_zero(t3dg_2(1,1,1)-t2_1(1,1)
+		,"T3dg(i,Num,j)(1,1,1)");
+  test_for_zero(t3dg_2(1,1,2)-t2_1(1,2)
+		,"T3dg(i,Num,j)(1,1,2)");
+  test_for_zero(t3dg_2(2,1,0)-t2_1(2,0)
+		,"T3dg(i,Num,j)(1,2,0)");
+  test_for_zero(t3dg_2(2,1,1)-t2_1(2,1)
+		,"T3dg(i,Num,j)(1,2,1)");
+  test_for_zero(t3dg_2(2,1,2)-t2_1(2,2)
+		,"T3dg(i,Num,j)(1,2,2)");
+
+  t2_1(i,j)=t3dg_2(i,2,j);
+  test_for_zero(t3dg_2(0,2,0)-t2_1(0,0)
+		,"T3dg(i,Num,j)(2,0,0)");
+  test_for_zero(t3dg_2(0,2,1)-t2_1(0,1)
+		,"T3dg(i,Num,j)(2,0,1)");
+  test_for_zero(t3dg_2(0,2,2)-t2_1(0,2)
+		,"T3dg(i,Num,j)(2,0,2)");
+  test_for_zero(t3dg_2(1,2,0)-t2_1(1,0)
+		,"T3dg(i,Num,j)(2,1,0)");
+  test_for_zero(t3dg_2(1,2,1)-t2_1(1,1)
+		,"T3dg(i,Num,j)(2,1,1)");
+  test_for_zero(t3dg_2(1,2,2)-t2_1(1,2)
+		,"T3dg(i,Num,j)(2,1,2)");
+  test_for_zero(t3dg_2(2,2,0)-t2_1(2,0)
+		,"T3dg(i,Num,j)(2,2,0)");
+  test_for_zero(t3dg_2(2,2,1)-t2_1(2,1)
+		,"T3dg(i,Num,j)(2,2,1)");
+  test_for_zero(t3dg_2(2,2,2)-t2_1(2,2)
+		,"T3dg(i,Num,j)(2,2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgX.C
--- a/tests/conformance/T3dg/test_T3dgX.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t3dg_1(i,j,k)=10;
-  test_for_zero(t3dg_1(0,0,0) - 10
-		,"T3dg=T(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) - 10
-		,"T3dg=T(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) - 10
-		,"T3dg=T(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) - 10
-		,"T3dg=T(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - 10
-		,"T3dg=T(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) - 10
-		,"T3dg=T(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) - 10
-		,"T3dg=T(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) - 10
-		,"T3dg=T(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - 10
-		,"T3dg=T(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - 10
-		,"T3dg=T(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) - 10
-		,"T3dg=T(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) - 10
-		,"T3dg=T(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) - 10
-		,"T3dg=T(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - 10
-		,"T3dg=T(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) - 10
-		,"T3dg=T(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) - 10
-		,"T3dg=T(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) - 10
-		,"T3dg=T(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - 10
-		,"T3dg=T(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - 10
-		,"T3dg=T(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) - 10
-		,"T3dg=T(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) - 10
-		,"T3dg=T(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) - 10
-		,"T3dg=T(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - 10
-		,"T3dg=T(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) - 10
-		,"T3dg=T(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) - 10
-		,"T3dg=T(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) - 10
-		,"T3dg=T(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - 10
-		,"T3dg=T(2,2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgX.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgX.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,90 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t3dg_1(i,j,k)=10;
+  test_for_zero(t3dg_1(0,0,0) - 10
+		,"T3dg=T(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) - 10
+		,"T3dg=T(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) - 10
+		,"T3dg=T(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) - 10
+		,"T3dg=T(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - 10
+		,"T3dg=T(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) - 10
+		,"T3dg=T(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) - 10
+		,"T3dg=T(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) - 10
+		,"T3dg=T(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - 10
+		,"T3dg=T(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - 10
+		,"T3dg=T(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) - 10
+		,"T3dg=T(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) - 10
+		,"T3dg=T(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) - 10
+		,"T3dg=T(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - 10
+		,"T3dg=T(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) - 10
+		,"T3dg=T(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) - 10
+		,"T3dg=T(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) - 10
+		,"T3dg=T(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - 10
+		,"T3dg=T(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - 10
+		,"T3dg=T(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) - 10
+		,"T3dg=T(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) - 10
+		,"T3dg=T(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) - 10
+		,"T3dg=T(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - 10
+		,"T3dg=T(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) - 10
+		,"T3dg=T(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) - 10
+		,"T3dg=T(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) - 10
+		,"T3dg=T(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - 10
+		,"T3dg=T(2,2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXI.C
--- a/tests/conformance/T3dg/test_T3dgXI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t3dg_1(i,j,k)=t3dg_2(i,j,k)+t3dg_3(i,j,k);
-  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0) + t3dg_3(0,0,0))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(0,0,1) + t3dg_3(0,0,1))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(0,0,2) + t3dg_3(0,0,2))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,1,0) + t3dg_3(0,1,0))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(0,1,1) + t3dg_3(0,1,1))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(0,1,2) + t3dg_3(0,1,2))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,2,0) + t3dg_3(0,2,0))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(0,2,1) + t3dg_3(0,2,1))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(0,2,2) + t3dg_3(0,2,2))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(1,0,0) + t3dg_3(1,0,0))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,0,1) + t3dg_3(1,0,1))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(1,0,2) + t3dg_3(1,0,2))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(1,1,0) + t3dg_3(1,1,0))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,1) + t3dg_3(1,1,1))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(1,1,2) + t3dg_3(1,1,2))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(1,2,0) + t3dg_3(1,2,0))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,2,1) + t3dg_3(1,2,1))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(1,2,2) + t3dg_3(1,2,2))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(2,0,0) + t3dg_3(2,0,0))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(2,0,1) + t3dg_3(2,0,1))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,0,2) + t3dg_3(2,0,2))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(2,1,0) + t3dg_3(2,1,0))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(2,1,1) + t3dg_3(2,1,1))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,1,2) + t3dg_3(2,1,2))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(2,2,0) + t3dg_3(2,2,0))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(2,2,1) + t3dg_3(2,2,1))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,2) + t3dg_3(2,2,2))
-		,"T3dg(i,j,k)+T3dg(i,j,k)(2,2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,90 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t3dg_1(i,j,k)=t3dg_2(i,j,k)+t3dg_3(i,j,k);
+  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0) + t3dg_3(0,0,0))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(0,0,1) + t3dg_3(0,0,1))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(0,0,2) + t3dg_3(0,0,2))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,1,0) + t3dg_3(0,1,0))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(0,1,1) + t3dg_3(0,1,1))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(0,1,2) + t3dg_3(0,1,2))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,2,0) + t3dg_3(0,2,0))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(0,2,1) + t3dg_3(0,2,1))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(0,2,2) + t3dg_3(0,2,2))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(1,0,0) + t3dg_3(1,0,0))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,0,1) + t3dg_3(1,0,1))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(1,0,2) + t3dg_3(1,0,2))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(1,1,0) + t3dg_3(1,1,0))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,1) + t3dg_3(1,1,1))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(1,1,2) + t3dg_3(1,1,2))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(1,2,0) + t3dg_3(1,2,0))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,2,1) + t3dg_3(1,2,1))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(1,2,2) + t3dg_3(1,2,2))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(2,0,0) + t3dg_3(2,0,0))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(2,0,1) + t3dg_3(2,0,1))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,0,2) + t3dg_3(2,0,2))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(2,1,0) + t3dg_3(2,1,0))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(2,1,1) + t3dg_3(2,1,1))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,1,2) + t3dg_3(2,1,2))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(2,2,0) + t3dg_3(2,2,0))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(2,2,1) + t3dg_3(2,2,1))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,2) + t3dg_3(2,2,2))
+		,"T3dg(i,j,k)+T3dg(i,j,k)(2,2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXII.C
--- a/tests/conformance/T3dg/test_T3dgXII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t3dg_1(i,j,k)=t3dg_2(i,j,k)-t3dg_3(i,j,k);
-  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0) - t3dg_3(0,0,0))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(0,0,1) - t3dg_3(0,0,1))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(0,0,2) - t3dg_3(0,0,2))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,1,0) - t3dg_3(0,1,0))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(0,1,1) - t3dg_3(0,1,1))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(0,1,2) - t3dg_3(0,1,2))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,2,0) - t3dg_3(0,2,0))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(0,2,1) - t3dg_3(0,2,1))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(0,2,2) - t3dg_3(0,2,2))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(1,0,0) - t3dg_3(1,0,0))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,0,1) - t3dg_3(1,0,1))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(1,0,2) - t3dg_3(1,0,2))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(1,1,0) - t3dg_3(1,1,0))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,1) - t3dg_3(1,1,1))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(1,1,2) - t3dg_3(1,1,2))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(1,2,0) - t3dg_3(1,2,0))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,2,1) - t3dg_3(1,2,1))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(1,2,2) - t3dg_3(1,2,2))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(2,0,0) - t3dg_3(2,0,0))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(2,0,1) - t3dg_3(2,0,1))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,0,2) - t3dg_3(2,0,2))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(2,1,0) - t3dg_3(2,1,0))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(2,1,1) - t3dg_3(2,1,1))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,1,2) - t3dg_3(2,1,2))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(2,2,0) - t3dg_3(2,2,0))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(2,2,1) - t3dg_3(2,2,1))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,2) - t3dg_3(2,2,2))
-		,"T3dg(i,j,k)-T3dg(i,j,k)(2,2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,90 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t3dg_1(i,j,k)=t3dg_2(i,j,k)-t3dg_3(i,j,k);
+  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0) - t3dg_3(0,0,0))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(0,0,1) - t3dg_3(0,0,1))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(0,0,2) - t3dg_3(0,0,2))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,1,0) - t3dg_3(0,1,0))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(0,1,1) - t3dg_3(0,1,1))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(0,1,2) - t3dg_3(0,1,2))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,2,0) - t3dg_3(0,2,0))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(0,2,1) - t3dg_3(0,2,1))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(0,2,2) - t3dg_3(0,2,2))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(1,0,0) - t3dg_3(1,0,0))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,0,1) - t3dg_3(1,0,1))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(1,0,2) - t3dg_3(1,0,2))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(1,1,0) - t3dg_3(1,1,0))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,1) - t3dg_3(1,1,1))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(1,1,2) - t3dg_3(1,1,2))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(1,2,0) - t3dg_3(1,2,0))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,2,1) - t3dg_3(1,2,1))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(1,2,2) - t3dg_3(1,2,2))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(2,0,0) - t3dg_3(2,0,0))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(2,0,1) - t3dg_3(2,0,1))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,0,2) - t3dg_3(2,0,2))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(2,1,0) - t3dg_3(2,1,0))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(2,1,1) - t3dg_3(2,1,1))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,1,2) - t3dg_3(2,1,2))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(2,2,0) - t3dg_3(2,2,0))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(2,2,1) - t3dg_3(2,2,1))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,2) - t3dg_3(2,2,2))
+		,"T3dg(i,j,k)-T3dg(i,j,k)(2,2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXIII.C
--- a/tests/conformance/T3dg/test_T3dgXIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t3dg_1(i,j,k)=t3dg_2(i,j,k)+t3dg_3(j,i,k);
-  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0) + t3dg_3(0,0,0))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(0,0,1) + t3dg_3(0,0,1))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(0,0,2) + t3dg_3(0,0,2))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,1,0) + t3dg_3(0,1,0))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(0,1,1) + t3dg_3(0,1,1))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(0,1,2) + t3dg_3(0,1,2))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,2,0) + t3dg_3(0,2,0))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(0,2,1) + t3dg_3(0,2,1))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(0,2,2) + t3dg_3(0,2,2))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(1,0,0) + t3dg_3(1,0,0))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,0,1) + t3dg_3(1,0,1))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(1,0,2) + t3dg_3(1,0,2))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(1,1,0) + t3dg_3(1,1,0))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,1) + t3dg_3(1,1,1))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(1,1,2) + t3dg_3(1,1,2))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(1,2,0) + t3dg_3(1,2,0))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,2,1) + t3dg_3(1,2,1))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(1,2,2) + t3dg_3(1,2,2))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(2,0,0) + t3dg_3(2,0,0))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(2,0,1) + t3dg_3(2,0,1))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,0,2) + t3dg_3(2,0,2))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(2,1,0) + t3dg_3(2,1,0))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(2,1,1) + t3dg_3(2,1,1))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,1,2) + t3dg_3(2,1,2))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(2,2,0) + t3dg_3(2,2,0))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(2,2,1) + t3dg_3(2,2,1))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,2) + t3dg_3(2,2,2))
-		,"T3dg(i,j,k)+T3dg(j,i,k)(2,2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,90 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t3dg_1(i,j,k)=t3dg_2(i,j,k)+t3dg_3(j,i,k);
+  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0) + t3dg_3(0,0,0))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(0,0,1) + t3dg_3(0,0,1))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(0,0,2) + t3dg_3(0,0,2))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,1,0) + t3dg_3(0,1,0))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(0,1,1) + t3dg_3(0,1,1))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(0,1,2) + t3dg_3(0,1,2))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,2,0) + t3dg_3(0,2,0))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(0,2,1) + t3dg_3(0,2,1))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(0,2,2) + t3dg_3(0,2,2))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(1,0,0) + t3dg_3(1,0,0))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,0,1) + t3dg_3(1,0,1))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(1,0,2) + t3dg_3(1,0,2))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(1,1,0) + t3dg_3(1,1,0))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,1) + t3dg_3(1,1,1))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(1,1,2) + t3dg_3(1,1,2))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(1,2,0) + t3dg_3(1,2,0))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,2,1) + t3dg_3(1,2,1))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(1,2,2) + t3dg_3(1,2,2))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(2,0,0) + t3dg_3(2,0,0))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(2,0,1) + t3dg_3(2,0,1))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,0,2) + t3dg_3(2,0,2))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(2,1,0) + t3dg_3(2,1,0))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(2,1,1) + t3dg_3(2,1,1))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,1,2) + t3dg_3(2,1,2))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(2,2,0) + t3dg_3(2,2,0))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(2,2,1) + t3dg_3(2,2,1))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,2) + t3dg_3(2,2,2))
+		,"T3dg(i,j,k)+T3dg(j,i,k)(2,2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXIV.C
--- a/tests/conformance/T3dg/test_T3dgXIV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t3dg_1(i,j,k)=-t3dg_2(i,j,k);
-  test_for_zero(t3dg_1(0,0,0) + t3dg_2(0,0,0)
-		,"-T3dg(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) + t3dg_2(0,0,1)
-		,"-T3dg(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) + t3dg_2(0,0,2)
-		,"-T3dg(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) + t3dg_2(0,1,0)
-		,"-T3dg(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) + t3dg_2(0,1,1)
-		,"-T3dg(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) + t3dg_2(0,1,2)
-		,"-T3dg(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) + t3dg_2(0,2,0)
-		,"-T3dg(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) + t3dg_2(0,2,1)
-		,"-T3dg(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) + t3dg_2(0,2,2)
-		,"-T3dg(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) + t3dg_2(1,0,0)
-		,"-T3dg(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) + t3dg_2(1,0,1)
-		,"-T3dg(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) + t3dg_2(1,0,2)
-		,"-T3dg(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) + t3dg_2(1,1,0)
-		,"-T3dg(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) + t3dg_2(1,1,1)
-		,"-T3dg(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) + t3dg_2(1,1,2)
-		,"-T3dg(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) + t3dg_2(1,2,0)
-		,"-T3dg(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) + t3dg_2(1,2,1)
-		,"-T3dg(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) + t3dg_2(1,2,2)
-		,"-T3dg(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) + t3dg_2(2,0,0)
-		,"-T3dg(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) + t3dg_2(2,0,1)
-		,"-T3dg(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) + t3dg_2(2,0,2)
-		,"-T3dg(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) + t3dg_2(2,1,0)
-		,"-T3dg(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) + t3dg_2(2,1,1)
-		,"-T3dg(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) + t3dg_2(2,1,2)
-		,"-T3dg(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) + t3dg_2(2,2,0)
-		,"-T3dg(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) + t3dg_2(2,2,1)
-		,"-T3dg(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) + t3dg_2(2,2,2)
-		,"-T3dg(2,2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXIV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXIV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,90 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t3dg_1(i,j,k)=-t3dg_2(i,j,k);
+  test_for_zero(t3dg_1(0,0,0) + t3dg_2(0,0,0)
+		,"-T3dg(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) + t3dg_2(0,0,1)
+		,"-T3dg(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) + t3dg_2(0,0,2)
+		,"-T3dg(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) + t3dg_2(0,1,0)
+		,"-T3dg(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) + t3dg_2(0,1,1)
+		,"-T3dg(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) + t3dg_2(0,1,2)
+		,"-T3dg(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) + t3dg_2(0,2,0)
+		,"-T3dg(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) + t3dg_2(0,2,1)
+		,"-T3dg(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) + t3dg_2(0,2,2)
+		,"-T3dg(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) + t3dg_2(1,0,0)
+		,"-T3dg(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) + t3dg_2(1,0,1)
+		,"-T3dg(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) + t3dg_2(1,0,2)
+		,"-T3dg(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) + t3dg_2(1,1,0)
+		,"-T3dg(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) + t3dg_2(1,1,1)
+		,"-T3dg(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) + t3dg_2(1,1,2)
+		,"-T3dg(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) + t3dg_2(1,2,0)
+		,"-T3dg(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) + t3dg_2(1,2,1)
+		,"-T3dg(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) + t3dg_2(1,2,2)
+		,"-T3dg(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) + t3dg_2(2,0,0)
+		,"-T3dg(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) + t3dg_2(2,0,1)
+		,"-T3dg(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) + t3dg_2(2,0,2)
+		,"-T3dg(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) + t3dg_2(2,1,0)
+		,"-T3dg(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) + t3dg_2(2,1,1)
+		,"-T3dg(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) + t3dg_2(2,1,2)
+		,"-T3dg(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) + t3dg_2(2,2,0)
+		,"-T3dg(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) + t3dg_2(2,2,1)
+		,"-T3dg(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) + t3dg_2(2,2,2)
+		,"-T3dg(2,2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXIX.C
--- a/tests/conformance/T3dg/test_T3dgXIX.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,110 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t2_1(i,j)=t3dg_2(k,i,j)*t1_2(k);
-  test_for_zero(t2_1(0,0) - (t3dg_2(0,0,0)*t1_2(0)
-			     + t3dg_2(1,0,0)*t1_2(1)
-			     + t3dg_2(2,0,0)*t1_2(2))
-		,"T3dg(k,i,j)*T1(k)(0,0)");
-  test_for_zero(t2_1(0,1) - (t3dg_2(0,0,1)*t1_2(0)
-			     + t3dg_2(1,0,1)*t1_2(1)
-			     + t3dg_2(2,0,1)*t1_2(2))
-		,"T3dg(k,i,j)*T1(k)(0,1)");
-  test_for_zero(t2_1(0,2) - (t3dg_2(0,0,2)*t1_2(0)
-			     + t3dg_2(1,0,2)*t1_2(1)
-			     + t3dg_2(2,0,2)*t1_2(2))
-		,"T3dg(k,i,j)*T1(k)(0,2)");
-  test_for_zero(t2_1(1,0) - (t3dg_2(0,1,0)*t1_2(0)
-			     + t3dg_2(1,1,0)*t1_2(1)
-			     + t3dg_2(2,1,0)*t1_2(2))
-		,"T3dg(k,i,j)*T1(k)(1,0)");
-  test_for_zero(t2_1(1,1) - (t3dg_2(0,1,1)*t1_2(0)
-			     + t3dg_2(1,1,1)*t1_2(1)
-			     + t3dg_2(2,1,1)*t1_2(2))
-		,"T3dg(k,i,j)*T1(k)(1,1)");
-  test_for_zero(t2_1(1,2) - (t3dg_2(0,1,2)*t1_2(0)
-			     + t3dg_2(1,1,2)*t1_2(1)
-			     + t3dg_2(2,1,2)*t1_2(2))
-		,"T3dg(k,i,j)*T1(k)(1,2)");
-  test_for_zero(t2_1(2,0) - (t3dg_2(0,2,0)*t1_2(0)
-			     + t3dg_2(1,2,0)*t1_2(1)
-			     + t3dg_2(2,2,0)*t1_2(2))
-		,"T3dg(k,i,j)*T1(k)(2,0)");
-  test_for_zero(t2_1(2,1) - (t3dg_2(0,2,1)*t1_2(0)
-			     + t3dg_2(1,2,1)*t1_2(1)
-			     + t3dg_2(2,2,1)*t1_2(2))
-		,"T3dg(k,i,j)*T1(k)(2,1)");
-  test_for_zero(t2_1(2,2) - (t3dg_2(0,2,2)*t1_2(0)
-			     + t3dg_2(1,2,2)*t1_2(1)
-			     + t3dg_2(2,2,2)*t1_2(2))
-		,"T3dg(k,i,j)*T1(k)(2,2)");
-
-  t2_1(i,j)=t1_2(k)*t3dg_3(k,i,j);
-  test_for_zero(t2_1(0,0) - (t3dg_3(0,0,0)*t1_2(0)
-			     + t3dg_3(1,0,0)*t1_2(1)
-			     + t3dg_3(2,0,0)*t1_2(2))
-		,"T1(k)*T3dg(k,i,j)(0,0)");
-  test_for_zero(t2_1(0,1) - (t3dg_3(0,0,1)*t1_2(0)
-			     + t3dg_3(1,0,1)*t1_2(1)
-			     + t3dg_3(2,0,1)*t1_2(2))
-		,"T1(k)*T3dg(k,i,j)(0,1)");
-  test_for_zero(t2_1(0,2) - (t3dg_3(0,0,2)*t1_2(0)
-			     + t3dg_3(1,0,2)*t1_2(1)
-			     + t3dg_3(2,0,2)*t1_2(2))
-		,"T1(k)*T3dg(k,i,j)(0,2)");
-  test_for_zero(t2_1(1,0) - (t3dg_3(0,1,0)*t1_2(0)
-			     + t3dg_3(1,1,0)*t1_2(1)
-			     + t3dg_3(2,1,0)*t1_2(2))
-		,"T1(k)*T3dg(k,i,j)(1,0)");
-  test_for_zero(t2_1(1,1) - (t3dg_3(0,1,1)*t1_2(0)
-			     + t3dg_3(1,1,1)*t1_2(1)
-			     + t3dg_3(2,1,1)*t1_2(2))
-		,"T1(k)*T3dg(k,i,j)(1,1)");
-  test_for_zero(t2_1(1,2) - (t3dg_3(0,1,2)*t1_2(0)
-			     + t3dg_3(1,1,2)*t1_2(1)
-			     + t3dg_3(2,1,2)*t1_2(2))
-		,"T1(k)*T3dg(k,i,j)(1,2)");
-  test_for_zero(t2_1(2,0) - (t3dg_3(0,2,0)*t1_2(0)
-			     + t3dg_3(1,2,0)*t1_2(1)
-			     + t3dg_3(2,2,0)*t1_2(2))
-		,"T1(k)*T3dg(k,i,j)(2,0)");
-  test_for_zero(t2_1(2,1) - (t3dg_3(0,2,1)*t1_2(0)
-			     + t3dg_3(1,2,1)*t1_2(1)
-			     + t3dg_3(2,2,1)*t1_2(2))
-		,"T1(k)*T3dg(k,i,j)(2,1)");
-  test_for_zero(t2_1(2,2) - (t3dg_3(0,2,2)*t1_2(0)
-			     + t3dg_3(1,2,2)*t1_2(1)
-			     + t3dg_3(2,2,2)*t1_2(2))
-		,"T1(k)*T3dg(k,i,j)(2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXIX.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXIX.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,110 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t2_1(i,j)=t3dg_2(k,i,j)*t1_2(k);
+  test_for_zero(t2_1(0,0) - (t3dg_2(0,0,0)*t1_2(0)
+			     + t3dg_2(1,0,0)*t1_2(1)
+			     + t3dg_2(2,0,0)*t1_2(2))
+		,"T3dg(k,i,j)*T1(k)(0,0)");
+  test_for_zero(t2_1(0,1) - (t3dg_2(0,0,1)*t1_2(0)
+			     + t3dg_2(1,0,1)*t1_2(1)
+			     + t3dg_2(2,0,1)*t1_2(2))
+		,"T3dg(k,i,j)*T1(k)(0,1)");
+  test_for_zero(t2_1(0,2) - (t3dg_2(0,0,2)*t1_2(0)
+			     + t3dg_2(1,0,2)*t1_2(1)
+			     + t3dg_2(2,0,2)*t1_2(2))
+		,"T3dg(k,i,j)*T1(k)(0,2)");
+  test_for_zero(t2_1(1,0) - (t3dg_2(0,1,0)*t1_2(0)
+			     + t3dg_2(1,1,0)*t1_2(1)
+			     + t3dg_2(2,1,0)*t1_2(2))
+		,"T3dg(k,i,j)*T1(k)(1,0)");
+  test_for_zero(t2_1(1,1) - (t3dg_2(0,1,1)*t1_2(0)
+			     + t3dg_2(1,1,1)*t1_2(1)
+			     + t3dg_2(2,1,1)*t1_2(2))
+		,"T3dg(k,i,j)*T1(k)(1,1)");
+  test_for_zero(t2_1(1,2) - (t3dg_2(0,1,2)*t1_2(0)
+			     + t3dg_2(1,1,2)*t1_2(1)
+			     + t3dg_2(2,1,2)*t1_2(2))
+		,"T3dg(k,i,j)*T1(k)(1,2)");
+  test_for_zero(t2_1(2,0) - (t3dg_2(0,2,0)*t1_2(0)
+			     + t3dg_2(1,2,0)*t1_2(1)
+			     + t3dg_2(2,2,0)*t1_2(2))
+		,"T3dg(k,i,j)*T1(k)(2,0)");
+  test_for_zero(t2_1(2,1) - (t3dg_2(0,2,1)*t1_2(0)
+			     + t3dg_2(1,2,1)*t1_2(1)
+			     + t3dg_2(2,2,1)*t1_2(2))
+		,"T3dg(k,i,j)*T1(k)(2,1)");
+  test_for_zero(t2_1(2,2) - (t3dg_2(0,2,2)*t1_2(0)
+			     + t3dg_2(1,2,2)*t1_2(1)
+			     + t3dg_2(2,2,2)*t1_2(2))
+		,"T3dg(k,i,j)*T1(k)(2,2)");
+
+  t2_1(i,j)=t1_2(k)*t3dg_3(k,i,j);
+  test_for_zero(t2_1(0,0) - (t3dg_3(0,0,0)*t1_2(0)
+			     + t3dg_3(1,0,0)*t1_2(1)
+			     + t3dg_3(2,0,0)*t1_2(2))
+		,"T1(k)*T3dg(k,i,j)(0,0)");
+  test_for_zero(t2_1(0,1) - (t3dg_3(0,0,1)*t1_2(0)
+			     + t3dg_3(1,0,1)*t1_2(1)
+			     + t3dg_3(2,0,1)*t1_2(2))
+		,"T1(k)*T3dg(k,i,j)(0,1)");
+  test_for_zero(t2_1(0,2) - (t3dg_3(0,0,2)*t1_2(0)
+			     + t3dg_3(1,0,2)*t1_2(1)
+			     + t3dg_3(2,0,2)*t1_2(2))
+		,"T1(k)*T3dg(k,i,j)(0,2)");
+  test_for_zero(t2_1(1,0) - (t3dg_3(0,1,0)*t1_2(0)
+			     + t3dg_3(1,1,0)*t1_2(1)
+			     + t3dg_3(2,1,0)*t1_2(2))
+		,"T1(k)*T3dg(k,i,j)(1,0)");
+  test_for_zero(t2_1(1,1) - (t3dg_3(0,1,1)*t1_2(0)
+			     + t3dg_3(1,1,1)*t1_2(1)
+			     + t3dg_3(2,1,1)*t1_2(2))
+		,"T1(k)*T3dg(k,i,j)(1,1)");
+  test_for_zero(t2_1(1,2) - (t3dg_3(0,1,2)*t1_2(0)
+			     + t3dg_3(1,1,2)*t1_2(1)
+			     + t3dg_3(2,1,2)*t1_2(2))
+		,"T1(k)*T3dg(k,i,j)(1,2)");
+  test_for_zero(t2_1(2,0) - (t3dg_3(0,2,0)*t1_2(0)
+			     + t3dg_3(1,2,0)*t1_2(1)
+			     + t3dg_3(2,2,0)*t1_2(2))
+		,"T1(k)*T3dg(k,i,j)(2,0)");
+  test_for_zero(t2_1(2,1) - (t3dg_3(0,2,1)*t1_2(0)
+			     + t3dg_3(1,2,1)*t1_2(1)
+			     + t3dg_3(2,2,1)*t1_2(2))
+		,"T1(k)*T3dg(k,i,j)(2,1)");
+  test_for_zero(t2_1(2,2) - (t3dg_3(0,2,2)*t1_2(0)
+			     + t3dg_3(1,2,2)*t1_2(1)
+			     + t3dg_3(2,2,2)*t1_2(2))
+		,"T1(k)*T3dg(k,i,j)(2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXV.C
--- a/tests/conformance/T3dg/test_T3dgXV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,146 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t3dg_1(i,j,k)=(t3dg_2(i,j,k)&t1_2(k));
-  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0)*t1_2(0))
-		,"T3dg(i,j,k)&T1(k)(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(0,0,1)*t1_2(1))
-		,"T3dg(i,j,k)&T1(k)(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(0,0,2)*t1_2(2))
-		,"T3dg(i,j,k)&T1(k)(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,1,0)*t1_2(0))
-		,"T3dg(i,j,k)&T1(k)(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(0,1,1)*t1_2(1))
-		,"T3dg(i,j,k)&T1(k)(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(0,1,2)*t1_2(2))
-		,"T3dg(i,j,k)&T1(k)(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,2,0)*t1_2(0))
-		,"T3dg(i,j,k)&T1(k)(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(0,2,1)*t1_2(1))
-		,"T3dg(i,j,k)&T1(k)(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(0,2,2)*t1_2(2))
-		,"T3dg(i,j,k)&T1(k)(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(1,0,0)*t1_2(0))
-		,"T3dg(i,j,k)&T1(k)(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,0,1)*t1_2(1))
-		,"T3dg(i,j,k)&T1(k)(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(1,0,2)*t1_2(2))
-		,"T3dg(i,j,k)&T1(k)(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(1,1,0)*t1_2(0))
-		,"T3dg(i,j,k)&T1(k)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,1)*t1_2(1))
-		,"T3dg(i,j,k)&T1(k)(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(1,1,2)*t1_2(2))
-		,"T3dg(i,j,k)&T1(k)(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(1,2,0)*t1_2(0))
-		,"T3dg(i,j,k)&T1(k)(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,2,1)*t1_2(1))
-		,"T3dg(i,j,k)&T1(k)(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(1,2,2)*t1_2(2))
-		,"T3dg(i,j,k)&T1(k)(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(2,0,0)*t1_2(0))
-		,"T3dg(i,j,k)&T1(k)(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(2,0,1)*t1_2(1))
-		,"T3dg(i,j,k)&T1(k)(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,0,2)*t1_2(2))
-		,"T3dg(i,j,k)&T1(k)(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(2,1,0)*t1_2(0))
-		,"T3dg(i,j,k)&T1(k)(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(2,1,1)*t1_2(1))
-		,"T3dg(i,j,k)&T1(k)(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,1,2)*t1_2(2))
-		,"T3dg(i,j,k)&T1(k)(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(2,2,0)*t1_2(0))
-		,"T3dg(i,j,k)&T1(k)(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(2,2,1)*t1_2(1))
-		,"T3dg(i,j,k)&T1(k)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,2)*t1_2(2))
-		,"T3dg(i,j,k)&T1(k)(2,2,2)");
-
-  t3dg_1(i,j,k)=(t1_2(k)&t3dg_3(i,j,k));
-  test_for_zero(t3dg_1(0,0,0) - (t3dg_3(0,0,0)*t1_2(0))
-		,"T1(k)&T3dg(i,j,k)(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) - (t3dg_3(0,0,1)*t1_2(1))
-		,"T1(k)&T3dg(i,j,k)(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) - (t3dg_3(0,0,2)*t1_2(2))
-		,"T1(k)&T3dg(i,j,k)(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) - (t3dg_3(0,1,0)*t1_2(0))
-		,"T1(k)&T3dg(i,j,k)(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - (t3dg_3(0,1,1)*t1_2(1))
-		,"T1(k)&T3dg(i,j,k)(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) - (t3dg_3(0,1,2)*t1_2(2))
-		,"T1(k)&T3dg(i,j,k)(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) - (t3dg_3(0,2,0)*t1_2(0))
-		,"T1(k)&T3dg(i,j,k)(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) - (t3dg_3(0,2,1)*t1_2(1))
-		,"T1(k)&T3dg(i,j,k)(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - (t3dg_3(0,2,2)*t1_2(2))
-		,"T1(k)&T3dg(i,j,k)(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - (t3dg_3(1,0,0)*t1_2(0))
-		,"T1(k)&T3dg(i,j,k)(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) - (t3dg_3(1,0,1)*t1_2(1))
-		,"T1(k)&T3dg(i,j,k)(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) - (t3dg_3(1,0,2)*t1_2(2))
-		,"T1(k)&T3dg(i,j,k)(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) - (t3dg_3(1,1,0)*t1_2(0))
-		,"T1(k)&T3dg(i,j,k)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - (t3dg_3(1,1,1)*t1_2(1))
-		,"T1(k)&T3dg(i,j,k)(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) - (t3dg_3(1,1,2)*t1_2(2))
-		,"T1(k)&T3dg(i,j,k)(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) - (t3dg_3(1,2,0)*t1_2(0))
-		,"T1(k)&T3dg(i,j,k)(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) - (t3dg_3(1,2,1)*t1_2(1))
-		,"T1(k)&T3dg(i,j,k)(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - (t3dg_3(1,2,2)*t1_2(2))
-		,"T1(k)&T3dg(i,j,k)(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - (t3dg_3(2,0,0)*t1_2(0))
-		,"T1(k)&T3dg(i,j,k)(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) - (t3dg_3(2,0,1)*t1_2(1))
-		,"T1(k)&T3dg(i,j,k)(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) - (t3dg_3(2,0,2)*t1_2(2))
-		,"T1(k)&T3dg(i,j,k)(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) - (t3dg_3(2,1,0)*t1_2(0))
-		,"T1(k)&T3dg(i,j,k)(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - (t3dg_3(2,1,1)*t1_2(1))
-		,"T1(k)&T3dg(i,j,k)(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) - (t3dg_3(2,1,2)*t1_2(2))
-		,"T1(k)&T3dg(i,j,k)(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) - (t3dg_3(2,2,0)*t1_2(0))
-		,"T1(k)&T3dg(i,j,k)(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) - (t3dg_3(2,2,1)*t1_2(1))
-		,"T1(k)&T3dg(i,j,k)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - (t3dg_3(2,2,2)*t1_2(2))
-		,"T1(k)&T3dg(i,j,k)(2,2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,146 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t3dg_1(i,j,k)=(t3dg_2(i,j,k)&t1_2(k));
+  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0)*t1_2(0))
+		,"T3dg(i,j,k)&T1(k)(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(0,0,1)*t1_2(1))
+		,"T3dg(i,j,k)&T1(k)(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(0,0,2)*t1_2(2))
+		,"T3dg(i,j,k)&T1(k)(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,1,0)*t1_2(0))
+		,"T3dg(i,j,k)&T1(k)(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(0,1,1)*t1_2(1))
+		,"T3dg(i,j,k)&T1(k)(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(0,1,2)*t1_2(2))
+		,"T3dg(i,j,k)&T1(k)(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,2,0)*t1_2(0))
+		,"T3dg(i,j,k)&T1(k)(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(0,2,1)*t1_2(1))
+		,"T3dg(i,j,k)&T1(k)(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(0,2,2)*t1_2(2))
+		,"T3dg(i,j,k)&T1(k)(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(1,0,0)*t1_2(0))
+		,"T3dg(i,j,k)&T1(k)(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,0,1)*t1_2(1))
+		,"T3dg(i,j,k)&T1(k)(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(1,0,2)*t1_2(2))
+		,"T3dg(i,j,k)&T1(k)(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(1,1,0)*t1_2(0))
+		,"T3dg(i,j,k)&T1(k)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,1)*t1_2(1))
+		,"T3dg(i,j,k)&T1(k)(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(1,1,2)*t1_2(2))
+		,"T3dg(i,j,k)&T1(k)(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(1,2,0)*t1_2(0))
+		,"T3dg(i,j,k)&T1(k)(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,2,1)*t1_2(1))
+		,"T3dg(i,j,k)&T1(k)(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(1,2,2)*t1_2(2))
+		,"T3dg(i,j,k)&T1(k)(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(2,0,0)*t1_2(0))
+		,"T3dg(i,j,k)&T1(k)(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(2,0,1)*t1_2(1))
+		,"T3dg(i,j,k)&T1(k)(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,0,2)*t1_2(2))
+		,"T3dg(i,j,k)&T1(k)(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(2,1,0)*t1_2(0))
+		,"T3dg(i,j,k)&T1(k)(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(2,1,1)*t1_2(1))
+		,"T3dg(i,j,k)&T1(k)(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,1,2)*t1_2(2))
+		,"T3dg(i,j,k)&T1(k)(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(2,2,0)*t1_2(0))
+		,"T3dg(i,j,k)&T1(k)(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(2,2,1)*t1_2(1))
+		,"T3dg(i,j,k)&T1(k)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,2)*t1_2(2))
+		,"T3dg(i,j,k)&T1(k)(2,2,2)");
+
+  t3dg_1(i,j,k)=(t1_2(k)&t3dg_3(i,j,k));
+  test_for_zero(t3dg_1(0,0,0) - (t3dg_3(0,0,0)*t1_2(0))
+		,"T1(k)&T3dg(i,j,k)(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) - (t3dg_3(0,0,1)*t1_2(1))
+		,"T1(k)&T3dg(i,j,k)(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) - (t3dg_3(0,0,2)*t1_2(2))
+		,"T1(k)&T3dg(i,j,k)(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) - (t3dg_3(0,1,0)*t1_2(0))
+		,"T1(k)&T3dg(i,j,k)(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - (t3dg_3(0,1,1)*t1_2(1))
+		,"T1(k)&T3dg(i,j,k)(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) - (t3dg_3(0,1,2)*t1_2(2))
+		,"T1(k)&T3dg(i,j,k)(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) - (t3dg_3(0,2,0)*t1_2(0))
+		,"T1(k)&T3dg(i,j,k)(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) - (t3dg_3(0,2,1)*t1_2(1))
+		,"T1(k)&T3dg(i,j,k)(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - (t3dg_3(0,2,2)*t1_2(2))
+		,"T1(k)&T3dg(i,j,k)(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - (t3dg_3(1,0,0)*t1_2(0))
+		,"T1(k)&T3dg(i,j,k)(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) - (t3dg_3(1,0,1)*t1_2(1))
+		,"T1(k)&T3dg(i,j,k)(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) - (t3dg_3(1,0,2)*t1_2(2))
+		,"T1(k)&T3dg(i,j,k)(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) - (t3dg_3(1,1,0)*t1_2(0))
+		,"T1(k)&T3dg(i,j,k)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - (t3dg_3(1,1,1)*t1_2(1))
+		,"T1(k)&T3dg(i,j,k)(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) - (t3dg_3(1,1,2)*t1_2(2))
+		,"T1(k)&T3dg(i,j,k)(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) - (t3dg_3(1,2,0)*t1_2(0))
+		,"T1(k)&T3dg(i,j,k)(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) - (t3dg_3(1,2,1)*t1_2(1))
+		,"T1(k)&T3dg(i,j,k)(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - (t3dg_3(1,2,2)*t1_2(2))
+		,"T1(k)&T3dg(i,j,k)(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - (t3dg_3(2,0,0)*t1_2(0))
+		,"T1(k)&T3dg(i,j,k)(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) - (t3dg_3(2,0,1)*t1_2(1))
+		,"T1(k)&T3dg(i,j,k)(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) - (t3dg_3(2,0,2)*t1_2(2))
+		,"T1(k)&T3dg(i,j,k)(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) - (t3dg_3(2,1,0)*t1_2(0))
+		,"T1(k)&T3dg(i,j,k)(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - (t3dg_3(2,1,1)*t1_2(1))
+		,"T1(k)&T3dg(i,j,k)(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) - (t3dg_3(2,1,2)*t1_2(2))
+		,"T1(k)&T3dg(i,j,k)(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) - (t3dg_3(2,2,0)*t1_2(0))
+		,"T1(k)&T3dg(i,j,k)(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) - (t3dg_3(2,2,1)*t1_2(1))
+		,"T1(k)&T3dg(i,j,k)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - (t3dg_3(2,2,2)*t1_2(2))
+		,"T1(k)&T3dg(i,j,k)(2,2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXVI.C
--- a/tests/conformance/T3dg/test_T3dgXVI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,146 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t3dg_1(i,j,k)=t3dg_2(i,j,k)*10;
-  test_for_zero(t3dg_1(0,0,0) - t3dg_2(0,0,0)*10
-		,"T3dg*T(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) - t3dg_2(0,0,1)*10
-		,"T3dg*T(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) - t3dg_2(0,0,2)*10
-		,"T3dg*T(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) - t3dg_2(0,1,0)*10
-		,"T3dg*T(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - t3dg_2(0,1,1)*10
-		,"T3dg*T(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) - t3dg_2(0,1,2)*10
-		,"T3dg*T(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) - t3dg_2(0,2,0)*10
-		,"T3dg*T(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) - t3dg_2(0,2,1)*10
-		,"T3dg*T(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - t3dg_2(0,2,2)*10
-		,"T3dg*T(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - t3dg_2(1,0,0)*10
-		,"T3dg*T(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) - t3dg_2(1,0,1)*10
-		,"T3dg*T(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) - t3dg_2(1,0,2)*10
-		,"T3dg*T(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) - t3dg_2(1,1,0)*10
-		,"T3dg*T(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - t3dg_2(1,1,1)*10
-		,"T3dg*T(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) - t3dg_2(1,1,2)*10
-		,"T3dg*T(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) - t3dg_2(1,2,0)*10
-		,"T3dg*T(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) - t3dg_2(1,2,1)*10
-		,"T3dg*T(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - t3dg_2(1,2,2)*10
-		,"T3dg*T(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - t3dg_2(2,0,0)*10
-		,"T3dg*T(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) - t3dg_2(2,0,1)*10
-		,"T3dg*T(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) - t3dg_2(2,0,2)*10
-		,"T3dg*T(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) - t3dg_2(2,1,0)*10
-		,"T3dg*T(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - t3dg_2(2,1,1)*10
-		,"T3dg*T(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) - t3dg_2(2,1,2)*10
-		,"T3dg*T(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) - t3dg_2(2,2,0)*10
-		,"T3dg*T(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) - t3dg_2(2,2,1)*10
-		,"T3dg*T(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - t3dg_2(2,2,2)*10
-		,"T3dg*T(2,2,2)");
-
-  t3dg_1(i,j,k)=t3dg_2(i,j,k)/10;
-  test_for_zero(t3dg_1(0,0,0) - t3dg_2(0,0,0)/10
-		,"T3dg/T(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) - t3dg_2(0,0,1)/10
-		,"T3dg/T(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) - t3dg_2(0,0,2)/10
-		,"T3dg/T(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) - t3dg_2(0,1,0)/10
-		,"T3dg/T(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - t3dg_2(0,1,1)/10
-		,"T3dg/T(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) - t3dg_2(0,1,2)/10
-		,"T3dg/T(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) - t3dg_2(0,2,0)/10
-		,"T3dg/T(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) - t3dg_2(0,2,1)/10
-		,"T3dg/T(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - t3dg_2(0,2,2)/10
-		,"T3dg/T(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - t3dg_2(1,0,0)/10
-		,"T3dg/T(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) - t3dg_2(1,0,1)/10
-		,"T3dg/T(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) - t3dg_2(1,0,2)/10
-		,"T3dg/T(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) - t3dg_2(1,1,0)/10
-		,"T3dg/T(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - t3dg_2(1,1,1)/10
-		,"T3dg/T(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) - t3dg_2(1,1,2)/10
-		,"T3dg/T(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) - t3dg_2(1,2,0)/10
-		,"T3dg/T(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) - t3dg_2(1,2,1)/10
-		,"T3dg/T(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - t3dg_2(1,2,2)/10
-		,"T3dg/T(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - t3dg_2(2,0,0)/10
-		,"T3dg/T(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) - t3dg_2(2,0,1)/10
-		,"T3dg/T(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) - t3dg_2(2,0,2)/10
-		,"T3dg/T(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) - t3dg_2(2,1,0)/10
-		,"T3dg/T(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - t3dg_2(2,1,1)/10
-		,"T3dg/T(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) - t3dg_2(2,1,2)/10
-		,"T3dg/T(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) - t3dg_2(2,2,0)/10
-		,"T3dg/T(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) - t3dg_2(2,2,1)/10
-		,"T3dg/T(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - t3dg_2(2,2,2)/10
-		,"T3dg/T(2,2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXVI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXVI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,146 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t3dg_1(i,j,k)=t3dg_2(i,j,k)*10;
+  test_for_zero(t3dg_1(0,0,0) - t3dg_2(0,0,0)*10
+		,"T3dg*T(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) - t3dg_2(0,0,1)*10
+		,"T3dg*T(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) - t3dg_2(0,0,2)*10
+		,"T3dg*T(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) - t3dg_2(0,1,0)*10
+		,"T3dg*T(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - t3dg_2(0,1,1)*10
+		,"T3dg*T(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) - t3dg_2(0,1,2)*10
+		,"T3dg*T(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) - t3dg_2(0,2,0)*10
+		,"T3dg*T(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) - t3dg_2(0,2,1)*10
+		,"T3dg*T(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - t3dg_2(0,2,2)*10
+		,"T3dg*T(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - t3dg_2(1,0,0)*10
+		,"T3dg*T(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) - t3dg_2(1,0,1)*10
+		,"T3dg*T(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) - t3dg_2(1,0,2)*10
+		,"T3dg*T(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) - t3dg_2(1,1,0)*10
+		,"T3dg*T(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - t3dg_2(1,1,1)*10
+		,"T3dg*T(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) - t3dg_2(1,1,2)*10
+		,"T3dg*T(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) - t3dg_2(1,2,0)*10
+		,"T3dg*T(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) - t3dg_2(1,2,1)*10
+		,"T3dg*T(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - t3dg_2(1,2,2)*10
+		,"T3dg*T(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - t3dg_2(2,0,0)*10
+		,"T3dg*T(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) - t3dg_2(2,0,1)*10
+		,"T3dg*T(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) - t3dg_2(2,0,2)*10
+		,"T3dg*T(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) - t3dg_2(2,1,0)*10
+		,"T3dg*T(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - t3dg_2(2,1,1)*10
+		,"T3dg*T(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) - t3dg_2(2,1,2)*10
+		,"T3dg*T(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) - t3dg_2(2,2,0)*10
+		,"T3dg*T(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) - t3dg_2(2,2,1)*10
+		,"T3dg*T(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - t3dg_2(2,2,2)*10
+		,"T3dg*T(2,2,2)");
+
+  t3dg_1(i,j,k)=t3dg_2(i,j,k)/10;
+  test_for_zero(t3dg_1(0,0,0) - t3dg_2(0,0,0)/10
+		,"T3dg/T(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) - t3dg_2(0,0,1)/10
+		,"T3dg/T(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) - t3dg_2(0,0,2)/10
+		,"T3dg/T(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) - t3dg_2(0,1,0)/10
+		,"T3dg/T(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - t3dg_2(0,1,1)/10
+		,"T3dg/T(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) - t3dg_2(0,1,2)/10
+		,"T3dg/T(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) - t3dg_2(0,2,0)/10
+		,"T3dg/T(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) - t3dg_2(0,2,1)/10
+		,"T3dg/T(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - t3dg_2(0,2,2)/10
+		,"T3dg/T(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - t3dg_2(1,0,0)/10
+		,"T3dg/T(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) - t3dg_2(1,0,1)/10
+		,"T3dg/T(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) - t3dg_2(1,0,2)/10
+		,"T3dg/T(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) - t3dg_2(1,1,0)/10
+		,"T3dg/T(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - t3dg_2(1,1,1)/10
+		,"T3dg/T(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) - t3dg_2(1,1,2)/10
+		,"T3dg/T(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) - t3dg_2(1,2,0)/10
+		,"T3dg/T(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) - t3dg_2(1,2,1)/10
+		,"T3dg/T(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - t3dg_2(1,2,2)/10
+		,"T3dg/T(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - t3dg_2(2,0,0)/10
+		,"T3dg/T(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) - t3dg_2(2,0,1)/10
+		,"T3dg/T(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) - t3dg_2(2,0,2)/10
+		,"T3dg/T(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) - t3dg_2(2,1,0)/10
+		,"T3dg/T(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - t3dg_2(2,1,1)/10
+		,"T3dg/T(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) - t3dg_2(2,1,2)/10
+		,"T3dg/T(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) - t3dg_2(2,2,0)/10
+		,"T3dg/T(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) - t3dg_2(2,2,1)/10
+		,"T3dg/T(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - t3dg_2(2,2,2)/10
+		,"T3dg/T(2,2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXVII.C
--- a/tests/conformance/T3dg/test_T3dgXVII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,110 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t2s_1(i,j)=t3dg_2(i,j,k)*t1_2(k);
-  test_for_zero(t2s_1(0,0) - (t3dg_2(0,0,0)*t1_2(0)
-			      + t3dg_2(0,0,1)*t1_2(1)
-			      + t3dg_2(0,0,2)*t1_2(2))
-		,"T3dg(i,j,k)*T1(k)(0,0)");
-  test_for_zero(t2s_1(0,1) - (t3dg_2(0,1,0)*t1_2(0)
-			      + t3dg_2(0,1,1)*t1_2(1)
-			      + t3dg_2(0,1,2)*t1_2(2))
-		,"T3dg(i,j,k)*T1(k)(0,1)");
-  test_for_zero(t2s_1(0,2) - (t3dg_2(0,2,0)*t1_2(0)
-			      + t3dg_2(0,2,1)*t1_2(1)
-			      + t3dg_2(0,2,2)*t1_2(2))
-		,"T3dg(i,j,k)*T1(k)(0,2)");
-  test_for_zero(t2s_1(1,0) - (t3dg_2(1,0,0)*t1_2(0)
-			      + t3dg_2(1,0,1)*t1_2(1)
-			      + t3dg_2(1,0,2)*t1_2(2))
-		,"T3dg(i,j,k)*T1(k)(1,0)");
-  test_for_zero(t2s_1(1,1) - (t3dg_2(1,1,0)*t1_2(0)
-			      + t3dg_2(1,1,1)*t1_2(1)
-			      + t3dg_2(1,1,2)*t1_2(2))
-		,"T3dg(i,j,k)*T1(k)(1,1)");
-  test_for_zero(t2s_1(1,2) - (t3dg_2(1,2,0)*t1_2(0)
-			      + t3dg_2(1,2,1)*t1_2(1)
-			      + t3dg_2(1,2,2)*t1_2(2))
-		,"T3dg(i,j,k)*T1(k)(1,2)");
-  test_for_zero(t2s_1(2,0) - (t3dg_2(2,0,0)*t1_2(0)
-			      + t3dg_2(2,0,1)*t1_2(1)
-			      + t3dg_2(2,0,2)*t1_2(2))
-		,"T3dg(i,j,k)*T1(k)(2,0)");
-  test_for_zero(t2s_1(2,1) - (t3dg_2(2,1,0)*t1_2(0)
-			      + t3dg_2(2,1,1)*t1_2(1)
-			      + t3dg_2(2,1,2)*t1_2(2))
-		,"T3dg(i,j,k)*T1(k)(2,1)");
-  test_for_zero(t2s_1(2,2) - (t3dg_2(2,2,0)*t1_2(0)
-			      + t3dg_2(2,2,1)*t1_2(1)
-			      + t3dg_2(2,2,2)*t1_2(2))
-		,"T3dg(i,j,k)*T1(k)(2,2)");
-
-  t2s_1(i,j)=t1_2(k)*t3dg_3(i,j,k);
-  test_for_zero(t2s_1(0,0) - (t3dg_3(0,0,0)*t1_2(0)
-			      + t3dg_3(0,0,1)*t1_2(1)
-			      + t3dg_3(0,0,2)*t1_2(2))
-		,"T1(k)*T3dg(i,j,k)(0,0)");
-  test_for_zero(t2s_1(0,1) - (t3dg_3(0,1,0)*t1_2(0)
-			      + t3dg_3(0,1,1)*t1_2(1)
-			      + t3dg_3(0,1,2)*t1_2(2))
-		,"T1(k)*T3dg(i,j,k)(0,1)");
-  test_for_zero(t2s_1(0,2) - (t3dg_3(0,2,0)*t1_2(0)
-			      + t3dg_3(0,2,1)*t1_2(1)
-			      + t3dg_3(0,2,2)*t1_2(2))
-		,"T1(k)*T3dg(i,j,k)(0,2)");
-  test_for_zero(t2s_1(1,0) - (t3dg_3(1,0,0)*t1_2(0)
-			      + t3dg_3(1,0,1)*t1_2(1)
-			      + t3dg_3(1,0,2)*t1_2(2))
-		,"T1(k)*T3dg(i,j,k)(1,0)");
-  test_for_zero(t2s_1(1,1) - (t3dg_3(1,1,0)*t1_2(0)
-			      + t3dg_3(1,1,1)*t1_2(1)
-			      + t3dg_3(1,1,2)*t1_2(2))
-		,"T1(k)*T3dg(i,j,k)(1,1)");
-  test_for_zero(t2s_1(1,2) - (t3dg_3(1,2,0)*t1_2(0)
-			      + t3dg_3(1,2,1)*t1_2(1)
-			      + t3dg_3(1,2,2)*t1_2(2))
-		,"T1(k)*T3dg(i,j,k)(1,2)");
-  test_for_zero(t2s_1(2,0) - (t3dg_3(2,0,0)*t1_2(0)
-			      + t3dg_3(2,0,1)*t1_2(1)
-			      + t3dg_3(2,0,2)*t1_2(2))
-		,"T1(k)*T3dg(i,j,k)(2,0)");
-  test_for_zero(t2s_1(2,1) - (t3dg_3(2,1,0)*t1_2(0)
-			      + t3dg_3(2,1,1)*t1_2(1)
-			      + t3dg_3(2,1,2)*t1_2(2))
-		,"T1(k)*T3dg(i,j,k)(2,1)");
-  test_for_zero(t2s_1(2,2) - (t3dg_3(2,2,0)*t1_2(0)
-			      + t3dg_3(2,2,1)*t1_2(1)
-			      + t3dg_3(2,2,2)*t1_2(2))
-		,"T1(k)*T3dg(i,j,k)(2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXVII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXVII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,110 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t2s_1(i,j)=t3dg_2(i,j,k)*t1_2(k);
+  test_for_zero(t2s_1(0,0) - (t3dg_2(0,0,0)*t1_2(0)
+			      + t3dg_2(0,0,1)*t1_2(1)
+			      + t3dg_2(0,0,2)*t1_2(2))
+		,"T3dg(i,j,k)*T1(k)(0,0)");
+  test_for_zero(t2s_1(0,1) - (t3dg_2(0,1,0)*t1_2(0)
+			      + t3dg_2(0,1,1)*t1_2(1)
+			      + t3dg_2(0,1,2)*t1_2(2))
+		,"T3dg(i,j,k)*T1(k)(0,1)");
+  test_for_zero(t2s_1(0,2) - (t3dg_2(0,2,0)*t1_2(0)
+			      + t3dg_2(0,2,1)*t1_2(1)
+			      + t3dg_2(0,2,2)*t1_2(2))
+		,"T3dg(i,j,k)*T1(k)(0,2)");
+  test_for_zero(t2s_1(1,0) - (t3dg_2(1,0,0)*t1_2(0)
+			      + t3dg_2(1,0,1)*t1_2(1)
+			      + t3dg_2(1,0,2)*t1_2(2))
+		,"T3dg(i,j,k)*T1(k)(1,0)");
+  test_for_zero(t2s_1(1,1) - (t3dg_2(1,1,0)*t1_2(0)
+			      + t3dg_2(1,1,1)*t1_2(1)
+			      + t3dg_2(1,1,2)*t1_2(2))
+		,"T3dg(i,j,k)*T1(k)(1,1)");
+  test_for_zero(t2s_1(1,2) - (t3dg_2(1,2,0)*t1_2(0)
+			      + t3dg_2(1,2,1)*t1_2(1)
+			      + t3dg_2(1,2,2)*t1_2(2))
+		,"T3dg(i,j,k)*T1(k)(1,2)");
+  test_for_zero(t2s_1(2,0) - (t3dg_2(2,0,0)*t1_2(0)
+			      + t3dg_2(2,0,1)*t1_2(1)
+			      + t3dg_2(2,0,2)*t1_2(2))
+		,"T3dg(i,j,k)*T1(k)(2,0)");
+  test_for_zero(t2s_1(2,1) - (t3dg_2(2,1,0)*t1_2(0)
+			      + t3dg_2(2,1,1)*t1_2(1)
+			      + t3dg_2(2,1,2)*t1_2(2))
+		,"T3dg(i,j,k)*T1(k)(2,1)");
+  test_for_zero(t2s_1(2,2) - (t3dg_2(2,2,0)*t1_2(0)
+			      + t3dg_2(2,2,1)*t1_2(1)
+			      + t3dg_2(2,2,2)*t1_2(2))
+		,"T3dg(i,j,k)*T1(k)(2,2)");
+
+  t2s_1(i,j)=t1_2(k)*t3dg_3(i,j,k);
+  test_for_zero(t2s_1(0,0) - (t3dg_3(0,0,0)*t1_2(0)
+			      + t3dg_3(0,0,1)*t1_2(1)
+			      + t3dg_3(0,0,2)*t1_2(2))
+		,"T1(k)*T3dg(i,j,k)(0,0)");
+  test_for_zero(t2s_1(0,1) - (t3dg_3(0,1,0)*t1_2(0)
+			      + t3dg_3(0,1,1)*t1_2(1)
+			      + t3dg_3(0,1,2)*t1_2(2))
+		,"T1(k)*T3dg(i,j,k)(0,1)");
+  test_for_zero(t2s_1(0,2) - (t3dg_3(0,2,0)*t1_2(0)
+			      + t3dg_3(0,2,1)*t1_2(1)
+			      + t3dg_3(0,2,2)*t1_2(2))
+		,"T1(k)*T3dg(i,j,k)(0,2)");
+  test_for_zero(t2s_1(1,0) - (t3dg_3(1,0,0)*t1_2(0)
+			      + t3dg_3(1,0,1)*t1_2(1)
+			      + t3dg_3(1,0,2)*t1_2(2))
+		,"T1(k)*T3dg(i,j,k)(1,0)");
+  test_for_zero(t2s_1(1,1) - (t3dg_3(1,1,0)*t1_2(0)
+			      + t3dg_3(1,1,1)*t1_2(1)
+			      + t3dg_3(1,1,2)*t1_2(2))
+		,"T1(k)*T3dg(i,j,k)(1,1)");
+  test_for_zero(t2s_1(1,2) - (t3dg_3(1,2,0)*t1_2(0)
+			      + t3dg_3(1,2,1)*t1_2(1)
+			      + t3dg_3(1,2,2)*t1_2(2))
+		,"T1(k)*T3dg(i,j,k)(1,2)");
+  test_for_zero(t2s_1(2,0) - (t3dg_3(2,0,0)*t1_2(0)
+			      + t3dg_3(2,0,1)*t1_2(1)
+			      + t3dg_3(2,0,2)*t1_2(2))
+		,"T1(k)*T3dg(i,j,k)(2,0)");
+  test_for_zero(t2s_1(2,1) - (t3dg_3(2,1,0)*t1_2(0)
+			      + t3dg_3(2,1,1)*t1_2(1)
+			      + t3dg_3(2,1,2)*t1_2(2))
+		,"T1(k)*T3dg(i,j,k)(2,1)");
+  test_for_zero(t2s_1(2,2) - (t3dg_3(2,2,0)*t1_2(0)
+			      + t3dg_3(2,2,1)*t1_2(1)
+			      + t3dg_3(2,2,2)*t1_2(2))
+		,"T1(k)*T3dg(i,j,k)(2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXVIII.C
--- a/tests/conformance/T3dg/test_T3dgXVIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,110 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t2_1(i,j)=t3dg_2(i,k,j)*t1_2(k);
-  test_for_zero(t2_1(0,0) - (t3dg_2(0,0,0)*t1_2(0)
-			     + t3dg_2(0,1,0)*t1_2(1)
-			     + t3dg_2(0,2,0)*t1_2(2))
-		,"T3dg(i,k,j)*T1(k)(0,0)");
-  test_for_zero(t2_1(0,1) - (t3dg_2(0,0,1)*t1_2(0)
-			     + t3dg_2(0,1,1)*t1_2(1)
-			     + t3dg_2(0,2,1)*t1_2(2))
-		,"T3dg(i,k,j)*T1(k)(0,1)");
-  test_for_zero(t2_1(0,2) - (t3dg_2(0,0,2)*t1_2(0)
-			     + t3dg_2(0,1,2)*t1_2(1)
-			     + t3dg_2(0,2,2)*t1_2(2))
-		,"T3dg(i,k,j)*T1(k)(0,2)");
-  test_for_zero(t2_1(1,0) - (t3dg_2(1,0,0)*t1_2(0)
-			     + t3dg_2(1,1,0)*t1_2(1)
-			     + t3dg_2(1,2,0)*t1_2(2))
-		,"T3dg(i,k,j)*T1(k)(1,0)");
-  test_for_zero(t2_1(1,1) - (t3dg_2(1,0,1)*t1_2(0)
-			     + t3dg_2(1,1,1)*t1_2(1)
-			     + t3dg_2(1,2,1)*t1_2(2))
-		,"T3dg(i,k,j)*T1(k)(1,1)");
-  test_for_zero(t2_1(1,2) - (t3dg_2(1,0,2)*t1_2(0)
-			     + t3dg_2(1,1,2)*t1_2(1)
-			     + t3dg_2(1,2,2)*t1_2(2))
-		,"T3dg(i,k,j)*T1(k)(1,2)");
-  test_for_zero(t2_1(2,0) - (t3dg_2(2,0,0)*t1_2(0)
-			     + t3dg_2(2,1,0)*t1_2(1)
-			     + t3dg_2(2,2,0)*t1_2(2))
-		,"T3dg(i,k,j)*T1(k)(2,0)");
-  test_for_zero(t2_1(2,1) - (t3dg_2(2,0,1)*t1_2(0)
-			     + t3dg_2(2,1,1)*t1_2(1)
-			     + t3dg_2(2,2,1)*t1_2(2))
-		,"T3dg(i,k,j)*T1(k)(2,1)");
-  test_for_zero(t2_1(2,2) - (t3dg_2(2,0,2)*t1_2(0)
-			     + t3dg_2(2,1,2)*t1_2(1)
-			     + t3dg_2(2,2,2)*t1_2(2))
-		,"T3dg(i,k,j)*T1(k)(2,2)");
-
-  t2_1(i,j)=t1_2(k)*t3dg_3(i,k,j);
-  test_for_zero(t2_1(0,0) - (t3dg_3(0,0,0)*t1_2(0)
-			     + t3dg_3(0,1,0)*t1_2(1)
-			     + t3dg_3(0,2,0)*t1_2(2))
-		,"T1(k)*T3dg(i,k,j)(0,0)");
-  test_for_zero(t2_1(0,1) - (t3dg_3(0,0,1)*t1_2(0)
-			     + t3dg_3(0,1,1)*t1_2(1)
-			     + t3dg_3(0,2,1)*t1_2(2))
-		,"T1(k)*T3dg(i,k,j)(0,1)");
-  test_for_zero(t2_1(0,2) - (t3dg_3(0,0,2)*t1_2(0)
-			     + t3dg_3(0,1,2)*t1_2(1)
-			     + t3dg_3(0,2,2)*t1_2(2))
-		,"T1(k)*T3dg(i,k,j)(0,2)");
-  test_for_zero(t2_1(1,0) - (t3dg_3(1,0,0)*t1_2(0)
-			     + t3dg_3(1,1,0)*t1_2(1)
-			     + t3dg_3(1,2,0)*t1_2(2))
-		,"T1(k)*T3dg(i,k,j)(1,0)");
-  test_for_zero(t2_1(1,1) - (t3dg_3(1,0,1)*t1_2(0)
-			     + t3dg_3(1,1,1)*t1_2(1)
-			     + t3dg_3(1,2,1)*t1_2(2))
-		,"T1(k)*T3dg(i,k,j)(1,1)");
-  test_for_zero(t2_1(1,2) - (t3dg_3(1,0,2)*t1_2(0)
-			     + t3dg_3(1,1,2)*t1_2(1)
-			     + t3dg_3(1,2,2)*t1_2(2))
-		,"T1(k)*T3dg(i,k,j)(1,2)");
-  test_for_zero(t2_1(2,0) - (t3dg_3(2,0,0)*t1_2(0)
-			     + t3dg_3(2,1,0)*t1_2(1)
-			     + t3dg_3(2,2,0)*t1_2(2))
-		,"T1(k)*T3dg(i,k,j)(2,0)");
-  test_for_zero(t2_1(2,1) - (t3dg_3(2,0,1)*t1_2(0)
-			     + t3dg_3(2,1,1)*t1_2(1)
-			     + t3dg_3(2,2,1)*t1_2(2))
-		,"T1(k)*T3dg(i,k,j)(2,1)");
-  test_for_zero(t2_1(2,2) - (t3dg_3(2,0,2)*t1_2(0)
-			     + t3dg_3(2,1,2)*t1_2(1)
-			     + t3dg_3(2,2,2)*t1_2(2))
-		,"T1(k)*T3dg(i,k,j)(2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXVIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXVIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,110 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t2_1(i,j)=t3dg_2(i,k,j)*t1_2(k);
+  test_for_zero(t2_1(0,0) - (t3dg_2(0,0,0)*t1_2(0)
+			     + t3dg_2(0,1,0)*t1_2(1)
+			     + t3dg_2(0,2,0)*t1_2(2))
+		,"T3dg(i,k,j)*T1(k)(0,0)");
+  test_for_zero(t2_1(0,1) - (t3dg_2(0,0,1)*t1_2(0)
+			     + t3dg_2(0,1,1)*t1_2(1)
+			     + t3dg_2(0,2,1)*t1_2(2))
+		,"T3dg(i,k,j)*T1(k)(0,1)");
+  test_for_zero(t2_1(0,2) - (t3dg_2(0,0,2)*t1_2(0)
+			     + t3dg_2(0,1,2)*t1_2(1)
+			     + t3dg_2(0,2,2)*t1_2(2))
+		,"T3dg(i,k,j)*T1(k)(0,2)");
+  test_for_zero(t2_1(1,0) - (t3dg_2(1,0,0)*t1_2(0)
+			     + t3dg_2(1,1,0)*t1_2(1)
+			     + t3dg_2(1,2,0)*t1_2(2))
+		,"T3dg(i,k,j)*T1(k)(1,0)");
+  test_for_zero(t2_1(1,1) - (t3dg_2(1,0,1)*t1_2(0)
+			     + t3dg_2(1,1,1)*t1_2(1)
+			     + t3dg_2(1,2,1)*t1_2(2))
+		,"T3dg(i,k,j)*T1(k)(1,1)");
+  test_for_zero(t2_1(1,2) - (t3dg_2(1,0,2)*t1_2(0)
+			     + t3dg_2(1,1,2)*t1_2(1)
+			     + t3dg_2(1,2,2)*t1_2(2))
+		,"T3dg(i,k,j)*T1(k)(1,2)");
+  test_for_zero(t2_1(2,0) - (t3dg_2(2,0,0)*t1_2(0)
+			     + t3dg_2(2,1,0)*t1_2(1)
+			     + t3dg_2(2,2,0)*t1_2(2))
+		,"T3dg(i,k,j)*T1(k)(2,0)");
+  test_for_zero(t2_1(2,1) - (t3dg_2(2,0,1)*t1_2(0)
+			     + t3dg_2(2,1,1)*t1_2(1)
+			     + t3dg_2(2,2,1)*t1_2(2))
+		,"T3dg(i,k,j)*T1(k)(2,1)");
+  test_for_zero(t2_1(2,2) - (t3dg_2(2,0,2)*t1_2(0)
+			     + t3dg_2(2,1,2)*t1_2(1)
+			     + t3dg_2(2,2,2)*t1_2(2))
+		,"T3dg(i,k,j)*T1(k)(2,2)");
+
+  t2_1(i,j)=t1_2(k)*t3dg_3(i,k,j);
+  test_for_zero(t2_1(0,0) - (t3dg_3(0,0,0)*t1_2(0)
+			     + t3dg_3(0,1,0)*t1_2(1)
+			     + t3dg_3(0,2,0)*t1_2(2))
+		,"T1(k)*T3dg(i,k,j)(0,0)");
+  test_for_zero(t2_1(0,1) - (t3dg_3(0,0,1)*t1_2(0)
+			     + t3dg_3(0,1,1)*t1_2(1)
+			     + t3dg_3(0,2,1)*t1_2(2))
+		,"T1(k)*T3dg(i,k,j)(0,1)");
+  test_for_zero(t2_1(0,2) - (t3dg_3(0,0,2)*t1_2(0)
+			     + t3dg_3(0,1,2)*t1_2(1)
+			     + t3dg_3(0,2,2)*t1_2(2))
+		,"T1(k)*T3dg(i,k,j)(0,2)");
+  test_for_zero(t2_1(1,0) - (t3dg_3(1,0,0)*t1_2(0)
+			     + t3dg_3(1,1,0)*t1_2(1)
+			     + t3dg_3(1,2,0)*t1_2(2))
+		,"T1(k)*T3dg(i,k,j)(1,0)");
+  test_for_zero(t2_1(1,1) - (t3dg_3(1,0,1)*t1_2(0)
+			     + t3dg_3(1,1,1)*t1_2(1)
+			     + t3dg_3(1,2,1)*t1_2(2))
+		,"T1(k)*T3dg(i,k,j)(1,1)");
+  test_for_zero(t2_1(1,2) - (t3dg_3(1,0,2)*t1_2(0)
+			     + t3dg_3(1,1,2)*t1_2(1)
+			     + t3dg_3(1,2,2)*t1_2(2))
+		,"T1(k)*T3dg(i,k,j)(1,2)");
+  test_for_zero(t2_1(2,0) - (t3dg_3(2,0,0)*t1_2(0)
+			     + t3dg_3(2,1,0)*t1_2(1)
+			     + t3dg_3(2,2,0)*t1_2(2))
+		,"T1(k)*T3dg(i,k,j)(2,0)");
+  test_for_zero(t2_1(2,1) - (t3dg_3(2,0,1)*t1_2(0)
+			     + t3dg_3(2,1,1)*t1_2(1)
+			     + t3dg_3(2,2,1)*t1_2(2))
+		,"T1(k)*T3dg(i,k,j)(2,1)");
+  test_for_zero(t2_1(2,2) - (t3dg_3(2,0,2)*t1_2(0)
+			     + t3dg_3(2,1,2)*t1_2(1)
+			     + t3dg_3(2,2,2)*t1_2(2))
+		,"T1(k)*T3dg(i,k,j)(2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXX.C
--- a/tests/conformance/T3dg/test_T3dgXX.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,254 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t3dg_1(i,j,k)=t3dg_2(i,j,l)*t2_2(l,k);
-  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0)*t2_2(0,0)
-				 + t3dg_2(0,0,1)*t2_2(1,0)
-				 + t3dg_2(0,0,2)*t2_2(2,0))
-		,"T3dg(i,j,l)*T2(l,k)(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(0,0,0)*t2_2(0,1)
-				 + t3dg_2(0,0,1)*t2_2(1,1)
-				 + t3dg_2(0,0,2)*t2_2(2,1))
-		,"T3dg(i,j,l)*T2(l,k)(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(0,0,0)*t2_2(0,2)
-				 + t3dg_2(0,0,1)*t2_2(1,2)
-				 + t3dg_2(0,0,2)*t2_2(2,2))
-		,"T3dg(i,j,l)*T2(l,k)(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,1,0)*t2_2(0,0)
-				 + t3dg_2(0,1,1)*t2_2(1,0)
-				 + t3dg_2(0,1,2)*t2_2(2,0))
-		,"T3dg(i,j,l)*T2(l,k)(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(0,1,0)*t2_2(0,1)
-				 + t3dg_2(0,1,1)*t2_2(1,1)
-				 + t3dg_2(0,1,2)*t2_2(2,1))
-		,"T3dg(i,j,l)*T2(l,k)(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(0,1,0)*t2_2(0,2)
-				 + t3dg_2(0,1,1)*t2_2(1,2)
-				 + t3dg_2(0,1,2)*t2_2(2,2))
-		,"T3dg(i,j,l)*T2(l,k)(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,2,0)*t2_2(0,0)
-				 + t3dg_2(0,2,1)*t2_2(1,0)
-				 + t3dg_2(0,2,2)*t2_2(2,0))
-		,"T3dg(i,j,l)*T2(l,k)(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(0,2,0)*t2_2(0,1)
-				 + t3dg_2(0,2,1)*t2_2(1,1)
-				 + t3dg_2(0,2,2)*t2_2(2,1))
-		,"T3dg(i,j,l)*T2(l,k)(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(0,2,0)*t2_2(0,2)
-				 + t3dg_2(0,2,1)*t2_2(1,2)
-				 + t3dg_2(0,2,2)*t2_2(2,2))
-		,"T3dg(i,j,l)*T2(l,k)(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(1,0,0)*t2_2(0,0)
-				 + t3dg_2(1,0,1)*t2_2(1,0)
-				 + t3dg_2(1,0,2)*t2_2(2,0))
-		,"T3dg(i,j,l)*T2(l,k)(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,0,0)*t2_2(0,1)
-				 + t3dg_2(1,0,1)*t2_2(1,1)
-				 + t3dg_2(1,0,2)*t2_2(2,1))
-		,"T3dg(i,j,l)*T2(l,k)(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(1,0,0)*t2_2(0,2)
-				 + t3dg_2(1,0,1)*t2_2(1,2)
-				 + t3dg_2(1,0,2)*t2_2(2,2))
-		,"T3dg(i,j,l)*T2(l,k)(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(1,1,0)*t2_2(0,0)
-				 + t3dg_2(1,1,1)*t2_2(1,0)
-				 + t3dg_2(1,1,2)*t2_2(2,0))
-		,"T3dg(i,j,l)*T2(l,k)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,0)*t2_2(0,1)
-				 + t3dg_2(1,1,1)*t2_2(1,1)
-				 + t3dg_2(1,1,2)*t2_2(2,1))
-		,"T3dg(i,j,l)*T2(l,k)(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(1,1,0)*t2_2(0,2)
-				 + t3dg_2(1,1,1)*t2_2(1,2)
-				 + t3dg_2(1,1,2)*t2_2(2,2))
-		,"T3dg(i,j,l)*T2(l,k)(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(1,2,0)*t2_2(0,0)
-				 + t3dg_2(1,2,1)*t2_2(1,0)
-				 + t3dg_2(1,2,2)*t2_2(2,0))
-		,"T3dg(i,j,l)*T2(l,k)(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,2,0)*t2_2(0,1)
-				 + t3dg_2(1,2,1)*t2_2(1,1)
-				 + t3dg_2(1,2,2)*t2_2(2,1))
-		,"T3dg(i,j,l)*T2(l,k)(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(1,2,0)*t2_2(0,2)
-				 + t3dg_2(1,2,1)*t2_2(1,2)
-				 + t3dg_2(1,2,2)*t2_2(2,2))
-		,"T3dg(i,j,l)*T2(l,k)(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(2,0,0)*t2_2(0,0)
-				 + t3dg_2(2,0,1)*t2_2(1,0)
-				 + t3dg_2(2,0,2)*t2_2(2,0))
-		,"T3dg(i,j,l)*T2(l,k)(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(2,0,0)*t2_2(0,1)
-				 + t3dg_2(2,0,1)*t2_2(1,1)
-				 + t3dg_2(2,0,2)*t2_2(2,1))
-		,"T3dg(i,j,l)*T2(l,k)(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,0,0)*t2_2(0,2)
-				 + t3dg_2(2,0,1)*t2_2(1,2)
-				 + t3dg_2(2,0,2)*t2_2(2,2))
-		,"T3dg(i,j,l)*T2(l,k)(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(2,1,0)*t2_2(0,0)
-				 + t3dg_2(2,1,1)*t2_2(1,0)
-				 + t3dg_2(2,1,2)*t2_2(2,0))
-		,"T3dg(i,j,l)*T2(l,k)(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(2,1,0)*t2_2(0,1)
-				 + t3dg_2(2,1,1)*t2_2(1,1)
-				 + t3dg_2(2,1,2)*t2_2(2,1))
-		,"T3dg(i,j,l)*T2(l,k)(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,1,0)*t2_2(0,2)
-				 + t3dg_2(2,1,1)*t2_2(1,2)
-				 + t3dg_2(2,1,2)*t2_2(2,2))
-		,"T3dg(i,j,l)*T2(l,k)(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(2,2,0)*t2_2(0,0)
-				 + t3dg_2(2,2,1)*t2_2(1,0)
-				 + t3dg_2(2,2,2)*t2_2(2,0))
-		,"T3dg(i,j,l)*T2(l,k)(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(2,2,0)*t2_2(0,1)
-				 + t3dg_2(2,2,1)*t2_2(1,1)
-				 + t3dg_2(2,2,2)*t2_2(2,1))
-		,"T3dg(i,j,l)*T2(l,k)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,0)*t2_2(0,2)
-				 + t3dg_2(2,2,1)*t2_2(1,2)
-				 + t3dg_2(2,2,2)*t2_2(2,2))
-		,"T3dg(i,j,l)*T2(l,k)(2,2,2)");
-
-  t3dg_1(i,j,k)=t2_2(l,k)*t3dg_3(i,j,l);
-  test_for_zero(t3dg_1(0,0,0) - (t3dg_3(0,0,0)*t2_2(0,0)
-				 + t3dg_3(0,0,1)*t2_2(1,0)
-				 + t3dg_3(0,0,2)*t2_2(2,0))
-		,"T2(l,k)*T3dg(i,j,l)(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) - (t3dg_3(0,0,0)*t2_2(0,1)
-				 + t3dg_3(0,0,1)*t2_2(1,1)
-				 + t3dg_3(0,0,2)*t2_2(2,1))
-		,"T2(l,k)*T3dg(i,j,l)(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) - (t3dg_3(0,0,0)*t2_2(0,2)
-				 + t3dg_3(0,0,1)*t2_2(1,2)
-				 + t3dg_3(0,0,2)*t2_2(2,2))
-		,"T2(l,k)*T3dg(i,j,l)(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) - (t3dg_3(0,1,0)*t2_2(0,0)
-				 + t3dg_3(0,1,1)*t2_2(1,0)
-				 + t3dg_3(0,1,2)*t2_2(2,0))
-		,"T2(l,k)*T3dg(i,j,l)(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - (t3dg_3(0,1,0)*t2_2(0,1)
-				 + t3dg_3(0,1,1)*t2_2(1,1)
-				 + t3dg_3(0,1,2)*t2_2(2,1))
-		,"T2(l,k)*T3dg(i,j,l)(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) - (t3dg_3(0,1,0)*t2_2(0,2)
-				 + t3dg_3(0,1,1)*t2_2(1,2)
-				 + t3dg_3(0,1,2)*t2_2(2,2))
-		,"T2(l,k)*T3dg(i,j,l)(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) - (t3dg_3(0,2,0)*t2_2(0,0)
-				 + t3dg_3(0,2,1)*t2_2(1,0)
-				 + t3dg_3(0,2,2)*t2_2(2,0))
-		,"T2(l,k)*T3dg(i,j,l)(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) - (t3dg_3(0,2,0)*t2_2(0,1)
-				 + t3dg_3(0,2,1)*t2_2(1,1)
-				 + t3dg_3(0,2,2)*t2_2(2,1))
-		,"T2(l,k)*T3dg(i,j,l)(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - (t3dg_3(0,2,0)*t2_2(0,2)
-				 + t3dg_3(0,2,1)*t2_2(1,2)
-				 + t3dg_3(0,2,2)*t2_2(2,2))
-		,"T2(l,k)*T3dg(i,j,l)(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - (t3dg_3(1,0,0)*t2_2(0,0)
-				 + t3dg_3(1,0,1)*t2_2(1,0)
-				 + t3dg_3(1,0,2)*t2_2(2,0))
-		,"T2(l,k)*T3dg(i,j,l)(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) - (t3dg_3(1,0,0)*t2_2(0,1)
-				 + t3dg_3(1,0,1)*t2_2(1,1)
-				 + t3dg_3(1,0,2)*t2_2(2,1))
-		,"T2(l,k)*T3dg(i,j,l)(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) - (t3dg_3(1,0,0)*t2_2(0,2)
-				 + t3dg_3(1,0,1)*t2_2(1,2)
-				 + t3dg_3(1,0,2)*t2_2(2,2))
-		,"T2(l,k)*T3dg(i,j,l)(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) - (t3dg_3(1,1,0)*t2_2(0,0)
-				 + t3dg_3(1,1,1)*t2_2(1,0)
-				 + t3dg_3(1,1,2)*t2_2(2,0))
-		,"T2(l,k)*T3dg(i,j,l)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - (t3dg_3(1,1,0)*t2_2(0,1)
-				 + t3dg_3(1,1,1)*t2_2(1,1)
-				 + t3dg_3(1,1,2)*t2_2(2,1))
-		,"T2(l,k)*T3dg(i,j,l)(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) - (t3dg_3(1,1,0)*t2_2(0,2)
-				 + t3dg_3(1,1,1)*t2_2(1,2)
-				 + t3dg_3(1,1,2)*t2_2(2,2))
-		,"T2(l,k)*T3dg(i,j,l)(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) - (t3dg_3(1,2,0)*t2_2(0,0)
-				 + t3dg_3(1,2,1)*t2_2(1,0)
-				 + t3dg_3(1,2,2)*t2_2(2,0))
-		,"T2(l,k)*T3dg(i,j,l)(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) - (t3dg_3(1,2,0)*t2_2(0,1)
-				 + t3dg_3(1,2,1)*t2_2(1,1)
-				 + t3dg_3(1,2,2)*t2_2(2,1))
-		,"T2(l,k)*T3dg(i,j,l)(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - (t3dg_3(1,2,0)*t2_2(0,2)
-				 + t3dg_3(1,2,1)*t2_2(1,2)
-				 + t3dg_3(1,2,2)*t2_2(2,2))
-		,"T2(l,k)*T3dg(i,j,l)(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - (t3dg_3(2,0,0)*t2_2(0,0)
-				 + t3dg_3(2,0,1)*t2_2(1,0)
-				 + t3dg_3(2,0,2)*t2_2(2,0))
-		,"T2(l,k)*T3dg(i,j,l)(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) - (t3dg_3(2,0,0)*t2_2(0,1)
-				 + t3dg_3(2,0,1)*t2_2(1,1)
-				 + t3dg_3(2,0,2)*t2_2(2,1))
-		,"T2(l,k)*T3dg(i,j,l)(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) - (t3dg_3(2,0,0)*t2_2(0,2)
-				 + t3dg_3(2,0,1)*t2_2(1,2)
-				 + t3dg_3(2,0,2)*t2_2(2,2))
-		,"T2(l,k)*T3dg(i,j,l)(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) - (t3dg_3(2,1,0)*t2_2(0,0)
-				 + t3dg_3(2,1,1)*t2_2(1,0)
-				 + t3dg_3(2,1,2)*t2_2(2,0))
-		,"T2(l,k)*T3dg(i,j,l)(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - (t3dg_3(2,1,0)*t2_2(0,1)
-				 + t3dg_3(2,1,1)*t2_2(1,1)
-				 + t3dg_3(2,1,2)*t2_2(2,1))
-		,"T2(l,k)*T3dg(i,j,l)(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) - (t3dg_3(2,1,0)*t2_2(0,2)
-				 + t3dg_3(2,1,1)*t2_2(1,2)
-				 + t3dg_3(2,1,2)*t2_2(2,2))
-		,"T2(l,k)*T3dg(i,j,l)(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) - (t3dg_3(2,2,0)*t2_2(0,0)
-				 + t3dg_3(2,2,1)*t2_2(1,0)
-				 + t3dg_3(2,2,2)*t2_2(2,0))
-		,"T2(l,k)*T3dg(i,j,l)(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) - (t3dg_3(2,2,0)*t2_2(0,1)
-				 + t3dg_3(2,2,1)*t2_2(1,1)
-				 + t3dg_3(2,2,2)*t2_2(2,1))
-		,"T2(l,k)*T3dg(i,j,l)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - (t3dg_3(2,2,0)*t2_2(0,2)
-				 + t3dg_3(2,2,1)*t2_2(1,2)
-				 + t3dg_3(2,2,2)*t2_2(2,2))
-		,"T2(l,k)*T3dg(i,j,l)(2,2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXX.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXX.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,254 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t3dg_1(i,j,k)=t3dg_2(i,j,l)*t2_2(l,k);
+  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0)*t2_2(0,0)
+				 + t3dg_2(0,0,1)*t2_2(1,0)
+				 + t3dg_2(0,0,2)*t2_2(2,0))
+		,"T3dg(i,j,l)*T2(l,k)(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(0,0,0)*t2_2(0,1)
+				 + t3dg_2(0,0,1)*t2_2(1,1)
+				 + t3dg_2(0,0,2)*t2_2(2,1))
+		,"T3dg(i,j,l)*T2(l,k)(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(0,0,0)*t2_2(0,2)
+				 + t3dg_2(0,0,1)*t2_2(1,2)
+				 + t3dg_2(0,0,2)*t2_2(2,2))
+		,"T3dg(i,j,l)*T2(l,k)(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,1,0)*t2_2(0,0)
+				 + t3dg_2(0,1,1)*t2_2(1,0)
+				 + t3dg_2(0,1,2)*t2_2(2,0))
+		,"T3dg(i,j,l)*T2(l,k)(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(0,1,0)*t2_2(0,1)
+				 + t3dg_2(0,1,1)*t2_2(1,1)
+				 + t3dg_2(0,1,2)*t2_2(2,1))
+		,"T3dg(i,j,l)*T2(l,k)(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(0,1,0)*t2_2(0,2)
+				 + t3dg_2(0,1,1)*t2_2(1,2)
+				 + t3dg_2(0,1,2)*t2_2(2,2))
+		,"T3dg(i,j,l)*T2(l,k)(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,2,0)*t2_2(0,0)
+				 + t3dg_2(0,2,1)*t2_2(1,0)
+				 + t3dg_2(0,2,2)*t2_2(2,0))
+		,"T3dg(i,j,l)*T2(l,k)(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(0,2,0)*t2_2(0,1)
+				 + t3dg_2(0,2,1)*t2_2(1,1)
+				 + t3dg_2(0,2,2)*t2_2(2,1))
+		,"T3dg(i,j,l)*T2(l,k)(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(0,2,0)*t2_2(0,2)
+				 + t3dg_2(0,2,1)*t2_2(1,2)
+				 + t3dg_2(0,2,2)*t2_2(2,2))
+		,"T3dg(i,j,l)*T2(l,k)(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(1,0,0)*t2_2(0,0)
+				 + t3dg_2(1,0,1)*t2_2(1,0)
+				 + t3dg_2(1,0,2)*t2_2(2,0))
+		,"T3dg(i,j,l)*T2(l,k)(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,0,0)*t2_2(0,1)
+				 + t3dg_2(1,0,1)*t2_2(1,1)
+				 + t3dg_2(1,0,2)*t2_2(2,1))
+		,"T3dg(i,j,l)*T2(l,k)(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(1,0,0)*t2_2(0,2)
+				 + t3dg_2(1,0,1)*t2_2(1,2)
+				 + t3dg_2(1,0,2)*t2_2(2,2))
+		,"T3dg(i,j,l)*T2(l,k)(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(1,1,0)*t2_2(0,0)
+				 + t3dg_2(1,1,1)*t2_2(1,0)
+				 + t3dg_2(1,1,2)*t2_2(2,0))
+		,"T3dg(i,j,l)*T2(l,k)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,0)*t2_2(0,1)
+				 + t3dg_2(1,1,1)*t2_2(1,1)
+				 + t3dg_2(1,1,2)*t2_2(2,1))
+		,"T3dg(i,j,l)*T2(l,k)(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(1,1,0)*t2_2(0,2)
+				 + t3dg_2(1,1,1)*t2_2(1,2)
+				 + t3dg_2(1,1,2)*t2_2(2,2))
+		,"T3dg(i,j,l)*T2(l,k)(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(1,2,0)*t2_2(0,0)
+				 + t3dg_2(1,2,1)*t2_2(1,0)
+				 + t3dg_2(1,2,2)*t2_2(2,0))
+		,"T3dg(i,j,l)*T2(l,k)(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,2,0)*t2_2(0,1)
+				 + t3dg_2(1,2,1)*t2_2(1,1)
+				 + t3dg_2(1,2,2)*t2_2(2,1))
+		,"T3dg(i,j,l)*T2(l,k)(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(1,2,0)*t2_2(0,2)
+				 + t3dg_2(1,2,1)*t2_2(1,2)
+				 + t3dg_2(1,2,2)*t2_2(2,2))
+		,"T3dg(i,j,l)*T2(l,k)(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(2,0,0)*t2_2(0,0)
+				 + t3dg_2(2,0,1)*t2_2(1,0)
+				 + t3dg_2(2,0,2)*t2_2(2,0))
+		,"T3dg(i,j,l)*T2(l,k)(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(2,0,0)*t2_2(0,1)
+				 + t3dg_2(2,0,1)*t2_2(1,1)
+				 + t3dg_2(2,0,2)*t2_2(2,1))
+		,"T3dg(i,j,l)*T2(l,k)(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,0,0)*t2_2(0,2)
+				 + t3dg_2(2,0,1)*t2_2(1,2)
+				 + t3dg_2(2,0,2)*t2_2(2,2))
+		,"T3dg(i,j,l)*T2(l,k)(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(2,1,0)*t2_2(0,0)
+				 + t3dg_2(2,1,1)*t2_2(1,0)
+				 + t3dg_2(2,1,2)*t2_2(2,0))
+		,"T3dg(i,j,l)*T2(l,k)(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(2,1,0)*t2_2(0,1)
+				 + t3dg_2(2,1,1)*t2_2(1,1)
+				 + t3dg_2(2,1,2)*t2_2(2,1))
+		,"T3dg(i,j,l)*T2(l,k)(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,1,0)*t2_2(0,2)
+				 + t3dg_2(2,1,1)*t2_2(1,2)
+				 + t3dg_2(2,1,2)*t2_2(2,2))
+		,"T3dg(i,j,l)*T2(l,k)(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(2,2,0)*t2_2(0,0)
+				 + t3dg_2(2,2,1)*t2_2(1,0)
+				 + t3dg_2(2,2,2)*t2_2(2,0))
+		,"T3dg(i,j,l)*T2(l,k)(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(2,2,0)*t2_2(0,1)
+				 + t3dg_2(2,2,1)*t2_2(1,1)
+				 + t3dg_2(2,2,2)*t2_2(2,1))
+		,"T3dg(i,j,l)*T2(l,k)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,0)*t2_2(0,2)
+				 + t3dg_2(2,2,1)*t2_2(1,2)
+				 + t3dg_2(2,2,2)*t2_2(2,2))
+		,"T3dg(i,j,l)*T2(l,k)(2,2,2)");
+
+  t3dg_1(i,j,k)=t2_2(l,k)*t3dg_3(i,j,l);
+  test_for_zero(t3dg_1(0,0,0) - (t3dg_3(0,0,0)*t2_2(0,0)
+				 + t3dg_3(0,0,1)*t2_2(1,0)
+				 + t3dg_3(0,0,2)*t2_2(2,0))
+		,"T2(l,k)*T3dg(i,j,l)(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) - (t3dg_3(0,0,0)*t2_2(0,1)
+				 + t3dg_3(0,0,1)*t2_2(1,1)
+				 + t3dg_3(0,0,2)*t2_2(2,1))
+		,"T2(l,k)*T3dg(i,j,l)(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) - (t3dg_3(0,0,0)*t2_2(0,2)
+				 + t3dg_3(0,0,1)*t2_2(1,2)
+				 + t3dg_3(0,0,2)*t2_2(2,2))
+		,"T2(l,k)*T3dg(i,j,l)(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) - (t3dg_3(0,1,0)*t2_2(0,0)
+				 + t3dg_3(0,1,1)*t2_2(1,0)
+				 + t3dg_3(0,1,2)*t2_2(2,0))
+		,"T2(l,k)*T3dg(i,j,l)(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - (t3dg_3(0,1,0)*t2_2(0,1)
+				 + t3dg_3(0,1,1)*t2_2(1,1)
+				 + t3dg_3(0,1,2)*t2_2(2,1))
+		,"T2(l,k)*T3dg(i,j,l)(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) - (t3dg_3(0,1,0)*t2_2(0,2)
+				 + t3dg_3(0,1,1)*t2_2(1,2)
+				 + t3dg_3(0,1,2)*t2_2(2,2))
+		,"T2(l,k)*T3dg(i,j,l)(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) - (t3dg_3(0,2,0)*t2_2(0,0)
+				 + t3dg_3(0,2,1)*t2_2(1,0)
+				 + t3dg_3(0,2,2)*t2_2(2,0))
+		,"T2(l,k)*T3dg(i,j,l)(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) - (t3dg_3(0,2,0)*t2_2(0,1)
+				 + t3dg_3(0,2,1)*t2_2(1,1)
+				 + t3dg_3(0,2,2)*t2_2(2,1))
+		,"T2(l,k)*T3dg(i,j,l)(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - (t3dg_3(0,2,0)*t2_2(0,2)
+				 + t3dg_3(0,2,1)*t2_2(1,2)
+				 + t3dg_3(0,2,2)*t2_2(2,2))
+		,"T2(l,k)*T3dg(i,j,l)(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - (t3dg_3(1,0,0)*t2_2(0,0)
+				 + t3dg_3(1,0,1)*t2_2(1,0)
+				 + t3dg_3(1,0,2)*t2_2(2,0))
+		,"T2(l,k)*T3dg(i,j,l)(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) - (t3dg_3(1,0,0)*t2_2(0,1)
+				 + t3dg_3(1,0,1)*t2_2(1,1)
+				 + t3dg_3(1,0,2)*t2_2(2,1))
+		,"T2(l,k)*T3dg(i,j,l)(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) - (t3dg_3(1,0,0)*t2_2(0,2)
+				 + t3dg_3(1,0,1)*t2_2(1,2)
+				 + t3dg_3(1,0,2)*t2_2(2,2))
+		,"T2(l,k)*T3dg(i,j,l)(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) - (t3dg_3(1,1,0)*t2_2(0,0)
+				 + t3dg_3(1,1,1)*t2_2(1,0)
+				 + t3dg_3(1,1,2)*t2_2(2,0))
+		,"T2(l,k)*T3dg(i,j,l)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - (t3dg_3(1,1,0)*t2_2(0,1)
+				 + t3dg_3(1,1,1)*t2_2(1,1)
+				 + t3dg_3(1,1,2)*t2_2(2,1))
+		,"T2(l,k)*T3dg(i,j,l)(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) - (t3dg_3(1,1,0)*t2_2(0,2)
+				 + t3dg_3(1,1,1)*t2_2(1,2)
+				 + t3dg_3(1,1,2)*t2_2(2,2))
+		,"T2(l,k)*T3dg(i,j,l)(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) - (t3dg_3(1,2,0)*t2_2(0,0)
+				 + t3dg_3(1,2,1)*t2_2(1,0)
+				 + t3dg_3(1,2,2)*t2_2(2,0))
+		,"T2(l,k)*T3dg(i,j,l)(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) - (t3dg_3(1,2,0)*t2_2(0,1)
+				 + t3dg_3(1,2,1)*t2_2(1,1)
+				 + t3dg_3(1,2,2)*t2_2(2,1))
+		,"T2(l,k)*T3dg(i,j,l)(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - (t3dg_3(1,2,0)*t2_2(0,2)
+				 + t3dg_3(1,2,1)*t2_2(1,2)
+				 + t3dg_3(1,2,2)*t2_2(2,2))
+		,"T2(l,k)*T3dg(i,j,l)(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - (t3dg_3(2,0,0)*t2_2(0,0)
+				 + t3dg_3(2,0,1)*t2_2(1,0)
+				 + t3dg_3(2,0,2)*t2_2(2,0))
+		,"T2(l,k)*T3dg(i,j,l)(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) - (t3dg_3(2,0,0)*t2_2(0,1)
+				 + t3dg_3(2,0,1)*t2_2(1,1)
+				 + t3dg_3(2,0,2)*t2_2(2,1))
+		,"T2(l,k)*T3dg(i,j,l)(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) - (t3dg_3(2,0,0)*t2_2(0,2)
+				 + t3dg_3(2,0,1)*t2_2(1,2)
+				 + t3dg_3(2,0,2)*t2_2(2,2))
+		,"T2(l,k)*T3dg(i,j,l)(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) - (t3dg_3(2,1,0)*t2_2(0,0)
+				 + t3dg_3(2,1,1)*t2_2(1,0)
+				 + t3dg_3(2,1,2)*t2_2(2,0))
+		,"T2(l,k)*T3dg(i,j,l)(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - (t3dg_3(2,1,0)*t2_2(0,1)
+				 + t3dg_3(2,1,1)*t2_2(1,1)
+				 + t3dg_3(2,1,2)*t2_2(2,1))
+		,"T2(l,k)*T3dg(i,j,l)(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) - (t3dg_3(2,1,0)*t2_2(0,2)
+				 + t3dg_3(2,1,1)*t2_2(1,2)
+				 + t3dg_3(2,1,2)*t2_2(2,2))
+		,"T2(l,k)*T3dg(i,j,l)(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) - (t3dg_3(2,2,0)*t2_2(0,0)
+				 + t3dg_3(2,2,1)*t2_2(1,0)
+				 + t3dg_3(2,2,2)*t2_2(2,0))
+		,"T2(l,k)*T3dg(i,j,l)(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) - (t3dg_3(2,2,0)*t2_2(0,1)
+				 + t3dg_3(2,2,1)*t2_2(1,1)
+				 + t3dg_3(2,2,2)*t2_2(2,1))
+		,"T2(l,k)*T3dg(i,j,l)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - (t3dg_3(2,2,0)*t2_2(0,2)
+				 + t3dg_3(2,2,1)*t2_2(1,2)
+				 + t3dg_3(2,2,2)*t2_2(2,2))
+		,"T2(l,k)*T3dg(i,j,l)(2,2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXI.C
--- a/tests/conformance/T3dg/test_T3dgXXI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,254 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t3dg_1(i,j,k)=t3dg_2(i,j,l)*t2_2(k,l);
-  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0)*t2_2(0,0)
-				 + t3dg_2(0,0,1)*t2_2(0,1)
-				 + t3dg_2(0,0,2)*t2_2(0,2))
-		,"T3dg(i,j,l)*T2(k,l)(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(0,0,0)*t2_2(1,0)
-				 + t3dg_2(0,0,1)*t2_2(1,1)
-				 + t3dg_2(0,0,2)*t2_2(1,2))
-		,"T3dg(i,j,l)*T2(k,l)(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(0,0,0)*t2_2(2,0)
-				 + t3dg_2(0,0,1)*t2_2(2,1)
-				 + t3dg_2(0,0,2)*t2_2(2,2))
-		,"T3dg(i,j,l)*T2(k,l)(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,1,0)*t2_2(0,0)
-				 + t3dg_2(0,1,1)*t2_2(0,1)
-				 + t3dg_2(0,1,2)*t2_2(0,2))
-		,"T3dg(i,j,l)*T2(k,l)(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(0,1,0)*t2_2(1,0)
-				 + t3dg_2(0,1,1)*t2_2(1,1)
-				 + t3dg_2(0,1,2)*t2_2(1,2))
-		,"T3dg(i,j,l)*T2(k,l)(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(0,1,0)*t2_2(2,0)
-				 + t3dg_2(0,1,1)*t2_2(2,1)
-				 + t3dg_2(0,1,2)*t2_2(2,2))
-		,"T3dg(i,j,l)*T2(k,l)(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,2,0)*t2_2(0,0)
-				 + t3dg_2(0,2,1)*t2_2(0,1)
-				 + t3dg_2(0,2,2)*t2_2(0,2))
-		,"T3dg(i,j,l)*T2(k,l)(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(0,2,0)*t2_2(1,0)
-				 + t3dg_2(0,2,1)*t2_2(1,1)
-				 + t3dg_2(0,2,2)*t2_2(1,2))
-		,"T3dg(i,j,l)*T2(k,l)(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(0,2,0)*t2_2(2,0)
-				 + t3dg_2(0,2,1)*t2_2(2,1)
-				 + t3dg_2(0,2,2)*t2_2(2,2))
-		,"T3dg(i,j,l)*T2(k,l)(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(1,0,0)*t2_2(0,0)
-				 + t3dg_2(1,0,1)*t2_2(0,1)
-				 + t3dg_2(1,0,2)*t2_2(0,2))
-		,"T3dg(i,j,l)*T2(k,l)(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,0,0)*t2_2(1,0)
-				 + t3dg_2(1,0,1)*t2_2(1,1)
-				 + t3dg_2(1,0,2)*t2_2(1,2))
-		,"T3dg(i,j,l)*T2(k,l)(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(1,0,0)*t2_2(2,0)
-				 + t3dg_2(1,0,1)*t2_2(2,1)
-				 + t3dg_2(1,0,2)*t2_2(2,2))
-		,"T3dg(i,j,l)*T2(k,l)(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(1,1,0)*t2_2(0,0)
-				 + t3dg_2(1,1,1)*t2_2(0,1)
-				 + t3dg_2(1,1,2)*t2_2(0,2))
-		,"T3dg(i,j,l)*T2(k,l)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,0)*t2_2(1,0)
-				 + t3dg_2(1,1,1)*t2_2(1,1)
-				 + t3dg_2(1,1,2)*t2_2(1,2))
-		,"T3dg(i,j,l)*T2(k,l)(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(1,1,0)*t2_2(2,0)
-				 + t3dg_2(1,1,1)*t2_2(2,1)
-				 + t3dg_2(1,1,2)*t2_2(2,2))
-		,"T3dg(i,j,l)*T2(k,l)(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(1,2,0)*t2_2(0,0)
-				 + t3dg_2(1,2,1)*t2_2(0,1)
-				 + t3dg_2(1,2,2)*t2_2(0,2))
-		,"T3dg(i,j,l)*T2(k,l)(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,2,0)*t2_2(1,0)
-				 + t3dg_2(1,2,1)*t2_2(1,1)
-				 + t3dg_2(1,2,2)*t2_2(1,2))
-		,"T3dg(i,j,l)*T2(k,l)(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(1,2,0)*t2_2(2,0)
-				 + t3dg_2(1,2,1)*t2_2(2,1)
-				 + t3dg_2(1,2,2)*t2_2(2,2))
-		,"T3dg(i,j,l)*T2(k,l)(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(2,0,0)*t2_2(0,0)
-				 + t3dg_2(2,0,1)*t2_2(0,1)
-				 + t3dg_2(2,0,2)*t2_2(0,2))
-		,"T3dg(i,j,l)*T2(k,l)(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(2,0,0)*t2_2(1,0)
-				 + t3dg_2(2,0,1)*t2_2(1,1)
-				 + t3dg_2(2,0,2)*t2_2(1,2))
-		,"T3dg(i,j,l)*T2(k,l)(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,0,0)*t2_2(2,0)
-				 + t3dg_2(2,0,1)*t2_2(2,1)
-				 + t3dg_2(2,0,2)*t2_2(2,2))
-		,"T3dg(i,j,l)*T2(k,l)(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(2,1,0)*t2_2(0,0)
-				 + t3dg_2(2,1,1)*t2_2(0,1)
-				 + t3dg_2(2,1,2)*t2_2(0,2))
-		,"T3dg(i,j,l)*T2(k,l)(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(2,1,0)*t2_2(1,0)
-				 + t3dg_2(2,1,1)*t2_2(1,1)
-				 + t3dg_2(2,1,2)*t2_2(1,2))
-		,"T3dg(i,j,l)*T2(k,l)(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,1,0)*t2_2(2,0)
-				 + t3dg_2(2,1,1)*t2_2(2,1)
-				 + t3dg_2(2,1,2)*t2_2(2,2))
-		,"T3dg(i,j,l)*T2(k,l)(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(2,2,0)*t2_2(0,0)
-				 + t3dg_2(2,2,1)*t2_2(0,1)
-				 + t3dg_2(2,2,2)*t2_2(0,2))
-		,"T3dg(i,j,l)*T2(k,l)(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(2,2,0)*t2_2(1,0)
-				 + t3dg_2(2,2,1)*t2_2(1,1)
-				 + t3dg_2(2,2,2)*t2_2(1,2))
-		,"T3dg(i,j,l)*T2(k,l)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,0)*t2_2(2,0)
-				 + t3dg_2(2,2,1)*t2_2(2,1)
-				 + t3dg_2(2,2,2)*t2_2(2,2))
-		,"T3dg(i,j,l)*T2(k,l)(2,2,2)");
-
-  t3dg_1(i,j,k)=t2_2(k,l)*t3dg_3(i,j,l);
-  test_for_zero(t3dg_1(0,0,0) - (t3dg_3(0,0,0)*t2_2(0,0)
-				 + t3dg_3(0,0,1)*t2_2(0,1)
-				 + t3dg_3(0,0,2)*t2_2(0,2))
-		,"T2(k,l)*T3dg(i,j,l)(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) - (t3dg_3(0,0,0)*t2_2(1,0)
-				 + t3dg_3(0,0,1)*t2_2(1,1)
-				 + t3dg_3(0,0,2)*t2_2(1,2))
-		,"T2(k,l)*T3dg(i,j,l)(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) - (t3dg_3(0,0,0)*t2_2(2,0)
-				 + t3dg_3(0,0,1)*t2_2(2,1)
-				 + t3dg_3(0,0,2)*t2_2(2,2))
-		,"T2(k,l)*T3dg(i,j,l)(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) - (t3dg_3(0,1,0)*t2_2(0,0)
-				 + t3dg_3(0,1,1)*t2_2(0,1)
-				 + t3dg_3(0,1,2)*t2_2(0,2))
-		,"T2(k,l)*T3dg(i,j,l)(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - (t3dg_3(0,1,0)*t2_2(1,0)
-				 + t3dg_3(0,1,1)*t2_2(1,1)
-				 + t3dg_3(0,1,2)*t2_2(1,2))
-		,"T2(k,l)*T3dg(i,j,l)(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) - (t3dg_3(0,1,0)*t2_2(2,0)
-				 + t3dg_3(0,1,1)*t2_2(2,1)
-				 + t3dg_3(0,1,2)*t2_2(2,2))
-		,"T2(k,l)*T3dg(i,j,l)(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) - (t3dg_3(0,2,0)*t2_2(0,0)
-				 + t3dg_3(0,2,1)*t2_2(0,1)
-				 + t3dg_3(0,2,2)*t2_2(0,2))
-		,"T2(k,l)*T3dg(i,j,l)(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) - (t3dg_3(0,2,0)*t2_2(1,0)
-				 + t3dg_3(0,2,1)*t2_2(1,1)
-				 + t3dg_3(0,2,2)*t2_2(1,2))
-		,"T2(k,l)*T3dg(i,j,l)(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - (t3dg_3(0,2,0)*t2_2(2,0)
-				 + t3dg_3(0,2,1)*t2_2(2,1)
-				 + t3dg_3(0,2,2)*t2_2(2,2))
-		,"T2(k,l)*T3dg(i,j,l)(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - (t3dg_3(1,0,0)*t2_2(0,0)
-				 + t3dg_3(1,0,1)*t2_2(0,1)
-				 + t3dg_3(1,0,2)*t2_2(0,2))
-		,"T2(k,l)*T3dg(i,j,l)(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) - (t3dg_3(1,0,0)*t2_2(1,0)
-				 + t3dg_3(1,0,1)*t2_2(1,1)
-				 + t3dg_3(1,0,2)*t2_2(1,2))
-		,"T2(k,l)*T3dg(i,j,l)(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) - (t3dg_3(1,0,0)*t2_2(2,0)
-				 + t3dg_3(1,0,1)*t2_2(2,1)
-				 + t3dg_3(1,0,2)*t2_2(2,2))
-		,"T2(k,l)*T3dg(i,j,l)(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) - (t3dg_3(1,1,0)*t2_2(0,0)
-				 + t3dg_3(1,1,1)*t2_2(0,1)
-				 + t3dg_3(1,1,2)*t2_2(0,2))
-		,"T2(k,l)*T3dg(i,j,l)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - (t3dg_3(1,1,0)*t2_2(1,0)
-				 + t3dg_3(1,1,1)*t2_2(1,1)
-				 + t3dg_3(1,1,2)*t2_2(1,2))
-		,"T2(k,l)*T3dg(i,j,l)(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) - (t3dg_3(1,1,0)*t2_2(2,0)
-				 + t3dg_3(1,1,1)*t2_2(2,1)
-				 + t3dg_3(1,1,2)*t2_2(2,2))
-		,"T2(k,l)*T3dg(i,j,l)(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) - (t3dg_3(1,2,0)*t2_2(0,0)
-				 + t3dg_3(1,2,1)*t2_2(0,1)
-				 + t3dg_3(1,2,2)*t2_2(0,2))
-		,"T2(k,l)*T3dg(i,j,l)(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) - (t3dg_3(1,2,0)*t2_2(1,0)
-				 + t3dg_3(1,2,1)*t2_2(1,1)
-				 + t3dg_3(1,2,2)*t2_2(1,2))
-		,"T2(k,l)*T3dg(i,j,l)(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - (t3dg_3(1,2,0)*t2_2(2,0)
-				 + t3dg_3(1,2,1)*t2_2(2,1)
-				 + t3dg_3(1,2,2)*t2_2(2,2))
-		,"T2(k,l)*T3dg(i,j,l)(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - (t3dg_3(2,0,0)*t2_2(0,0)
-				 + t3dg_3(2,0,1)*t2_2(0,1)
-				 + t3dg_3(2,0,2)*t2_2(0,2))
-		,"T2(k,l)*T3dg(i,j,l)(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) - (t3dg_3(2,0,0)*t2_2(1,0)
-				 + t3dg_3(2,0,1)*t2_2(1,1)
-				 + t3dg_3(2,0,2)*t2_2(1,2))
-		,"T2(k,l)*T3dg(i,j,l)(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) - (t3dg_3(2,0,0)*t2_2(2,0)
-				 + t3dg_3(2,0,1)*t2_2(2,1)
-				 + t3dg_3(2,0,2)*t2_2(2,2))
-		,"T2(k,l)*T3dg(i,j,l)(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) - (t3dg_3(2,1,0)*t2_2(0,0)
-				 + t3dg_3(2,1,1)*t2_2(0,1)
-				 + t3dg_3(2,1,2)*t2_2(0,2))
-		,"T2(k,l)*T3dg(i,j,l)(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - (t3dg_3(2,1,0)*t2_2(1,0)
-				 + t3dg_3(2,1,1)*t2_2(1,1)
-				 + t3dg_3(2,1,2)*t2_2(1,2))
-		,"T2(k,l)*T3dg(i,j,l)(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) - (t3dg_3(2,1,0)*t2_2(2,0)
-				 + t3dg_3(2,1,1)*t2_2(2,1)
-				 + t3dg_3(2,1,2)*t2_2(2,2))
-		,"T2(k,l)*T3dg(i,j,l)(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) - (t3dg_3(2,2,0)*t2_2(0,0)
-				 + t3dg_3(2,2,1)*t2_2(0,1)
-				 + t3dg_3(2,2,2)*t2_2(0,2))
-		,"T2(k,l)*T3dg(i,j,l)(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) - (t3dg_3(2,2,0)*t2_2(1,0)
-				 + t3dg_3(2,2,1)*t2_2(1,1)
-				 + t3dg_3(2,2,2)*t2_2(1,2))
-		,"T2(k,l)*T3dg(i,j,l)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - (t3dg_3(2,2,0)*t2_2(2,0)
-				 + t3dg_3(2,2,1)*t2_2(2,1)
-				 + t3dg_3(2,2,2)*t2_2(2,2))
-		,"T2(k,l)*T3dg(i,j,l)(2,2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXXI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,254 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t3dg_1(i,j,k)=t3dg_2(i,j,l)*t2_2(k,l);
+  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0)*t2_2(0,0)
+				 + t3dg_2(0,0,1)*t2_2(0,1)
+				 + t3dg_2(0,0,2)*t2_2(0,2))
+		,"T3dg(i,j,l)*T2(k,l)(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(0,0,0)*t2_2(1,0)
+				 + t3dg_2(0,0,1)*t2_2(1,1)
+				 + t3dg_2(0,0,2)*t2_2(1,2))
+		,"T3dg(i,j,l)*T2(k,l)(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(0,0,0)*t2_2(2,0)
+				 + t3dg_2(0,0,1)*t2_2(2,1)
+				 + t3dg_2(0,0,2)*t2_2(2,2))
+		,"T3dg(i,j,l)*T2(k,l)(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,1,0)*t2_2(0,0)
+				 + t3dg_2(0,1,1)*t2_2(0,1)
+				 + t3dg_2(0,1,2)*t2_2(0,2))
+		,"T3dg(i,j,l)*T2(k,l)(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(0,1,0)*t2_2(1,0)
+				 + t3dg_2(0,1,1)*t2_2(1,1)
+				 + t3dg_2(0,1,2)*t2_2(1,2))
+		,"T3dg(i,j,l)*T2(k,l)(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(0,1,0)*t2_2(2,0)
+				 + t3dg_2(0,1,1)*t2_2(2,1)
+				 + t3dg_2(0,1,2)*t2_2(2,2))
+		,"T3dg(i,j,l)*T2(k,l)(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,2,0)*t2_2(0,0)
+				 + t3dg_2(0,2,1)*t2_2(0,1)
+				 + t3dg_2(0,2,2)*t2_2(0,2))
+		,"T3dg(i,j,l)*T2(k,l)(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(0,2,0)*t2_2(1,0)
+				 + t3dg_2(0,2,1)*t2_2(1,1)
+				 + t3dg_2(0,2,2)*t2_2(1,2))
+		,"T3dg(i,j,l)*T2(k,l)(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(0,2,0)*t2_2(2,0)
+				 + t3dg_2(0,2,1)*t2_2(2,1)
+				 + t3dg_2(0,2,2)*t2_2(2,2))
+		,"T3dg(i,j,l)*T2(k,l)(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(1,0,0)*t2_2(0,0)
+				 + t3dg_2(1,0,1)*t2_2(0,1)
+				 + t3dg_2(1,0,2)*t2_2(0,2))
+		,"T3dg(i,j,l)*T2(k,l)(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,0,0)*t2_2(1,0)
+				 + t3dg_2(1,0,1)*t2_2(1,1)
+				 + t3dg_2(1,0,2)*t2_2(1,2))
+		,"T3dg(i,j,l)*T2(k,l)(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(1,0,0)*t2_2(2,0)
+				 + t3dg_2(1,0,1)*t2_2(2,1)
+				 + t3dg_2(1,0,2)*t2_2(2,2))
+		,"T3dg(i,j,l)*T2(k,l)(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(1,1,0)*t2_2(0,0)
+				 + t3dg_2(1,1,1)*t2_2(0,1)
+				 + t3dg_2(1,1,2)*t2_2(0,2))
+		,"T3dg(i,j,l)*T2(k,l)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,0)*t2_2(1,0)
+				 + t3dg_2(1,1,1)*t2_2(1,1)
+				 + t3dg_2(1,1,2)*t2_2(1,2))
+		,"T3dg(i,j,l)*T2(k,l)(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(1,1,0)*t2_2(2,0)
+				 + t3dg_2(1,1,1)*t2_2(2,1)
+				 + t3dg_2(1,1,2)*t2_2(2,2))
+		,"T3dg(i,j,l)*T2(k,l)(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(1,2,0)*t2_2(0,0)
+				 + t3dg_2(1,2,1)*t2_2(0,1)
+				 + t3dg_2(1,2,2)*t2_2(0,2))
+		,"T3dg(i,j,l)*T2(k,l)(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,2,0)*t2_2(1,0)
+				 + t3dg_2(1,2,1)*t2_2(1,1)
+				 + t3dg_2(1,2,2)*t2_2(1,2))
+		,"T3dg(i,j,l)*T2(k,l)(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(1,2,0)*t2_2(2,0)
+				 + t3dg_2(1,2,1)*t2_2(2,1)
+				 + t3dg_2(1,2,2)*t2_2(2,2))
+		,"T3dg(i,j,l)*T2(k,l)(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(2,0,0)*t2_2(0,0)
+				 + t3dg_2(2,0,1)*t2_2(0,1)
+				 + t3dg_2(2,0,2)*t2_2(0,2))
+		,"T3dg(i,j,l)*T2(k,l)(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(2,0,0)*t2_2(1,0)
+				 + t3dg_2(2,0,1)*t2_2(1,1)
+				 + t3dg_2(2,0,2)*t2_2(1,2))
+		,"T3dg(i,j,l)*T2(k,l)(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,0,0)*t2_2(2,0)
+				 + t3dg_2(2,0,1)*t2_2(2,1)
+				 + t3dg_2(2,0,2)*t2_2(2,2))
+		,"T3dg(i,j,l)*T2(k,l)(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(2,1,0)*t2_2(0,0)
+				 + t3dg_2(2,1,1)*t2_2(0,1)
+				 + t3dg_2(2,1,2)*t2_2(0,2))
+		,"T3dg(i,j,l)*T2(k,l)(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(2,1,0)*t2_2(1,0)
+				 + t3dg_2(2,1,1)*t2_2(1,1)
+				 + t3dg_2(2,1,2)*t2_2(1,2))
+		,"T3dg(i,j,l)*T2(k,l)(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,1,0)*t2_2(2,0)
+				 + t3dg_2(2,1,1)*t2_2(2,1)
+				 + t3dg_2(2,1,2)*t2_2(2,2))
+		,"T3dg(i,j,l)*T2(k,l)(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(2,2,0)*t2_2(0,0)
+				 + t3dg_2(2,2,1)*t2_2(0,1)
+				 + t3dg_2(2,2,2)*t2_2(0,2))
+		,"T3dg(i,j,l)*T2(k,l)(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(2,2,0)*t2_2(1,0)
+				 + t3dg_2(2,2,1)*t2_2(1,1)
+				 + t3dg_2(2,2,2)*t2_2(1,2))
+		,"T3dg(i,j,l)*T2(k,l)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,0)*t2_2(2,0)
+				 + t3dg_2(2,2,1)*t2_2(2,1)
+				 + t3dg_2(2,2,2)*t2_2(2,2))
+		,"T3dg(i,j,l)*T2(k,l)(2,2,2)");
+
+  t3dg_1(i,j,k)=t2_2(k,l)*t3dg_3(i,j,l);
+  test_for_zero(t3dg_1(0,0,0) - (t3dg_3(0,0,0)*t2_2(0,0)
+				 + t3dg_3(0,0,1)*t2_2(0,1)
+				 + t3dg_3(0,0,2)*t2_2(0,2))
+		,"T2(k,l)*T3dg(i,j,l)(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) - (t3dg_3(0,0,0)*t2_2(1,0)
+				 + t3dg_3(0,0,1)*t2_2(1,1)
+				 + t3dg_3(0,0,2)*t2_2(1,2))
+		,"T2(k,l)*T3dg(i,j,l)(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) - (t3dg_3(0,0,0)*t2_2(2,0)
+				 + t3dg_3(0,0,1)*t2_2(2,1)
+				 + t3dg_3(0,0,2)*t2_2(2,2))
+		,"T2(k,l)*T3dg(i,j,l)(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) - (t3dg_3(0,1,0)*t2_2(0,0)
+				 + t3dg_3(0,1,1)*t2_2(0,1)
+				 + t3dg_3(0,1,2)*t2_2(0,2))
+		,"T2(k,l)*T3dg(i,j,l)(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - (t3dg_3(0,1,0)*t2_2(1,0)
+				 + t3dg_3(0,1,1)*t2_2(1,1)
+				 + t3dg_3(0,1,2)*t2_2(1,2))
+		,"T2(k,l)*T3dg(i,j,l)(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) - (t3dg_3(0,1,0)*t2_2(2,0)
+				 + t3dg_3(0,1,1)*t2_2(2,1)
+				 + t3dg_3(0,1,2)*t2_2(2,2))
+		,"T2(k,l)*T3dg(i,j,l)(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) - (t3dg_3(0,2,0)*t2_2(0,0)
+				 + t3dg_3(0,2,1)*t2_2(0,1)
+				 + t3dg_3(0,2,2)*t2_2(0,2))
+		,"T2(k,l)*T3dg(i,j,l)(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) - (t3dg_3(0,2,0)*t2_2(1,0)
+				 + t3dg_3(0,2,1)*t2_2(1,1)
+				 + t3dg_3(0,2,2)*t2_2(1,2))
+		,"T2(k,l)*T3dg(i,j,l)(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - (t3dg_3(0,2,0)*t2_2(2,0)
+				 + t3dg_3(0,2,1)*t2_2(2,1)
+				 + t3dg_3(0,2,2)*t2_2(2,2))
+		,"T2(k,l)*T3dg(i,j,l)(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - (t3dg_3(1,0,0)*t2_2(0,0)
+				 + t3dg_3(1,0,1)*t2_2(0,1)
+				 + t3dg_3(1,0,2)*t2_2(0,2))
+		,"T2(k,l)*T3dg(i,j,l)(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) - (t3dg_3(1,0,0)*t2_2(1,0)
+				 + t3dg_3(1,0,1)*t2_2(1,1)
+				 + t3dg_3(1,0,2)*t2_2(1,2))
+		,"T2(k,l)*T3dg(i,j,l)(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) - (t3dg_3(1,0,0)*t2_2(2,0)
+				 + t3dg_3(1,0,1)*t2_2(2,1)
+				 + t3dg_3(1,0,2)*t2_2(2,2))
+		,"T2(k,l)*T3dg(i,j,l)(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) - (t3dg_3(1,1,0)*t2_2(0,0)
+				 + t3dg_3(1,1,1)*t2_2(0,1)
+				 + t3dg_3(1,1,2)*t2_2(0,2))
+		,"T2(k,l)*T3dg(i,j,l)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - (t3dg_3(1,1,0)*t2_2(1,0)
+				 + t3dg_3(1,1,1)*t2_2(1,1)
+				 + t3dg_3(1,1,2)*t2_2(1,2))
+		,"T2(k,l)*T3dg(i,j,l)(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) - (t3dg_3(1,1,0)*t2_2(2,0)
+				 + t3dg_3(1,1,1)*t2_2(2,1)
+				 + t3dg_3(1,1,2)*t2_2(2,2))
+		,"T2(k,l)*T3dg(i,j,l)(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) - (t3dg_3(1,2,0)*t2_2(0,0)
+				 + t3dg_3(1,2,1)*t2_2(0,1)
+				 + t3dg_3(1,2,2)*t2_2(0,2))
+		,"T2(k,l)*T3dg(i,j,l)(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) - (t3dg_3(1,2,0)*t2_2(1,0)
+				 + t3dg_3(1,2,1)*t2_2(1,1)
+				 + t3dg_3(1,2,2)*t2_2(1,2))
+		,"T2(k,l)*T3dg(i,j,l)(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - (t3dg_3(1,2,0)*t2_2(2,0)
+				 + t3dg_3(1,2,1)*t2_2(2,1)
+				 + t3dg_3(1,2,2)*t2_2(2,2))
+		,"T2(k,l)*T3dg(i,j,l)(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - (t3dg_3(2,0,0)*t2_2(0,0)
+				 + t3dg_3(2,0,1)*t2_2(0,1)
+				 + t3dg_3(2,0,2)*t2_2(0,2))
+		,"T2(k,l)*T3dg(i,j,l)(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) - (t3dg_3(2,0,0)*t2_2(1,0)
+				 + t3dg_3(2,0,1)*t2_2(1,1)
+				 + t3dg_3(2,0,2)*t2_2(1,2))
+		,"T2(k,l)*T3dg(i,j,l)(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) - (t3dg_3(2,0,0)*t2_2(2,0)
+				 + t3dg_3(2,0,1)*t2_2(2,1)
+				 + t3dg_3(2,0,2)*t2_2(2,2))
+		,"T2(k,l)*T3dg(i,j,l)(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) - (t3dg_3(2,1,0)*t2_2(0,0)
+				 + t3dg_3(2,1,1)*t2_2(0,1)
+				 + t3dg_3(2,1,2)*t2_2(0,2))
+		,"T2(k,l)*T3dg(i,j,l)(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - (t3dg_3(2,1,0)*t2_2(1,0)
+				 + t3dg_3(2,1,1)*t2_2(1,1)
+				 + t3dg_3(2,1,2)*t2_2(1,2))
+		,"T2(k,l)*T3dg(i,j,l)(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) - (t3dg_3(2,1,0)*t2_2(2,0)
+				 + t3dg_3(2,1,1)*t2_2(2,1)
+				 + t3dg_3(2,1,2)*t2_2(2,2))
+		,"T2(k,l)*T3dg(i,j,l)(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) - (t3dg_3(2,2,0)*t2_2(0,0)
+				 + t3dg_3(2,2,1)*t2_2(0,1)
+				 + t3dg_3(2,2,2)*t2_2(0,2))
+		,"T2(k,l)*T3dg(i,j,l)(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) - (t3dg_3(2,2,0)*t2_2(1,0)
+				 + t3dg_3(2,2,1)*t2_2(1,1)
+				 + t3dg_3(2,2,2)*t2_2(1,2))
+		,"T2(k,l)*T3dg(i,j,l)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - (t3dg_3(2,2,0)*t2_2(2,0)
+				 + t3dg_3(2,2,1)*t2_2(2,1)
+				 + t3dg_3(2,2,2)*t2_2(2,2))
+		,"T2(k,l)*T3dg(i,j,l)(2,2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXII.C
--- a/tests/conformance/T3dg/test_T3dgXXII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t1_1(i)=t3dg_2(i,j,k)*t2_2(j,k);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
-			   + t3dg_2(0,0,1)*t2_2(0,1)
-			   + t3dg_2(0,0,2)*t2_2(0,2)
-			   + t3dg_2(0,1,0)*t2_2(1,0)
-			   + t3dg_2(0,1,1)*t2_2(1,1)
-			   + t3dg_2(0,1,2)*t2_2(1,2)
-			   + t3dg_2(0,2,0)*t2_2(2,0)
-			   + t3dg_2(0,2,1)*t2_2(2,1)
-			   + t3dg_2(0,2,2)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(j,k)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(1,0,0)*t2_2(0,0)
-			   + t3dg_2(1,0,1)*t2_2(0,1)
-			   + t3dg_2(1,0,2)*t2_2(0,2)
-			   + t3dg_2(1,1,0)*t2_2(1,0)
-			   + t3dg_2(1,1,1)*t2_2(1,1)
-			   + t3dg_2(1,1,2)*t2_2(1,2)
-			   + t3dg_2(1,2,0)*t2_2(2,0)
-			   + t3dg_2(1,2,1)*t2_2(2,1)
-			   + t3dg_2(1,2,2)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(j,k)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(2,0,0)*t2_2(0,0)
-			   + t3dg_2(2,0,1)*t2_2(0,1)
-			   + t3dg_2(2,0,2)*t2_2(0,2)
-			   + t3dg_2(2,1,0)*t2_2(1,0)
-			   + t3dg_2(2,1,1)*t2_2(1,1)
-			   + t3dg_2(2,1,2)*t2_2(1,2)
-			   + t3dg_2(2,2,0)*t2_2(2,0)
-			   + t3dg_2(2,2,1)*t2_2(2,1)
-			   + t3dg_2(2,2,2)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(j,k)(2)");
-
-  t1_1(i)=t2_2(j,k)*t3dg_2(i,j,k);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
-			   + t3dg_2(0,0,1)*t2_2(0,1)
-			   + t3dg_2(0,0,2)*t2_2(0,2)
-			   + t3dg_2(0,1,0)*t2_2(1,0)
-			   + t3dg_2(0,1,1)*t2_2(1,1)
-			   + t3dg_2(0,1,2)*t2_2(1,2)
-			   + t3dg_2(0,2,0)*t2_2(2,0)
-			   + t3dg_2(0,2,1)*t2_2(2,1)
-			   + t3dg_2(0,2,2)*t2_2(2,2))
-		,"T2(j,k)*T3dg(i,j,k)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(1,0,0)*t2_2(0,0)
-			   + t3dg_2(1,0,1)*t2_2(0,1)
-			   + t3dg_2(1,0,2)*t2_2(0,2)
-			   + t3dg_2(1,1,0)*t2_2(1,0)
-			   + t3dg_2(1,1,1)*t2_2(1,1)
-			   + t3dg_2(1,1,2)*t2_2(1,2)
-			   + t3dg_2(1,2,0)*t2_2(2,0)
-			   + t3dg_2(1,2,1)*t2_2(2,1)
-			   + t3dg_2(1,2,2)*t2_2(2,2))
-		,"T2(j,k)*T3dg(i,j,k)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(2,0,0)*t2_2(0,0)
-			   + t3dg_2(2,0,1)*t2_2(0,1)
-			   + t3dg_2(2,0,2)*t2_2(0,2)
-			   + t3dg_2(2,1,0)*t2_2(1,0)
-			   + t3dg_2(2,1,1)*t2_2(1,1)
-			   + t3dg_2(2,1,2)*t2_2(1,2)
-			   + t3dg_2(2,2,0)*t2_2(2,0)
-			   + t3dg_2(2,2,1)*t2_2(2,1)
-			   + t3dg_2(2,2,2)*t2_2(2,2))
-		,"T2(j,k)*T3dg(i,j,k)(2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXXII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,98 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t1_1(i)=t3dg_2(i,j,k)*t2_2(j,k);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
+			   + t3dg_2(0,0,1)*t2_2(0,1)
+			   + t3dg_2(0,0,2)*t2_2(0,2)
+			   + t3dg_2(0,1,0)*t2_2(1,0)
+			   + t3dg_2(0,1,1)*t2_2(1,1)
+			   + t3dg_2(0,1,2)*t2_2(1,2)
+			   + t3dg_2(0,2,0)*t2_2(2,0)
+			   + t3dg_2(0,2,1)*t2_2(2,1)
+			   + t3dg_2(0,2,2)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(j,k)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(1,0,0)*t2_2(0,0)
+			   + t3dg_2(1,0,1)*t2_2(0,1)
+			   + t3dg_2(1,0,2)*t2_2(0,2)
+			   + t3dg_2(1,1,0)*t2_2(1,0)
+			   + t3dg_2(1,1,1)*t2_2(1,1)
+			   + t3dg_2(1,1,2)*t2_2(1,2)
+			   + t3dg_2(1,2,0)*t2_2(2,0)
+			   + t3dg_2(1,2,1)*t2_2(2,1)
+			   + t3dg_2(1,2,2)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(j,k)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(2,0,0)*t2_2(0,0)
+			   + t3dg_2(2,0,1)*t2_2(0,1)
+			   + t3dg_2(2,0,2)*t2_2(0,2)
+			   + t3dg_2(2,1,0)*t2_2(1,0)
+			   + t3dg_2(2,1,1)*t2_2(1,1)
+			   + t3dg_2(2,1,2)*t2_2(1,2)
+			   + t3dg_2(2,2,0)*t2_2(2,0)
+			   + t3dg_2(2,2,1)*t2_2(2,1)
+			   + t3dg_2(2,2,2)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(j,k)(2)");
+
+  t1_1(i)=t2_2(j,k)*t3dg_2(i,j,k);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
+			   + t3dg_2(0,0,1)*t2_2(0,1)
+			   + t3dg_2(0,0,2)*t2_2(0,2)
+			   + t3dg_2(0,1,0)*t2_2(1,0)
+			   + t3dg_2(0,1,1)*t2_2(1,1)
+			   + t3dg_2(0,1,2)*t2_2(1,2)
+			   + t3dg_2(0,2,0)*t2_2(2,0)
+			   + t3dg_2(0,2,1)*t2_2(2,1)
+			   + t3dg_2(0,2,2)*t2_2(2,2))
+		,"T2(j,k)*T3dg(i,j,k)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(1,0,0)*t2_2(0,0)
+			   + t3dg_2(1,0,1)*t2_2(0,1)
+			   + t3dg_2(1,0,2)*t2_2(0,2)
+			   + t3dg_2(1,1,0)*t2_2(1,0)
+			   + t3dg_2(1,1,1)*t2_2(1,1)
+			   + t3dg_2(1,1,2)*t2_2(1,2)
+			   + t3dg_2(1,2,0)*t2_2(2,0)
+			   + t3dg_2(1,2,1)*t2_2(2,1)
+			   + t3dg_2(1,2,2)*t2_2(2,2))
+		,"T2(j,k)*T3dg(i,j,k)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(2,0,0)*t2_2(0,0)
+			   + t3dg_2(2,0,1)*t2_2(0,1)
+			   + t3dg_2(2,0,2)*t2_2(0,2)
+			   + t3dg_2(2,1,0)*t2_2(1,0)
+			   + t3dg_2(2,1,1)*t2_2(1,1)
+			   + t3dg_2(2,1,2)*t2_2(1,2)
+			   + t3dg_2(2,2,0)*t2_2(2,0)
+			   + t3dg_2(2,2,1)*t2_2(2,1)
+			   + t3dg_2(2,2,2)*t2_2(2,2))
+		,"T2(j,k)*T3dg(i,j,k)(2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXIII.C
--- a/tests/conformance/T3dg/test_T3dgXXIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t1_1(i)=t3dg_2(i,j,k)*t2_2(k,j);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
-			   + t3dg_2(0,0,1)*t2_2(1,0)
-			   + t3dg_2(0,0,2)*t2_2(2,0)
-			   + t3dg_2(0,1,0)*t2_2(0,1)
-			   + t3dg_2(0,1,1)*t2_2(1,1)
-			   + t3dg_2(0,1,2)*t2_2(2,1)
-			   + t3dg_2(0,2,0)*t2_2(0,2)
-			   + t3dg_2(0,2,1)*t2_2(1,2)
-			   + t3dg_2(0,2,2)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(k,j)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(1,0,0)*t2_2(0,0)
-			   + t3dg_2(1,0,1)*t2_2(1,0)
-			   + t3dg_2(1,0,2)*t2_2(2,0)
-			   + t3dg_2(1,1,0)*t2_2(0,1)
-			   + t3dg_2(1,1,1)*t2_2(1,1)
-			   + t3dg_2(1,1,2)*t2_2(2,1)
-			   + t3dg_2(1,2,0)*t2_2(0,2)
-			   + t3dg_2(1,2,1)*t2_2(1,2)
-			   + t3dg_2(1,2,2)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(k,j)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(2,0,0)*t2_2(0,0)
-			   + t3dg_2(2,0,1)*t2_2(1,0)
-			   + t3dg_2(2,0,2)*t2_2(2,0)
-			   + t3dg_2(2,1,0)*t2_2(0,1)
-			   + t3dg_2(2,1,1)*t2_2(1,1)
-			   + t3dg_2(2,1,2)*t2_2(2,1)
-			   + t3dg_2(2,2,0)*t2_2(0,2)
-			   + t3dg_2(2,2,1)*t2_2(1,2)
-			   + t3dg_2(2,2,2)*t2_2(2,2))
-		,"T3dg(i,j,k)*T2(k,j)(2)");
-
-  t1_1(i)=t2_2(k,j)*t3dg_2(i,j,k);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
-			   + t3dg_2(0,0,1)*t2_2(1,0)
-			   + t3dg_2(0,0,2)*t2_2(2,0)
-			   + t3dg_2(0,1,0)*t2_2(0,1)
-			   + t3dg_2(0,1,1)*t2_2(1,1)
-			   + t3dg_2(0,1,2)*t2_2(2,1)
-			   + t3dg_2(0,2,0)*t2_2(0,2)
-			   + t3dg_2(0,2,1)*t2_2(1,2)
-			   + t3dg_2(0,2,2)*t2_2(2,2))
-		,"T2(k,j)*T3dg(i,j,k)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(1,0,0)*t2_2(0,0)
-			   + t3dg_2(1,0,1)*t2_2(1,0)
-			   + t3dg_2(1,0,2)*t2_2(2,0)
-			   + t3dg_2(1,1,0)*t2_2(0,1)
-			   + t3dg_2(1,1,1)*t2_2(1,1)
-			   + t3dg_2(1,1,2)*t2_2(2,1)
-			   + t3dg_2(1,2,0)*t2_2(0,2)
-			   + t3dg_2(1,2,1)*t2_2(1,2)
-			   + t3dg_2(1,2,2)*t2_2(2,2))
-		,"T2(k,j)*T3dg(i,j,k)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(2,0,0)*t2_2(0,0)
-			   + t3dg_2(2,0,1)*t2_2(1,0)
-			   + t3dg_2(2,0,2)*t2_2(2,0)
-			   + t3dg_2(2,1,0)*t2_2(0,1)
-			   + t3dg_2(2,1,1)*t2_2(1,1)
-			   + t3dg_2(2,1,2)*t2_2(2,1)
-			   + t3dg_2(2,2,0)*t2_2(0,2)
-			   + t3dg_2(2,2,1)*t2_2(1,2)
-			   + t3dg_2(2,2,2)*t2_2(2,2))
-		,"T2(k,j)*T3dg(i,j,k)(2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXXIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,98 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t1_1(i)=t3dg_2(i,j,k)*t2_2(k,j);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
+			   + t3dg_2(0,0,1)*t2_2(1,0)
+			   + t3dg_2(0,0,2)*t2_2(2,0)
+			   + t3dg_2(0,1,0)*t2_2(0,1)
+			   + t3dg_2(0,1,1)*t2_2(1,1)
+			   + t3dg_2(0,1,2)*t2_2(2,1)
+			   + t3dg_2(0,2,0)*t2_2(0,2)
+			   + t3dg_2(0,2,1)*t2_2(1,2)
+			   + t3dg_2(0,2,2)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(k,j)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(1,0,0)*t2_2(0,0)
+			   + t3dg_2(1,0,1)*t2_2(1,0)
+			   + t3dg_2(1,0,2)*t2_2(2,0)
+			   + t3dg_2(1,1,0)*t2_2(0,1)
+			   + t3dg_2(1,1,1)*t2_2(1,1)
+			   + t3dg_2(1,1,2)*t2_2(2,1)
+			   + t3dg_2(1,2,0)*t2_2(0,2)
+			   + t3dg_2(1,2,1)*t2_2(1,2)
+			   + t3dg_2(1,2,2)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(k,j)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(2,0,0)*t2_2(0,0)
+			   + t3dg_2(2,0,1)*t2_2(1,0)
+			   + t3dg_2(2,0,2)*t2_2(2,0)
+			   + t3dg_2(2,1,0)*t2_2(0,1)
+			   + t3dg_2(2,1,1)*t2_2(1,1)
+			   + t3dg_2(2,1,2)*t2_2(2,1)
+			   + t3dg_2(2,2,0)*t2_2(0,2)
+			   + t3dg_2(2,2,1)*t2_2(1,2)
+			   + t3dg_2(2,2,2)*t2_2(2,2))
+		,"T3dg(i,j,k)*T2(k,j)(2)");
+
+  t1_1(i)=t2_2(k,j)*t3dg_2(i,j,k);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
+			   + t3dg_2(0,0,1)*t2_2(1,0)
+			   + t3dg_2(0,0,2)*t2_2(2,0)
+			   + t3dg_2(0,1,0)*t2_2(0,1)
+			   + t3dg_2(0,1,1)*t2_2(1,1)
+			   + t3dg_2(0,1,2)*t2_2(2,1)
+			   + t3dg_2(0,2,0)*t2_2(0,2)
+			   + t3dg_2(0,2,1)*t2_2(1,2)
+			   + t3dg_2(0,2,2)*t2_2(2,2))
+		,"T2(k,j)*T3dg(i,j,k)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(1,0,0)*t2_2(0,0)
+			   + t3dg_2(1,0,1)*t2_2(1,0)
+			   + t3dg_2(1,0,2)*t2_2(2,0)
+			   + t3dg_2(1,1,0)*t2_2(0,1)
+			   + t3dg_2(1,1,1)*t2_2(1,1)
+			   + t3dg_2(1,1,2)*t2_2(2,1)
+			   + t3dg_2(1,2,0)*t2_2(0,2)
+			   + t3dg_2(1,2,1)*t2_2(1,2)
+			   + t3dg_2(1,2,2)*t2_2(2,2))
+		,"T2(k,j)*T3dg(i,j,k)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(2,0,0)*t2_2(0,0)
+			   + t3dg_2(2,0,1)*t2_2(1,0)
+			   + t3dg_2(2,0,2)*t2_2(2,0)
+			   + t3dg_2(2,1,0)*t2_2(0,1)
+			   + t3dg_2(2,1,1)*t2_2(1,1)
+			   + t3dg_2(2,1,2)*t2_2(2,1)
+			   + t3dg_2(2,2,0)*t2_2(0,2)
+			   + t3dg_2(2,2,1)*t2_2(1,2)
+			   + t3dg_2(2,2,2)*t2_2(2,2))
+		,"T2(k,j)*T3dg(i,j,k)(2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXIV.C
--- a/tests/conformance/T3dg/test_T3dgXXIV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t1_1(i)=t3dg_2(j,i,k)*t2_2(j,k);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
-			   + t3dg_2(0,0,1)*t2_2(0,1)
-			   + t3dg_2(0,0,2)*t2_2(0,2)
-			   + t3dg_2(1,0,0)*t2_2(1,0)
-			   + t3dg_2(1,0,1)*t2_2(1,1)
-			   + t3dg_2(1,0,2)*t2_2(1,2)
-			   + t3dg_2(2,0,0)*t2_2(2,0)
-			   + t3dg_2(2,0,1)*t2_2(2,1)
-			   + t3dg_2(2,0,2)*t2_2(2,2))
-		,"T3dg(j,i,k)*T2(j,k)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(0,1,0)*t2_2(0,0)
-			   + t3dg_2(0,1,1)*t2_2(0,1)
-			   + t3dg_2(0,1,2)*t2_2(0,2)
-			   + t3dg_2(1,1,0)*t2_2(1,0)
-			   + t3dg_2(1,1,1)*t2_2(1,1)
-			   + t3dg_2(1,1,2)*t2_2(1,2)
-			   + t3dg_2(2,1,0)*t2_2(2,0)
-			   + t3dg_2(2,1,1)*t2_2(2,1)
-			   + t3dg_2(2,1,2)*t2_2(2,2))
-		,"T3dg(j,i,k)*T2(j,k)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(0,2,0)*t2_2(0,0)
-			   + t3dg_2(0,2,1)*t2_2(0,1)
-			   + t3dg_2(0,2,2)*t2_2(0,2)
-			   + t3dg_2(1,2,0)*t2_2(1,0)
-			   + t3dg_2(1,2,1)*t2_2(1,1)
-			   + t3dg_2(1,2,2)*t2_2(1,2)
-			   + t3dg_2(2,2,0)*t2_2(2,0)
-			   + t3dg_2(2,2,1)*t2_2(2,1)
-			   + t3dg_2(2,2,2)*t2_2(2,2))
-		,"T3dg(j,i,k)*T2(j,k)(2)");
-
-  t1_1(i)=t2_2(j,k)*t3dg_2(j,i,k);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
-			   + t3dg_2(0,0,1)*t2_2(0,1)
-			   + t3dg_2(0,0,2)*t2_2(0,2)
-			   + t3dg_2(1,0,0)*t2_2(1,0)
-			   + t3dg_2(1,0,1)*t2_2(1,1)
-			   + t3dg_2(1,0,2)*t2_2(1,2)
-			   + t3dg_2(2,0,0)*t2_2(2,0)
-			   + t3dg_2(2,0,1)*t2_2(2,1)
-			   + t3dg_2(2,0,2)*t2_2(2,2))
-		,"T2(j,k)*T3dg(j,i,k)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(0,1,0)*t2_2(0,0)
-			   + t3dg_2(0,1,1)*t2_2(0,1)
-			   + t3dg_2(0,1,2)*t2_2(0,2)
-			   + t3dg_2(1,1,0)*t2_2(1,0)
-			   + t3dg_2(1,1,1)*t2_2(1,1)
-			   + t3dg_2(1,1,2)*t2_2(1,2)
-			   + t3dg_2(2,1,0)*t2_2(2,0)
-			   + t3dg_2(2,1,1)*t2_2(2,1)
-			   + t3dg_2(2,1,2)*t2_2(2,2))
-		,"T2(j,k)*T3dg(j,i,k)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(0,2,0)*t2_2(0,0)
-			   + t3dg_2(0,2,1)*t2_2(0,1)
-			   + t3dg_2(0,2,2)*t2_2(0,2)
-			   + t3dg_2(1,2,0)*t2_2(1,0)
-			   + t3dg_2(1,2,1)*t2_2(1,1)
-			   + t3dg_2(1,2,2)*t2_2(1,2)
-			   + t3dg_2(2,2,0)*t2_2(2,0)
-			   + t3dg_2(2,2,1)*t2_2(2,1)
-			   + t3dg_2(2,2,2)*t2_2(2,2))
-		,"T2(j,k)*T3dg(j,i,k)(2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXIV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXXIV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,98 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t1_1(i)=t3dg_2(j,i,k)*t2_2(j,k);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
+			   + t3dg_2(0,0,1)*t2_2(0,1)
+			   + t3dg_2(0,0,2)*t2_2(0,2)
+			   + t3dg_2(1,0,0)*t2_2(1,0)
+			   + t3dg_2(1,0,1)*t2_2(1,1)
+			   + t3dg_2(1,0,2)*t2_2(1,2)
+			   + t3dg_2(2,0,0)*t2_2(2,0)
+			   + t3dg_2(2,0,1)*t2_2(2,1)
+			   + t3dg_2(2,0,2)*t2_2(2,2))
+		,"T3dg(j,i,k)*T2(j,k)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(0,1,0)*t2_2(0,0)
+			   + t3dg_2(0,1,1)*t2_2(0,1)
+			   + t3dg_2(0,1,2)*t2_2(0,2)
+			   + t3dg_2(1,1,0)*t2_2(1,0)
+			   + t3dg_2(1,1,1)*t2_2(1,1)
+			   + t3dg_2(1,1,2)*t2_2(1,2)
+			   + t3dg_2(2,1,0)*t2_2(2,0)
+			   + t3dg_2(2,1,1)*t2_2(2,1)
+			   + t3dg_2(2,1,2)*t2_2(2,2))
+		,"T3dg(j,i,k)*T2(j,k)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(0,2,0)*t2_2(0,0)
+			   + t3dg_2(0,2,1)*t2_2(0,1)
+			   + t3dg_2(0,2,2)*t2_2(0,2)
+			   + t3dg_2(1,2,0)*t2_2(1,0)
+			   + t3dg_2(1,2,1)*t2_2(1,1)
+			   + t3dg_2(1,2,2)*t2_2(1,2)
+			   + t3dg_2(2,2,0)*t2_2(2,0)
+			   + t3dg_2(2,2,1)*t2_2(2,1)
+			   + t3dg_2(2,2,2)*t2_2(2,2))
+		,"T3dg(j,i,k)*T2(j,k)(2)");
+
+  t1_1(i)=t2_2(j,k)*t3dg_2(j,i,k);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
+			   + t3dg_2(0,0,1)*t2_2(0,1)
+			   + t3dg_2(0,0,2)*t2_2(0,2)
+			   + t3dg_2(1,0,0)*t2_2(1,0)
+			   + t3dg_2(1,0,1)*t2_2(1,1)
+			   + t3dg_2(1,0,2)*t2_2(1,2)
+			   + t3dg_2(2,0,0)*t2_2(2,0)
+			   + t3dg_2(2,0,1)*t2_2(2,1)
+			   + t3dg_2(2,0,2)*t2_2(2,2))
+		,"T2(j,k)*T3dg(j,i,k)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(0,1,0)*t2_2(0,0)
+			   + t3dg_2(0,1,1)*t2_2(0,1)
+			   + t3dg_2(0,1,2)*t2_2(0,2)
+			   + t3dg_2(1,1,0)*t2_2(1,0)
+			   + t3dg_2(1,1,1)*t2_2(1,1)
+			   + t3dg_2(1,1,2)*t2_2(1,2)
+			   + t3dg_2(2,1,0)*t2_2(2,0)
+			   + t3dg_2(2,1,1)*t2_2(2,1)
+			   + t3dg_2(2,1,2)*t2_2(2,2))
+		,"T2(j,k)*T3dg(j,i,k)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(0,2,0)*t2_2(0,0)
+			   + t3dg_2(0,2,1)*t2_2(0,1)
+			   + t3dg_2(0,2,2)*t2_2(0,2)
+			   + t3dg_2(1,2,0)*t2_2(1,0)
+			   + t3dg_2(1,2,1)*t2_2(1,1)
+			   + t3dg_2(1,2,2)*t2_2(1,2)
+			   + t3dg_2(2,2,0)*t2_2(2,0)
+			   + t3dg_2(2,2,1)*t2_2(2,1)
+			   + t3dg_2(2,2,2)*t2_2(2,2))
+		,"T2(j,k)*T3dg(j,i,k)(2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXIX.C
--- a/tests/conformance/T3dg/test_T3dgXXIX.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,254 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t3dg_1(i,j,k)=t3dg_2(i,j,l)*t2s_2(k,l);
-  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0)*t2s_2(0,0)
-				 + t3dg_2(0,0,1)*t2s_2(0,1)
-				 + t3dg_2(0,0,2)*t2s_2(0,2))
-		,"T3dg(i,j,l)*T2s(k,l)(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(0,0,0)*t2s_2(1,0)
-				 + t3dg_2(0,0,1)*t2s_2(1,1)
-				 + t3dg_2(0,0,2)*t2s_2(1,2))
-		,"T3dg(i,j,l)*T2s(k,l)(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(0,0,0)*t2s_2(2,0)
-				 + t3dg_2(0,0,1)*t2s_2(2,1)
-				 + t3dg_2(0,0,2)*t2s_2(2,2))
-		,"T3dg(i,j,l)*T2s(k,l)(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,1,0)*t2s_2(0,0)
-				 + t3dg_2(0,1,1)*t2s_2(0,1)
-				 + t3dg_2(0,1,2)*t2s_2(0,2))
-		,"T3dg(i,j,l)*T2s(k,l)(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(0,1,0)*t2s_2(1,0)
-				 + t3dg_2(0,1,1)*t2s_2(1,1)
-				 + t3dg_2(0,1,2)*t2s_2(1,2))
-		,"T3dg(i,j,l)*T2s(k,l)(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(0,1,0)*t2s_2(2,0)
-				 + t3dg_2(0,1,1)*t2s_2(2,1)
-				 + t3dg_2(0,1,2)*t2s_2(2,2))
-		,"T3dg(i,j,l)*T2s(k,l)(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,2,0)*t2s_2(0,0)
-				 + t3dg_2(0,2,1)*t2s_2(0,1)
-				 + t3dg_2(0,2,2)*t2s_2(0,2))
-		,"T3dg(i,j,l)*T2s(k,l)(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(0,2,0)*t2s_2(1,0)
-				 + t3dg_2(0,2,1)*t2s_2(1,1)
-				 + t3dg_2(0,2,2)*t2s_2(1,2))
-		,"T3dg(i,j,l)*T2s(k,l)(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(0,2,0)*t2s_2(2,0)
-				 + t3dg_2(0,2,1)*t2s_2(2,1)
-				 + t3dg_2(0,2,2)*t2s_2(2,2))
-		,"T3dg(i,j,l)*T2s(k,l)(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(1,0,0)*t2s_2(0,0)
-				 + t3dg_2(1,0,1)*t2s_2(0,1)
-				 + t3dg_2(1,0,2)*t2s_2(0,2))
-		,"T3dg(i,j,l)*T2s(k,l)(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,0,0)*t2s_2(1,0)
-				 + t3dg_2(1,0,1)*t2s_2(1,1)
-				 + t3dg_2(1,0,2)*t2s_2(1,2))
-		,"T3dg(i,j,l)*T2s(k,l)(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(1,0,0)*t2s_2(2,0)
-				 + t3dg_2(1,0,1)*t2s_2(2,1)
-				 + t3dg_2(1,0,2)*t2s_2(2,2))
-		,"T3dg(i,j,l)*T2s(k,l)(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(1,1,0)*t2s_2(0,0)
-				 + t3dg_2(1,1,1)*t2s_2(0,1)
-				 + t3dg_2(1,1,2)*t2s_2(0,2))
-		,"T3dg(i,j,l)*T2s(k,l)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,0)*t2s_2(1,0)
-				 + t3dg_2(1,1,1)*t2s_2(1,1)
-				 + t3dg_2(1,1,2)*t2s_2(1,2))
-		,"T3dg(i,j,l)*T2s(k,l)(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(1,1,0)*t2s_2(2,0)
-				 + t3dg_2(1,1,1)*t2s_2(2,1)
-				 + t3dg_2(1,1,2)*t2s_2(2,2))
-		,"T3dg(i,j,l)*T2s(k,l)(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(1,2,0)*t2s_2(0,0)
-				 + t3dg_2(1,2,1)*t2s_2(0,1)
-				 + t3dg_2(1,2,2)*t2s_2(0,2))
-		,"T3dg(i,j,l)*T2s(k,l)(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,2,0)*t2s_2(1,0)
-				 + t3dg_2(1,2,1)*t2s_2(1,1)
-				 + t3dg_2(1,2,2)*t2s_2(1,2))
-		,"T3dg(i,j,l)*T2s(k,l)(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(1,2,0)*t2s_2(2,0)
-				 + t3dg_2(1,2,1)*t2s_2(2,1)
-				 + t3dg_2(1,2,2)*t2s_2(2,2))
-		,"T3dg(i,j,l)*T2s(k,l)(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(2,0,0)*t2s_2(0,0)
-				 + t3dg_2(2,0,1)*t2s_2(0,1)
-				 + t3dg_2(2,0,2)*t2s_2(0,2))
-		,"T3dg(i,j,l)*T2s(k,l)(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(2,0,0)*t2s_2(1,0)
-				 + t3dg_2(2,0,1)*t2s_2(1,1)
-				 + t3dg_2(2,0,2)*t2s_2(1,2))
-		,"T3dg(i,j,l)*T2s(k,l)(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,0,0)*t2s_2(2,0)
-				 + t3dg_2(2,0,1)*t2s_2(2,1)
-				 + t3dg_2(2,0,2)*t2s_2(2,2))
-		,"T3dg(i,j,l)*T2s(k,l)(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(2,1,0)*t2s_2(0,0)
-				 + t3dg_2(2,1,1)*t2s_2(0,1)
-				 + t3dg_2(2,1,2)*t2s_2(0,2))
-		,"T3dg(i,j,l)*T2s(k,l)(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(2,1,0)*t2s_2(1,0)
-				 + t3dg_2(2,1,1)*t2s_2(1,1)
-				 + t3dg_2(2,1,2)*t2s_2(1,2))
-		,"T3dg(i,j,l)*T2s(k,l)(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,1,0)*t2s_2(2,0)
-				 + t3dg_2(2,1,1)*t2s_2(2,1)
-				 + t3dg_2(2,1,2)*t2s_2(2,2))
-		,"T3dg(i,j,l)*T2s(k,l)(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(2,2,0)*t2s_2(0,0)
-				 + t3dg_2(2,2,1)*t2s_2(0,1)
-				 + t3dg_2(2,2,2)*t2s_2(0,2))
-		,"T3dg(i,j,l)*T2s(k,l)(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(2,2,0)*t2s_2(1,0)
-				 + t3dg_2(2,2,1)*t2s_2(1,1)
-				 + t3dg_2(2,2,2)*t2s_2(1,2))
-		,"T3dg(i,j,l)*T2s(k,l)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,0)*t2s_2(2,0)
-				 + t3dg_2(2,2,1)*t2s_2(2,1)
-				 + t3dg_2(2,2,2)*t2s_2(2,2))
-		,"T3dg(i,j,l)*T2s(k,l)(2,2,2)");
-
-  t3dg_1(i,j,k)=t2s_2(k,l)*t3dg_3(i,j,l);
-  test_for_zero(t3dg_1(0,0,0) - (t3dg_3(0,0,0)*t2s_2(0,0)
-				 + t3dg_3(0,0,1)*t2s_2(0,1)
-				 + t3dg_3(0,0,2)*t2s_2(0,2))
-		,"T2s(k,l)*T3dg(i,j,l)(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) - (t3dg_3(0,0,0)*t2s_2(1,0)
-				 + t3dg_3(0,0,1)*t2s_2(1,1)
-				 + t3dg_3(0,0,2)*t2s_2(1,2))
-		,"T2s(k,l)*T3dg(i,j,l)(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) - (t3dg_3(0,0,0)*t2s_2(2,0)
-				 + t3dg_3(0,0,1)*t2s_2(2,1)
-				 + t3dg_3(0,0,2)*t2s_2(2,2))
-		,"T2s(k,l)*T3dg(i,j,l)(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) - (t3dg_3(0,1,0)*t2s_2(0,0)
-				 + t3dg_3(0,1,1)*t2s_2(0,1)
-				 + t3dg_3(0,1,2)*t2s_2(0,2))
-		,"T2s(k,l)*T3dg(i,j,l)(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - (t3dg_3(0,1,0)*t2s_2(1,0)
-				 + t3dg_3(0,1,1)*t2s_2(1,1)
-				 + t3dg_3(0,1,2)*t2s_2(1,2))
-		,"T2s(k,l)*T3dg(i,j,l)(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) - (t3dg_3(0,1,0)*t2s_2(2,0)
-				 + t3dg_3(0,1,1)*t2s_2(2,1)
-				 + t3dg_3(0,1,2)*t2s_2(2,2))
-		,"T2s(k,l)*T3dg(i,j,l)(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) - (t3dg_3(0,2,0)*t2s_2(0,0)
-				 + t3dg_3(0,2,1)*t2s_2(0,1)
-				 + t3dg_3(0,2,2)*t2s_2(0,2))
-		,"T2s(k,l)*T3dg(i,j,l)(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) - (t3dg_3(0,2,0)*t2s_2(1,0)
-				 + t3dg_3(0,2,1)*t2s_2(1,1)
-				 + t3dg_3(0,2,2)*t2s_2(1,2))
-		,"T2s(k,l)*T3dg(i,j,l)(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - (t3dg_3(0,2,0)*t2s_2(2,0)
-				 + t3dg_3(0,2,1)*t2s_2(2,1)
-				 + t3dg_3(0,2,2)*t2s_2(2,2))
-		,"T2s(k,l)*T3dg(i,j,l)(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - (t3dg_3(1,0,0)*t2s_2(0,0)
-				 + t3dg_3(1,0,1)*t2s_2(0,1)
-				 + t3dg_3(1,0,2)*t2s_2(0,2))
-		,"T2s(k,l)*T3dg(i,j,l)(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) - (t3dg_3(1,0,0)*t2s_2(1,0)
-				 + t3dg_3(1,0,1)*t2s_2(1,1)
-				 + t3dg_3(1,0,2)*t2s_2(1,2))
-		,"T2s(k,l)*T3dg(i,j,l)(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) - (t3dg_3(1,0,0)*t2s_2(2,0)
-				 + t3dg_3(1,0,1)*t2s_2(2,1)
-				 + t3dg_3(1,0,2)*t2s_2(2,2))
-		,"T2s(k,l)*T3dg(i,j,l)(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) - (t3dg_3(1,1,0)*t2s_2(0,0)
-				 + t3dg_3(1,1,1)*t2s_2(0,1)
-				 + t3dg_3(1,1,2)*t2s_2(0,2))
-		,"T2s(k,l)*T3dg(i,j,l)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - (t3dg_3(1,1,0)*t2s_2(1,0)
-				 + t3dg_3(1,1,1)*t2s_2(1,1)
-				 + t3dg_3(1,1,2)*t2s_2(1,2))
-		,"T2s(k,l)*T3dg(i,j,l)(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) - (t3dg_3(1,1,0)*t2s_2(2,0)
-				 + t3dg_3(1,1,1)*t2s_2(2,1)
-				 + t3dg_3(1,1,2)*t2s_2(2,2))
-		,"T2s(k,l)*T3dg(i,j,l)(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) - (t3dg_3(1,2,0)*t2s_2(0,0)
-				 + t3dg_3(1,2,1)*t2s_2(0,1)
-				 + t3dg_3(1,2,2)*t2s_2(0,2))
-		,"T2s(k,l)*T3dg(i,j,l)(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) - (t3dg_3(1,2,0)*t2s_2(1,0)
-				 + t3dg_3(1,2,1)*t2s_2(1,1)
-				 + t3dg_3(1,2,2)*t2s_2(1,2))
-		,"T2s(k,l)*T3dg(i,j,l)(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - (t3dg_3(1,2,0)*t2s_2(2,0)
-				 + t3dg_3(1,2,1)*t2s_2(2,1)
-				 + t3dg_3(1,2,2)*t2s_2(2,2))
-		,"T2s(k,l)*T3dg(i,j,l)(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - (t3dg_3(2,0,0)*t2s_2(0,0)
-				 + t3dg_3(2,0,1)*t2s_2(0,1)
-				 + t3dg_3(2,0,2)*t2s_2(0,2))
-		,"T2s(k,l)*T3dg(i,j,l)(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) - (t3dg_3(2,0,0)*t2s_2(1,0)
-				 + t3dg_3(2,0,1)*t2s_2(1,1)
-				 + t3dg_3(2,0,2)*t2s_2(1,2))
-		,"T2s(k,l)*T3dg(i,j,l)(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) - (t3dg_3(2,0,0)*t2s_2(2,0)
-				 + t3dg_3(2,0,1)*t2s_2(2,1)
-				 + t3dg_3(2,0,2)*t2s_2(2,2))
-		,"T2s(k,l)*T3dg(i,j,l)(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) - (t3dg_3(2,1,0)*t2s_2(0,0)
-				 + t3dg_3(2,1,1)*t2s_2(0,1)
-				 + t3dg_3(2,1,2)*t2s_2(0,2))
-		,"T2s(k,l)*T3dg(i,j,l)(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - (t3dg_3(2,1,0)*t2s_2(1,0)
-				 + t3dg_3(2,1,1)*t2s_2(1,1)
-				 + t3dg_3(2,1,2)*t2s_2(1,2))
-		,"T2s(k,l)*T3dg(i,j,l)(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) - (t3dg_3(2,1,0)*t2s_2(2,0)
-				 + t3dg_3(2,1,1)*t2s_2(2,1)
-				 + t3dg_3(2,1,2)*t2s_2(2,2))
-		,"T2s(k,l)*T3dg(i,j,l)(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) - (t3dg_3(2,2,0)*t2s_2(0,0)
-				 + t3dg_3(2,2,1)*t2s_2(0,1)
-				 + t3dg_3(2,2,2)*t2s_2(0,2))
-		,"T2s(k,l)*T3dg(i,j,l)(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) - (t3dg_3(2,2,0)*t2s_2(1,0)
-				 + t3dg_3(2,2,1)*t2s_2(1,1)
-				 + t3dg_3(2,2,2)*t2s_2(1,2))
-		,"T2s(k,l)*T3dg(i,j,l)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - (t3dg_3(2,2,0)*t2s_2(2,0)
-				 + t3dg_3(2,2,1)*t2s_2(2,1)
-				 + t3dg_3(2,2,2)*t2s_2(2,2))
-		,"T2s(k,l)*T3dg(i,j,l)(2,2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXIX.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXXIX.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,254 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXXIX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t3dg_1(i,j,k)=t3dg_2(i,j,l)*t2s_2(k,l);
+  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0)*t2s_2(0,0)
+				 + t3dg_2(0,0,1)*t2s_2(0,1)
+				 + t3dg_2(0,0,2)*t2s_2(0,2))
+		,"T3dg(i,j,l)*T2s(k,l)(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(0,0,0)*t2s_2(1,0)
+				 + t3dg_2(0,0,1)*t2s_2(1,1)
+				 + t3dg_2(0,0,2)*t2s_2(1,2))
+		,"T3dg(i,j,l)*T2s(k,l)(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(0,0,0)*t2s_2(2,0)
+				 + t3dg_2(0,0,1)*t2s_2(2,1)
+				 + t3dg_2(0,0,2)*t2s_2(2,2))
+		,"T3dg(i,j,l)*T2s(k,l)(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,1,0)*t2s_2(0,0)
+				 + t3dg_2(0,1,1)*t2s_2(0,1)
+				 + t3dg_2(0,1,2)*t2s_2(0,2))
+		,"T3dg(i,j,l)*T2s(k,l)(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(0,1,0)*t2s_2(1,0)
+				 + t3dg_2(0,1,1)*t2s_2(1,1)
+				 + t3dg_2(0,1,2)*t2s_2(1,2))
+		,"T3dg(i,j,l)*T2s(k,l)(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(0,1,0)*t2s_2(2,0)
+				 + t3dg_2(0,1,1)*t2s_2(2,1)
+				 + t3dg_2(0,1,2)*t2s_2(2,2))
+		,"T3dg(i,j,l)*T2s(k,l)(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,2,0)*t2s_2(0,0)
+				 + t3dg_2(0,2,1)*t2s_2(0,1)
+				 + t3dg_2(0,2,2)*t2s_2(0,2))
+		,"T3dg(i,j,l)*T2s(k,l)(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(0,2,0)*t2s_2(1,0)
+				 + t3dg_2(0,2,1)*t2s_2(1,1)
+				 + t3dg_2(0,2,2)*t2s_2(1,2))
+		,"T3dg(i,j,l)*T2s(k,l)(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(0,2,0)*t2s_2(2,0)
+				 + t3dg_2(0,2,1)*t2s_2(2,1)
+				 + t3dg_2(0,2,2)*t2s_2(2,2))
+		,"T3dg(i,j,l)*T2s(k,l)(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(1,0,0)*t2s_2(0,0)
+				 + t3dg_2(1,0,1)*t2s_2(0,1)
+				 + t3dg_2(1,0,2)*t2s_2(0,2))
+		,"T3dg(i,j,l)*T2s(k,l)(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,0,0)*t2s_2(1,0)
+				 + t3dg_2(1,0,1)*t2s_2(1,1)
+				 + t3dg_2(1,0,2)*t2s_2(1,2))
+		,"T3dg(i,j,l)*T2s(k,l)(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(1,0,0)*t2s_2(2,0)
+				 + t3dg_2(1,0,1)*t2s_2(2,1)
+				 + t3dg_2(1,0,2)*t2s_2(2,2))
+		,"T3dg(i,j,l)*T2s(k,l)(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(1,1,0)*t2s_2(0,0)
+				 + t3dg_2(1,1,1)*t2s_2(0,1)
+				 + t3dg_2(1,1,2)*t2s_2(0,2))
+		,"T3dg(i,j,l)*T2s(k,l)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,0)*t2s_2(1,0)
+				 + t3dg_2(1,1,1)*t2s_2(1,1)
+				 + t3dg_2(1,1,2)*t2s_2(1,2))
+		,"T3dg(i,j,l)*T2s(k,l)(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(1,1,0)*t2s_2(2,0)
+				 + t3dg_2(1,1,1)*t2s_2(2,1)
+				 + t3dg_2(1,1,2)*t2s_2(2,2))
+		,"T3dg(i,j,l)*T2s(k,l)(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(1,2,0)*t2s_2(0,0)
+				 + t3dg_2(1,2,1)*t2s_2(0,1)
+				 + t3dg_2(1,2,2)*t2s_2(0,2))
+		,"T3dg(i,j,l)*T2s(k,l)(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,2,0)*t2s_2(1,0)
+				 + t3dg_2(1,2,1)*t2s_2(1,1)
+				 + t3dg_2(1,2,2)*t2s_2(1,2))
+		,"T3dg(i,j,l)*T2s(k,l)(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(1,2,0)*t2s_2(2,0)
+				 + t3dg_2(1,2,1)*t2s_2(2,1)
+				 + t3dg_2(1,2,2)*t2s_2(2,2))
+		,"T3dg(i,j,l)*T2s(k,l)(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(2,0,0)*t2s_2(0,0)
+				 + t3dg_2(2,0,1)*t2s_2(0,1)
+				 + t3dg_2(2,0,2)*t2s_2(0,2))
+		,"T3dg(i,j,l)*T2s(k,l)(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(2,0,0)*t2s_2(1,0)
+				 + t3dg_2(2,0,1)*t2s_2(1,1)
+				 + t3dg_2(2,0,2)*t2s_2(1,2))
+		,"T3dg(i,j,l)*T2s(k,l)(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,0,0)*t2s_2(2,0)
+				 + t3dg_2(2,0,1)*t2s_2(2,1)
+				 + t3dg_2(2,0,2)*t2s_2(2,2))
+		,"T3dg(i,j,l)*T2s(k,l)(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(2,1,0)*t2s_2(0,0)
+				 + t3dg_2(2,1,1)*t2s_2(0,1)
+				 + t3dg_2(2,1,2)*t2s_2(0,2))
+		,"T3dg(i,j,l)*T2s(k,l)(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(2,1,0)*t2s_2(1,0)
+				 + t3dg_2(2,1,1)*t2s_2(1,1)
+				 + t3dg_2(2,1,2)*t2s_2(1,2))
+		,"T3dg(i,j,l)*T2s(k,l)(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,1,0)*t2s_2(2,0)
+				 + t3dg_2(2,1,1)*t2s_2(2,1)
+				 + t3dg_2(2,1,2)*t2s_2(2,2))
+		,"T3dg(i,j,l)*T2s(k,l)(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(2,2,0)*t2s_2(0,0)
+				 + t3dg_2(2,2,1)*t2s_2(0,1)
+				 + t3dg_2(2,2,2)*t2s_2(0,2))
+		,"T3dg(i,j,l)*T2s(k,l)(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(2,2,0)*t2s_2(1,0)
+				 + t3dg_2(2,2,1)*t2s_2(1,1)
+				 + t3dg_2(2,2,2)*t2s_2(1,2))
+		,"T3dg(i,j,l)*T2s(k,l)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,0)*t2s_2(2,0)
+				 + t3dg_2(2,2,1)*t2s_2(2,1)
+				 + t3dg_2(2,2,2)*t2s_2(2,2))
+		,"T3dg(i,j,l)*T2s(k,l)(2,2,2)");
+
+  t3dg_1(i,j,k)=t2s_2(k,l)*t3dg_3(i,j,l);
+  test_for_zero(t3dg_1(0,0,0) - (t3dg_3(0,0,0)*t2s_2(0,0)
+				 + t3dg_3(0,0,1)*t2s_2(0,1)
+				 + t3dg_3(0,0,2)*t2s_2(0,2))
+		,"T2s(k,l)*T3dg(i,j,l)(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) - (t3dg_3(0,0,0)*t2s_2(1,0)
+				 + t3dg_3(0,0,1)*t2s_2(1,1)
+				 + t3dg_3(0,0,2)*t2s_2(1,2))
+		,"T2s(k,l)*T3dg(i,j,l)(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) - (t3dg_3(0,0,0)*t2s_2(2,0)
+				 + t3dg_3(0,0,1)*t2s_2(2,1)
+				 + t3dg_3(0,0,2)*t2s_2(2,2))
+		,"T2s(k,l)*T3dg(i,j,l)(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) - (t3dg_3(0,1,0)*t2s_2(0,0)
+				 + t3dg_3(0,1,1)*t2s_2(0,1)
+				 + t3dg_3(0,1,2)*t2s_2(0,2))
+		,"T2s(k,l)*T3dg(i,j,l)(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - (t3dg_3(0,1,0)*t2s_2(1,0)
+				 + t3dg_3(0,1,1)*t2s_2(1,1)
+				 + t3dg_3(0,1,2)*t2s_2(1,2))
+		,"T2s(k,l)*T3dg(i,j,l)(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) - (t3dg_3(0,1,0)*t2s_2(2,0)
+				 + t3dg_3(0,1,1)*t2s_2(2,1)
+				 + t3dg_3(0,1,2)*t2s_2(2,2))
+		,"T2s(k,l)*T3dg(i,j,l)(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) - (t3dg_3(0,2,0)*t2s_2(0,0)
+				 + t3dg_3(0,2,1)*t2s_2(0,1)
+				 + t3dg_3(0,2,2)*t2s_2(0,2))
+		,"T2s(k,l)*T3dg(i,j,l)(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) - (t3dg_3(0,2,0)*t2s_2(1,0)
+				 + t3dg_3(0,2,1)*t2s_2(1,1)
+				 + t3dg_3(0,2,2)*t2s_2(1,2))
+		,"T2s(k,l)*T3dg(i,j,l)(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - (t3dg_3(0,2,0)*t2s_2(2,0)
+				 + t3dg_3(0,2,1)*t2s_2(2,1)
+				 + t3dg_3(0,2,2)*t2s_2(2,2))
+		,"T2s(k,l)*T3dg(i,j,l)(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - (t3dg_3(1,0,0)*t2s_2(0,0)
+				 + t3dg_3(1,0,1)*t2s_2(0,1)
+				 + t3dg_3(1,0,2)*t2s_2(0,2))
+		,"T2s(k,l)*T3dg(i,j,l)(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) - (t3dg_3(1,0,0)*t2s_2(1,0)
+				 + t3dg_3(1,0,1)*t2s_2(1,1)
+				 + t3dg_3(1,0,2)*t2s_2(1,2))
+		,"T2s(k,l)*T3dg(i,j,l)(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) - (t3dg_3(1,0,0)*t2s_2(2,0)
+				 + t3dg_3(1,0,1)*t2s_2(2,1)
+				 + t3dg_3(1,0,2)*t2s_2(2,2))
+		,"T2s(k,l)*T3dg(i,j,l)(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) - (t3dg_3(1,1,0)*t2s_2(0,0)
+				 + t3dg_3(1,1,1)*t2s_2(0,1)
+				 + t3dg_3(1,1,2)*t2s_2(0,2))
+		,"T2s(k,l)*T3dg(i,j,l)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - (t3dg_3(1,1,0)*t2s_2(1,0)
+				 + t3dg_3(1,1,1)*t2s_2(1,1)
+				 + t3dg_3(1,1,2)*t2s_2(1,2))
+		,"T2s(k,l)*T3dg(i,j,l)(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) - (t3dg_3(1,1,0)*t2s_2(2,0)
+				 + t3dg_3(1,1,1)*t2s_2(2,1)
+				 + t3dg_3(1,1,2)*t2s_2(2,2))
+		,"T2s(k,l)*T3dg(i,j,l)(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) - (t3dg_3(1,2,0)*t2s_2(0,0)
+				 + t3dg_3(1,2,1)*t2s_2(0,1)
+				 + t3dg_3(1,2,2)*t2s_2(0,2))
+		,"T2s(k,l)*T3dg(i,j,l)(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) - (t3dg_3(1,2,0)*t2s_2(1,0)
+				 + t3dg_3(1,2,1)*t2s_2(1,1)
+				 + t3dg_3(1,2,2)*t2s_2(1,2))
+		,"T2s(k,l)*T3dg(i,j,l)(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - (t3dg_3(1,2,0)*t2s_2(2,0)
+				 + t3dg_3(1,2,1)*t2s_2(2,1)
+				 + t3dg_3(1,2,2)*t2s_2(2,2))
+		,"T2s(k,l)*T3dg(i,j,l)(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - (t3dg_3(2,0,0)*t2s_2(0,0)
+				 + t3dg_3(2,0,1)*t2s_2(0,1)
+				 + t3dg_3(2,0,2)*t2s_2(0,2))
+		,"T2s(k,l)*T3dg(i,j,l)(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) - (t3dg_3(2,0,0)*t2s_2(1,0)
+				 + t3dg_3(2,0,1)*t2s_2(1,1)
+				 + t3dg_3(2,0,2)*t2s_2(1,2))
+		,"T2s(k,l)*T3dg(i,j,l)(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) - (t3dg_3(2,0,0)*t2s_2(2,0)
+				 + t3dg_3(2,0,1)*t2s_2(2,1)
+				 + t3dg_3(2,0,2)*t2s_2(2,2))
+		,"T2s(k,l)*T3dg(i,j,l)(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) - (t3dg_3(2,1,0)*t2s_2(0,0)
+				 + t3dg_3(2,1,1)*t2s_2(0,1)
+				 + t3dg_3(2,1,2)*t2s_2(0,2))
+		,"T2s(k,l)*T3dg(i,j,l)(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - (t3dg_3(2,1,0)*t2s_2(1,0)
+				 + t3dg_3(2,1,1)*t2s_2(1,1)
+				 + t3dg_3(2,1,2)*t2s_2(1,2))
+		,"T2s(k,l)*T3dg(i,j,l)(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) - (t3dg_3(2,1,0)*t2s_2(2,0)
+				 + t3dg_3(2,1,1)*t2s_2(2,1)
+				 + t3dg_3(2,1,2)*t2s_2(2,2))
+		,"T2s(k,l)*T3dg(i,j,l)(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) - (t3dg_3(2,2,0)*t2s_2(0,0)
+				 + t3dg_3(2,2,1)*t2s_2(0,1)
+				 + t3dg_3(2,2,2)*t2s_2(0,2))
+		,"T2s(k,l)*T3dg(i,j,l)(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) - (t3dg_3(2,2,0)*t2s_2(1,0)
+				 + t3dg_3(2,2,1)*t2s_2(1,1)
+				 + t3dg_3(2,2,2)*t2s_2(1,2))
+		,"T2s(k,l)*T3dg(i,j,l)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - (t3dg_3(2,2,0)*t2s_2(2,0)
+				 + t3dg_3(2,2,1)*t2s_2(2,1)
+				 + t3dg_3(2,2,2)*t2s_2(2,2))
+		,"T2s(k,l)*T3dg(i,j,l)(2,2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXV.C
--- a/tests/conformance/T3dg/test_T3dgXXV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t1_1(i)=t3dg_2(j,i,k)*t2_2(k,j);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
-			   + t3dg_2(0,0,1)*t2_2(1,0)
-			   + t3dg_2(0,0,2)*t2_2(2,0)
-			   + t3dg_2(1,0,0)*t2_2(0,1)
-			   + t3dg_2(1,0,1)*t2_2(1,1)
-			   + t3dg_2(1,0,2)*t2_2(2,1)
-			   + t3dg_2(2,0,0)*t2_2(0,2)
-			   + t3dg_2(2,0,1)*t2_2(1,2)
-			   + t3dg_2(2,0,2)*t2_2(2,2))
-		,"T3dg(j,i,k)*T2(k,j)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(0,1,0)*t2_2(0,0)
-			   + t3dg_2(0,1,1)*t2_2(1,0)
-			   + t3dg_2(0,1,2)*t2_2(2,0)
-			   + t3dg_2(1,1,0)*t2_2(0,1)
-			   + t3dg_2(1,1,1)*t2_2(1,1)
-			   + t3dg_2(1,1,2)*t2_2(2,1)
-			   + t3dg_2(2,1,0)*t2_2(0,2)
-			   + t3dg_2(2,1,1)*t2_2(1,2)
-			   + t3dg_2(2,1,2)*t2_2(2,2))
-		,"T3dg(j,i,k)*T2(k,j)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(0,2,0)*t2_2(0,0)
-			   + t3dg_2(0,2,1)*t2_2(1,0)
-			   + t3dg_2(0,2,2)*t2_2(2,0)
-			   + t3dg_2(1,2,0)*t2_2(0,1)
-			   + t3dg_2(1,2,1)*t2_2(1,1)
-			   + t3dg_2(1,2,2)*t2_2(2,1)
-			   + t3dg_2(2,2,0)*t2_2(0,2)
-			   + t3dg_2(2,2,1)*t2_2(1,2)
-			   + t3dg_2(2,2,2)*t2_2(2,2))
-		,"T3dg(j,i,k)*T2(k,j)(2)");
-
-  t1_1(i)=t2_2(k,j)*t3dg_2(j,i,k);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
-			   + t3dg_2(0,0,1)*t2_2(1,0)
-			   + t3dg_2(0,0,2)*t2_2(2,0)
-			   + t3dg_2(1,0,0)*t2_2(0,1)
-			   + t3dg_2(1,0,1)*t2_2(1,1)
-			   + t3dg_2(1,0,2)*t2_2(2,1)
-			   + t3dg_2(2,0,0)*t2_2(0,2)
-			   + t3dg_2(2,0,1)*t2_2(1,2)
-			   + t3dg_2(2,0,2)*t2_2(2,2))
-		,"T2(k,j)*T3dg(j,i,k)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(0,1,0)*t2_2(0,0)
-			   + t3dg_2(0,1,1)*t2_2(1,0)
-			   + t3dg_2(0,1,2)*t2_2(2,0)
-			   + t3dg_2(1,1,0)*t2_2(0,1)
-			   + t3dg_2(1,1,1)*t2_2(1,1)
-			   + t3dg_2(1,1,2)*t2_2(2,1)
-			   + t3dg_2(2,1,0)*t2_2(0,2)
-			   + t3dg_2(2,1,1)*t2_2(1,2)
-			   + t3dg_2(2,1,2)*t2_2(2,2))
-		,"T2(k,j)*T3dg(j,i,k)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(0,2,0)*t2_2(0,0)
-			   + t3dg_2(0,2,1)*t2_2(1,0)
-			   + t3dg_2(0,2,2)*t2_2(2,0)
-			   + t3dg_2(1,2,0)*t2_2(0,1)
-			   + t3dg_2(1,2,1)*t2_2(1,1)
-			   + t3dg_2(1,2,2)*t2_2(2,1)
-			   + t3dg_2(2,2,0)*t2_2(0,2)
-			   + t3dg_2(2,2,1)*t2_2(1,2)
-			   + t3dg_2(2,2,2)*t2_2(2,2))
-		,"T2(k,j)*T3dg(j,i,k)(2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXXV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,98 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t1_1(i)=t3dg_2(j,i,k)*t2_2(k,j);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
+			   + t3dg_2(0,0,1)*t2_2(1,0)
+			   + t3dg_2(0,0,2)*t2_2(2,0)
+			   + t3dg_2(1,0,0)*t2_2(0,1)
+			   + t3dg_2(1,0,1)*t2_2(1,1)
+			   + t3dg_2(1,0,2)*t2_2(2,1)
+			   + t3dg_2(2,0,0)*t2_2(0,2)
+			   + t3dg_2(2,0,1)*t2_2(1,2)
+			   + t3dg_2(2,0,2)*t2_2(2,2))
+		,"T3dg(j,i,k)*T2(k,j)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(0,1,0)*t2_2(0,0)
+			   + t3dg_2(0,1,1)*t2_2(1,0)
+			   + t3dg_2(0,1,2)*t2_2(2,0)
+			   + t3dg_2(1,1,0)*t2_2(0,1)
+			   + t3dg_2(1,1,1)*t2_2(1,1)
+			   + t3dg_2(1,1,2)*t2_2(2,1)
+			   + t3dg_2(2,1,0)*t2_2(0,2)
+			   + t3dg_2(2,1,1)*t2_2(1,2)
+			   + t3dg_2(2,1,2)*t2_2(2,2))
+		,"T3dg(j,i,k)*T2(k,j)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(0,2,0)*t2_2(0,0)
+			   + t3dg_2(0,2,1)*t2_2(1,0)
+			   + t3dg_2(0,2,2)*t2_2(2,0)
+			   + t3dg_2(1,2,0)*t2_2(0,1)
+			   + t3dg_2(1,2,1)*t2_2(1,1)
+			   + t3dg_2(1,2,2)*t2_2(2,1)
+			   + t3dg_2(2,2,0)*t2_2(0,2)
+			   + t3dg_2(2,2,1)*t2_2(1,2)
+			   + t3dg_2(2,2,2)*t2_2(2,2))
+		,"T3dg(j,i,k)*T2(k,j)(2)");
+
+  t1_1(i)=t2_2(k,j)*t3dg_2(j,i,k);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
+			   + t3dg_2(0,0,1)*t2_2(1,0)
+			   + t3dg_2(0,0,2)*t2_2(2,0)
+			   + t3dg_2(1,0,0)*t2_2(0,1)
+			   + t3dg_2(1,0,1)*t2_2(1,1)
+			   + t3dg_2(1,0,2)*t2_2(2,1)
+			   + t3dg_2(2,0,0)*t2_2(0,2)
+			   + t3dg_2(2,0,1)*t2_2(1,2)
+			   + t3dg_2(2,0,2)*t2_2(2,2))
+		,"T2(k,j)*T3dg(j,i,k)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(0,1,0)*t2_2(0,0)
+			   + t3dg_2(0,1,1)*t2_2(1,0)
+			   + t3dg_2(0,1,2)*t2_2(2,0)
+			   + t3dg_2(1,1,0)*t2_2(0,1)
+			   + t3dg_2(1,1,1)*t2_2(1,1)
+			   + t3dg_2(1,1,2)*t2_2(2,1)
+			   + t3dg_2(2,1,0)*t2_2(0,2)
+			   + t3dg_2(2,1,1)*t2_2(1,2)
+			   + t3dg_2(2,1,2)*t2_2(2,2))
+		,"T2(k,j)*T3dg(j,i,k)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(0,2,0)*t2_2(0,0)
+			   + t3dg_2(0,2,1)*t2_2(1,0)
+			   + t3dg_2(0,2,2)*t2_2(2,0)
+			   + t3dg_2(1,2,0)*t2_2(0,1)
+			   + t3dg_2(1,2,1)*t2_2(1,1)
+			   + t3dg_2(1,2,2)*t2_2(2,1)
+			   + t3dg_2(2,2,0)*t2_2(0,2)
+			   + t3dg_2(2,2,1)*t2_2(1,2)
+			   + t3dg_2(2,2,2)*t2_2(2,2))
+		,"T2(k,j)*T3dg(j,i,k)(2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXVI.C
--- a/tests/conformance/T3dg/test_T3dgXXVI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t1_1(i)=t3dg_2(j,k,i)*t2_2(j,k);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
-			   + t3dg_2(0,1,0)*t2_2(0,1)
-			   + t3dg_2(0,2,0)*t2_2(0,2)
-			   + t3dg_2(1,0,0)*t2_2(1,0)
-			   + t3dg_2(1,1,0)*t2_2(1,1)
-			   + t3dg_2(1,2,0)*t2_2(1,2)
-			   + t3dg_2(2,0,0)*t2_2(2,0)
-			   + t3dg_2(2,1,0)*t2_2(2,1)
-			   + t3dg_2(2,2,0)*t2_2(2,2))
-		,"T3dg(j,k,i)*T2(j,k)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(0,0,1)*t2_2(0,0)
-			   + t3dg_2(0,1,1)*t2_2(0,1)
-			   + t3dg_2(0,2,1)*t2_2(0,2)
-			   + t3dg_2(1,0,1)*t2_2(1,0)
-			   + t3dg_2(1,1,1)*t2_2(1,1)
-			   + t3dg_2(1,2,1)*t2_2(1,2)
-			   + t3dg_2(2,0,1)*t2_2(2,0)
-			   + t3dg_2(2,1,1)*t2_2(2,1)
-			   + t3dg_2(2,2,1)*t2_2(2,2))
-		,"T3dg(j,k,i)*T2(j,k)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(0,0,2)*t2_2(0,0)
-			   + t3dg_2(0,1,2)*t2_2(0,1)
-			   + t3dg_2(0,2,2)*t2_2(0,2)
-			   + t3dg_2(1,0,2)*t2_2(1,0)
-			   + t3dg_2(1,1,2)*t2_2(1,1)
-			   + t3dg_2(1,2,2)*t2_2(1,2)
-			   + t3dg_2(2,0,2)*t2_2(2,0)
-			   + t3dg_2(2,1,2)*t2_2(2,1)
-			   + t3dg_2(2,2,2)*t2_2(2,2))
-		,"T3dg(j,k,i)*T2(j,k)(2)");
-
-  t1_1(i)=t2_2(j,k)*t3dg_2(j,k,i);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
-			   + t3dg_2(0,1,0)*t2_2(0,1)
-			   + t3dg_2(0,2,0)*t2_2(0,2)
-			   + t3dg_2(1,0,0)*t2_2(1,0)
-			   + t3dg_2(1,1,0)*t2_2(1,1)
-			   + t3dg_2(1,2,0)*t2_2(1,2)
-			   + t3dg_2(2,0,0)*t2_2(2,0)
-			   + t3dg_2(2,1,0)*t2_2(2,1)
-			   + t3dg_2(2,2,0)*t2_2(2,2))
-		,"T2(j,k)*T3dg(j,k,i)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(0,0,1)*t2_2(0,0)
-			   + t3dg_2(0,1,1)*t2_2(0,1)
-			   + t3dg_2(0,2,1)*t2_2(0,2)
-			   + t3dg_2(1,0,1)*t2_2(1,0)
-			   + t3dg_2(1,1,1)*t2_2(1,1)
-			   + t3dg_2(1,2,1)*t2_2(1,2)
-			   + t3dg_2(2,0,1)*t2_2(2,0)
-			   + t3dg_2(2,1,1)*t2_2(2,1)
-			   + t3dg_2(2,2,1)*t2_2(2,2))
-		,"T2(j,k)*T3dg(j,k,i)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(0,0,2)*t2_2(0,0)
-			   + t3dg_2(0,1,2)*t2_2(0,1)
-			   + t3dg_2(0,2,2)*t2_2(0,2)
-			   + t3dg_2(1,0,2)*t2_2(1,0)
-			   + t3dg_2(1,1,2)*t2_2(1,1)
-			   + t3dg_2(1,2,2)*t2_2(1,2)
-			   + t3dg_2(2,0,2)*t2_2(2,0)
-			   + t3dg_2(2,1,2)*t2_2(2,1)
-			   + t3dg_2(2,2,2)*t2_2(2,2))
-		,"T2(j,k)*T3dg(j,k,i)(2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXVI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXXVI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,98 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXXVI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t1_1(i)=t3dg_2(j,k,i)*t2_2(j,k);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
+			   + t3dg_2(0,1,0)*t2_2(0,1)
+			   + t3dg_2(0,2,0)*t2_2(0,2)
+			   + t3dg_2(1,0,0)*t2_2(1,0)
+			   + t3dg_2(1,1,0)*t2_2(1,1)
+			   + t3dg_2(1,2,0)*t2_2(1,2)
+			   + t3dg_2(2,0,0)*t2_2(2,0)
+			   + t3dg_2(2,1,0)*t2_2(2,1)
+			   + t3dg_2(2,2,0)*t2_2(2,2))
+		,"T3dg(j,k,i)*T2(j,k)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(0,0,1)*t2_2(0,0)
+			   + t3dg_2(0,1,1)*t2_2(0,1)
+			   + t3dg_2(0,2,1)*t2_2(0,2)
+			   + t3dg_2(1,0,1)*t2_2(1,0)
+			   + t3dg_2(1,1,1)*t2_2(1,1)
+			   + t3dg_2(1,2,1)*t2_2(1,2)
+			   + t3dg_2(2,0,1)*t2_2(2,0)
+			   + t3dg_2(2,1,1)*t2_2(2,1)
+			   + t3dg_2(2,2,1)*t2_2(2,2))
+		,"T3dg(j,k,i)*T2(j,k)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(0,0,2)*t2_2(0,0)
+			   + t3dg_2(0,1,2)*t2_2(0,1)
+			   + t3dg_2(0,2,2)*t2_2(0,2)
+			   + t3dg_2(1,0,2)*t2_2(1,0)
+			   + t3dg_2(1,1,2)*t2_2(1,1)
+			   + t3dg_2(1,2,2)*t2_2(1,2)
+			   + t3dg_2(2,0,2)*t2_2(2,0)
+			   + t3dg_2(2,1,2)*t2_2(2,1)
+			   + t3dg_2(2,2,2)*t2_2(2,2))
+		,"T3dg(j,k,i)*T2(j,k)(2)");
+
+  t1_1(i)=t2_2(j,k)*t3dg_2(j,k,i);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
+			   + t3dg_2(0,1,0)*t2_2(0,1)
+			   + t3dg_2(0,2,0)*t2_2(0,2)
+			   + t3dg_2(1,0,0)*t2_2(1,0)
+			   + t3dg_2(1,1,0)*t2_2(1,1)
+			   + t3dg_2(1,2,0)*t2_2(1,2)
+			   + t3dg_2(2,0,0)*t2_2(2,0)
+			   + t3dg_2(2,1,0)*t2_2(2,1)
+			   + t3dg_2(2,2,0)*t2_2(2,2))
+		,"T2(j,k)*T3dg(j,k,i)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(0,0,1)*t2_2(0,0)
+			   + t3dg_2(0,1,1)*t2_2(0,1)
+			   + t3dg_2(0,2,1)*t2_2(0,2)
+			   + t3dg_2(1,0,1)*t2_2(1,0)
+			   + t3dg_2(1,1,1)*t2_2(1,1)
+			   + t3dg_2(1,2,1)*t2_2(1,2)
+			   + t3dg_2(2,0,1)*t2_2(2,0)
+			   + t3dg_2(2,1,1)*t2_2(2,1)
+			   + t3dg_2(2,2,1)*t2_2(2,2))
+		,"T2(j,k)*T3dg(j,k,i)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(0,0,2)*t2_2(0,0)
+			   + t3dg_2(0,1,2)*t2_2(0,1)
+			   + t3dg_2(0,2,2)*t2_2(0,2)
+			   + t3dg_2(1,0,2)*t2_2(1,0)
+			   + t3dg_2(1,1,2)*t2_2(1,1)
+			   + t3dg_2(1,2,2)*t2_2(1,2)
+			   + t3dg_2(2,0,2)*t2_2(2,0)
+			   + t3dg_2(2,1,2)*t2_2(2,1)
+			   + t3dg_2(2,2,2)*t2_2(2,2))
+		,"T2(j,k)*T3dg(j,k,i)(2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXVII.C
--- a/tests/conformance/T3dg/test_T3dgXXVII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t1_1(i)=t3dg_2(j,k,i)*t2_2(k,j);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
-			   + t3dg_2(0,1,0)*t2_2(1,0)
-			   + t3dg_2(0,2,0)*t2_2(2,0)
-			   + t3dg_2(1,0,0)*t2_2(0,1)
-			   + t3dg_2(1,1,0)*t2_2(1,1)
-			   + t3dg_2(1,2,0)*t2_2(2,1)
-			   + t3dg_2(2,0,0)*t2_2(0,2)
-			   + t3dg_2(2,1,0)*t2_2(1,2)
-			   + t3dg_2(2,2,0)*t2_2(2,2))
-		,"T3dg(j,k,i)*T2(k,j)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(0,0,1)*t2_2(0,0)
-			   + t3dg_2(0,1,1)*t2_2(1,0)
-			   + t3dg_2(0,2,1)*t2_2(2,0)
-			   + t3dg_2(1,0,1)*t2_2(0,1)
-			   + t3dg_2(1,1,1)*t2_2(1,1)
-			   + t3dg_2(1,2,1)*t2_2(2,1)
-			   + t3dg_2(2,0,1)*t2_2(0,2)
-			   + t3dg_2(2,1,1)*t2_2(1,2)
-			   + t3dg_2(2,2,1)*t2_2(2,2))
-		,"T3dg(j,k,i)*T2(k,j)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(0,0,2)*t2_2(0,0)
-			   + t3dg_2(0,1,2)*t2_2(1,0)
-			   + t3dg_2(0,2,2)*t2_2(2,0)
-			   + t3dg_2(1,0,2)*t2_2(0,1)
-			   + t3dg_2(1,1,2)*t2_2(1,1)
-			   + t3dg_2(1,2,2)*t2_2(2,1)
-			   + t3dg_2(2,0,2)*t2_2(0,2)
-			   + t3dg_2(2,1,2)*t2_2(1,2)
-			   + t3dg_2(2,2,2)*t2_2(2,2))
-		,"T3dg(j,k,i)*T2(k,j)(2)");
-
-  t1_1(i)=t2_2(k,j)*t3dg_2(j,k,i);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
-			   + t3dg_2(0,1,0)*t2_2(1,0)
-			   + t3dg_2(0,2,0)*t2_2(2,0)
-			   + t3dg_2(1,0,0)*t2_2(0,1)
-			   + t3dg_2(1,1,0)*t2_2(1,1)
-			   + t3dg_2(1,2,0)*t2_2(2,1)
-			   + t3dg_2(2,0,0)*t2_2(0,2)
-			   + t3dg_2(2,1,0)*t2_2(1,2)
-			   + t3dg_2(2,2,0)*t2_2(2,2))
-		,"T2(k,j)*T3dg(j,k,i)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(0,0,1)*t2_2(0,0)
-			   + t3dg_2(0,1,1)*t2_2(1,0)
-			   + t3dg_2(0,2,1)*t2_2(2,0)
-			   + t3dg_2(1,0,1)*t2_2(0,1)
-			   + t3dg_2(1,1,1)*t2_2(1,1)
-			   + t3dg_2(1,2,1)*t2_2(2,1)
-			   + t3dg_2(2,0,1)*t2_2(0,2)
-			   + t3dg_2(2,1,1)*t2_2(1,2)
-			   + t3dg_2(2,2,1)*t2_2(2,2))
-		,"T2(k,j)*T3dg(j,k,i)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(0,0,2)*t2_2(0,0)
-			   + t3dg_2(0,1,2)*t2_2(1,0)
-			   + t3dg_2(0,2,2)*t2_2(2,0)
-			   + t3dg_2(1,0,2)*t2_2(0,1)
-			   + t3dg_2(1,1,2)*t2_2(1,1)
-			   + t3dg_2(1,2,2)*t2_2(2,1)
-			   + t3dg_2(2,0,2)*t2_2(0,2)
-			   + t3dg_2(2,1,2)*t2_2(1,2)
-			   + t3dg_2(2,2,2)*t2_2(2,2))
-		,"T2(k,j)*T3dg(j,k,i)(2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXVII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXXVII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,98 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXXVII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t1_1(i)=t3dg_2(j,k,i)*t2_2(k,j);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
+			   + t3dg_2(0,1,0)*t2_2(1,0)
+			   + t3dg_2(0,2,0)*t2_2(2,0)
+			   + t3dg_2(1,0,0)*t2_2(0,1)
+			   + t3dg_2(1,1,0)*t2_2(1,1)
+			   + t3dg_2(1,2,0)*t2_2(2,1)
+			   + t3dg_2(2,0,0)*t2_2(0,2)
+			   + t3dg_2(2,1,0)*t2_2(1,2)
+			   + t3dg_2(2,2,0)*t2_2(2,2))
+		,"T3dg(j,k,i)*T2(k,j)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(0,0,1)*t2_2(0,0)
+			   + t3dg_2(0,1,1)*t2_2(1,0)
+			   + t3dg_2(0,2,1)*t2_2(2,0)
+			   + t3dg_2(1,0,1)*t2_2(0,1)
+			   + t3dg_2(1,1,1)*t2_2(1,1)
+			   + t3dg_2(1,2,1)*t2_2(2,1)
+			   + t3dg_2(2,0,1)*t2_2(0,2)
+			   + t3dg_2(2,1,1)*t2_2(1,2)
+			   + t3dg_2(2,2,1)*t2_2(2,2))
+		,"T3dg(j,k,i)*T2(k,j)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(0,0,2)*t2_2(0,0)
+			   + t3dg_2(0,1,2)*t2_2(1,0)
+			   + t3dg_2(0,2,2)*t2_2(2,0)
+			   + t3dg_2(1,0,2)*t2_2(0,1)
+			   + t3dg_2(1,1,2)*t2_2(1,1)
+			   + t3dg_2(1,2,2)*t2_2(2,1)
+			   + t3dg_2(2,0,2)*t2_2(0,2)
+			   + t3dg_2(2,1,2)*t2_2(1,2)
+			   + t3dg_2(2,2,2)*t2_2(2,2))
+		,"T3dg(j,k,i)*T2(k,j)(2)");
+
+  t1_1(i)=t2_2(k,j)*t3dg_2(j,k,i);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2_2(0,0)
+			   + t3dg_2(0,1,0)*t2_2(1,0)
+			   + t3dg_2(0,2,0)*t2_2(2,0)
+			   + t3dg_2(1,0,0)*t2_2(0,1)
+			   + t3dg_2(1,1,0)*t2_2(1,1)
+			   + t3dg_2(1,2,0)*t2_2(2,1)
+			   + t3dg_2(2,0,0)*t2_2(0,2)
+			   + t3dg_2(2,1,0)*t2_2(1,2)
+			   + t3dg_2(2,2,0)*t2_2(2,2))
+		,"T2(k,j)*T3dg(j,k,i)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(0,0,1)*t2_2(0,0)
+			   + t3dg_2(0,1,1)*t2_2(1,0)
+			   + t3dg_2(0,2,1)*t2_2(2,0)
+			   + t3dg_2(1,0,1)*t2_2(0,1)
+			   + t3dg_2(1,1,1)*t2_2(1,1)
+			   + t3dg_2(1,2,1)*t2_2(2,1)
+			   + t3dg_2(2,0,1)*t2_2(0,2)
+			   + t3dg_2(2,1,1)*t2_2(1,2)
+			   + t3dg_2(2,2,1)*t2_2(2,2))
+		,"T2(k,j)*T3dg(j,k,i)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(0,0,2)*t2_2(0,0)
+			   + t3dg_2(0,1,2)*t2_2(1,0)
+			   + t3dg_2(0,2,2)*t2_2(2,0)
+			   + t3dg_2(1,0,2)*t2_2(0,1)
+			   + t3dg_2(1,1,2)*t2_2(1,1)
+			   + t3dg_2(1,2,2)*t2_2(2,1)
+			   + t3dg_2(2,0,2)*t2_2(0,2)
+			   + t3dg_2(2,1,2)*t2_2(1,2)
+			   + t3dg_2(2,2,2)*t2_2(2,2))
+		,"T2(k,j)*T3dg(j,k,i)(2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXVIII.C
--- a/tests/conformance/T3dg/test_T3dgXXVIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,254 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t3dg_1(i,j,k)=t3dg_2(i,j,l)*t2s_2(l,k);
-  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0)*t2s_2(0,0)
-				 + t3dg_2(0,0,1)*t2s_2(1,0)
-				 + t3dg_2(0,0,2)*t2s_2(2,0))
-		,"T3dg(i,j,l)*T2s(l,k)(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(0,0,0)*t2s_2(0,1)
-				 + t3dg_2(0,0,1)*t2s_2(1,1)
-				 + t3dg_2(0,0,2)*t2s_2(2,1))
-		,"T3dg(i,j,l)*T2s(l,k)(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(0,0,0)*t2s_2(0,2)
-				 + t3dg_2(0,0,1)*t2s_2(1,2)
-				 + t3dg_2(0,0,2)*t2s_2(2,2))
-		,"T3dg(i,j,l)*T2s(l,k)(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,1,0)*t2s_2(0,0)
-				 + t3dg_2(0,1,1)*t2s_2(1,0)
-				 + t3dg_2(0,1,2)*t2s_2(2,0))
-		,"T3dg(i,j,l)*T2s(l,k)(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(0,1,0)*t2s_2(0,1)
-				 + t3dg_2(0,1,1)*t2s_2(1,1)
-				 + t3dg_2(0,1,2)*t2s_2(2,1))
-		,"T3dg(i,j,l)*T2s(l,k)(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(0,1,0)*t2s_2(0,2)
-				 + t3dg_2(0,1,1)*t2s_2(1,2)
-				 + t3dg_2(0,1,2)*t2s_2(2,2))
-		,"T3dg(i,j,l)*T2s(l,k)(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,2,0)*t2s_2(0,0)
-				 + t3dg_2(0,2,1)*t2s_2(1,0)
-				 + t3dg_2(0,2,2)*t2s_2(2,0))
-		,"T3dg(i,j,l)*T2s(l,k)(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(0,2,0)*t2s_2(0,1)
-				 + t3dg_2(0,2,1)*t2s_2(1,1)
-				 + t3dg_2(0,2,2)*t2s_2(2,1))
-		,"T3dg(i,j,l)*T2s(l,k)(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(0,2,0)*t2s_2(0,2)
-				 + t3dg_2(0,2,1)*t2s_2(1,2)
-				 + t3dg_2(0,2,2)*t2s_2(2,2))
-		,"T3dg(i,j,l)*T2s(l,k)(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(1,0,0)*t2s_2(0,0)
-				 + t3dg_2(1,0,1)*t2s_2(1,0)
-				 + t3dg_2(1,0,2)*t2s_2(2,0))
-		,"T3dg(i,j,l)*T2s(l,k)(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,0,0)*t2s_2(0,1)
-				 + t3dg_2(1,0,1)*t2s_2(1,1)
-				 + t3dg_2(1,0,2)*t2s_2(2,1))
-		,"T3dg(i,j,l)*T2s(l,k)(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(1,0,0)*t2s_2(0,2)
-				 + t3dg_2(1,0,1)*t2s_2(1,2)
-				 + t3dg_2(1,0,2)*t2s_2(2,2))
-		,"T3dg(i,j,l)*T2s(l,k)(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(1,1,0)*t2s_2(0,0)
-				 + t3dg_2(1,1,1)*t2s_2(1,0)
-				 + t3dg_2(1,1,2)*t2s_2(2,0))
-		,"T3dg(i,j,l)*T2s(l,k)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,0)*t2s_2(0,1)
-				 + t3dg_2(1,1,1)*t2s_2(1,1)
-				 + t3dg_2(1,1,2)*t2s_2(2,1))
-		,"T3dg(i,j,l)*T2s(l,k)(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(1,1,0)*t2s_2(0,2)
-				 + t3dg_2(1,1,1)*t2s_2(1,2)
-				 + t3dg_2(1,1,2)*t2s_2(2,2))
-		,"T3dg(i,j,l)*T2s(l,k)(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(1,2,0)*t2s_2(0,0)
-				 + t3dg_2(1,2,1)*t2s_2(1,0)
-				 + t3dg_2(1,2,2)*t2s_2(2,0))
-		,"T3dg(i,j,l)*T2s(l,k)(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,2,0)*t2s_2(0,1)
-				 + t3dg_2(1,2,1)*t2s_2(1,1)
-				 + t3dg_2(1,2,2)*t2s_2(2,1))
-		,"T3dg(i,j,l)*T2s(l,k)(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(1,2,0)*t2s_2(0,2)
-				 + t3dg_2(1,2,1)*t2s_2(1,2)
-				 + t3dg_2(1,2,2)*t2s_2(2,2))
-		,"T3dg(i,j,l)*T2s(l,k)(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(2,0,0)*t2s_2(0,0)
-				 + t3dg_2(2,0,1)*t2s_2(1,0)
-				 + t3dg_2(2,0,2)*t2s_2(2,0))
-		,"T3dg(i,j,l)*T2s(l,k)(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(2,0,0)*t2s_2(0,1)
-				 + t3dg_2(2,0,1)*t2s_2(1,1)
-				 + t3dg_2(2,0,2)*t2s_2(2,1))
-		,"T3dg(i,j,l)*T2s(l,k)(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,0,0)*t2s_2(0,2)
-				 + t3dg_2(2,0,1)*t2s_2(1,2)
-				 + t3dg_2(2,0,2)*t2s_2(2,2))
-		,"T3dg(i,j,l)*T2s(l,k)(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(2,1,0)*t2s_2(0,0)
-				 + t3dg_2(2,1,1)*t2s_2(1,0)
-				 + t3dg_2(2,1,2)*t2s_2(2,0))
-		,"T3dg(i,j,l)*T2s(l,k)(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(2,1,0)*t2s_2(0,1)
-				 + t3dg_2(2,1,1)*t2s_2(1,1)
-				 + t3dg_2(2,1,2)*t2s_2(2,1))
-		,"T3dg(i,j,l)*T2s(l,k)(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,1,0)*t2s_2(0,2)
-				 + t3dg_2(2,1,1)*t2s_2(1,2)
-				 + t3dg_2(2,1,2)*t2s_2(2,2))
-		,"T3dg(i,j,l)*T2s(l,k)(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(2,2,0)*t2s_2(0,0)
-				 + t3dg_2(2,2,1)*t2s_2(1,0)
-				 + t3dg_2(2,2,2)*t2s_2(2,0))
-		,"T3dg(i,j,l)*T2s(l,k)(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(2,2,0)*t2s_2(0,1)
-				 + t3dg_2(2,2,1)*t2s_2(1,1)
-				 + t3dg_2(2,2,2)*t2s_2(2,1))
-		,"T3dg(i,j,l)*T2s(l,k)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,0)*t2s_2(0,2)
-				 + t3dg_2(2,2,1)*t2s_2(1,2)
-				 + t3dg_2(2,2,2)*t2s_2(2,2))
-		,"T3dg(i,j,l)*T2s(l,k)(2,2,2)");
-
-  t3dg_1(i,j,k)=t2s_2(l,k)*t3dg_3(i,j,l);
-  test_for_zero(t3dg_1(0,0,0) - (t3dg_3(0,0,0)*t2s_2(0,0)
-				 + t3dg_3(0,0,1)*t2s_2(1,0)
-				 + t3dg_3(0,0,2)*t2s_2(2,0))
-		,"T2s(l,k)*T3dg(i,j,l)(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) - (t3dg_3(0,0,0)*t2s_2(0,1)
-				 + t3dg_3(0,0,1)*t2s_2(1,1)
-				 + t3dg_3(0,0,2)*t2s_2(2,1))
-		,"T2s(l,k)*T3dg(i,j,l)(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) - (t3dg_3(0,0,0)*t2s_2(0,2)
-				 + t3dg_3(0,0,1)*t2s_2(1,2)
-				 + t3dg_3(0,0,2)*t2s_2(2,2))
-		,"T2s(l,k)*T3dg(i,j,l)(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) - (t3dg_3(0,1,0)*t2s_2(0,0)
-				 + t3dg_3(0,1,1)*t2s_2(1,0)
-				 + t3dg_3(0,1,2)*t2s_2(2,0))
-		,"T2s(l,k)*T3dg(i,j,l)(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - (t3dg_3(0,1,0)*t2s_2(0,1)
-				 + t3dg_3(0,1,1)*t2s_2(1,1)
-				 + t3dg_3(0,1,2)*t2s_2(2,1))
-		,"T2s(l,k)*T3dg(i,j,l)(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) - (t3dg_3(0,1,0)*t2s_2(0,2)
-				 + t3dg_3(0,1,1)*t2s_2(1,2)
-				 + t3dg_3(0,1,2)*t2s_2(2,2))
-		,"T2s(l,k)*T3dg(i,j,l)(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) - (t3dg_3(0,2,0)*t2s_2(0,0)
-				 + t3dg_3(0,2,1)*t2s_2(1,0)
-				 + t3dg_3(0,2,2)*t2s_2(2,0))
-		,"T2s(l,k)*T3dg(i,j,l)(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) - (t3dg_3(0,2,0)*t2s_2(0,1)
-				 + t3dg_3(0,2,1)*t2s_2(1,1)
-				 + t3dg_3(0,2,2)*t2s_2(2,1))
-		,"T2s(l,k)*T3dg(i,j,l)(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - (t3dg_3(0,2,0)*t2s_2(0,2)
-				 + t3dg_3(0,2,1)*t2s_2(1,2)
-				 + t3dg_3(0,2,2)*t2s_2(2,2))
-		,"T2s(l,k)*T3dg(i,j,l)(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - (t3dg_3(1,0,0)*t2s_2(0,0)
-				 + t3dg_3(1,0,1)*t2s_2(1,0)
-				 + t3dg_3(1,0,2)*t2s_2(2,0))
-		,"T2s(l,k)*T3dg(i,j,l)(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) - (t3dg_3(1,0,0)*t2s_2(0,1)
-				 + t3dg_3(1,0,1)*t2s_2(1,1)
-				 + t3dg_3(1,0,2)*t2s_2(2,1))
-		,"T2s(l,k)*T3dg(i,j,l)(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) - (t3dg_3(1,0,0)*t2s_2(0,2)
-				 + t3dg_3(1,0,1)*t2s_2(1,2)
-				 + t3dg_3(1,0,2)*t2s_2(2,2))
-		,"T2s(l,k)*T3dg(i,j,l)(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) - (t3dg_3(1,1,0)*t2s_2(0,0)
-				 + t3dg_3(1,1,1)*t2s_2(1,0)
-				 + t3dg_3(1,1,2)*t2s_2(2,0))
-		,"T2s(l,k)*T3dg(i,j,l)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - (t3dg_3(1,1,0)*t2s_2(0,1)
-				 + t3dg_3(1,1,1)*t2s_2(1,1)
-				 + t3dg_3(1,1,2)*t2s_2(2,1))
-		,"T2s(l,k)*T3dg(i,j,l)(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) - (t3dg_3(1,1,0)*t2s_2(0,2)
-				 + t3dg_3(1,1,1)*t2s_2(1,2)
-				 + t3dg_3(1,1,2)*t2s_2(2,2))
-		,"T2s(l,k)*T3dg(i,j,l)(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) - (t3dg_3(1,2,0)*t2s_2(0,0)
-				 + t3dg_3(1,2,1)*t2s_2(1,0)
-				 + t3dg_3(1,2,2)*t2s_2(2,0))
-		,"T2s(l,k)*T3dg(i,j,l)(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) - (t3dg_3(1,2,0)*t2s_2(0,1)
-				 + t3dg_3(1,2,1)*t2s_2(1,1)
-				 + t3dg_3(1,2,2)*t2s_2(2,1))
-		,"T2s(l,k)*T3dg(i,j,l)(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - (t3dg_3(1,2,0)*t2s_2(0,2)
-				 + t3dg_3(1,2,1)*t2s_2(1,2)
-				 + t3dg_3(1,2,2)*t2s_2(2,2))
-		,"T2s(l,k)*T3dg(i,j,l)(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - (t3dg_3(2,0,0)*t2s_2(0,0)
-				 + t3dg_3(2,0,1)*t2s_2(1,0)
-				 + t3dg_3(2,0,2)*t2s_2(2,0))
-		,"T2s(l,k)*T3dg(i,j,l)(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) - (t3dg_3(2,0,0)*t2s_2(0,1)
-				 + t3dg_3(2,0,1)*t2s_2(1,1)
-				 + t3dg_3(2,0,2)*t2s_2(2,1))
-		,"T2s(l,k)*T3dg(i,j,l)(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) - (t3dg_3(2,0,0)*t2s_2(0,2)
-				 + t3dg_3(2,0,1)*t2s_2(1,2)
-				 + t3dg_3(2,0,2)*t2s_2(2,2))
-		,"T2s(l,k)*T3dg(i,j,l)(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) - (t3dg_3(2,1,0)*t2s_2(0,0)
-				 + t3dg_3(2,1,1)*t2s_2(1,0)
-				 + t3dg_3(2,1,2)*t2s_2(2,0))
-		,"T2s(l,k)*T3dg(i,j,l)(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - (t3dg_3(2,1,0)*t2s_2(0,1)
-				 + t3dg_3(2,1,1)*t2s_2(1,1)
-				 + t3dg_3(2,1,2)*t2s_2(2,1))
-		,"T2s(l,k)*T3dg(i,j,l)(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) - (t3dg_3(2,1,0)*t2s_2(0,2)
-				 + t3dg_3(2,1,1)*t2s_2(1,2)
-				 + t3dg_3(2,1,2)*t2s_2(2,2))
-		,"T2s(l,k)*T3dg(i,j,l)(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) - (t3dg_3(2,2,0)*t2s_2(0,0)
-				 + t3dg_3(2,2,1)*t2s_2(1,0)
-				 + t3dg_3(2,2,2)*t2s_2(2,0))
-		,"T2s(l,k)*T3dg(i,j,l)(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) - (t3dg_3(2,2,0)*t2s_2(0,1)
-				 + t3dg_3(2,2,1)*t2s_2(1,1)
-				 + t3dg_3(2,2,2)*t2s_2(2,1))
-		,"T2s(l,k)*T3dg(i,j,l)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - (t3dg_3(2,2,0)*t2s_2(0,2)
-				 + t3dg_3(2,2,1)*t2s_2(1,2)
-				 + t3dg_3(2,2,2)*t2s_2(2,2))
-		,"T2s(l,k)*T3dg(i,j,l)(2,2,2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXVIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXXVIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,254 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXXVIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t3dg_1(i,j,k)=t3dg_2(i,j,l)*t2s_2(l,k);
+  test_for_zero(t3dg_1(0,0,0) - (t3dg_2(0,0,0)*t2s_2(0,0)
+				 + t3dg_2(0,0,1)*t2s_2(1,0)
+				 + t3dg_2(0,0,2)*t2s_2(2,0))
+		,"T3dg(i,j,l)*T2s(l,k)(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) - (t3dg_2(0,0,0)*t2s_2(0,1)
+				 + t3dg_2(0,0,1)*t2s_2(1,1)
+				 + t3dg_2(0,0,2)*t2s_2(2,1))
+		,"T3dg(i,j,l)*T2s(l,k)(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) - (t3dg_2(0,0,0)*t2s_2(0,2)
+				 + t3dg_2(0,0,1)*t2s_2(1,2)
+				 + t3dg_2(0,0,2)*t2s_2(2,2))
+		,"T3dg(i,j,l)*T2s(l,k)(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) - (t3dg_2(0,1,0)*t2s_2(0,0)
+				 + t3dg_2(0,1,1)*t2s_2(1,0)
+				 + t3dg_2(0,1,2)*t2s_2(2,0))
+		,"T3dg(i,j,l)*T2s(l,k)(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - (t3dg_2(0,1,0)*t2s_2(0,1)
+				 + t3dg_2(0,1,1)*t2s_2(1,1)
+				 + t3dg_2(0,1,2)*t2s_2(2,1))
+		,"T3dg(i,j,l)*T2s(l,k)(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) - (t3dg_2(0,1,0)*t2s_2(0,2)
+				 + t3dg_2(0,1,1)*t2s_2(1,2)
+				 + t3dg_2(0,1,2)*t2s_2(2,2))
+		,"T3dg(i,j,l)*T2s(l,k)(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) - (t3dg_2(0,2,0)*t2s_2(0,0)
+				 + t3dg_2(0,2,1)*t2s_2(1,0)
+				 + t3dg_2(0,2,2)*t2s_2(2,0))
+		,"T3dg(i,j,l)*T2s(l,k)(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) - (t3dg_2(0,2,0)*t2s_2(0,1)
+				 + t3dg_2(0,2,1)*t2s_2(1,1)
+				 + t3dg_2(0,2,2)*t2s_2(2,1))
+		,"T3dg(i,j,l)*T2s(l,k)(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - (t3dg_2(0,2,0)*t2s_2(0,2)
+				 + t3dg_2(0,2,1)*t2s_2(1,2)
+				 + t3dg_2(0,2,2)*t2s_2(2,2))
+		,"T3dg(i,j,l)*T2s(l,k)(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - (t3dg_2(1,0,0)*t2s_2(0,0)
+				 + t3dg_2(1,0,1)*t2s_2(1,0)
+				 + t3dg_2(1,0,2)*t2s_2(2,0))
+		,"T3dg(i,j,l)*T2s(l,k)(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) - (t3dg_2(1,0,0)*t2s_2(0,1)
+				 + t3dg_2(1,0,1)*t2s_2(1,1)
+				 + t3dg_2(1,0,2)*t2s_2(2,1))
+		,"T3dg(i,j,l)*T2s(l,k)(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) - (t3dg_2(1,0,0)*t2s_2(0,2)
+				 + t3dg_2(1,0,1)*t2s_2(1,2)
+				 + t3dg_2(1,0,2)*t2s_2(2,2))
+		,"T3dg(i,j,l)*T2s(l,k)(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) - (t3dg_2(1,1,0)*t2s_2(0,0)
+				 + t3dg_2(1,1,1)*t2s_2(1,0)
+				 + t3dg_2(1,1,2)*t2s_2(2,0))
+		,"T3dg(i,j,l)*T2s(l,k)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - (t3dg_2(1,1,0)*t2s_2(0,1)
+				 + t3dg_2(1,1,1)*t2s_2(1,1)
+				 + t3dg_2(1,1,2)*t2s_2(2,1))
+		,"T3dg(i,j,l)*T2s(l,k)(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) - (t3dg_2(1,1,0)*t2s_2(0,2)
+				 + t3dg_2(1,1,1)*t2s_2(1,2)
+				 + t3dg_2(1,1,2)*t2s_2(2,2))
+		,"T3dg(i,j,l)*T2s(l,k)(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) - (t3dg_2(1,2,0)*t2s_2(0,0)
+				 + t3dg_2(1,2,1)*t2s_2(1,0)
+				 + t3dg_2(1,2,2)*t2s_2(2,0))
+		,"T3dg(i,j,l)*T2s(l,k)(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) - (t3dg_2(1,2,0)*t2s_2(0,1)
+				 + t3dg_2(1,2,1)*t2s_2(1,1)
+				 + t3dg_2(1,2,2)*t2s_2(2,1))
+		,"T3dg(i,j,l)*T2s(l,k)(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - (t3dg_2(1,2,0)*t2s_2(0,2)
+				 + t3dg_2(1,2,1)*t2s_2(1,2)
+				 + t3dg_2(1,2,2)*t2s_2(2,2))
+		,"T3dg(i,j,l)*T2s(l,k)(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - (t3dg_2(2,0,0)*t2s_2(0,0)
+				 + t3dg_2(2,0,1)*t2s_2(1,0)
+				 + t3dg_2(2,0,2)*t2s_2(2,0))
+		,"T3dg(i,j,l)*T2s(l,k)(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) - (t3dg_2(2,0,0)*t2s_2(0,1)
+				 + t3dg_2(2,0,1)*t2s_2(1,1)
+				 + t3dg_2(2,0,2)*t2s_2(2,1))
+		,"T3dg(i,j,l)*T2s(l,k)(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) - (t3dg_2(2,0,0)*t2s_2(0,2)
+				 + t3dg_2(2,0,1)*t2s_2(1,2)
+				 + t3dg_2(2,0,2)*t2s_2(2,2))
+		,"T3dg(i,j,l)*T2s(l,k)(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) - (t3dg_2(2,1,0)*t2s_2(0,0)
+				 + t3dg_2(2,1,1)*t2s_2(1,0)
+				 + t3dg_2(2,1,2)*t2s_2(2,0))
+		,"T3dg(i,j,l)*T2s(l,k)(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - (t3dg_2(2,1,0)*t2s_2(0,1)
+				 + t3dg_2(2,1,1)*t2s_2(1,1)
+				 + t3dg_2(2,1,2)*t2s_2(2,1))
+		,"T3dg(i,j,l)*T2s(l,k)(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) - (t3dg_2(2,1,0)*t2s_2(0,2)
+				 + t3dg_2(2,1,1)*t2s_2(1,2)
+				 + t3dg_2(2,1,2)*t2s_2(2,2))
+		,"T3dg(i,j,l)*T2s(l,k)(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) - (t3dg_2(2,2,0)*t2s_2(0,0)
+				 + t3dg_2(2,2,1)*t2s_2(1,0)
+				 + t3dg_2(2,2,2)*t2s_2(2,0))
+		,"T3dg(i,j,l)*T2s(l,k)(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) - (t3dg_2(2,2,0)*t2s_2(0,1)
+				 + t3dg_2(2,2,1)*t2s_2(1,1)
+				 + t3dg_2(2,2,2)*t2s_2(2,1))
+		,"T3dg(i,j,l)*T2s(l,k)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - (t3dg_2(2,2,0)*t2s_2(0,2)
+				 + t3dg_2(2,2,1)*t2s_2(1,2)
+				 + t3dg_2(2,2,2)*t2s_2(2,2))
+		,"T3dg(i,j,l)*T2s(l,k)(2,2,2)");
+
+  t3dg_1(i,j,k)=t2s_2(l,k)*t3dg_3(i,j,l);
+  test_for_zero(t3dg_1(0,0,0) - (t3dg_3(0,0,0)*t2s_2(0,0)
+				 + t3dg_3(0,0,1)*t2s_2(1,0)
+				 + t3dg_3(0,0,2)*t2s_2(2,0))
+		,"T2s(l,k)*T3dg(i,j,l)(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) - (t3dg_3(0,0,0)*t2s_2(0,1)
+				 + t3dg_3(0,0,1)*t2s_2(1,1)
+				 + t3dg_3(0,0,2)*t2s_2(2,1))
+		,"T2s(l,k)*T3dg(i,j,l)(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) - (t3dg_3(0,0,0)*t2s_2(0,2)
+				 + t3dg_3(0,0,1)*t2s_2(1,2)
+				 + t3dg_3(0,0,2)*t2s_2(2,2))
+		,"T2s(l,k)*T3dg(i,j,l)(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) - (t3dg_3(0,1,0)*t2s_2(0,0)
+				 + t3dg_3(0,1,1)*t2s_2(1,0)
+				 + t3dg_3(0,1,2)*t2s_2(2,0))
+		,"T2s(l,k)*T3dg(i,j,l)(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - (t3dg_3(0,1,0)*t2s_2(0,1)
+				 + t3dg_3(0,1,1)*t2s_2(1,1)
+				 + t3dg_3(0,1,2)*t2s_2(2,1))
+		,"T2s(l,k)*T3dg(i,j,l)(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) - (t3dg_3(0,1,0)*t2s_2(0,2)
+				 + t3dg_3(0,1,1)*t2s_2(1,2)
+				 + t3dg_3(0,1,2)*t2s_2(2,2))
+		,"T2s(l,k)*T3dg(i,j,l)(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) - (t3dg_3(0,2,0)*t2s_2(0,0)
+				 + t3dg_3(0,2,1)*t2s_2(1,0)
+				 + t3dg_3(0,2,2)*t2s_2(2,0))
+		,"T2s(l,k)*T3dg(i,j,l)(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) - (t3dg_3(0,2,0)*t2s_2(0,1)
+				 + t3dg_3(0,2,1)*t2s_2(1,1)
+				 + t3dg_3(0,2,2)*t2s_2(2,1))
+		,"T2s(l,k)*T3dg(i,j,l)(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - (t3dg_3(0,2,0)*t2s_2(0,2)
+				 + t3dg_3(0,2,1)*t2s_2(1,2)
+				 + t3dg_3(0,2,2)*t2s_2(2,2))
+		,"T2s(l,k)*T3dg(i,j,l)(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - (t3dg_3(1,0,0)*t2s_2(0,0)
+				 + t3dg_3(1,0,1)*t2s_2(1,0)
+				 + t3dg_3(1,0,2)*t2s_2(2,0))
+		,"T2s(l,k)*T3dg(i,j,l)(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) - (t3dg_3(1,0,0)*t2s_2(0,1)
+				 + t3dg_3(1,0,1)*t2s_2(1,1)
+				 + t3dg_3(1,0,2)*t2s_2(2,1))
+		,"T2s(l,k)*T3dg(i,j,l)(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) - (t3dg_3(1,0,0)*t2s_2(0,2)
+				 + t3dg_3(1,0,1)*t2s_2(1,2)
+				 + t3dg_3(1,0,2)*t2s_2(2,2))
+		,"T2s(l,k)*T3dg(i,j,l)(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) - (t3dg_3(1,1,0)*t2s_2(0,0)
+				 + t3dg_3(1,1,1)*t2s_2(1,0)
+				 + t3dg_3(1,1,2)*t2s_2(2,0))
+		,"T2s(l,k)*T3dg(i,j,l)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - (t3dg_3(1,1,0)*t2s_2(0,1)
+				 + t3dg_3(1,1,1)*t2s_2(1,1)
+				 + t3dg_3(1,1,2)*t2s_2(2,1))
+		,"T2s(l,k)*T3dg(i,j,l)(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) - (t3dg_3(1,1,0)*t2s_2(0,2)
+				 + t3dg_3(1,1,1)*t2s_2(1,2)
+				 + t3dg_3(1,1,2)*t2s_2(2,2))
+		,"T2s(l,k)*T3dg(i,j,l)(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) - (t3dg_3(1,2,0)*t2s_2(0,0)
+				 + t3dg_3(1,2,1)*t2s_2(1,0)
+				 + t3dg_3(1,2,2)*t2s_2(2,0))
+		,"T2s(l,k)*T3dg(i,j,l)(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) - (t3dg_3(1,2,0)*t2s_2(0,1)
+				 + t3dg_3(1,2,1)*t2s_2(1,1)
+				 + t3dg_3(1,2,2)*t2s_2(2,1))
+		,"T2s(l,k)*T3dg(i,j,l)(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - (t3dg_3(1,2,0)*t2s_2(0,2)
+				 + t3dg_3(1,2,1)*t2s_2(1,2)
+				 + t3dg_3(1,2,2)*t2s_2(2,2))
+		,"T2s(l,k)*T3dg(i,j,l)(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - (t3dg_3(2,0,0)*t2s_2(0,0)
+				 + t3dg_3(2,0,1)*t2s_2(1,0)
+				 + t3dg_3(2,0,2)*t2s_2(2,0))
+		,"T2s(l,k)*T3dg(i,j,l)(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) - (t3dg_3(2,0,0)*t2s_2(0,1)
+				 + t3dg_3(2,0,1)*t2s_2(1,1)
+				 + t3dg_3(2,0,2)*t2s_2(2,1))
+		,"T2s(l,k)*T3dg(i,j,l)(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) - (t3dg_3(2,0,0)*t2s_2(0,2)
+				 + t3dg_3(2,0,1)*t2s_2(1,2)
+				 + t3dg_3(2,0,2)*t2s_2(2,2))
+		,"T2s(l,k)*T3dg(i,j,l)(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) - (t3dg_3(2,1,0)*t2s_2(0,0)
+				 + t3dg_3(2,1,1)*t2s_2(1,0)
+				 + t3dg_3(2,1,2)*t2s_2(2,0))
+		,"T2s(l,k)*T3dg(i,j,l)(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - (t3dg_3(2,1,0)*t2s_2(0,1)
+				 + t3dg_3(2,1,1)*t2s_2(1,1)
+				 + t3dg_3(2,1,2)*t2s_2(2,1))
+		,"T2s(l,k)*T3dg(i,j,l)(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) - (t3dg_3(2,1,0)*t2s_2(0,2)
+				 + t3dg_3(2,1,1)*t2s_2(1,2)
+				 + t3dg_3(2,1,2)*t2s_2(2,2))
+		,"T2s(l,k)*T3dg(i,j,l)(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) - (t3dg_3(2,2,0)*t2s_2(0,0)
+				 + t3dg_3(2,2,1)*t2s_2(1,0)
+				 + t3dg_3(2,2,2)*t2s_2(2,0))
+		,"T2s(l,k)*T3dg(i,j,l)(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) - (t3dg_3(2,2,0)*t2s_2(0,1)
+				 + t3dg_3(2,2,1)*t2s_2(1,1)
+				 + t3dg_3(2,2,2)*t2s_2(2,1))
+		,"T2s(l,k)*T3dg(i,j,l)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - (t3dg_3(2,2,0)*t2s_2(0,2)
+				 + t3dg_3(2,2,1)*t2s_2(1,2)
+				 + t3dg_3(2,2,2)*t2s_2(2,2))
+		,"T2s(l,k)*T3dg(i,j,l)(2,2,2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXX.C
--- a/tests/conformance/T3dg/test_T3dgXXX.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXXX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t1_1(i)=t3dg_2(i,j,k)*t2s_2(j,k);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
-			   + t3dg_2(0,0,1)*t2s_2(0,1)
-			   + t3dg_2(0,0,2)*t2s_2(0,2)
-			   + t3dg_2(0,1,0)*t2s_2(1,0)
-			   + t3dg_2(0,1,1)*t2s_2(1,1)
-			   + t3dg_2(0,1,2)*t2s_2(1,2)
-			   + t3dg_2(0,2,0)*t2s_2(2,0)
-			   + t3dg_2(0,2,1)*t2s_2(2,1)
-			   + t3dg_2(0,2,2)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(j,k)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(1,0,0)*t2s_2(0,0)
-			   + t3dg_2(1,0,1)*t2s_2(0,1)
-			   + t3dg_2(1,0,2)*t2s_2(0,2)
-			   + t3dg_2(1,1,0)*t2s_2(1,0)
-			   + t3dg_2(1,1,1)*t2s_2(1,1)
-			   + t3dg_2(1,1,2)*t2s_2(1,2)
-			   + t3dg_2(1,2,0)*t2s_2(2,0)
-			   + t3dg_2(1,2,1)*t2s_2(2,1)
-			   + t3dg_2(1,2,2)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(j,k)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(2,0,0)*t2s_2(0,0)
-			   + t3dg_2(2,0,1)*t2s_2(0,1)
-			   + t3dg_2(2,0,2)*t2s_2(0,2)
-			   + t3dg_2(2,1,0)*t2s_2(1,0)
-			   + t3dg_2(2,1,1)*t2s_2(1,1)
-			   + t3dg_2(2,1,2)*t2s_2(1,2)
-			   + t3dg_2(2,2,0)*t2s_2(2,0)
-			   + t3dg_2(2,2,1)*t2s_2(2,1)
-			   + t3dg_2(2,2,2)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(j,k)(2)");
-
-  t1_1(i)=t2s_2(j,k)*t3dg_2(i,j,k);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
-			   + t3dg_2(0,0,1)*t2s_2(0,1)
-			   + t3dg_2(0,0,2)*t2s_2(0,2)
-			   + t3dg_2(0,1,0)*t2s_2(1,0)
-			   + t3dg_2(0,1,1)*t2s_2(1,1)
-			   + t3dg_2(0,1,2)*t2s_2(1,2)
-			   + t3dg_2(0,2,0)*t2s_2(2,0)
-			   + t3dg_2(0,2,1)*t2s_2(2,1)
-			   + t3dg_2(0,2,2)*t2s_2(2,2))
-		,"T2s(j,k)*T3dg(i,j,k)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(1,0,0)*t2s_2(0,0)
-			   + t3dg_2(1,0,1)*t2s_2(0,1)
-			   + t3dg_2(1,0,2)*t2s_2(0,2)
-			   + t3dg_2(1,1,0)*t2s_2(1,0)
-			   + t3dg_2(1,1,1)*t2s_2(1,1)
-			   + t3dg_2(1,1,2)*t2s_2(1,2)
-			   + t3dg_2(1,2,0)*t2s_2(2,0)
-			   + t3dg_2(1,2,1)*t2s_2(2,1)
-			   + t3dg_2(1,2,2)*t2s_2(2,2))
-		,"T2s(j,k)*T3dg(i,j,k)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(2,0,0)*t2s_2(0,0)
-			   + t3dg_2(2,0,1)*t2s_2(0,1)
-			   + t3dg_2(2,0,2)*t2s_2(0,2)
-			   + t3dg_2(2,1,0)*t2s_2(1,0)
-			   + t3dg_2(2,1,1)*t2s_2(1,1)
-			   + t3dg_2(2,1,2)*t2s_2(1,2)
-			   + t3dg_2(2,2,0)*t2s_2(2,0)
-			   + t3dg_2(2,2,1)*t2s_2(2,1)
-			   + t3dg_2(2,2,2)*t2s_2(2,2))
-		,"T2s(j,k)*T3dg(i,j,k)(2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXX.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXXX.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,98 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXXX(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t1_1(i)=t3dg_2(i,j,k)*t2s_2(j,k);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
+			   + t3dg_2(0,0,1)*t2s_2(0,1)
+			   + t3dg_2(0,0,2)*t2s_2(0,2)
+			   + t3dg_2(0,1,0)*t2s_2(1,0)
+			   + t3dg_2(0,1,1)*t2s_2(1,1)
+			   + t3dg_2(0,1,2)*t2s_2(1,2)
+			   + t3dg_2(0,2,0)*t2s_2(2,0)
+			   + t3dg_2(0,2,1)*t2s_2(2,1)
+			   + t3dg_2(0,2,2)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(j,k)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(1,0,0)*t2s_2(0,0)
+			   + t3dg_2(1,0,1)*t2s_2(0,1)
+			   + t3dg_2(1,0,2)*t2s_2(0,2)
+			   + t3dg_2(1,1,0)*t2s_2(1,0)
+			   + t3dg_2(1,1,1)*t2s_2(1,1)
+			   + t3dg_2(1,1,2)*t2s_2(1,2)
+			   + t3dg_2(1,2,0)*t2s_2(2,0)
+			   + t3dg_2(1,2,1)*t2s_2(2,1)
+			   + t3dg_2(1,2,2)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(j,k)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(2,0,0)*t2s_2(0,0)
+			   + t3dg_2(2,0,1)*t2s_2(0,1)
+			   + t3dg_2(2,0,2)*t2s_2(0,2)
+			   + t3dg_2(2,1,0)*t2s_2(1,0)
+			   + t3dg_2(2,1,1)*t2s_2(1,1)
+			   + t3dg_2(2,1,2)*t2s_2(1,2)
+			   + t3dg_2(2,2,0)*t2s_2(2,0)
+			   + t3dg_2(2,2,1)*t2s_2(2,1)
+			   + t3dg_2(2,2,2)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(j,k)(2)");
+
+  t1_1(i)=t2s_2(j,k)*t3dg_2(i,j,k);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
+			   + t3dg_2(0,0,1)*t2s_2(0,1)
+			   + t3dg_2(0,0,2)*t2s_2(0,2)
+			   + t3dg_2(0,1,0)*t2s_2(1,0)
+			   + t3dg_2(0,1,1)*t2s_2(1,1)
+			   + t3dg_2(0,1,2)*t2s_2(1,2)
+			   + t3dg_2(0,2,0)*t2s_2(2,0)
+			   + t3dg_2(0,2,1)*t2s_2(2,1)
+			   + t3dg_2(0,2,2)*t2s_2(2,2))
+		,"T2s(j,k)*T3dg(i,j,k)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(1,0,0)*t2s_2(0,0)
+			   + t3dg_2(1,0,1)*t2s_2(0,1)
+			   + t3dg_2(1,0,2)*t2s_2(0,2)
+			   + t3dg_2(1,1,0)*t2s_2(1,0)
+			   + t3dg_2(1,1,1)*t2s_2(1,1)
+			   + t3dg_2(1,1,2)*t2s_2(1,2)
+			   + t3dg_2(1,2,0)*t2s_2(2,0)
+			   + t3dg_2(1,2,1)*t2s_2(2,1)
+			   + t3dg_2(1,2,2)*t2s_2(2,2))
+		,"T2s(j,k)*T3dg(i,j,k)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(2,0,0)*t2s_2(0,0)
+			   + t3dg_2(2,0,1)*t2s_2(0,1)
+			   + t3dg_2(2,0,2)*t2s_2(0,2)
+			   + t3dg_2(2,1,0)*t2s_2(1,0)
+			   + t3dg_2(2,1,1)*t2s_2(1,1)
+			   + t3dg_2(2,1,2)*t2s_2(1,2)
+			   + t3dg_2(2,2,0)*t2s_2(2,0)
+			   + t3dg_2(2,2,1)*t2s_2(2,1)
+			   + t3dg_2(2,2,2)*t2s_2(2,2))
+		,"T2s(j,k)*T3dg(i,j,k)(2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXXI.C
--- a/tests/conformance/T3dg/test_T3dgXXXI.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXXXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t1_1(i)=t3dg_2(i,j,k)*t2s_2(k,j);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
-			   + t3dg_2(0,0,1)*t2s_2(1,0)
-			   + t3dg_2(0,0,2)*t2s_2(2,0)
-			   + t3dg_2(0,1,0)*t2s_2(0,1)
-			   + t3dg_2(0,1,1)*t2s_2(1,1)
-			   + t3dg_2(0,1,2)*t2s_2(2,1)
-			   + t3dg_2(0,2,0)*t2s_2(0,2)
-			   + t3dg_2(0,2,1)*t2s_2(1,2)
-			   + t3dg_2(0,2,2)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(k,j)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(1,0,0)*t2s_2(0,0)
-			   + t3dg_2(1,0,1)*t2s_2(1,0)
-			   + t3dg_2(1,0,2)*t2s_2(2,0)
-			   + t3dg_2(1,1,0)*t2s_2(0,1)
-			   + t3dg_2(1,1,1)*t2s_2(1,1)
-			   + t3dg_2(1,1,2)*t2s_2(2,1)
-			   + t3dg_2(1,2,0)*t2s_2(0,2)
-			   + t3dg_2(1,2,1)*t2s_2(1,2)
-			   + t3dg_2(1,2,2)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(k,j)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(2,0,0)*t2s_2(0,0)
-			   + t3dg_2(2,0,1)*t2s_2(1,0)
-			   + t3dg_2(2,0,2)*t2s_2(2,0)
-			   + t3dg_2(2,1,0)*t2s_2(0,1)
-			   + t3dg_2(2,1,1)*t2s_2(1,1)
-			   + t3dg_2(2,1,2)*t2s_2(2,1)
-			   + t3dg_2(2,2,0)*t2s_2(0,2)
-			   + t3dg_2(2,2,1)*t2s_2(1,2)
-			   + t3dg_2(2,2,2)*t2s_2(2,2))
-		,"T3dg(i,j,k)*T2s(k,j)(2)");
-
-  t1_1(i)=t2s_2(k,j)*t3dg_2(i,j,k);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
-			   + t3dg_2(0,0,1)*t2s_2(1,0)
-			   + t3dg_2(0,0,2)*t2s_2(2,0)
-			   + t3dg_2(0,1,0)*t2s_2(0,1)
-			   + t3dg_2(0,1,1)*t2s_2(1,1)
-			   + t3dg_2(0,1,2)*t2s_2(2,1)
-			   + t3dg_2(0,2,0)*t2s_2(0,2)
-			   + t3dg_2(0,2,1)*t2s_2(1,2)
-			   + t3dg_2(0,2,2)*t2s_2(2,2))
-		,"T2s(k,j)*T3dg(i,j,k)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(1,0,0)*t2s_2(0,0)
-			   + t3dg_2(1,0,1)*t2s_2(1,0)
-			   + t3dg_2(1,0,2)*t2s_2(2,0)
-			   + t3dg_2(1,1,0)*t2s_2(0,1)
-			   + t3dg_2(1,1,1)*t2s_2(1,1)
-			   + t3dg_2(1,1,2)*t2s_2(2,1)
-			   + t3dg_2(1,2,0)*t2s_2(0,2)
-			   + t3dg_2(1,2,1)*t2s_2(1,2)
-			   + t3dg_2(1,2,2)*t2s_2(2,2))
-		,"T2s(k,j)*T3dg(i,j,k)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(2,0,0)*t2s_2(0,0)
-			   + t3dg_2(2,0,1)*t2s_2(1,0)
-			   + t3dg_2(2,0,2)*t2s_2(2,0)
-			   + t3dg_2(2,1,0)*t2s_2(0,1)
-			   + t3dg_2(2,1,1)*t2s_2(1,1)
-			   + t3dg_2(2,1,2)*t2s_2(2,1)
-			   + t3dg_2(2,2,0)*t2s_2(0,2)
-			   + t3dg_2(2,2,1)*t2s_2(1,2)
-			   + t3dg_2(2,2,2)*t2s_2(2,2))
-		,"T2s(k,j)*T3dg(i,j,k)(2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXXI.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXXXI.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,98 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXXXI(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t1_1(i)=t3dg_2(i,j,k)*t2s_2(k,j);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
+			   + t3dg_2(0,0,1)*t2s_2(1,0)
+			   + t3dg_2(0,0,2)*t2s_2(2,0)
+			   + t3dg_2(0,1,0)*t2s_2(0,1)
+			   + t3dg_2(0,1,1)*t2s_2(1,1)
+			   + t3dg_2(0,1,2)*t2s_2(2,1)
+			   + t3dg_2(0,2,0)*t2s_2(0,2)
+			   + t3dg_2(0,2,1)*t2s_2(1,2)
+			   + t3dg_2(0,2,2)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(k,j)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(1,0,0)*t2s_2(0,0)
+			   + t3dg_2(1,0,1)*t2s_2(1,0)
+			   + t3dg_2(1,0,2)*t2s_2(2,0)
+			   + t3dg_2(1,1,0)*t2s_2(0,1)
+			   + t3dg_2(1,1,1)*t2s_2(1,1)
+			   + t3dg_2(1,1,2)*t2s_2(2,1)
+			   + t3dg_2(1,2,0)*t2s_2(0,2)
+			   + t3dg_2(1,2,1)*t2s_2(1,2)
+			   + t3dg_2(1,2,2)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(k,j)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(2,0,0)*t2s_2(0,0)
+			   + t3dg_2(2,0,1)*t2s_2(1,0)
+			   + t3dg_2(2,0,2)*t2s_2(2,0)
+			   + t3dg_2(2,1,0)*t2s_2(0,1)
+			   + t3dg_2(2,1,1)*t2s_2(1,1)
+			   + t3dg_2(2,1,2)*t2s_2(2,1)
+			   + t3dg_2(2,2,0)*t2s_2(0,2)
+			   + t3dg_2(2,2,1)*t2s_2(1,2)
+			   + t3dg_2(2,2,2)*t2s_2(2,2))
+		,"T3dg(i,j,k)*T2s(k,j)(2)");
+
+  t1_1(i)=t2s_2(k,j)*t3dg_2(i,j,k);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
+			   + t3dg_2(0,0,1)*t2s_2(1,0)
+			   + t3dg_2(0,0,2)*t2s_2(2,0)
+			   + t3dg_2(0,1,0)*t2s_2(0,1)
+			   + t3dg_2(0,1,1)*t2s_2(1,1)
+			   + t3dg_2(0,1,2)*t2s_2(2,1)
+			   + t3dg_2(0,2,0)*t2s_2(0,2)
+			   + t3dg_2(0,2,1)*t2s_2(1,2)
+			   + t3dg_2(0,2,2)*t2s_2(2,2))
+		,"T2s(k,j)*T3dg(i,j,k)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(1,0,0)*t2s_2(0,0)
+			   + t3dg_2(1,0,1)*t2s_2(1,0)
+			   + t3dg_2(1,0,2)*t2s_2(2,0)
+			   + t3dg_2(1,1,0)*t2s_2(0,1)
+			   + t3dg_2(1,1,1)*t2s_2(1,1)
+			   + t3dg_2(1,1,2)*t2s_2(2,1)
+			   + t3dg_2(1,2,0)*t2s_2(0,2)
+			   + t3dg_2(1,2,1)*t2s_2(1,2)
+			   + t3dg_2(1,2,2)*t2s_2(2,2))
+		,"T2s(k,j)*T3dg(i,j,k)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(2,0,0)*t2s_2(0,0)
+			   + t3dg_2(2,0,1)*t2s_2(1,0)
+			   + t3dg_2(2,0,2)*t2s_2(2,0)
+			   + t3dg_2(2,1,0)*t2s_2(0,1)
+			   + t3dg_2(2,1,1)*t2s_2(1,1)
+			   + t3dg_2(2,1,2)*t2s_2(2,1)
+			   + t3dg_2(2,2,0)*t2s_2(0,2)
+			   + t3dg_2(2,2,1)*t2s_2(1,2)
+			   + t3dg_2(2,2,2)*t2s_2(2,2))
+		,"T2s(k,j)*T3dg(i,j,k)(2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXXII.C
--- a/tests/conformance/T3dg/test_T3dgXXXII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXXXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t1_1(i)=t3dg_2(j,i,k)*t2s_2(j,k);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
-			   + t3dg_2(0,0,1)*t2s_2(0,1)
-			   + t3dg_2(0,0,2)*t2s_2(0,2)
-			   + t3dg_2(1,0,0)*t2s_2(1,0)
-			   + t3dg_2(1,0,1)*t2s_2(1,1)
-			   + t3dg_2(1,0,2)*t2s_2(1,2)
-			   + t3dg_2(2,0,0)*t2s_2(2,0)
-			   + t3dg_2(2,0,1)*t2s_2(2,1)
-			   + t3dg_2(2,0,2)*t2s_2(2,2))
-		,"T3dg(j,i,k)*T2s(j,k)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(0,1,0)*t2s_2(0,0)
-			   + t3dg_2(0,1,1)*t2s_2(0,1)
-			   + t3dg_2(0,1,2)*t2s_2(0,2)
-			   + t3dg_2(1,1,0)*t2s_2(1,0)
-			   + t3dg_2(1,1,1)*t2s_2(1,1)
-			   + t3dg_2(1,1,2)*t2s_2(1,2)
-			   + t3dg_2(2,1,0)*t2s_2(2,0)
-			   + t3dg_2(2,1,1)*t2s_2(2,1)
-			   + t3dg_2(2,1,2)*t2s_2(2,2))
-		,"T3dg(j,i,k)*T2s(j,k)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(0,2,0)*t2s_2(0,0)
-			   + t3dg_2(0,2,1)*t2s_2(0,1)
-			   + t3dg_2(0,2,2)*t2s_2(0,2)
-			   + t3dg_2(1,2,0)*t2s_2(1,0)
-			   + t3dg_2(1,2,1)*t2s_2(1,1)
-			   + t3dg_2(1,2,2)*t2s_2(1,2)
-			   + t3dg_2(2,2,0)*t2s_2(2,0)
-			   + t3dg_2(2,2,1)*t2s_2(2,1)
-			   + t3dg_2(2,2,2)*t2s_2(2,2))
-		,"T3dg(j,i,k)*T2s(j,k)(2)");
-
-  t1_1(i)=t2s_2(j,k)*t3dg_2(j,i,k);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
-			   + t3dg_2(0,0,1)*t2s_2(0,1)
-			   + t3dg_2(0,0,2)*t2s_2(0,2)
-			   + t3dg_2(1,0,0)*t2s_2(1,0)
-			   + t3dg_2(1,0,1)*t2s_2(1,1)
-			   + t3dg_2(1,0,2)*t2s_2(1,2)
-			   + t3dg_2(2,0,0)*t2s_2(2,0)
-			   + t3dg_2(2,0,1)*t2s_2(2,1)
-			   + t3dg_2(2,0,2)*t2s_2(2,2))
-		,"T2s(j,k)*T3dg(j,i,k)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(0,1,0)*t2s_2(0,0)
-			   + t3dg_2(0,1,1)*t2s_2(0,1)
-			   + t3dg_2(0,1,2)*t2s_2(0,2)
-			   + t3dg_2(1,1,0)*t2s_2(1,0)
-			   + t3dg_2(1,1,1)*t2s_2(1,1)
-			   + t3dg_2(1,1,2)*t2s_2(1,2)
-			   + t3dg_2(2,1,0)*t2s_2(2,0)
-			   + t3dg_2(2,1,1)*t2s_2(2,1)
-			   + t3dg_2(2,1,2)*t2s_2(2,2))
-		,"T2s(j,k)*T3dg(j,i,k)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(0,2,0)*t2s_2(0,0)
-			   + t3dg_2(0,2,1)*t2s_2(0,1)
-			   + t3dg_2(0,2,2)*t2s_2(0,2)
-			   + t3dg_2(1,2,0)*t2s_2(1,0)
-			   + t3dg_2(1,2,1)*t2s_2(1,1)
-			   + t3dg_2(1,2,2)*t2s_2(1,2)
-			   + t3dg_2(2,2,0)*t2s_2(2,0)
-			   + t3dg_2(2,2,1)*t2s_2(2,1)
-			   + t3dg_2(2,2,2)*t2s_2(2,2))
-		,"T2s(j,k)*T3dg(j,i,k)(2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXXII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXXXII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,98 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXXXII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t1_1(i)=t3dg_2(j,i,k)*t2s_2(j,k);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
+			   + t3dg_2(0,0,1)*t2s_2(0,1)
+			   + t3dg_2(0,0,2)*t2s_2(0,2)
+			   + t3dg_2(1,0,0)*t2s_2(1,0)
+			   + t3dg_2(1,0,1)*t2s_2(1,1)
+			   + t3dg_2(1,0,2)*t2s_2(1,2)
+			   + t3dg_2(2,0,0)*t2s_2(2,0)
+			   + t3dg_2(2,0,1)*t2s_2(2,1)
+			   + t3dg_2(2,0,2)*t2s_2(2,2))
+		,"T3dg(j,i,k)*T2s(j,k)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(0,1,0)*t2s_2(0,0)
+			   + t3dg_2(0,1,1)*t2s_2(0,1)
+			   + t3dg_2(0,1,2)*t2s_2(0,2)
+			   + t3dg_2(1,1,0)*t2s_2(1,0)
+			   + t3dg_2(1,1,1)*t2s_2(1,1)
+			   + t3dg_2(1,1,2)*t2s_2(1,2)
+			   + t3dg_2(2,1,0)*t2s_2(2,0)
+			   + t3dg_2(2,1,1)*t2s_2(2,1)
+			   + t3dg_2(2,1,2)*t2s_2(2,2))
+		,"T3dg(j,i,k)*T2s(j,k)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(0,2,0)*t2s_2(0,0)
+			   + t3dg_2(0,2,1)*t2s_2(0,1)
+			   + t3dg_2(0,2,2)*t2s_2(0,2)
+			   + t3dg_2(1,2,0)*t2s_2(1,0)
+			   + t3dg_2(1,2,1)*t2s_2(1,1)
+			   + t3dg_2(1,2,2)*t2s_2(1,2)
+			   + t3dg_2(2,2,0)*t2s_2(2,0)
+			   + t3dg_2(2,2,1)*t2s_2(2,1)
+			   + t3dg_2(2,2,2)*t2s_2(2,2))
+		,"T3dg(j,i,k)*T2s(j,k)(2)");
+
+  t1_1(i)=t2s_2(j,k)*t3dg_2(j,i,k);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
+			   + t3dg_2(0,0,1)*t2s_2(0,1)
+			   + t3dg_2(0,0,2)*t2s_2(0,2)
+			   + t3dg_2(1,0,0)*t2s_2(1,0)
+			   + t3dg_2(1,0,1)*t2s_2(1,1)
+			   + t3dg_2(1,0,2)*t2s_2(1,2)
+			   + t3dg_2(2,0,0)*t2s_2(2,0)
+			   + t3dg_2(2,0,1)*t2s_2(2,1)
+			   + t3dg_2(2,0,2)*t2s_2(2,2))
+		,"T2s(j,k)*T3dg(j,i,k)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(0,1,0)*t2s_2(0,0)
+			   + t3dg_2(0,1,1)*t2s_2(0,1)
+			   + t3dg_2(0,1,2)*t2s_2(0,2)
+			   + t3dg_2(1,1,0)*t2s_2(1,0)
+			   + t3dg_2(1,1,1)*t2s_2(1,1)
+			   + t3dg_2(1,1,2)*t2s_2(1,2)
+			   + t3dg_2(2,1,0)*t2s_2(2,0)
+			   + t3dg_2(2,1,1)*t2s_2(2,1)
+			   + t3dg_2(2,1,2)*t2s_2(2,2))
+		,"T2s(j,k)*T3dg(j,i,k)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(0,2,0)*t2s_2(0,0)
+			   + t3dg_2(0,2,1)*t2s_2(0,1)
+			   + t3dg_2(0,2,2)*t2s_2(0,2)
+			   + t3dg_2(1,2,0)*t2s_2(1,0)
+			   + t3dg_2(1,2,1)*t2s_2(1,1)
+			   + t3dg_2(1,2,2)*t2s_2(1,2)
+			   + t3dg_2(2,2,0)*t2s_2(2,0)
+			   + t3dg_2(2,2,1)*t2s_2(2,1)
+			   + t3dg_2(2,2,2)*t2s_2(2,2))
+		,"T2s(j,k)*T3dg(j,i,k)(2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXXIII.C
--- a/tests/conformance/T3dg/test_T3dgXXXIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXXXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t1_1(i)=t3dg_2(j,i,k)*t2s_2(k,j);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
-			   + t3dg_2(0,0,1)*t2s_2(1,0)
-			   + t3dg_2(0,0,2)*t2s_2(2,0)
-			   + t3dg_2(1,0,0)*t2s_2(0,1)
-			   + t3dg_2(1,0,1)*t2s_2(1,1)
-			   + t3dg_2(1,0,2)*t2s_2(2,1)
-			   + t3dg_2(2,0,0)*t2s_2(0,2)
-			   + t3dg_2(2,0,1)*t2s_2(1,2)
-			   + t3dg_2(2,0,2)*t2s_2(2,2))
-		,"T3dg(j,i,k)*T2s(k,j)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(0,1,0)*t2s_2(0,0)
-			   + t3dg_2(0,1,1)*t2s_2(1,0)
-			   + t3dg_2(0,1,2)*t2s_2(2,0)
-			   + t3dg_2(1,1,0)*t2s_2(0,1)
-			   + t3dg_2(1,1,1)*t2s_2(1,1)
-			   + t3dg_2(1,1,2)*t2s_2(2,1)
-			   + t3dg_2(2,1,0)*t2s_2(0,2)
-			   + t3dg_2(2,1,1)*t2s_2(1,2)
-			   + t3dg_2(2,1,2)*t2s_2(2,2))
-		,"T3dg(j,i,k)*T2s(k,j)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(0,2,0)*t2s_2(0,0)
-			   + t3dg_2(0,2,1)*t2s_2(1,0)
-			   + t3dg_2(0,2,2)*t2s_2(2,0)
-			   + t3dg_2(1,2,0)*t2s_2(0,1)
-			   + t3dg_2(1,2,1)*t2s_2(1,1)
-			   + t3dg_2(1,2,2)*t2s_2(2,1)
-			   + t3dg_2(2,2,0)*t2s_2(0,2)
-			   + t3dg_2(2,2,1)*t2s_2(1,2)
-			   + t3dg_2(2,2,2)*t2s_2(2,2))
-		,"T3dg(j,i,k)*T2s(k,j)(2)");
-
-  t1_1(i)=t2s_2(k,j)*t3dg_2(j,i,k);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
-			   + t3dg_2(0,0,1)*t2s_2(1,0)
-			   + t3dg_2(0,0,2)*t2s_2(2,0)
-			   + t3dg_2(1,0,0)*t2s_2(0,1)
-			   + t3dg_2(1,0,1)*t2s_2(1,1)
-			   + t3dg_2(1,0,2)*t2s_2(2,1)
-			   + t3dg_2(2,0,0)*t2s_2(0,2)
-			   + t3dg_2(2,0,1)*t2s_2(1,2)
-			   + t3dg_2(2,0,2)*t2s_2(2,2))
-		,"T2s(k,j)*T3dg(j,i,k)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(0,1,0)*t2s_2(0,0)
-			   + t3dg_2(0,1,1)*t2s_2(1,0)
-			   + t3dg_2(0,1,2)*t2s_2(2,0)
-			   + t3dg_2(1,1,0)*t2s_2(0,1)
-			   + t3dg_2(1,1,1)*t2s_2(1,1)
-			   + t3dg_2(1,1,2)*t2s_2(2,1)
-			   + t3dg_2(2,1,0)*t2s_2(0,2)
-			   + t3dg_2(2,1,1)*t2s_2(1,2)
-			   + t3dg_2(2,1,2)*t2s_2(2,2))
-		,"T2s(k,j)*T3dg(j,i,k)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(0,2,0)*t2s_2(0,0)
-			   + t3dg_2(0,2,1)*t2s_2(1,0)
-			   + t3dg_2(0,2,2)*t2s_2(2,0)
-			   + t3dg_2(1,2,0)*t2s_2(0,1)
-			   + t3dg_2(1,2,1)*t2s_2(1,1)
-			   + t3dg_2(1,2,2)*t2s_2(2,1)
-			   + t3dg_2(2,2,0)*t2s_2(0,2)
-			   + t3dg_2(2,2,1)*t2s_2(1,2)
-			   + t3dg_2(2,2,2)*t2s_2(2,2))
-		,"T2s(k,j)*T3dg(j,i,k)(2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXXIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXXXIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,98 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXXXIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t1_1(i)=t3dg_2(j,i,k)*t2s_2(k,j);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
+			   + t3dg_2(0,0,1)*t2s_2(1,0)
+			   + t3dg_2(0,0,2)*t2s_2(2,0)
+			   + t3dg_2(1,0,0)*t2s_2(0,1)
+			   + t3dg_2(1,0,1)*t2s_2(1,1)
+			   + t3dg_2(1,0,2)*t2s_2(2,1)
+			   + t3dg_2(2,0,0)*t2s_2(0,2)
+			   + t3dg_2(2,0,1)*t2s_2(1,2)
+			   + t3dg_2(2,0,2)*t2s_2(2,2))
+		,"T3dg(j,i,k)*T2s(k,j)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(0,1,0)*t2s_2(0,0)
+			   + t3dg_2(0,1,1)*t2s_2(1,0)
+			   + t3dg_2(0,1,2)*t2s_2(2,0)
+			   + t3dg_2(1,1,0)*t2s_2(0,1)
+			   + t3dg_2(1,1,1)*t2s_2(1,1)
+			   + t3dg_2(1,1,2)*t2s_2(2,1)
+			   + t3dg_2(2,1,0)*t2s_2(0,2)
+			   + t3dg_2(2,1,1)*t2s_2(1,2)
+			   + t3dg_2(2,1,2)*t2s_2(2,2))
+		,"T3dg(j,i,k)*T2s(k,j)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(0,2,0)*t2s_2(0,0)
+			   + t3dg_2(0,2,1)*t2s_2(1,0)
+			   + t3dg_2(0,2,2)*t2s_2(2,0)
+			   + t3dg_2(1,2,0)*t2s_2(0,1)
+			   + t3dg_2(1,2,1)*t2s_2(1,1)
+			   + t3dg_2(1,2,2)*t2s_2(2,1)
+			   + t3dg_2(2,2,0)*t2s_2(0,2)
+			   + t3dg_2(2,2,1)*t2s_2(1,2)
+			   + t3dg_2(2,2,2)*t2s_2(2,2))
+		,"T3dg(j,i,k)*T2s(k,j)(2)");
+
+  t1_1(i)=t2s_2(k,j)*t3dg_2(j,i,k);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
+			   + t3dg_2(0,0,1)*t2s_2(1,0)
+			   + t3dg_2(0,0,2)*t2s_2(2,0)
+			   + t3dg_2(1,0,0)*t2s_2(0,1)
+			   + t3dg_2(1,0,1)*t2s_2(1,1)
+			   + t3dg_2(1,0,2)*t2s_2(2,1)
+			   + t3dg_2(2,0,0)*t2s_2(0,2)
+			   + t3dg_2(2,0,1)*t2s_2(1,2)
+			   + t3dg_2(2,0,2)*t2s_2(2,2))
+		,"T2s(k,j)*T3dg(j,i,k)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(0,1,0)*t2s_2(0,0)
+			   + t3dg_2(0,1,1)*t2s_2(1,0)
+			   + t3dg_2(0,1,2)*t2s_2(2,0)
+			   + t3dg_2(1,1,0)*t2s_2(0,1)
+			   + t3dg_2(1,1,1)*t2s_2(1,1)
+			   + t3dg_2(1,1,2)*t2s_2(2,1)
+			   + t3dg_2(2,1,0)*t2s_2(0,2)
+			   + t3dg_2(2,1,1)*t2s_2(1,2)
+			   + t3dg_2(2,1,2)*t2s_2(2,2))
+		,"T2s(k,j)*T3dg(j,i,k)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(0,2,0)*t2s_2(0,0)
+			   + t3dg_2(0,2,1)*t2s_2(1,0)
+			   + t3dg_2(0,2,2)*t2s_2(2,0)
+			   + t3dg_2(1,2,0)*t2s_2(0,1)
+			   + t3dg_2(1,2,1)*t2s_2(1,1)
+			   + t3dg_2(1,2,2)*t2s_2(2,1)
+			   + t3dg_2(2,2,0)*t2s_2(0,2)
+			   + t3dg_2(2,2,1)*t2s_2(1,2)
+			   + t3dg_2(2,2,2)*t2s_2(2,2))
+		,"T2s(k,j)*T3dg(j,i,k)(2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXXIV.C
--- a/tests/conformance/T3dg/test_T3dgXXXIV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXXXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t1_1(i)=t3dg_2(j,k,i)*t2s_2(j,k);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
-			   + t3dg_2(0,1,0)*t2s_2(0,1)
-			   + t3dg_2(0,2,0)*t2s_2(0,2)
-			   + t3dg_2(1,0,0)*t2s_2(1,0)
-			   + t3dg_2(1,1,0)*t2s_2(1,1)
-			   + t3dg_2(1,2,0)*t2s_2(1,2)
-			   + t3dg_2(2,0,0)*t2s_2(2,0)
-			   + t3dg_2(2,1,0)*t2s_2(2,1)
-			   + t3dg_2(2,2,0)*t2s_2(2,2))
-		,"T3dg(j,k,i)*T2s(j,k)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(0,0,1)*t2s_2(0,0)
-			   + t3dg_2(0,1,1)*t2s_2(0,1)
-			   + t3dg_2(0,2,1)*t2s_2(0,2)
-			   + t3dg_2(1,0,1)*t2s_2(1,0)
-			   + t3dg_2(1,1,1)*t2s_2(1,1)
-			   + t3dg_2(1,2,1)*t2s_2(1,2)
-			   + t3dg_2(2,0,1)*t2s_2(2,0)
-			   + t3dg_2(2,1,1)*t2s_2(2,1)
-			   + t3dg_2(2,2,1)*t2s_2(2,2))
-		,"T3dg(j,k,i)*T2s(j,k)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(0,0,2)*t2s_2(0,0)
-			   + t3dg_2(0,1,2)*t2s_2(0,1)
-			   + t3dg_2(0,2,2)*t2s_2(0,2)
-			   + t3dg_2(1,0,2)*t2s_2(1,0)
-			   + t3dg_2(1,1,2)*t2s_2(1,1)
-			   + t3dg_2(1,2,2)*t2s_2(1,2)
-			   + t3dg_2(2,0,2)*t2s_2(2,0)
-			   + t3dg_2(2,1,2)*t2s_2(2,1)
-			   + t3dg_2(2,2,2)*t2s_2(2,2))
-		,"T3dg(j,k,i)*T2s(j,k)(2)");
-
-  t1_1(i)=t2s_2(j,k)*t3dg_2(j,k,i);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
-			   + t3dg_2(0,1,0)*t2s_2(0,1)
-			   + t3dg_2(0,2,0)*t2s_2(0,2)
-			   + t3dg_2(1,0,0)*t2s_2(1,0)
-			   + t3dg_2(1,1,0)*t2s_2(1,1)
-			   + t3dg_2(1,2,0)*t2s_2(1,2)
-			   + t3dg_2(2,0,0)*t2s_2(2,0)
-			   + t3dg_2(2,1,0)*t2s_2(2,1)
-			   + t3dg_2(2,2,0)*t2s_2(2,2))
-		,"T2s(j,k)*T3dg(j,k,i)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(0,0,1)*t2s_2(0,0)
-			   + t3dg_2(0,1,1)*t2s_2(0,1)
-			   + t3dg_2(0,2,1)*t2s_2(0,2)
-			   + t3dg_2(1,0,1)*t2s_2(1,0)
-			   + t3dg_2(1,1,1)*t2s_2(1,1)
-			   + t3dg_2(1,2,1)*t2s_2(1,2)
-			   + t3dg_2(2,0,1)*t2s_2(2,0)
-			   + t3dg_2(2,1,1)*t2s_2(2,1)
-			   + t3dg_2(2,2,1)*t2s_2(2,2))
-		,"T2s(j,k)*T3dg(j,k,i)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(0,0,2)*t2s_2(0,0)
-			   + t3dg_2(0,1,2)*t2s_2(0,1)
-			   + t3dg_2(0,2,2)*t2s_2(0,2)
-			   + t3dg_2(1,0,2)*t2s_2(1,0)
-			   + t3dg_2(1,1,2)*t2s_2(1,1)
-			   + t3dg_2(1,2,2)*t2s_2(1,2)
-			   + t3dg_2(2,0,2)*t2s_2(2,0)
-			   + t3dg_2(2,1,2)*t2s_2(2,1)
-			   + t3dg_2(2,2,2)*t2s_2(2,2))
-		,"T2s(j,k)*T3dg(j,k,i)(2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXXIV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXXXIV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,98 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXXXIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t1_1(i)=t3dg_2(j,k,i)*t2s_2(j,k);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
+			   + t3dg_2(0,1,0)*t2s_2(0,1)
+			   + t3dg_2(0,2,0)*t2s_2(0,2)
+			   + t3dg_2(1,0,0)*t2s_2(1,0)
+			   + t3dg_2(1,1,0)*t2s_2(1,1)
+			   + t3dg_2(1,2,0)*t2s_2(1,2)
+			   + t3dg_2(2,0,0)*t2s_2(2,0)
+			   + t3dg_2(2,1,0)*t2s_2(2,1)
+			   + t3dg_2(2,2,0)*t2s_2(2,2))
+		,"T3dg(j,k,i)*T2s(j,k)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(0,0,1)*t2s_2(0,0)
+			   + t3dg_2(0,1,1)*t2s_2(0,1)
+			   + t3dg_2(0,2,1)*t2s_2(0,2)
+			   + t3dg_2(1,0,1)*t2s_2(1,0)
+			   + t3dg_2(1,1,1)*t2s_2(1,1)
+			   + t3dg_2(1,2,1)*t2s_2(1,2)
+			   + t3dg_2(2,0,1)*t2s_2(2,0)
+			   + t3dg_2(2,1,1)*t2s_2(2,1)
+			   + t3dg_2(2,2,1)*t2s_2(2,2))
+		,"T3dg(j,k,i)*T2s(j,k)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(0,0,2)*t2s_2(0,0)
+			   + t3dg_2(0,1,2)*t2s_2(0,1)
+			   + t3dg_2(0,2,2)*t2s_2(0,2)
+			   + t3dg_2(1,0,2)*t2s_2(1,0)
+			   + t3dg_2(1,1,2)*t2s_2(1,1)
+			   + t3dg_2(1,2,2)*t2s_2(1,2)
+			   + t3dg_2(2,0,2)*t2s_2(2,0)
+			   + t3dg_2(2,1,2)*t2s_2(2,1)
+			   + t3dg_2(2,2,2)*t2s_2(2,2))
+		,"T3dg(j,k,i)*T2s(j,k)(2)");
+
+  t1_1(i)=t2s_2(j,k)*t3dg_2(j,k,i);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
+			   + t3dg_2(0,1,0)*t2s_2(0,1)
+			   + t3dg_2(0,2,0)*t2s_2(0,2)
+			   + t3dg_2(1,0,0)*t2s_2(1,0)
+			   + t3dg_2(1,1,0)*t2s_2(1,1)
+			   + t3dg_2(1,2,0)*t2s_2(1,2)
+			   + t3dg_2(2,0,0)*t2s_2(2,0)
+			   + t3dg_2(2,1,0)*t2s_2(2,1)
+			   + t3dg_2(2,2,0)*t2s_2(2,2))
+		,"T2s(j,k)*T3dg(j,k,i)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(0,0,1)*t2s_2(0,0)
+			   + t3dg_2(0,1,1)*t2s_2(0,1)
+			   + t3dg_2(0,2,1)*t2s_2(0,2)
+			   + t3dg_2(1,0,1)*t2s_2(1,0)
+			   + t3dg_2(1,1,1)*t2s_2(1,1)
+			   + t3dg_2(1,2,1)*t2s_2(1,2)
+			   + t3dg_2(2,0,1)*t2s_2(2,0)
+			   + t3dg_2(2,1,1)*t2s_2(2,1)
+			   + t3dg_2(2,2,1)*t2s_2(2,2))
+		,"T2s(j,k)*T3dg(j,k,i)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(0,0,2)*t2s_2(0,0)
+			   + t3dg_2(0,1,2)*t2s_2(0,1)
+			   + t3dg_2(0,2,2)*t2s_2(0,2)
+			   + t3dg_2(1,0,2)*t2s_2(1,0)
+			   + t3dg_2(1,1,2)*t2s_2(1,1)
+			   + t3dg_2(1,2,2)*t2s_2(1,2)
+			   + t3dg_2(2,0,2)*t2s_2(2,0)
+			   + t3dg_2(2,1,2)*t2s_2(2,1)
+			   + t3dg_2(2,2,2)*t2s_2(2,2))
+		,"T2s(j,k)*T3dg(j,k,i)(2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXXV.C
--- a/tests/conformance/T3dg/test_T3dgXXXV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3dgXXXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_dg tests */
-
-  t1_1(i)=t3dg_2(j,k,i)*t2s_2(k,j);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
-			   + t3dg_2(0,1,0)*t2s_2(1,0)
-			   + t3dg_2(0,2,0)*t2s_2(2,0)
-			   + t3dg_2(1,0,0)*t2s_2(0,1)
-			   + t3dg_2(1,1,0)*t2s_2(1,1)
-			   + t3dg_2(1,2,0)*t2s_2(2,1)
-			   + t3dg_2(2,0,0)*t2s_2(0,2)
-			   + t3dg_2(2,1,0)*t2s_2(1,2)
-			   + t3dg_2(2,2,0)*t2s_2(2,2))
-		,"T3dg(j,k,i)*T2s(k,j)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(0,0,1)*t2s_2(0,0)
-			   + t3dg_2(0,1,1)*t2s_2(1,0)
-			   + t3dg_2(0,2,1)*t2s_2(2,0)
-			   + t3dg_2(1,0,1)*t2s_2(0,1)
-			   + t3dg_2(1,1,1)*t2s_2(1,1)
-			   + t3dg_2(1,2,1)*t2s_2(2,1)
-			   + t3dg_2(2,0,1)*t2s_2(0,2)
-			   + t3dg_2(2,1,1)*t2s_2(1,2)
-			   + t3dg_2(2,2,1)*t2s_2(2,2))
-		,"T3dg(j,k,i)*T2s(k,j)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(0,0,2)*t2s_2(0,0)
-			   + t3dg_2(0,1,2)*t2s_2(1,0)
-			   + t3dg_2(0,2,2)*t2s_2(2,0)
-			   + t3dg_2(1,0,2)*t2s_2(0,1)
-			   + t3dg_2(1,1,2)*t2s_2(1,1)
-			   + t3dg_2(1,2,2)*t2s_2(2,1)
-			   + t3dg_2(2,0,2)*t2s_2(0,2)
-			   + t3dg_2(2,1,2)*t2s_2(1,2)
-			   + t3dg_2(2,2,2)*t2s_2(2,2))
-		,"T3dg(j,k,i)*T2s(k,j)(2)");
-
-  t1_1(i)=t2s_2(k,j)*t3dg_2(j,k,i);
-  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
-			   + t3dg_2(0,1,0)*t2s_2(1,0)
-			   + t3dg_2(0,2,0)*t2s_2(2,0)
-			   + t3dg_2(1,0,0)*t2s_2(0,1)
-			   + t3dg_2(1,1,0)*t2s_2(1,1)
-			   + t3dg_2(1,2,0)*t2s_2(2,1)
-			   + t3dg_2(2,0,0)*t2s_2(0,2)
-			   + t3dg_2(2,1,0)*t2s_2(1,2)
-			   + t3dg_2(2,2,0)*t2s_2(2,2))
-		,"T2s(k,j)*T3dg(j,k,i)(0)");
-  test_for_zero(t1_1(1) - (t3dg_2(0,0,1)*t2s_2(0,0)
-			   + t3dg_2(0,1,1)*t2s_2(1,0)
-			   + t3dg_2(0,2,1)*t2s_2(2,0)
-			   + t3dg_2(1,0,1)*t2s_2(0,1)
-			   + t3dg_2(1,1,1)*t2s_2(1,1)
-			   + t3dg_2(1,2,1)*t2s_2(2,1)
-			   + t3dg_2(2,0,1)*t2s_2(0,2)
-			   + t3dg_2(2,1,1)*t2s_2(1,2)
-			   + t3dg_2(2,2,1)*t2s_2(2,2))
-		,"T2s(k,j)*T3dg(j,k,i)(1)");
-  test_for_zero(t1_1(2) - (t3dg_2(0,0,2)*t2s_2(0,0)
-			   + t3dg_2(0,1,2)*t2s_2(1,0)
-			   + t3dg_2(0,2,2)*t2s_2(2,0)
-			   + t3dg_2(1,0,2)*t2s_2(0,1)
-			   + t3dg_2(1,1,2)*t2s_2(1,1)
-			   + t3dg_2(1,2,2)*t2s_2(2,1)
-			   + t3dg_2(2,0,2)*t2s_2(0,2)
-			   + t3dg_2(2,1,2)*t2s_2(1,2)
-			   + t3dg_2(2,2,2)*t2s_2(2,2))
-		,"T2s(k,j)*T3dg(j,k,i)(2)");
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T3dg/test_T3dgXXXV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T3dg/test_T3dgXXXV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,98 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3dgXXXV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_dg tests */
+
+  t1_1(i)=t3dg_2(j,k,i)*t2s_2(k,j);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
+			   + t3dg_2(0,1,0)*t2s_2(1,0)
+			   + t3dg_2(0,2,0)*t2s_2(2,0)
+			   + t3dg_2(1,0,0)*t2s_2(0,1)
+			   + t3dg_2(1,1,0)*t2s_2(1,1)
+			   + t3dg_2(1,2,0)*t2s_2(2,1)
+			   + t3dg_2(2,0,0)*t2s_2(0,2)
+			   + t3dg_2(2,1,0)*t2s_2(1,2)
+			   + t3dg_2(2,2,0)*t2s_2(2,2))
+		,"T3dg(j,k,i)*T2s(k,j)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(0,0,1)*t2s_2(0,0)
+			   + t3dg_2(0,1,1)*t2s_2(1,0)
+			   + t3dg_2(0,2,1)*t2s_2(2,0)
+			   + t3dg_2(1,0,1)*t2s_2(0,1)
+			   + t3dg_2(1,1,1)*t2s_2(1,1)
+			   + t3dg_2(1,2,1)*t2s_2(2,1)
+			   + t3dg_2(2,0,1)*t2s_2(0,2)
+			   + t3dg_2(2,1,1)*t2s_2(1,2)
+			   + t3dg_2(2,2,1)*t2s_2(2,2))
+		,"T3dg(j,k,i)*T2s(k,j)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(0,0,2)*t2s_2(0,0)
+			   + t3dg_2(0,1,2)*t2s_2(1,0)
+			   + t3dg_2(0,2,2)*t2s_2(2,0)
+			   + t3dg_2(1,0,2)*t2s_2(0,1)
+			   + t3dg_2(1,1,2)*t2s_2(1,1)
+			   + t3dg_2(1,2,2)*t2s_2(2,1)
+			   + t3dg_2(2,0,2)*t2s_2(0,2)
+			   + t3dg_2(2,1,2)*t2s_2(1,2)
+			   + t3dg_2(2,2,2)*t2s_2(2,2))
+		,"T3dg(j,k,i)*T2s(k,j)(2)");
+
+  t1_1(i)=t2s_2(k,j)*t3dg_2(j,k,i);
+  test_for_zero(t1_1(0) - (t3dg_2(0,0,0)*t2s_2(0,0)
+			   + t3dg_2(0,1,0)*t2s_2(1,0)
+			   + t3dg_2(0,2,0)*t2s_2(2,0)
+			   + t3dg_2(1,0,0)*t2s_2(0,1)
+			   + t3dg_2(1,1,0)*t2s_2(1,1)
+			   + t3dg_2(1,2,0)*t2s_2(2,1)
+			   + t3dg_2(2,0,0)*t2s_2(0,2)
+			   + t3dg_2(2,1,0)*t2s_2(1,2)
+			   + t3dg_2(2,2,0)*t2s_2(2,2))
+		,"T2s(k,j)*T3dg(j,k,i)(0)");
+  test_for_zero(t1_1(1) - (t3dg_2(0,0,1)*t2s_2(0,0)
+			   + t3dg_2(0,1,1)*t2s_2(1,0)
+			   + t3dg_2(0,2,1)*t2s_2(2,0)
+			   + t3dg_2(1,0,1)*t2s_2(0,1)
+			   + t3dg_2(1,1,1)*t2s_2(1,1)
+			   + t3dg_2(1,2,1)*t2s_2(2,1)
+			   + t3dg_2(2,0,1)*t2s_2(0,2)
+			   + t3dg_2(2,1,1)*t2s_2(1,2)
+			   + t3dg_2(2,2,1)*t2s_2(2,2))
+		,"T2s(k,j)*T3dg(j,k,i)(1)");
+  test_for_zero(t1_1(2) - (t3dg_2(0,0,2)*t2s_2(0,0)
+			   + t3dg_2(0,1,2)*t2s_2(1,0)
+			   + t3dg_2(0,2,2)*t2s_2(2,0)
+			   + t3dg_2(1,0,2)*t2s_2(0,1)
+			   + t3dg_2(1,1,2)*t2s_2(1,1)
+			   + t3dg_2(1,2,2)*t2s_2(2,1)
+			   + t3dg_2(2,0,2)*t2s_2(0,2)
+			   + t3dg_2(2,1,2)*t2s_2(1,2)
+			   + t3dg_2(2,2,2)*t2s_2(2,2))
+		,"T2s(k,j)*T3dg(j,k,i)(2)");
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T4ddg/test_T4ddg.C
--- a/tests/conformance/T4ddg/test_T4ddg.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1272 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T4ddg(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-		Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-		Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-		const Tensor2<double,3,3> &t2_3,
-		Tensor2_symmetric<double,3> &t2s_1,
-		const Tensor2_symmetric<double,3> &t2s_2,
-		const Tensor2_symmetric<double,3> &t2s_3,
-		Tensor3_dg<double,3,3> &t3dg_1,
-		const Tensor3_dg<double,3,3> &t3dg_2,
-		const Tensor3_dg<double,3,3> &t3dg_3,
-		Tensor3_christof<double,3,3> &t3ch_1,
-		const Tensor3_christof<double,3,3> &t3ch_2,
-		const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  Tensor4_ddg<double,3,3> t4ddg_1, t4ddg_2, t4ddg_3;
-
-  t4ddg_1(i,j,l,m)=t3dg_2(i,j,k)*t3dg_3(l,m,k);
-  test_for_zero(t4ddg_1(0,0,0,0) - (t3dg_2(0,0,0)*t3dg_3(0,0,0)
-				    + t3dg_2(0,0,1)*t3dg_3(0,0,1)
-				    + t3dg_2(0,0,2)*t3dg_3(0,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,0,0,0)");
-  test_for_zero(t4ddg_1(0,0,0,1) - (t3dg_2(0,0,0)*t3dg_3(0,1,0)
-				    + t3dg_2(0,0,1)*t3dg_3(0,1,1)
-				    + t3dg_2(0,0,2)*t3dg_3(0,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,0,0,1)");
-  test_for_zero(t4ddg_1(0,0,0,2) - (t3dg_2(0,0,0)*t3dg_3(0,2,0)
-				    + t3dg_2(0,0,1)*t3dg_3(0,2,1)
-				    + t3dg_2(0,0,2)*t3dg_3(0,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,0,0,2)");
-  test_for_zero(t4ddg_1(0,0,1,0) - (t3dg_2(0,0,0)*t3dg_3(1,0,0)
-				    + t3dg_2(0,0,1)*t3dg_3(1,0,1)
-				    + t3dg_2(0,0,2)*t3dg_3(1,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,0,1,0)");
-  test_for_zero(t4ddg_1(0,0,1,1) - (t3dg_2(0,0,0)*t3dg_3(1,1,0)
-				    + t3dg_2(0,0,1)*t3dg_3(1,1,1)
-				    + t3dg_2(0,0,2)*t3dg_3(1,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,0,1,1)");
-  test_for_zero(t4ddg_1(0,0,1,2) - (t3dg_2(0,0,0)*t3dg_3(1,2,0)
-				    + t3dg_2(0,0,1)*t3dg_3(1,2,1)
-				    + t3dg_2(0,0,2)*t3dg_3(1,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,0,1,2)");
-  test_for_zero(t4ddg_1(0,0,2,0) - (t3dg_2(0,0,0)*t3dg_3(2,0,0)
-				    + t3dg_2(0,0,1)*t3dg_3(2,0,1)
-				    + t3dg_2(0,0,2)*t3dg_3(2,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,0,2,0)");
-  test_for_zero(t4ddg_1(0,0,2,1) - (t3dg_2(0,0,0)*t3dg_3(2,1,0)
-				    + t3dg_2(0,0,1)*t3dg_3(2,1,1)
-				    + t3dg_2(0,0,2)*t3dg_3(2,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,0,2,1)");
-  test_for_zero(t4ddg_1(0,0,2,2) - (t3dg_2(0,0,0)*t3dg_3(2,2,0)
-				    + t3dg_2(0,0,1)*t3dg_3(2,2,1)
-				    + t3dg_2(0,0,2)*t3dg_3(2,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,0,2,2)");
-  test_for_zero(t4ddg_1(0,1,0,0) - (t3dg_2(0,1,0)*t3dg_3(0,0,0)
-				    + t3dg_2(0,1,1)*t3dg_3(0,0,1)
-				    + t3dg_2(0,1,2)*t3dg_3(0,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,1,0,0)");
-  test_for_zero(t4ddg_1(0,1,0,1) - (t3dg_2(0,1,0)*t3dg_3(0,1,0)
-				    + t3dg_2(0,1,1)*t3dg_3(0,1,1)
-				    + t3dg_2(0,1,2)*t3dg_3(0,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,1,0,1)");
-  test_for_zero(t4ddg_1(0,1,0,2) - (t3dg_2(0,1,0)*t3dg_3(0,2,0)
-				    + t3dg_2(0,1,1)*t3dg_3(0,2,1)
-				    + t3dg_2(0,1,2)*t3dg_3(0,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,1,0,2)");
-  test_for_zero(t4ddg_1(0,1,1,0) - (t3dg_2(0,1,0)*t3dg_3(1,0,0)
-				    + t3dg_2(0,1,1)*t3dg_3(1,0,1)
-				    + t3dg_2(0,1,2)*t3dg_3(1,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,1,1,0)");
-  test_for_zero(t4ddg_1(0,1,1,1) - (t3dg_2(0,1,0)*t3dg_3(1,1,0)
-				    + t3dg_2(0,1,1)*t3dg_3(1,1,1)
-				    + t3dg_2(0,1,2)*t3dg_3(1,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,1,1,1)");
-  test_for_zero(t4ddg_1(0,1,1,2) - (t3dg_2(0,1,0)*t3dg_3(1,2,0)
-				    + t3dg_2(0,1,1)*t3dg_3(1,2,1)
-				    + t3dg_2(0,1,2)*t3dg_3(1,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,1,1,2)");
-  test_for_zero(t4ddg_1(0,1,2,0) - (t3dg_2(0,1,0)*t3dg_3(2,0,0)
-				    + t3dg_2(0,1,1)*t3dg_3(2,0,1)
-				    + t3dg_2(0,1,2)*t3dg_3(2,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,1,2,0)");
-  test_for_zero(t4ddg_1(0,1,2,1) - (t3dg_2(0,1,0)*t3dg_3(2,1,0)
-				    + t3dg_2(0,1,1)*t3dg_3(2,1,1)
-				    + t3dg_2(0,1,2)*t3dg_3(2,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,1,2,1)");
-  test_for_zero(t4ddg_1(0,1,2,2) - (t3dg_2(0,1,0)*t3dg_3(2,2,0)
-				    + t3dg_2(0,1,1)*t3dg_3(2,2,1)
-				    + t3dg_2(0,1,2)*t3dg_3(2,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,1,2,2)");
-  test_for_zero(t4ddg_1(0,2,0,0) - (t3dg_2(0,2,0)*t3dg_3(0,0,0)
-				    + t3dg_2(0,2,1)*t3dg_3(0,0,1)
-				    + t3dg_2(0,2,2)*t3dg_3(0,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,2,0,0)");
-  test_for_zero(t4ddg_1(0,2,0,1) - (t3dg_2(0,2,0)*t3dg_3(0,1,0)
-				    + t3dg_2(0,2,1)*t3dg_3(0,1,1)
-				    + t3dg_2(0,2,2)*t3dg_3(0,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,2,0,1)");
-  test_for_zero(t4ddg_1(0,2,0,2) - (t3dg_2(0,2,0)*t3dg_3(0,2,0)
-				    + t3dg_2(0,2,1)*t3dg_3(0,2,1)
-				    + t3dg_2(0,2,2)*t3dg_3(0,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,2,0,2)");
-  test_for_zero(t4ddg_1(0,2,1,0) - (t3dg_2(0,2,0)*t3dg_3(1,0,0)
-				    + t3dg_2(0,2,1)*t3dg_3(1,0,1)
-				    + t3dg_2(0,2,2)*t3dg_3(1,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,2,1,0)");
-  test_for_zero(t4ddg_1(0,2,1,1) - (t3dg_2(0,2,0)*t3dg_3(1,1,0)
-				    + t3dg_2(0,2,1)*t3dg_3(1,1,1)
-				    + t3dg_2(0,2,2)*t3dg_3(1,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,2,1,1)");
-  test_for_zero(t4ddg_1(0,2,1,2) - (t3dg_2(0,2,0)*t3dg_3(1,2,0)
-				    + t3dg_2(0,2,1)*t3dg_3(1,2,1)
-				    + t3dg_2(0,2,2)*t3dg_3(1,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,2,1,2)");
-  test_for_zero(t4ddg_1(0,2,2,0) - (t3dg_2(0,2,0)*t3dg_3(2,0,0)
-				    + t3dg_2(0,2,1)*t3dg_3(2,0,1)
-				    + t3dg_2(0,2,2)*t3dg_3(2,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,2,2,0)");
-  test_for_zero(t4ddg_1(0,2,2,1) - (t3dg_2(0,2,0)*t3dg_3(2,1,0)
-				    + t3dg_2(0,2,1)*t3dg_3(2,1,1)
-				    + t3dg_2(0,2,2)*t3dg_3(2,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,2,2,1)");
-  test_for_zero(t4ddg_1(0,2,2,2) - (t3dg_2(0,2,0)*t3dg_3(2,2,0)
-				    + t3dg_2(0,2,1)*t3dg_3(2,2,1)
-				    + t3dg_2(0,2,2)*t3dg_3(2,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(0,2,2,2)");
-  test_for_zero(t4ddg_1(1,0,0,0) - (t3dg_2(1,0,0)*t3dg_3(0,0,0)
-				    + t3dg_2(1,0,1)*t3dg_3(0,0,1)
-				    + t3dg_2(1,0,2)*t3dg_3(0,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,0,0,0)");
-  test_for_zero(t4ddg_1(1,0,0,1) - (t3dg_2(1,0,0)*t3dg_3(0,1,0)
-				    + t3dg_2(1,0,1)*t3dg_3(0,1,1)
-				    + t3dg_2(1,0,2)*t3dg_3(0,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,0,0,1)");
-  test_for_zero(t4ddg_1(1,0,0,2) - (t3dg_2(1,0,0)*t3dg_3(0,2,0)
-				    + t3dg_2(1,0,1)*t3dg_3(0,2,1)
-				    + t3dg_2(1,0,2)*t3dg_3(0,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,0,0,2)");
-  test_for_zero(t4ddg_1(1,0,1,0) - (t3dg_2(1,0,0)*t3dg_3(1,0,0)
-				    + t3dg_2(1,0,1)*t3dg_3(1,0,1)
-				    + t3dg_2(1,0,2)*t3dg_3(1,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,0,1,0)");
-  test_for_zero(t4ddg_1(1,0,1,1) - (t3dg_2(1,0,0)*t3dg_3(1,1,0)
-				    + t3dg_2(1,0,1)*t3dg_3(1,1,1)
-				    + t3dg_2(1,0,2)*t3dg_3(1,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,0,1,1)");
-  test_for_zero(t4ddg_1(1,0,1,2) - (t3dg_2(1,0,0)*t3dg_3(1,2,0)
-				    + t3dg_2(1,0,1)*t3dg_3(1,2,1)
-				    + t3dg_2(1,0,2)*t3dg_3(1,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,0,1,2)");
-  test_for_zero(t4ddg_1(1,0,2,0) - (t3dg_2(1,0,0)*t3dg_3(2,0,0)
-				    + t3dg_2(1,0,1)*t3dg_3(2,0,1)
-				    + t3dg_2(1,0,2)*t3dg_3(2,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,0,2,0)");
-  test_for_zero(t4ddg_1(1,0,2,1) - (t3dg_2(1,0,0)*t3dg_3(2,1,0)
-				    + t3dg_2(1,0,1)*t3dg_3(2,1,1)
-				    + t3dg_2(1,0,2)*t3dg_3(2,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,0,2,1)");
-  test_for_zero(t4ddg_1(1,0,2,2) - (t3dg_2(1,0,0)*t3dg_3(2,2,0)
-				    + t3dg_2(1,0,1)*t3dg_3(2,2,1)
-				    + t3dg_2(1,0,2)*t3dg_3(2,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,0,2,2)");
-  test_for_zero(t4ddg_1(1,1,0,0) - (t3dg_2(1,1,0)*t3dg_3(0,0,0)
-				    + t3dg_2(1,1,1)*t3dg_3(0,0,1)
-				    + t3dg_2(1,1,2)*t3dg_3(0,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,1,0,0)");
-  test_for_zero(t4ddg_1(1,1,0,1) - (t3dg_2(1,1,0)*t3dg_3(0,1,0)
-				    + t3dg_2(1,1,1)*t3dg_3(0,1,1)
-				    + t3dg_2(1,1,2)*t3dg_3(0,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,1,0,1)");
-  test_for_zero(t4ddg_1(1,1,0,2) - (t3dg_2(1,1,0)*t3dg_3(0,2,0)
-				    + t3dg_2(1,1,1)*t3dg_3(0,2,1)
-				    + t3dg_2(1,1,2)*t3dg_3(0,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,1,0,2)");
-  test_for_zero(t4ddg_1(1,1,1,0) - (t3dg_2(1,1,0)*t3dg_3(1,0,0)
-				    + t3dg_2(1,1,1)*t3dg_3(1,0,1)
-				    + t3dg_2(1,1,2)*t3dg_3(1,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,1) - (t3dg_2(1,1,0)*t3dg_3(1,1,0)
-				    + t3dg_2(1,1,1)*t3dg_3(1,1,1)
-				    + t3dg_2(1,1,2)*t3dg_3(1,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,1,1,1)");
-  test_for_zero(t4ddg_1(1,1,1,2) - (t3dg_2(1,1,0)*t3dg_3(1,2,0)
-				    + t3dg_2(1,1,1)*t3dg_3(1,2,1)
-				    + t3dg_2(1,1,2)*t3dg_3(1,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,1,1,2)");
-  test_for_zero(t4ddg_1(1,1,2,0) - (t3dg_2(1,1,0)*t3dg_3(2,0,0)
-				    + t3dg_2(1,1,1)*t3dg_3(2,0,1)
-				    + t3dg_2(1,1,2)*t3dg_3(2,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,1,2,0)");
-  test_for_zero(t4ddg_1(1,1,2,1) - (t3dg_2(1,1,0)*t3dg_3(2,1,0)
-				    + t3dg_2(1,1,1)*t3dg_3(2,1,1)
-				    + t3dg_2(1,1,2)*t3dg_3(2,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,1,2,1)");
-  test_for_zero(t4ddg_1(1,1,2,2) - (t3dg_2(1,1,0)*t3dg_3(2,2,0)
-				    + t3dg_2(1,1,1)*t3dg_3(2,2,1)
-				    + t3dg_2(1,1,2)*t3dg_3(2,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,1,2,2)");
-  test_for_zero(t4ddg_1(1,2,0,0) - (t3dg_2(1,2,0)*t3dg_3(0,0,0)
-				    + t3dg_2(1,2,1)*t3dg_3(0,0,1)
-				    + t3dg_2(1,2,2)*t3dg_3(0,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,2,0,0)");
-  test_for_zero(t4ddg_1(1,2,0,1) - (t3dg_2(1,2,0)*t3dg_3(0,1,0)
-				    + t3dg_2(1,2,1)*t3dg_3(0,1,1)
-				    + t3dg_2(1,2,2)*t3dg_3(0,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,2,0,1)");
-  test_for_zero(t4ddg_1(1,2,0,2) - (t3dg_2(1,2,0)*t3dg_3(0,2,0)
-				    + t3dg_2(1,2,1)*t3dg_3(0,2,1)
-				    + t3dg_2(1,2,2)*t3dg_3(0,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,2,0,2)");
-  test_for_zero(t4ddg_1(1,2,1,0) - (t3dg_2(1,2,0)*t3dg_3(1,0,0)
-				    + t3dg_2(1,2,1)*t3dg_3(1,0,1)
-				    + t3dg_2(1,2,2)*t3dg_3(1,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,2,1,0)");
-  test_for_zero(t4ddg_1(1,2,1,1) - (t3dg_2(1,2,0)*t3dg_3(1,1,0)
-				    + t3dg_2(1,2,1)*t3dg_3(1,1,1)
-				    + t3dg_2(1,2,2)*t3dg_3(1,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,2,1,1)");
-  test_for_zero(t4ddg_1(1,2,1,2) - (t3dg_2(1,2,0)*t3dg_3(1,2,0)
-				    + t3dg_2(1,2,1)*t3dg_3(1,2,1)
-				    + t3dg_2(1,2,2)*t3dg_3(1,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,2,1,2)");
-  test_for_zero(t4ddg_1(1,2,2,0) - (t3dg_2(1,2,0)*t3dg_3(2,0,0)
-				    + t3dg_2(1,2,1)*t3dg_3(2,0,1)
-				    + t3dg_2(1,2,2)*t3dg_3(2,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,2,2,0)");
-  test_for_zero(t4ddg_1(1,2,2,1) - (t3dg_2(1,2,0)*t3dg_3(2,1,0)
-				    + t3dg_2(1,2,1)*t3dg_3(2,1,1)
-				    + t3dg_2(1,2,2)*t3dg_3(2,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,2,2,1)");
-  test_for_zero(t4ddg_1(1,2,2,2) - (t3dg_2(1,2,0)*t3dg_3(2,2,0)
-				    + t3dg_2(1,2,1)*t3dg_3(2,2,1)
-				    + t3dg_2(1,2,2)*t3dg_3(2,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(1,2,2,2)");
-  test_for_zero(t4ddg_1(2,0,0,0) - (t3dg_2(2,0,0)*t3dg_3(0,0,0)
-				    + t3dg_2(2,0,1)*t3dg_3(0,0,1)
-				    + t3dg_2(2,0,2)*t3dg_3(0,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,0,0,0)");
-  test_for_zero(t4ddg_1(2,0,0,1) - (t3dg_2(2,0,0)*t3dg_3(0,1,0)
-				    + t3dg_2(2,0,1)*t3dg_3(0,1,1)
-				    + t3dg_2(2,0,2)*t3dg_3(0,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,0,0,1)");
-  test_for_zero(t4ddg_1(2,0,0,2) - (t3dg_2(2,0,0)*t3dg_3(0,2,0)
-				    + t3dg_2(2,0,1)*t3dg_3(0,2,1)
-				    + t3dg_2(2,0,2)*t3dg_3(0,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,0,0,2)");
-  test_for_zero(t4ddg_1(2,0,1,0) - (t3dg_2(2,0,0)*t3dg_3(1,0,0)
-				    + t3dg_2(2,0,1)*t3dg_3(1,0,1)
-				    + t3dg_2(2,0,2)*t3dg_3(1,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,0,1,0)");
-  test_for_zero(t4ddg_1(2,0,1,1) - (t3dg_2(2,0,0)*t3dg_3(1,1,0)
-				    + t3dg_2(2,0,1)*t3dg_3(1,1,1)
-				    + t3dg_2(2,0,2)*t3dg_3(1,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,0,1,1)");
-  test_for_zero(t4ddg_1(2,0,1,2) - (t3dg_2(2,0,0)*t3dg_3(1,2,0)
-				    + t3dg_2(2,0,1)*t3dg_3(1,2,1)
-				    + t3dg_2(2,0,2)*t3dg_3(1,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,0,1,2)");
-  test_for_zero(t4ddg_1(2,0,2,0) - (t3dg_2(2,0,0)*t3dg_3(2,0,0)
-				    + t3dg_2(2,0,1)*t3dg_3(2,0,1)
-				    + t3dg_2(2,0,2)*t3dg_3(2,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,0,2,0)");
-  test_for_zero(t4ddg_1(2,0,2,1) - (t3dg_2(2,0,0)*t3dg_3(2,1,0)
-				    + t3dg_2(2,0,1)*t3dg_3(2,1,1)
-				    + t3dg_2(2,0,2)*t3dg_3(2,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,0,2,1)");
-  test_for_zero(t4ddg_1(2,0,2,2) - (t3dg_2(2,0,0)*t3dg_3(2,2,0)
-				    + t3dg_2(2,0,1)*t3dg_3(2,2,1)
-				    + t3dg_2(2,0,2)*t3dg_3(2,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,0,2,2)");
-  test_for_zero(t4ddg_1(2,1,0,0) - (t3dg_2(2,1,0)*t3dg_3(0,0,0)
-				    + t3dg_2(2,1,1)*t3dg_3(0,0,1)
-				    + t3dg_2(2,1,2)*t3dg_3(0,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,1,0,0)");
-  test_for_zero(t4ddg_1(2,1,0,1) - (t3dg_2(2,1,0)*t3dg_3(0,1,0)
-				    + t3dg_2(2,1,1)*t3dg_3(0,1,1)
-				    + t3dg_2(2,1,2)*t3dg_3(0,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,1,0,1)");
-  test_for_zero(t4ddg_1(2,1,0,2) - (t3dg_2(2,1,0)*t3dg_3(0,2,0)
-				    + t3dg_2(2,1,1)*t3dg_3(0,2,1)
-				    + t3dg_2(2,1,2)*t3dg_3(0,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,1,0,2)");
-  test_for_zero(t4ddg_1(2,1,1,0) - (t3dg_2(2,1,0)*t3dg_3(1,0,0)
-				    + t3dg_2(2,1,1)*t3dg_3(1,0,1)
-				    + t3dg_2(2,1,2)*t3dg_3(1,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,1,1,0)");
-  test_for_zero(t4ddg_1(2,1,1,1) - (t3dg_2(2,1,0)*t3dg_3(1,1,0)
-				    + t3dg_2(2,1,1)*t3dg_3(1,1,1)
-				    + t3dg_2(2,1,2)*t3dg_3(1,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,1,1,1)");
-  test_for_zero(t4ddg_1(2,1,1,2) - (t3dg_2(2,1,0)*t3dg_3(1,2,0)
-				    + t3dg_2(2,1,1)*t3dg_3(1,2,1)
-				    + t3dg_2(2,1,2)*t3dg_3(1,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,1,1,2)");
-  test_for_zero(t4ddg_1(2,1,2,0) - (t3dg_2(2,1,0)*t3dg_3(2,0,0)
-				    + t3dg_2(2,1,1)*t3dg_3(2,0,1)
-				    + t3dg_2(2,1,2)*t3dg_3(2,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,1,2,0)");
-  test_for_zero(t4ddg_1(2,1,2,1) - (t3dg_2(2,1,0)*t3dg_3(2,1,0)
-				    + t3dg_2(2,1,1)*t3dg_3(2,1,1)
-				    + t3dg_2(2,1,2)*t3dg_3(2,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,1,2,1)");
-  test_for_zero(t4ddg_1(2,1,2,2) - (t3dg_2(2,1,0)*t3dg_3(2,2,0)
-				    + t3dg_2(2,1,1)*t3dg_3(2,2,1)
-				    + t3dg_2(2,1,2)*t3dg_3(2,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,1,2,2)");
-  test_for_zero(t4ddg_1(2,2,0,0) - (t3dg_2(2,2,0)*t3dg_3(0,0,0)
-				    + t3dg_2(2,2,1)*t3dg_3(0,0,1)
-				    + t3dg_2(2,2,2)*t3dg_3(0,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,2,0,0)");
-  test_for_zero(t4ddg_1(2,2,0,1) - (t3dg_2(2,2,0)*t3dg_3(0,1,0)
-				    + t3dg_2(2,2,1)*t3dg_3(0,1,1)
-				    + t3dg_2(2,2,2)*t3dg_3(0,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,2,0,1)");
-  test_for_zero(t4ddg_1(2,2,0,2) - (t3dg_2(2,2,0)*t3dg_3(0,2,0)
-				    + t3dg_2(2,2,1)*t3dg_3(0,2,1)
-				    + t3dg_2(2,2,2)*t3dg_3(0,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,2,0,2)");
-  test_for_zero(t4ddg_1(2,2,1,0) - (t3dg_2(2,2,0)*t3dg_3(1,0,0)
-				    + t3dg_2(2,2,1)*t3dg_3(1,0,1)
-				    + t3dg_2(2,2,2)*t3dg_3(1,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,2,1,0)");
-  test_for_zero(t4ddg_1(2,2,1,1) - (t3dg_2(2,2,0)*t3dg_3(1,1,0)
-				    + t3dg_2(2,2,1)*t3dg_3(1,1,1)
-				    + t3dg_2(2,2,2)*t3dg_3(1,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,2,1,1)");
-  test_for_zero(t4ddg_1(2,2,1,2) - (t3dg_2(2,2,0)*t3dg_3(1,2,0)
-				    + t3dg_2(2,2,1)*t3dg_3(1,2,1)
-				    + t3dg_2(2,2,2)*t3dg_3(1,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,2,1,2)");
-  test_for_zero(t4ddg_1(2,2,2,0) - (t3dg_2(2,2,0)*t3dg_3(2,0,0)
-				    + t3dg_2(2,2,1)*t3dg_3(2,0,1)
-				    + t3dg_2(2,2,2)*t3dg_3(2,0,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,2,2,0)");
-  test_for_zero(t4ddg_1(2,2,2,1) - (t3dg_2(2,2,0)*t3dg_3(2,1,0)
-				    + t3dg_2(2,2,1)*t3dg_3(2,1,1)
-				    + t3dg_2(2,2,2)*t3dg_3(2,1,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,2) - (t3dg_2(2,2,0)*t3dg_3(2,2,0)
-				    + t3dg_2(2,2,1)*t3dg_3(2,2,1)
-				    + t3dg_2(2,2,2)*t3dg_3(2,2,2))
-		,"T3dg(i,j,k)*T3dg(l,m,k)(2,2,2,2)");
-
-  t4ddg_2(i,j,l,m)=t2s_2(i,j)*t2s_3(l,m);
-  t4ddg_3(i,j,l,m)=t2s_3(i,j)*t2s_2(l,m);
-  test_for_zero(t4ddg_2(0,0,0,0) - (t2s_2(0,0)*t2s_3(0,0))
-		,"T2s(i,j)*T2s(l,m)(0,0,0,0)");
-  test_for_zero(t4ddg_2(0,0,0,1) - (t2s_2(0,0)*t2s_3(0,1))
-		,"T2s(i,j)*T2s(l,m)(0,0,0,1)");
-  test_for_zero(t4ddg_2(0,0,0,2) - (t2s_2(0,0)*t2s_3(0,2))
-		,"T2s(i,j)*T2s(l,m)(0,0,0,2)");
-  test_for_zero(t4ddg_2(0,0,1,0) - (t2s_2(0,0)*t2s_3(1,0))
-		,"T2s(i,j)*T2s(l,m)(0,0,1,0)");
-  test_for_zero(t4ddg_2(0,0,1,1) - (t2s_2(0,0)*t2s_3(1,1))
-		,"T2s(i,j)*T2s(l,m)(0,0,1,1)");
-  test_for_zero(t4ddg_2(0,0,1,2) - (t2s_2(0,0)*t2s_3(1,2))
-		,"T2s(i,j)*T2s(l,m)(0,0,1,2)");
-  test_for_zero(t4ddg_2(0,0,2,0) - (t2s_2(0,0)*t2s_3(2,0))
-		,"T2s(i,j)*T2s(l,m)(0,0,2,0)");
-  test_for_zero(t4ddg_2(0,0,2,1) - (t2s_2(0,0)*t2s_3(2,1))
-		,"T2s(i,j)*T2s(l,m)(0,0,2,1)");
-  test_for_zero(t4ddg_2(0,0,2,2) - (t2s_2(0,0)*t2s_3(2,2))
-		,"T2s(i,j)*T2s(l,m)(0,0,2,2)");
-  test_for_zero(t4ddg_2(0,1,0,0) - (t2s_2(0,1)*t2s_3(0,0))
-		,"T2s(i,j)*T2s(l,m)(0,1,0,0)");
-  test_for_zero(t4ddg_2(0,1,0,1) - (t2s_2(0,1)*t2s_3(0,1))
-		,"T2s(i,j)*T2s(l,m)(0,1,0,1)");
-  test_for_zero(t4ddg_2(0,1,0,2) - (t2s_2(0,1)*t2s_3(0,2))
-		,"T2s(i,j)*T2s(l,m)(0,1,0,2)");
-  test_for_zero(t4ddg_2(0,1,1,0) - (t2s_2(0,1)*t2s_3(1,0))
-		,"T2s(i,j)*T2s(l,m)(0,1,1,0)");
-  test_for_zero(t4ddg_2(0,1,1,1) - (t2s_2(0,1)*t2s_3(1,1))
-		,"T2s(i,j)*T2s(l,m)(0,1,1,1)");
-  test_for_zero(t4ddg_2(0,1,1,2) - (t2s_2(0,1)*t2s_3(1,2))
-		,"T2s(i,j)*T2s(l,m)(0,1,1,2)");
-  test_for_zero(t4ddg_2(0,1,2,0) - (t2s_2(0,1)*t2s_3(2,0))
-		,"T2s(i,j)*T2s(l,m)(0,1,2,0)");
-  test_for_zero(t4ddg_2(0,1,2,1) - (t2s_2(0,1)*t2s_3(2,1))
-		,"T2s(i,j)*T2s(l,m)(0,1,2,1)");
-  test_for_zero(t4ddg_2(0,1,2,2) - (t2s_2(0,1)*t2s_3(2,2))
-		,"T2s(i,j)*T2s(l,m)(0,1,2,2)");
-  test_for_zero(t4ddg_2(0,2,0,0) - (t2s_2(0,2)*t2s_3(0,0))
-		,"T2s(i,j)*T2s(l,m)(0,2,0,0)");
-  test_for_zero(t4ddg_2(0,2,0,1) - (t2s_2(0,2)*t2s_3(0,1))
-		,"T2s(i,j)*T2s(l,m)(0,2,0,1)");
-  test_for_zero(t4ddg_2(0,2,0,2) - (t2s_2(0,2)*t2s_3(0,2))
-		,"T2s(i,j)*T2s(l,m)(0,2,0,2)");
-  test_for_zero(t4ddg_2(0,2,1,0) - (t2s_2(0,2)*t2s_3(1,0))
-		,"T2s(i,j)*T2s(l,m)(0,2,1,0)");
-  test_for_zero(t4ddg_2(0,2,1,1) - (t2s_2(0,2)*t2s_3(1,1))
-		,"T2s(i,j)*T2s(l,m)(0,2,1,1)");
-  test_for_zero(t4ddg_2(0,2,1,2) - (t2s_2(0,2)*t2s_3(1,2))
-		,"T2s(i,j)*T2s(l,m)(0,2,1,2)");
-  test_for_zero(t4ddg_2(0,2,2,0) - (t2s_2(0,2)*t2s_3(2,0))
-		,"T2s(i,j)*T2s(l,m)(0,2,2,0)");
-  test_for_zero(t4ddg_2(0,2,2,1) - (t2s_2(0,2)*t2s_3(2,1))
-		,"T2s(i,j)*T2s(l,m)(0,2,2,1)");
-  test_for_zero(t4ddg_2(0,2,2,2) - (t2s_2(0,2)*t2s_3(2,2))
-		,"T2s(i,j)*T2s(l,m)(0,2,2,2)");
-  test_for_zero(t4ddg_2(1,0,0,0) - (t2s_2(1,0)*t2s_3(0,0))
-		,"T2s(i,j)*T2s(l,m)(1,0,0,0)");
-  test_for_zero(t4ddg_2(1,0,0,1) - (t2s_2(1,0)*t2s_3(0,1))
-		,"T2s(i,j)*T2s(l,m)(1,0,0,1)");
-  test_for_zero(t4ddg_2(1,0,0,2) - (t2s_2(1,0)*t2s_3(0,2))
-		,"T2s(i,j)*T2s(l,m)(1,0,0,2)");
-  test_for_zero(t4ddg_2(1,0,1,0) - (t2s_2(1,0)*t2s_3(1,0))
-		,"T2s(i,j)*T2s(l,m)(1,0,1,0)");
-  test_for_zero(t4ddg_2(1,0,1,1) - (t2s_2(1,0)*t2s_3(1,1))
-		,"T2s(i,j)*T2s(l,m)(1,0,1,1)");
-  test_for_zero(t4ddg_2(1,0,1,2) - (t2s_2(1,0)*t2s_3(1,2))
-		,"T2s(i,j)*T2s(l,m)(1,0,1,2)");
-  test_for_zero(t4ddg_2(1,0,2,0) - (t2s_2(1,0)*t2s_3(2,0))
-		,"T2s(i,j)*T2s(l,m)(1,0,2,0)");
-  test_for_zero(t4ddg_2(1,0,2,1) - (t2s_2(1,0)*t2s_3(2,1))
-		,"T2s(i,j)*T2s(l,m)(1,0,2,1)");
-  test_for_zero(t4ddg_2(1,0,2,2) - (t2s_2(1,0)*t2s_3(2,2))
-		,"T2s(i,j)*T2s(l,m)(1,0,2,2)");
-  test_for_zero(t4ddg_2(1,1,0,0) - (t2s_2(1,1)*t2s_3(0,0))
-		,"T2s(i,j)*T2s(l,m)(1,1,0,0)");
-  test_for_zero(t4ddg_2(1,1,0,1) - (t2s_2(1,1)*t2s_3(0,1))
-		,"T2s(i,j)*T2s(l,m)(1,1,0,1)");
-  test_for_zero(t4ddg_2(1,1,0,2) - (t2s_2(1,1)*t2s_3(0,2))
-		,"T2s(i,j)*T2s(l,m)(1,1,0,2)");
-  test_for_zero(t4ddg_2(1,1,1,0) - (t2s_2(1,1)*t2s_3(1,0))
-		,"T2s(i,j)*T2s(l,m)(1,1,1,0)");
-  test_for_zero(t4ddg_2(1,1,1,1) - (t2s_2(1,1)*t2s_3(1,1))
-		,"T2s(i,j)*T2s(l,m)(1,1,1,1)");
-  test_for_zero(t4ddg_2(1,1,1,2) - (t2s_2(1,1)*t2s_3(1,2))
-		,"T2s(i,j)*T2s(l,m)(1,1,1,2)");
-  test_for_zero(t4ddg_2(1,1,2,0) - (t2s_2(1,1)*t2s_3(2,0))
-		,"T2s(i,j)*T2s(l,m)(1,1,2,0)");
-  test_for_zero(t4ddg_2(1,1,2,1) - (t2s_2(1,1)*t2s_3(2,1))
-		,"T2s(i,j)*T2s(l,m)(1,1,2,1)");
-  test_for_zero(t4ddg_2(1,1,2,2) - (t2s_2(1,1)*t2s_3(2,2))
-		,"T2s(i,j)*T2s(l,m)(1,1,2,2)");
-  test_for_zero(t4ddg_2(1,2,0,0) - (t2s_2(1,2)*t2s_3(0,0))
-		,"T2s(i,j)*T2s(l,m)(1,2,0,0)");
-  test_for_zero(t4ddg_2(1,2,0,1) - (t2s_2(1,2)*t2s_3(0,1))
-		,"T2s(i,j)*T2s(l,m)(1,2,0,1)");
-  test_for_zero(t4ddg_2(1,2,0,2) - (t2s_2(1,2)*t2s_3(0,2))
-		,"T2s(i,j)*T2s(l,m)(1,2,0,2)");
-  test_for_zero(t4ddg_2(1,2,1,0) - (t2s_2(1,2)*t2s_3(1,0))
-		,"T2s(i,j)*T2s(l,m)(1,2,1,0)");
-  test_for_zero(t4ddg_2(1,2,1,1) - (t2s_2(1,2)*t2s_3(1,1))
-		,"T2s(i,j)*T2s(l,m)(1,2,1,1)");
-  test_for_zero(t4ddg_2(1,2,1,2) - (t2s_2(1,2)*t2s_3(1,2))
-		,"T2s(i,j)*T2s(l,m)(1,2,1,2)");
-  test_for_zero(t4ddg_2(1,2,2,0) - (t2s_2(1,2)*t2s_3(2,0))
-		,"T2s(i,j)*T2s(l,m)(1,2,2,0)");
-  test_for_zero(t4ddg_2(1,2,2,1) - (t2s_2(1,2)*t2s_3(2,1))
-		,"T2s(i,j)*T2s(l,m)(1,2,2,1)");
-  test_for_zero(t4ddg_2(1,2,2,2) - (t2s_2(1,2)*t2s_3(2,2))
-		,"T2s(i,j)*T2s(l,m)(1,2,2,2)");
-  test_for_zero(t4ddg_2(2,0,0,0) - (t2s_2(2,0)*t2s_3(0,0))
-		,"T2s(i,j)*T2s(l,m)(2,0,0,0)");
-  test_for_zero(t4ddg_2(2,0,0,1) - (t2s_2(2,0)*t2s_3(0,1))
-		,"T2s(i,j)*T2s(l,m)(2,0,0,1)");
-  test_for_zero(t4ddg_2(2,0,0,2) - (t2s_2(2,0)*t2s_3(0,2))
-		,"T2s(i,j)*T2s(l,m)(2,0,0,2)");
-  test_for_zero(t4ddg_2(2,0,1,0) - (t2s_2(2,0)*t2s_3(1,0))
-		,"T2s(i,j)*T2s(l,m)(2,0,1,0)");
-  test_for_zero(t4ddg_2(2,0,1,1) - (t2s_2(2,0)*t2s_3(1,1))
-		,"T2s(i,j)*T2s(l,m)(2,0,1,1)");
-  test_for_zero(t4ddg_2(2,0,1,2) - (t2s_2(2,0)*t2s_3(1,2))
-		,"T2s(i,j)*T2s(l,m)(2,0,1,2)");
-  test_for_zero(t4ddg_2(2,0,2,0) - (t2s_2(2,0)*t2s_3(2,0))
-		,"T2s(i,j)*T2s(l,m)(2,0,2,0)");
-  test_for_zero(t4ddg_2(2,0,2,1) - (t2s_2(2,0)*t2s_3(2,1))
-		,"T2s(i,j)*T2s(l,m)(2,0,2,1)");
-  test_for_zero(t4ddg_2(2,0,2,2) - (t2s_2(2,0)*t2s_3(2,2))
-		,"T2s(i,j)*T2s(l,m)(2,0,2,2)");
-  test_for_zero(t4ddg_2(2,1,0,0) - (t2s_2(2,1)*t2s_3(0,0))
-		,"T2s(i,j)*T2s(l,m)(2,1,0,0)");
-  test_for_zero(t4ddg_2(2,1,0,1) - (t2s_2(2,1)*t2s_3(0,1))
-		,"T2s(i,j)*T2s(l,m)(2,1,0,1)");
-  test_for_zero(t4ddg_2(2,1,0,2) - (t2s_2(2,1)*t2s_3(0,2))
-		,"T2s(i,j)*T2s(l,m)(2,1,0,2)");
-  test_for_zero(t4ddg_2(2,1,1,0) - (t2s_2(2,1)*t2s_3(1,0))
-		,"T2s(i,j)*T2s(l,m)(2,1,1,0)");
-  test_for_zero(t4ddg_2(2,1,1,1) - (t2s_2(2,1)*t2s_3(1,1))
-		,"T2s(i,j)*T2s(l,m)(2,1,1,1)");
-  test_for_zero(t4ddg_2(2,1,1,2) - (t2s_2(2,1)*t2s_3(1,2))
-		,"T2s(i,j)*T2s(l,m)(2,1,1,2)");
-  test_for_zero(t4ddg_2(2,1,2,0) - (t2s_2(2,1)*t2s_3(2,0))
-		,"T2s(i,j)*T2s(l,m)(2,1,2,0)");
-  test_for_zero(t4ddg_2(2,1,2,1) - (t2s_2(2,1)*t2s_3(2,1))
-		,"T2s(i,j)*T2s(l,m)(2,1,2,1)");
-  test_for_zero(t4ddg_2(2,1,2,2) - (t2s_2(2,1)*t2s_3(2,2))
-		,"T2s(i,j)*T2s(l,m)(2,1,2,2)");
-  test_for_zero(t4ddg_2(2,2,0,0) - (t2s_2(2,2)*t2s_3(0,0))
-		,"T2s(i,j)*T2s(l,m)(2,2,0,0)");
-  test_for_zero(t4ddg_2(2,2,0,1) - (t2s_2(2,2)*t2s_3(0,1))
-		,"T2s(i,j)*T2s(l,m)(2,2,0,1)");
-  test_for_zero(t4ddg_2(2,2,0,2) - (t2s_2(2,2)*t2s_3(0,2))
-		,"T2s(i,j)*T2s(l,m)(2,2,0,2)");
-  test_for_zero(t4ddg_2(2,2,1,0) - (t2s_2(2,2)*t2s_3(1,0))
-		,"T2s(i,j)*T2s(l,m)(2,2,1,0)");
-  test_for_zero(t4ddg_2(2,2,1,1) - (t2s_2(2,2)*t2s_3(1,1))
-		,"T2s(i,j)*T2s(l,m)(2,2,1,1)");
-  test_for_zero(t4ddg_2(2,2,1,2) - (t2s_2(2,2)*t2s_3(1,2))
-		,"T2s(i,j)*T2s(l,m)(2,2,1,2)");
-  test_for_zero(t4ddg_2(2,2,2,0) - (t2s_2(2,2)*t2s_3(2,0))
-		,"T2s(i,j)*T2s(l,m)(2,2,2,0)");
-  test_for_zero(t4ddg_2(2,2,2,1) - (t2s_2(2,2)*t2s_3(2,1))
-		,"T2s(i,j)*T2s(l,m)(2,2,2,1)");
-  test_for_zero(t4ddg_2(2,2,2,2) - (t2s_2(2,2)*t2s_3(2,2))
-		,"T2s(i,j)*T2s(l,m)(2,2,2,2)");
-
-  test_for_zero(t4ddg_1(i,j,k,l)*t4ddg_2(i,k,j,l)
-		- t4ddg_1(0,0,0,0)*t4ddg_2(0,0,0,0)
-		- t4ddg_1(0,0,0,1)*t4ddg_2(0,0,0,1)
-		- t4ddg_1(0,0,0,2)*t4ddg_2(0,0,0,2)
-		- t4ddg_1(0,0,1,0)*t4ddg_2(0,1,0,0)
-		- t4ddg_1(0,0,1,1)*t4ddg_2(0,1,0,1)
-		- t4ddg_1(0,0,1,2)*t4ddg_2(0,1,0,2)
-		- t4ddg_1(0,0,2,0)*t4ddg_2(0,2,0,0)
-		- t4ddg_1(0,0,2,1)*t4ddg_2(0,2,0,1)
-		- t4ddg_1(0,0,2,2)*t4ddg_2(0,2,0,2)
-		- t4ddg_1(0,1,0,0)*t4ddg_2(0,0,1,0)
-		- t4ddg_1(0,1,0,1)*t4ddg_2(0,0,1,1)
-		- t4ddg_1(0,1,0,2)*t4ddg_2(0,0,1,2)
-		- t4ddg_1(0,1,1,0)*t4ddg_2(0,1,1,0)
-		- t4ddg_1(0,1,1,1)*t4ddg_2(0,1,1,1)
-		- t4ddg_1(0,1,1,2)*t4ddg_2(0,1,1,2)
-		- t4ddg_1(0,1,2,0)*t4ddg_2(0,2,1,0)
-		- t4ddg_1(0,1,2,1)*t4ddg_2(0,2,1,1)
-		- t4ddg_1(0,1,2,2)*t4ddg_2(0,2,1,2)
-		- t4ddg_1(0,2,0,0)*t4ddg_2(0,0,2,0)
-		- t4ddg_1(0,2,0,1)*t4ddg_2(0,0,2,1)
-		- t4ddg_1(0,2,0,2)*t4ddg_2(0,0,2,2)
-		- t4ddg_1(0,2,1,0)*t4ddg_2(0,1,2,0)
-		- t4ddg_1(0,2,1,1)*t4ddg_2(0,1,2,1)
-		- t4ddg_1(0,2,1,2)*t4ddg_2(0,1,2,2)
-		- t4ddg_1(0,2,2,0)*t4ddg_2(0,2,2,0)
-		- t4ddg_1(0,2,2,1)*t4ddg_2(0,2,2,1)
-		- t4ddg_1(0,2,2,2)*t4ddg_2(0,2,2,2)
-
-		- t4ddg_1(1,0,0,0)*t4ddg_2(1,0,0,0)
-		- t4ddg_1(1,0,0,1)*t4ddg_2(1,0,0,1)
-		- t4ddg_1(1,0,0,2)*t4ddg_2(1,0,0,2)
-		- t4ddg_1(1,0,1,0)*t4ddg_2(1,1,0,0)
-		- t4ddg_1(1,0,1,1)*t4ddg_2(1,1,0,1)
-		- t4ddg_1(1,0,1,2)*t4ddg_2(1,1,0,2)
-		- t4ddg_1(1,0,2,0)*t4ddg_2(1,2,0,0)
-		- t4ddg_1(1,0,2,1)*t4ddg_2(1,2,0,1)
-		- t4ddg_1(1,0,2,2)*t4ddg_2(1,2,0,2)
-		- t4ddg_1(1,1,0,0)*t4ddg_2(1,0,1,0)
-		- t4ddg_1(1,1,0,1)*t4ddg_2(1,0,1,1)
-		- t4ddg_1(1,1,0,2)*t4ddg_2(1,0,1,2)
-		- t4ddg_1(1,1,1,0)*t4ddg_2(1,1,1,0)
-		- t4ddg_1(1,1,1,1)*t4ddg_2(1,1,1,1)
-		- t4ddg_1(1,1,1,2)*t4ddg_2(1,1,1,2)
-		- t4ddg_1(1,1,2,0)*t4ddg_2(1,2,1,0)
-		- t4ddg_1(1,1,2,1)*t4ddg_2(1,2,1,1)
-		- t4ddg_1(1,1,2,2)*t4ddg_2(1,2,1,2)
-		- t4ddg_1(1,2,0,0)*t4ddg_2(1,0,2,0)
-		- t4ddg_1(1,2,0,1)*t4ddg_2(1,0,2,1)
-		- t4ddg_1(1,2,0,2)*t4ddg_2(1,0,2,2)
-		- t4ddg_1(1,2,1,0)*t4ddg_2(1,1,2,0)
-		- t4ddg_1(1,2,1,1)*t4ddg_2(1,1,2,1)
-		- t4ddg_1(1,2,1,2)*t4ddg_2(1,1,2,2)
-		- t4ddg_1(1,2,2,0)*t4ddg_2(1,2,2,0)
-		- t4ddg_1(1,2,2,1)*t4ddg_2(1,2,2,1)
-		- t4ddg_1(1,2,2,2)*t4ddg_2(1,2,2,2)
-
-		- t4ddg_1(2,0,0,0)*t4ddg_2(2,0,0,0)
-		- t4ddg_1(2,0,0,1)*t4ddg_2(2,0,0,1)
-		- t4ddg_1(2,0,0,2)*t4ddg_2(2,0,0,2)
-		- t4ddg_1(2,0,1,0)*t4ddg_2(2,1,0,0)
-		- t4ddg_1(2,0,1,1)*t4ddg_2(2,1,0,1)
-		- t4ddg_1(2,0,1,2)*t4ddg_2(2,1,0,2)
-		- t4ddg_1(2,0,2,0)*t4ddg_2(2,2,0,0)
-		- t4ddg_1(2,0,2,1)*t4ddg_2(2,2,0,1)
-		- t4ddg_1(2,0,2,2)*t4ddg_2(2,2,0,2)
-		- t4ddg_1(2,1,0,0)*t4ddg_2(2,0,1,0)
-		- t4ddg_1(2,1,0,1)*t4ddg_2(2,0,1,1)
-		- t4ddg_1(2,1,0,2)*t4ddg_2(2,0,1,2)
-		- t4ddg_1(2,1,1,0)*t4ddg_2(2,1,1,0)
-		- t4ddg_1(2,1,1,1)*t4ddg_2(2,1,1,1)
-		- t4ddg_1(2,1,1,2)*t4ddg_2(2,1,1,2)
-		- t4ddg_1(2,1,2,0)*t4ddg_2(2,2,1,0)
-		- t4ddg_1(2,1,2,1)*t4ddg_2(2,2,1,1)
-		- t4ddg_1(2,1,2,2)*t4ddg_2(2,2,1,2)
-		- t4ddg_1(2,2,0,0)*t4ddg_2(2,0,2,0)
-		- t4ddg_1(2,2,0,1)*t4ddg_2(2,0,2,1)
-		- t4ddg_1(2,2,0,2)*t4ddg_2(2,0,2,2)
-		- t4ddg_1(2,2,1,0)*t4ddg_2(2,1,2,0)
-		- t4ddg_1(2,2,1,1)*t4ddg_2(2,1,2,1)
-		- t4ddg_1(2,2,1,2)*t4ddg_2(2,1,2,2)
-		- t4ddg_1(2,2,2,0)*t4ddg_2(2,2,2,0)
-		- t4ddg_1(2,2,2,1)*t4ddg_2(2,2,2,1)
-		- t4ddg_1(2,2,2,2)*t4ddg_2(2,2,2,2)
-		,"T4ddg(i,j,k,l)*T4ddg(i,j,k,l)");
-
-  t4ddg_1(i,j,k,l)=t4ddg_2(i,j,k,l)+t4ddg_3(i,j,k,l);
-  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)+t4ddg_3(0,0,0,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,0,0,0)");
-  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)+t4ddg_3(0,0,0,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,0,0,1)");
-  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)+t4ddg_3(0,0,0,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,0,0,2)");
-  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)+t4ddg_3(0,0,1,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,0,1,0)");
-  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)+t4ddg_3(0,0,1,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,0,1,1)");
-  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)+t4ddg_3(0,0,1,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,0,1,2)");
-  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)+t4ddg_3(0,0,2,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,0,2,0)");
-  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)+t4ddg_3(0,0,2,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,0,2,1)");
-  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)+t4ddg_3(0,0,2,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,0,2,2)");
-  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)+t4ddg_3(0,1,0,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,1,0,0)");
-  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)+t4ddg_3(0,1,0,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,1,0,1)");
-  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)+t4ddg_3(0,1,0,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,1,0,2)");
-  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)+t4ddg_3(0,1,1,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,1,1,0)");
-  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)+t4ddg_3(0,1,1,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,1,1,1)");
-  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)+t4ddg_3(0,1,1,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,1,1,2)");
-  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)+t4ddg_3(0,1,2,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,1,2,0)");
-  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)+t4ddg_3(0,1,2,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,1,2,1)");
-  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)+t4ddg_3(0,1,2,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,1,2,2)");
-  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)+t4ddg_3(0,2,0,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,2,0,0)");
-  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)+t4ddg_3(0,2,0,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,2,0,1)");
-  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)+t4ddg_3(0,2,0,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,2,0,2)");
-  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)+t4ddg_3(0,2,1,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,2,1,0)");
-  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)+t4ddg_3(0,2,1,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,2,1,1)");
-  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)+t4ddg_3(0,2,1,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,2,1,2)");
-  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)+t4ddg_3(0,2,2,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,2,2,0)");
-  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)+t4ddg_3(0,2,2,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,2,2,1)");
-  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)+t4ddg_3(0,2,2,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,2,2,2)");
-  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)+t4ddg_3(1,0,0,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,0,0,0)");
-  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)+t4ddg_3(1,0,0,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,0,0,1)");
-  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)+t4ddg_3(1,0,0,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,0,0,2)");
-  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)+t4ddg_3(1,0,1,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,0,1,0)");
-  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)+t4ddg_3(1,0,1,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,0,1,1)");
-  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)+t4ddg_3(1,0,1,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,0,1,2)");
-  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)+t4ddg_3(1,0,2,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,0,2,0)");
-  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)+t4ddg_3(1,0,2,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,0,2,1)");
-  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)+t4ddg_3(1,0,2,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,0,2,2)");
-  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)+t4ddg_3(1,1,0,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,1,0,0)");
-  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)+t4ddg_3(1,1,0,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,1,0,1)");
-  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)+t4ddg_3(1,1,0,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,1,0,2)");
-  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)+t4ddg_3(1,1,1,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)+t4ddg_3(1,1,1,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,1,1,1)");
-  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)+t4ddg_3(1,1,1,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,1,1,2)");
-  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)+t4ddg_3(1,1,2,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,1,2,0)");
-  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)+t4ddg_3(1,1,2,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,1,2,1)");
-  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)+t4ddg_3(1,1,2,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,1,2,2)");
-  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)+t4ddg_3(1,2,0,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,2,0,0)");
-  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)+t4ddg_3(1,2,0,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,2,0,1)");
-  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)+t4ddg_3(1,2,0,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,2,0,2)");
-  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)+t4ddg_3(1,2,1,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,2,1,0)");
-  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)+t4ddg_3(1,2,1,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,2,1,1)");
-  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)+t4ddg_3(1,2,1,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,2,1,2)");
-  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)+t4ddg_3(1,2,2,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,2,2,0)");
-  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)+t4ddg_3(1,2,2,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,2,2,1)");
-  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)+t4ddg_3(1,2,2,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,2,2,2)");
-  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)+t4ddg_3(2,0,0,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,0,0,0)");
-  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)+t4ddg_3(2,0,0,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,0,0,1)");
-  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)+t4ddg_3(2,0,0,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,0,0,2)");
-  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)+t4ddg_3(2,0,1,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,0,1,0)");
-  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)+t4ddg_3(2,0,1,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,0,1,1)");
-  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)+t4ddg_3(2,0,1,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,0,1,2)");
-  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)+t4ddg_3(2,0,2,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,0,2,0)");
-  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)+t4ddg_3(2,0,2,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,0,2,1)");
-  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)+t4ddg_3(2,0,2,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,0,2,2)");
-  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)+t4ddg_3(2,1,0,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,1,0,0)");
-  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)+t4ddg_3(2,1,0,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,1,0,1)");
-  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)+t4ddg_3(2,1,0,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,1,0,2)");
-  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)+t4ddg_3(2,1,1,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,1,1,0)");
-  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)+t4ddg_3(2,1,1,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,1,1,1)");
-  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)+t4ddg_3(2,1,1,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,1,1,2)");
-  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)+t4ddg_3(2,1,2,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,1,2,0)");
-  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)+t4ddg_3(2,1,2,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,1,2,1)");
-  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)+t4ddg_3(2,1,2,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,1,2,2)");
-  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)+t4ddg_3(2,2,0,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,2,0,0)");
-  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)+t4ddg_3(2,2,0,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,2,0,1)");
-  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)+t4ddg_3(2,2,0,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,2,0,2)");
-  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)+t4ddg_3(2,2,1,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,2,1,0)");
-  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)+t4ddg_3(2,2,1,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,2,1,1)");
-  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)+t4ddg_3(2,2,1,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,2,1,2)");
-  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)+t4ddg_3(2,2,2,0))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,2,2,0)");
-  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)+t4ddg_3(2,2,2,1))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)+t4ddg_3(2,2,2,2))
-		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,2,2,2)");
-
-  t4ddg_1(i,j,k,l)=t4ddg_2(i,j,k,l)+t4ddg_3(k,l,i,j);
-  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)+t4ddg_3(0,0,0,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,0,0,0)");
-  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)+t4ddg_3(0,1,0,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,0,0,1)");
-  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)+t4ddg_3(0,2,0,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,0,0,2)");
-  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)+t4ddg_3(1,0,0,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,0,1,0)");
-  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)+t4ddg_3(1,1,0,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,0,1,1)");
-  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)+t4ddg_3(1,2,0,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,0,1,2)");
-  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)+t4ddg_3(2,0,0,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,0,2,0)");
-  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)+t4ddg_3(2,1,0,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,0,2,1)");
-  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)+t4ddg_3(2,2,0,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,0,2,2)");
-  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)+t4ddg_3(0,0,0,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,1,0,0)");
-  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)+t4ddg_3(0,1,0,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,1,0,1)");
-  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)+t4ddg_3(0,2,0,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,1,0,2)");
-  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)+t4ddg_3(1,0,0,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,1,1,0)");
-  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)+t4ddg_3(1,1,0,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,1,1,1)");
-  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)+t4ddg_3(1,2,0,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,1,1,2)");
-  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)+t4ddg_3(2,0,0,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,1,2,0)");
-  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)+t4ddg_3(2,1,0,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,1,2,1)");
-  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)+t4ddg_3(2,2,0,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,1,2,2)");
-  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)+t4ddg_3(0,0,0,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,2,0,0)");
-  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)+t4ddg_3(0,1,0,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,2,0,1)");
-  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)+t4ddg_3(0,2,0,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,2,0,2)");
-  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)+t4ddg_3(1,0,0,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,2,1,0)");
-  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)+t4ddg_3(1,1,0,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,2,1,1)");
-  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)+t4ddg_3(1,2,0,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,2,1,2)");
-  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)+t4ddg_3(2,0,0,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,2,2,0)");
-  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)+t4ddg_3(2,1,0,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,2,2,1)");
-  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)+t4ddg_3(2,2,0,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,2,2,2)");
-  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)+t4ddg_3(0,0,1,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,0,0,0)");
-  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)+t4ddg_3(0,1,1,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,0,0,1)");
-  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)+t4ddg_3(0,2,1,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,0,0,2)");
-  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)+t4ddg_3(1,0,1,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,0,1,0)");
-  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)+t4ddg_3(1,1,1,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,0,1,1)");
-  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)+t4ddg_3(1,2,1,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,0,1,2)");
-  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)+t4ddg_3(2,0,1,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,0,2,0)");
-  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)+t4ddg_3(2,1,1,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,0,2,1)");
-  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)+t4ddg_3(2,2,1,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,0,2,2)");
-  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)+t4ddg_3(0,0,1,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,1,0,0)");
-  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)+t4ddg_3(0,1,1,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,1,0,1)");
-  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)+t4ddg_3(0,2,1,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,1,0,2)");
-  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)+t4ddg_3(1,0,1,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)+t4ddg_3(1,1,1,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,1,1,1)");
-  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)+t4ddg_3(1,2,1,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,1,1,2)");
-  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)+t4ddg_3(2,0,1,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,1,2,0)");
-  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)+t4ddg_3(2,1,1,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,1,2,1)");
-  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)+t4ddg_3(2,2,1,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,1,2,2)");
-  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)+t4ddg_3(0,0,1,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,2,0,0)");
-  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)+t4ddg_3(0,1,1,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,2,0,1)");
-  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)+t4ddg_3(0,2,1,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,2,0,2)");
-  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)+t4ddg_3(1,0,1,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,2,1,0)");
-  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)+t4ddg_3(1,1,1,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,2,1,1)");
-  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)+t4ddg_3(1,2,1,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,2,1,2)");
-  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)+t4ddg_3(2,0,1,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,2,2,0)");
-  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)+t4ddg_3(2,1,1,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,2,2,1)");
-  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)+t4ddg_3(2,2,1,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,2,2,2)");
-  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)+t4ddg_3(0,0,2,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,0,0,0)");
-  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)+t4ddg_3(0,1,2,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,0,0,1)");
-  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)+t4ddg_3(0,2,2,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,0,0,2)");
-  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)+t4ddg_3(1,0,2,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,0,1,0)");
-  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)+t4ddg_3(1,1,2,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,0,1,1)");
-  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)+t4ddg_3(1,2,2,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,0,1,2)");
-  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)+t4ddg_3(2,0,2,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,0,2,0)");
-  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)+t4ddg_3(2,1,2,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,0,2,1)");
-  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)+t4ddg_3(2,2,2,0))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,0,2,2)");
-  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)+t4ddg_3(0,0,2,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,1,0,0)");
-  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)+t4ddg_3(0,1,2,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,1,0,1)");
-  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)+t4ddg_3(0,2,2,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,1,0,2)");
-  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)+t4ddg_3(1,0,2,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,1,1,0)");
-  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)+t4ddg_3(1,1,2,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,1,1,1)");
-  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)+t4ddg_3(1,2,2,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,1,1,2)");
-  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)+t4ddg_3(2,0,2,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,1,2,0)");
-  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)+t4ddg_3(2,1,2,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,1,2,1)");
-  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)+t4ddg_3(2,2,2,1))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,1,2,2)");
-  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)+t4ddg_3(0,0,2,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,2,0,0)");
-  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)+t4ddg_3(0,1,2,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,2,0,1)");
-  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)+t4ddg_3(0,2,2,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,2,0,2)");
-  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)+t4ddg_3(1,0,2,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,2,1,0)");
-  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)+t4ddg_3(1,1,2,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,2,1,1)");
-  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)+t4ddg_3(1,2,2,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,2,1,2)");
-  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)+t4ddg_3(2,0,2,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,2,2,0)");
-  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)+t4ddg_3(2,1,2,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)+t4ddg_3(2,2,2,2))
-		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,2,2,2)");
-
-
-  t4ddg_1(i,j,k,l)=t4ddg_2(i,j,k,l)-t4ddg_3(i,j,k,l);
-  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)-t4ddg_3(0,0,0,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,0,0,0)");
-  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)-t4ddg_3(0,0,0,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,0,0,1)");
-  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)-t4ddg_3(0,0,0,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,0,0,2)");
-  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)-t4ddg_3(0,0,1,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,0,1,0)");
-  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)-t4ddg_3(0,0,1,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,0,1,1)");
-  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)-t4ddg_3(0,0,1,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,0,1,2)");
-  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)-t4ddg_3(0,0,2,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,0,2,0)");
-  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)-t4ddg_3(0,0,2,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,0,2,1)");
-  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)-t4ddg_3(0,0,2,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,0,2,2)");
-  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)-t4ddg_3(0,1,0,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,1,0,0)");
-  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)-t4ddg_3(0,1,0,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,1,0,1)");
-  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)-t4ddg_3(0,1,0,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,1,0,2)");
-  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)-t4ddg_3(0,1,1,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,1,1,0)");
-  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)-t4ddg_3(0,1,1,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,1,1,1)");
-  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)-t4ddg_3(0,1,1,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,1,1,2)");
-  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)-t4ddg_3(0,1,2,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,1,2,0)");
-  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)-t4ddg_3(0,1,2,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,1,2,1)");
-  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)-t4ddg_3(0,1,2,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,1,2,2)");
-  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)-t4ddg_3(0,2,0,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,2,0,0)");
-  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)-t4ddg_3(0,2,0,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,2,0,1)");
-  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)-t4ddg_3(0,2,0,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,2,0,2)");
-  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)-t4ddg_3(0,2,1,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,2,1,0)");
-  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)-t4ddg_3(0,2,1,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,2,1,1)");
-  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)-t4ddg_3(0,2,1,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,2,1,2)");
-  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)-t4ddg_3(0,2,2,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,2,2,0)");
-  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)-t4ddg_3(0,2,2,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,2,2,1)");
-  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)-t4ddg_3(0,2,2,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,2,2,2)");
-  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)-t4ddg_3(1,0,0,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,0,0,0)");
-  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)-t4ddg_3(1,0,0,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,0,0,1)");
-  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)-t4ddg_3(1,0,0,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,0,0,2)");
-  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)-t4ddg_3(1,0,1,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,0,1,0)");
-  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)-t4ddg_3(1,0,1,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,0,1,1)");
-  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)-t4ddg_3(1,0,1,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,0,1,2)");
-  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)-t4ddg_3(1,0,2,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,0,2,0)");
-  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)-t4ddg_3(1,0,2,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,0,2,1)");
-  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)-t4ddg_3(1,0,2,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,0,2,2)");
-  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)-t4ddg_3(1,1,0,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,1,0,0)");
-  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)-t4ddg_3(1,1,0,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,1,0,1)");
-  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)-t4ddg_3(1,1,0,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,1,0,2)");
-  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)-t4ddg_3(1,1,1,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)-t4ddg_3(1,1,1,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,1,1,1)");
-  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)-t4ddg_3(1,1,1,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,1,1,2)");
-  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)-t4ddg_3(1,1,2,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,1,2,0)");
-  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)-t4ddg_3(1,1,2,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,1,2,1)");
-  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)-t4ddg_3(1,1,2,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,1,2,2)");
-  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)-t4ddg_3(1,2,0,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,2,0,0)");
-  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)-t4ddg_3(1,2,0,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,2,0,1)");
-  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)-t4ddg_3(1,2,0,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,2,0,2)");
-  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)-t4ddg_3(1,2,1,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,2,1,0)");
-  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)-t4ddg_3(1,2,1,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,2,1,1)");
-  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)-t4ddg_3(1,2,1,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,2,1,2)");
-  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)-t4ddg_3(1,2,2,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,2,2,0)");
-  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)-t4ddg_3(1,2,2,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,2,2,1)");
-  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)-t4ddg_3(1,2,2,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,2,2,2)");
-  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)-t4ddg_3(2,0,0,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,0,0,0)");
-  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)-t4ddg_3(2,0,0,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,0,0,1)");
-  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)-t4ddg_3(2,0,0,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,0,0,2)");
-  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)-t4ddg_3(2,0,1,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,0,1,0)");
-  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)-t4ddg_3(2,0,1,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,0,1,1)");
-  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)-t4ddg_3(2,0,1,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,0,1,2)");
-  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)-t4ddg_3(2,0,2,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,0,2,0)");
-  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)-t4ddg_3(2,0,2,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,0,2,1)");
-  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)-t4ddg_3(2,0,2,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,0,2,2)");
-  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)-t4ddg_3(2,1,0,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,1,0,0)");
-  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)-t4ddg_3(2,1,0,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,1,0,1)");
-  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)-t4ddg_3(2,1,0,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,1,0,2)");
-  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)-t4ddg_3(2,1,1,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,1,1,0)");
-  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)-t4ddg_3(2,1,1,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,1,1,1)");
-  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)-t4ddg_3(2,1,1,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,1,1,2)");
-  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)-t4ddg_3(2,1,2,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,1,2,0)");
-  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)-t4ddg_3(2,1,2,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,1,2,1)");
-  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)-t4ddg_3(2,1,2,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,1,2,2)");
-  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)-t4ddg_3(2,2,0,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,2,0,0)");
-  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)-t4ddg_3(2,2,0,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,2,0,1)");
-  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)-t4ddg_3(2,2,0,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,2,0,2)");
-  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)-t4ddg_3(2,2,1,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,2,1,0)");
-  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)-t4ddg_3(2,2,1,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,2,1,1)");
-  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)-t4ddg_3(2,2,1,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,2,1,2)");
-  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)-t4ddg_3(2,2,2,0))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,2,2,0)");
-  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)-t4ddg_3(2,2,2,1))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)-t4ddg_3(2,2,2,2))
-		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,2,2,2)");
-
-  t4ddg_2(i,k,j,l)=t2s_2(i,k)*t2s_2(j,l);
-  t4ddg_3(i,l,j,k)=t2s_2(i,l)*t2s_2(j,k);
-  t4ddg_1(i,j,k,l)=(t4ddg_2(i,k,j,l) || t4ddg_3(i,l,j,k));
-  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)+t4ddg_3(0,0,0,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,0,0,0)");
-  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)+t4ddg_3(0,1,0,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,0,0,1)");
-  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)+t4ddg_3(0,2,0,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,0,0,2)");
-  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,0,1,0)+t4ddg_3(0,0,1,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,0,1,0)");
-  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,0,1,1)+t4ddg_3(0,1,1,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,0,1,1)");
-  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,0,1,2)+t4ddg_3(0,2,1,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,0,1,2)");
-  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,0,2,0)+t4ddg_3(0,0,2,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,0,2,0)");
-  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,0,2,1)+t4ddg_3(0,1,2,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,0,2,1)");
-  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,0,2,2)+t4ddg_3(0,2,2,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,0,2,2)");
-  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,1,0,0)+t4ddg_3(0,0,0,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,1,0,0)");
-  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,1,0,1)+t4ddg_3(0,1,0,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,1,0,1)");
-  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,1,0,2)+t4ddg_3(0,2,0,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,1,0,2)");
-  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)+t4ddg_3(0,0,1,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,1,1,0)");
-  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)+t4ddg_3(0,1,1,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,1,1,1)");
-  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)+t4ddg_3(0,2,1,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,1,1,2)");
-  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,1,2,0)+t4ddg_3(0,0,2,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,1,2,0)");
-  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,1,2,1)+t4ddg_3(0,1,2,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,1,2,1)");
-  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,1,2,2)+t4ddg_3(0,2,2,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,1,2,2)");
-  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,2,0,0)+t4ddg_3(0,0,0,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,2,0,0)");
-  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,2,0,1)+t4ddg_3(0,1,0,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,2,0,1)");
-  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,2,0,2)+t4ddg_3(0,2,0,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,2,0,2)");
-  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,2,1,0)+t4ddg_3(0,0,1,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,2,1,0)");
-  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,2,1,1)+t4ddg_3(0,1,1,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,2,1,1)");
-  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,2,1,2)+t4ddg_3(0,2,1,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,2,1,2)");
-  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)+t4ddg_3(0,0,2,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,2,2,0)");
-  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)+t4ddg_3(0,1,2,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,2,2,1)");
-  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)+t4ddg_3(0,2,2,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,2,2,2)");
-  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)+t4ddg_3(1,0,0,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,0,0,0)");
-  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)+t4ddg_3(1,1,0,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,0,0,1)");
-  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)+t4ddg_3(1,2,0,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,0,0,2)");
-  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,0,1,0)+t4ddg_3(1,0,1,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,0,1,0)");
-  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,0,1,1)+t4ddg_3(1,1,1,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,0,1,1)");
-  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,0,1,2)+t4ddg_3(1,2,1,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,0,1,2)");
-  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,0,2,0)+t4ddg_3(1,0,2,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,0,2,0)");
-  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,0,2,1)+t4ddg_3(1,1,2,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,0,2,1)");
-  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,0,2,2)+t4ddg_3(1,2,2,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,0,2,2)");
-  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,1,0,0)+t4ddg_3(1,0,0,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,1,0,0)");
-  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,1,0,1)+t4ddg_3(1,1,0,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,1,0,1)");
-  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,1,0,2)+t4ddg_3(1,2,0,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,1,0,2)");
-  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)+t4ddg_3(1,0,1,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)+t4ddg_3(1,1,1,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,1,1,1)");
-  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)+t4ddg_3(1,2,1,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,1,1,2)");
-  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,1,2,0)+t4ddg_3(1,0,2,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,1,2,0)");
-  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,1,2,1)+t4ddg_3(1,1,2,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,1,2,1)");
-  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,1,2,2)+t4ddg_3(1,2,2,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,1,2,2)");
-  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,2,0,0)+t4ddg_3(1,0,0,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,2,0,0)");
-  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,2,0,1)+t4ddg_3(1,1,0,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,2,0,1)");
-  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,2,0,2)+t4ddg_3(1,2,0,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,2,0,2)");
-  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,2,1,0)+t4ddg_3(1,0,1,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,2,1,0)");
-  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,2,1,1)+t4ddg_3(1,1,1,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,2,1,1)");
-  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,2,1,2)+t4ddg_3(1,2,1,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,2,1,2)");
-  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)+t4ddg_3(1,0,2,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,2,2,0)");
-  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)+t4ddg_3(1,1,2,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,2,2,1)");
-  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)+t4ddg_3(1,2,2,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,2,2,2)");
-  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)+t4ddg_3(2,0,0,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,0,0,0)");
-  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)+t4ddg_3(2,1,0,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,0,0,1)");
-  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)+t4ddg_3(2,2,0,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,0,0,2)");
-  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,0,1,0)+t4ddg_3(2,0,1,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,0,1,0)");
-  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,0,1,1)+t4ddg_3(2,1,1,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,0,1,1)");
-  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,0,1,2)+t4ddg_3(2,2,1,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,0,1,2)");
-  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,0,2,0)+t4ddg_3(2,0,2,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,0,2,0)");
-  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,0,2,1)+t4ddg_3(2,1,2,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,0,2,1)");
-  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,0,2,2)+t4ddg_3(2,2,2,0))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,0,2,2)");
-  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,1,0,0)+t4ddg_3(2,0,0,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,1,0,0)");
-  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,1,0,1)+t4ddg_3(2,1,0,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,1,0,1)");
-  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,1,0,2)+t4ddg_3(2,2,0,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,1,0,2)");
-  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)+t4ddg_3(2,0,1,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,1,1,0)");
-  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)+t4ddg_3(2,1,1,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,1,1,1)");
-  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)+t4ddg_3(2,2,1,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,1,1,2)");
-  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,1,2,0)+t4ddg_3(2,0,2,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,1,2,0)");
-  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,1,2,1)+t4ddg_3(2,1,2,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,1,2,1)");
-  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,1,2,2)+t4ddg_3(2,2,2,1))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,1,2,2)");
-  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,2,0,0)+t4ddg_3(2,0,0,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,2,0,0)");
-  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,2,0,1)+t4ddg_3(2,1,0,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,2,0,1)");
-  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,2,0,2)+t4ddg_3(2,2,0,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,2,0,2)");
-  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,2,1,0)+t4ddg_3(2,0,1,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,2,1,0)");
-  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,2,1,1)+t4ddg_3(2,1,1,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,2,1,1)");
-  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,2,1,2)+t4ddg_3(2,2,1,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,2,1,2)");
-  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)+t4ddg_3(2,0,2,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,2,2,0)");
-  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)+t4ddg_3(2,1,2,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)+t4ddg_3(2,2,2,2))
-		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,2,2,2)");
-
-  cout << endl;
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T4ddg/test_T4ddg.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T4ddg/test_T4ddg.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,1272 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T4ddg(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+		Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+		Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+		const Tensor2<double,3,3> &t2_3,
+		Tensor2_symmetric<double,3> &t2s_1,
+		const Tensor2_symmetric<double,3> &t2s_2,
+		const Tensor2_symmetric<double,3> &t2s_3,
+		Tensor3_dg<double,3,3> &t3dg_1,
+		const Tensor3_dg<double,3,3> &t3dg_2,
+		const Tensor3_dg<double,3,3> &t3dg_3,
+		Tensor3_christof<double,3,3> &t3ch_1,
+		const Tensor3_christof<double,3,3> &t3ch_2,
+		const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  Tensor4_ddg<double,3,3> t4ddg_1, t4ddg_2, t4ddg_3;
+
+  t4ddg_1(i,j,l,m)=t3dg_2(i,j,k)*t3dg_3(l,m,k);
+  test_for_zero(t4ddg_1(0,0,0,0) - (t3dg_2(0,0,0)*t3dg_3(0,0,0)
+				    + t3dg_2(0,0,1)*t3dg_3(0,0,1)
+				    + t3dg_2(0,0,2)*t3dg_3(0,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,0,0,0)");
+  test_for_zero(t4ddg_1(0,0,0,1) - (t3dg_2(0,0,0)*t3dg_3(0,1,0)
+				    + t3dg_2(0,0,1)*t3dg_3(0,1,1)
+				    + t3dg_2(0,0,2)*t3dg_3(0,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,0,0,1)");
+  test_for_zero(t4ddg_1(0,0,0,2) - (t3dg_2(0,0,0)*t3dg_3(0,2,0)
+				    + t3dg_2(0,0,1)*t3dg_3(0,2,1)
+				    + t3dg_2(0,0,2)*t3dg_3(0,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,0,0,2)");
+  test_for_zero(t4ddg_1(0,0,1,0) - (t3dg_2(0,0,0)*t3dg_3(1,0,0)
+				    + t3dg_2(0,0,1)*t3dg_3(1,0,1)
+				    + t3dg_2(0,0,2)*t3dg_3(1,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,0,1,0)");
+  test_for_zero(t4ddg_1(0,0,1,1) - (t3dg_2(0,0,0)*t3dg_3(1,1,0)
+				    + t3dg_2(0,0,1)*t3dg_3(1,1,1)
+				    + t3dg_2(0,0,2)*t3dg_3(1,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,0,1,1)");
+  test_for_zero(t4ddg_1(0,0,1,2) - (t3dg_2(0,0,0)*t3dg_3(1,2,0)
+				    + t3dg_2(0,0,1)*t3dg_3(1,2,1)
+				    + t3dg_2(0,0,2)*t3dg_3(1,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,0,1,2)");
+  test_for_zero(t4ddg_1(0,0,2,0) - (t3dg_2(0,0,0)*t3dg_3(2,0,0)
+				    + t3dg_2(0,0,1)*t3dg_3(2,0,1)
+				    + t3dg_2(0,0,2)*t3dg_3(2,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,0,2,0)");
+  test_for_zero(t4ddg_1(0,0,2,1) - (t3dg_2(0,0,0)*t3dg_3(2,1,0)
+				    + t3dg_2(0,0,1)*t3dg_3(2,1,1)
+				    + t3dg_2(0,0,2)*t3dg_3(2,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,0,2,1)");
+  test_for_zero(t4ddg_1(0,0,2,2) - (t3dg_2(0,0,0)*t3dg_3(2,2,0)
+				    + t3dg_2(0,0,1)*t3dg_3(2,2,1)
+				    + t3dg_2(0,0,2)*t3dg_3(2,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,0,2,2)");
+  test_for_zero(t4ddg_1(0,1,0,0) - (t3dg_2(0,1,0)*t3dg_3(0,0,0)
+				    + t3dg_2(0,1,1)*t3dg_3(0,0,1)
+				    + t3dg_2(0,1,2)*t3dg_3(0,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,1,0,0)");
+  test_for_zero(t4ddg_1(0,1,0,1) - (t3dg_2(0,1,0)*t3dg_3(0,1,0)
+				    + t3dg_2(0,1,1)*t3dg_3(0,1,1)
+				    + t3dg_2(0,1,2)*t3dg_3(0,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,1,0,1)");
+  test_for_zero(t4ddg_1(0,1,0,2) - (t3dg_2(0,1,0)*t3dg_3(0,2,0)
+				    + t3dg_2(0,1,1)*t3dg_3(0,2,1)
+				    + t3dg_2(0,1,2)*t3dg_3(0,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,1,0,2)");
+  test_for_zero(t4ddg_1(0,1,1,0) - (t3dg_2(0,1,0)*t3dg_3(1,0,0)
+				    + t3dg_2(0,1,1)*t3dg_3(1,0,1)
+				    + t3dg_2(0,1,2)*t3dg_3(1,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,1,1,0)");
+  test_for_zero(t4ddg_1(0,1,1,1) - (t3dg_2(0,1,0)*t3dg_3(1,1,0)
+				    + t3dg_2(0,1,1)*t3dg_3(1,1,1)
+				    + t3dg_2(0,1,2)*t3dg_3(1,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,1,1,1)");
+  test_for_zero(t4ddg_1(0,1,1,2) - (t3dg_2(0,1,0)*t3dg_3(1,2,0)
+				    + t3dg_2(0,1,1)*t3dg_3(1,2,1)
+				    + t3dg_2(0,1,2)*t3dg_3(1,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,1,1,2)");
+  test_for_zero(t4ddg_1(0,1,2,0) - (t3dg_2(0,1,0)*t3dg_3(2,0,0)
+				    + t3dg_2(0,1,1)*t3dg_3(2,0,1)
+				    + t3dg_2(0,1,2)*t3dg_3(2,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,1,2,0)");
+  test_for_zero(t4ddg_1(0,1,2,1) - (t3dg_2(0,1,0)*t3dg_3(2,1,0)
+				    + t3dg_2(0,1,1)*t3dg_3(2,1,1)
+				    + t3dg_2(0,1,2)*t3dg_3(2,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,1,2,1)");
+  test_for_zero(t4ddg_1(0,1,2,2) - (t3dg_2(0,1,0)*t3dg_3(2,2,0)
+				    + t3dg_2(0,1,1)*t3dg_3(2,2,1)
+				    + t3dg_2(0,1,2)*t3dg_3(2,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,1,2,2)");
+  test_for_zero(t4ddg_1(0,2,0,0) - (t3dg_2(0,2,0)*t3dg_3(0,0,0)
+				    + t3dg_2(0,2,1)*t3dg_3(0,0,1)
+				    + t3dg_2(0,2,2)*t3dg_3(0,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,2,0,0)");
+  test_for_zero(t4ddg_1(0,2,0,1) - (t3dg_2(0,2,0)*t3dg_3(0,1,0)
+				    + t3dg_2(0,2,1)*t3dg_3(0,1,1)
+				    + t3dg_2(0,2,2)*t3dg_3(0,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,2,0,1)");
+  test_for_zero(t4ddg_1(0,2,0,2) - (t3dg_2(0,2,0)*t3dg_3(0,2,0)
+				    + t3dg_2(0,2,1)*t3dg_3(0,2,1)
+				    + t3dg_2(0,2,2)*t3dg_3(0,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,2,0,2)");
+  test_for_zero(t4ddg_1(0,2,1,0) - (t3dg_2(0,2,0)*t3dg_3(1,0,0)
+				    + t3dg_2(0,2,1)*t3dg_3(1,0,1)
+				    + t3dg_2(0,2,2)*t3dg_3(1,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,2,1,0)");
+  test_for_zero(t4ddg_1(0,2,1,1) - (t3dg_2(0,2,0)*t3dg_3(1,1,0)
+				    + t3dg_2(0,2,1)*t3dg_3(1,1,1)
+				    + t3dg_2(0,2,2)*t3dg_3(1,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,2,1,1)");
+  test_for_zero(t4ddg_1(0,2,1,2) - (t3dg_2(0,2,0)*t3dg_3(1,2,0)
+				    + t3dg_2(0,2,1)*t3dg_3(1,2,1)
+				    + t3dg_2(0,2,2)*t3dg_3(1,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,2,1,2)");
+  test_for_zero(t4ddg_1(0,2,2,0) - (t3dg_2(0,2,0)*t3dg_3(2,0,0)
+				    + t3dg_2(0,2,1)*t3dg_3(2,0,1)
+				    + t3dg_2(0,2,2)*t3dg_3(2,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,2,2,0)");
+  test_for_zero(t4ddg_1(0,2,2,1) - (t3dg_2(0,2,0)*t3dg_3(2,1,0)
+				    + t3dg_2(0,2,1)*t3dg_3(2,1,1)
+				    + t3dg_2(0,2,2)*t3dg_3(2,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,2,2,1)");
+  test_for_zero(t4ddg_1(0,2,2,2) - (t3dg_2(0,2,0)*t3dg_3(2,2,0)
+				    + t3dg_2(0,2,1)*t3dg_3(2,2,1)
+				    + t3dg_2(0,2,2)*t3dg_3(2,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(0,2,2,2)");
+  test_for_zero(t4ddg_1(1,0,0,0) - (t3dg_2(1,0,0)*t3dg_3(0,0,0)
+				    + t3dg_2(1,0,1)*t3dg_3(0,0,1)
+				    + t3dg_2(1,0,2)*t3dg_3(0,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,0,0,0)");
+  test_for_zero(t4ddg_1(1,0,0,1) - (t3dg_2(1,0,0)*t3dg_3(0,1,0)
+				    + t3dg_2(1,0,1)*t3dg_3(0,1,1)
+				    + t3dg_2(1,0,2)*t3dg_3(0,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,0,0,1)");
+  test_for_zero(t4ddg_1(1,0,0,2) - (t3dg_2(1,0,0)*t3dg_3(0,2,0)
+				    + t3dg_2(1,0,1)*t3dg_3(0,2,1)
+				    + t3dg_2(1,0,2)*t3dg_3(0,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,0,0,2)");
+  test_for_zero(t4ddg_1(1,0,1,0) - (t3dg_2(1,0,0)*t3dg_3(1,0,0)
+				    + t3dg_2(1,0,1)*t3dg_3(1,0,1)
+				    + t3dg_2(1,0,2)*t3dg_3(1,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,0,1,0)");
+  test_for_zero(t4ddg_1(1,0,1,1) - (t3dg_2(1,0,0)*t3dg_3(1,1,0)
+				    + t3dg_2(1,0,1)*t3dg_3(1,1,1)
+				    + t3dg_2(1,0,2)*t3dg_3(1,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,0,1,1)");
+  test_for_zero(t4ddg_1(1,0,1,2) - (t3dg_2(1,0,0)*t3dg_3(1,2,0)
+				    + t3dg_2(1,0,1)*t3dg_3(1,2,1)
+				    + t3dg_2(1,0,2)*t3dg_3(1,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,0,1,2)");
+  test_for_zero(t4ddg_1(1,0,2,0) - (t3dg_2(1,0,0)*t3dg_3(2,0,0)
+				    + t3dg_2(1,0,1)*t3dg_3(2,0,1)
+				    + t3dg_2(1,0,2)*t3dg_3(2,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,0,2,0)");
+  test_for_zero(t4ddg_1(1,0,2,1) - (t3dg_2(1,0,0)*t3dg_3(2,1,0)
+				    + t3dg_2(1,0,1)*t3dg_3(2,1,1)
+				    + t3dg_2(1,0,2)*t3dg_3(2,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,0,2,1)");
+  test_for_zero(t4ddg_1(1,0,2,2) - (t3dg_2(1,0,0)*t3dg_3(2,2,0)
+				    + t3dg_2(1,0,1)*t3dg_3(2,2,1)
+				    + t3dg_2(1,0,2)*t3dg_3(2,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,0,2,2)");
+  test_for_zero(t4ddg_1(1,1,0,0) - (t3dg_2(1,1,0)*t3dg_3(0,0,0)
+				    + t3dg_2(1,1,1)*t3dg_3(0,0,1)
+				    + t3dg_2(1,1,2)*t3dg_3(0,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,1,0,0)");
+  test_for_zero(t4ddg_1(1,1,0,1) - (t3dg_2(1,1,0)*t3dg_3(0,1,0)
+				    + t3dg_2(1,1,1)*t3dg_3(0,1,1)
+				    + t3dg_2(1,1,2)*t3dg_3(0,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,1,0,1)");
+  test_for_zero(t4ddg_1(1,1,0,2) - (t3dg_2(1,1,0)*t3dg_3(0,2,0)
+				    + t3dg_2(1,1,1)*t3dg_3(0,2,1)
+				    + t3dg_2(1,1,2)*t3dg_3(0,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,1,0,2)");
+  test_for_zero(t4ddg_1(1,1,1,0) - (t3dg_2(1,1,0)*t3dg_3(1,0,0)
+				    + t3dg_2(1,1,1)*t3dg_3(1,0,1)
+				    + t3dg_2(1,1,2)*t3dg_3(1,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,1) - (t3dg_2(1,1,0)*t3dg_3(1,1,0)
+				    + t3dg_2(1,1,1)*t3dg_3(1,1,1)
+				    + t3dg_2(1,1,2)*t3dg_3(1,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,1,1,1)");
+  test_for_zero(t4ddg_1(1,1,1,2) - (t3dg_2(1,1,0)*t3dg_3(1,2,0)
+				    + t3dg_2(1,1,1)*t3dg_3(1,2,1)
+				    + t3dg_2(1,1,2)*t3dg_3(1,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,1,1,2)");
+  test_for_zero(t4ddg_1(1,1,2,0) - (t3dg_2(1,1,0)*t3dg_3(2,0,0)
+				    + t3dg_2(1,1,1)*t3dg_3(2,0,1)
+				    + t3dg_2(1,1,2)*t3dg_3(2,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,1,2,0)");
+  test_for_zero(t4ddg_1(1,1,2,1) - (t3dg_2(1,1,0)*t3dg_3(2,1,0)
+				    + t3dg_2(1,1,1)*t3dg_3(2,1,1)
+				    + t3dg_2(1,1,2)*t3dg_3(2,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,1,2,1)");
+  test_for_zero(t4ddg_1(1,1,2,2) - (t3dg_2(1,1,0)*t3dg_3(2,2,0)
+				    + t3dg_2(1,1,1)*t3dg_3(2,2,1)
+				    + t3dg_2(1,1,2)*t3dg_3(2,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,1,2,2)");
+  test_for_zero(t4ddg_1(1,2,0,0) - (t3dg_2(1,2,0)*t3dg_3(0,0,0)
+				    + t3dg_2(1,2,1)*t3dg_3(0,0,1)
+				    + t3dg_2(1,2,2)*t3dg_3(0,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,2,0,0)");
+  test_for_zero(t4ddg_1(1,2,0,1) - (t3dg_2(1,2,0)*t3dg_3(0,1,0)
+				    + t3dg_2(1,2,1)*t3dg_3(0,1,1)
+				    + t3dg_2(1,2,2)*t3dg_3(0,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,2,0,1)");
+  test_for_zero(t4ddg_1(1,2,0,2) - (t3dg_2(1,2,0)*t3dg_3(0,2,0)
+				    + t3dg_2(1,2,1)*t3dg_3(0,2,1)
+				    + t3dg_2(1,2,2)*t3dg_3(0,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,2,0,2)");
+  test_for_zero(t4ddg_1(1,2,1,0) - (t3dg_2(1,2,0)*t3dg_3(1,0,0)
+				    + t3dg_2(1,2,1)*t3dg_3(1,0,1)
+				    + t3dg_2(1,2,2)*t3dg_3(1,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,2,1,0)");
+  test_for_zero(t4ddg_1(1,2,1,1) - (t3dg_2(1,2,0)*t3dg_3(1,1,0)
+				    + t3dg_2(1,2,1)*t3dg_3(1,1,1)
+				    + t3dg_2(1,2,2)*t3dg_3(1,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,2,1,1)");
+  test_for_zero(t4ddg_1(1,2,1,2) - (t3dg_2(1,2,0)*t3dg_3(1,2,0)
+				    + t3dg_2(1,2,1)*t3dg_3(1,2,1)
+				    + t3dg_2(1,2,2)*t3dg_3(1,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,2,1,2)");
+  test_for_zero(t4ddg_1(1,2,2,0) - (t3dg_2(1,2,0)*t3dg_3(2,0,0)
+				    + t3dg_2(1,2,1)*t3dg_3(2,0,1)
+				    + t3dg_2(1,2,2)*t3dg_3(2,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,2,2,0)");
+  test_for_zero(t4ddg_1(1,2,2,1) - (t3dg_2(1,2,0)*t3dg_3(2,1,0)
+				    + t3dg_2(1,2,1)*t3dg_3(2,1,1)
+				    + t3dg_2(1,2,2)*t3dg_3(2,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,2,2,1)");
+  test_for_zero(t4ddg_1(1,2,2,2) - (t3dg_2(1,2,0)*t3dg_3(2,2,0)
+				    + t3dg_2(1,2,1)*t3dg_3(2,2,1)
+				    + t3dg_2(1,2,2)*t3dg_3(2,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(1,2,2,2)");
+  test_for_zero(t4ddg_1(2,0,0,0) - (t3dg_2(2,0,0)*t3dg_3(0,0,0)
+				    + t3dg_2(2,0,1)*t3dg_3(0,0,1)
+				    + t3dg_2(2,0,2)*t3dg_3(0,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,0,0,0)");
+  test_for_zero(t4ddg_1(2,0,0,1) - (t3dg_2(2,0,0)*t3dg_3(0,1,0)
+				    + t3dg_2(2,0,1)*t3dg_3(0,1,1)
+				    + t3dg_2(2,0,2)*t3dg_3(0,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,0,0,1)");
+  test_for_zero(t4ddg_1(2,0,0,2) - (t3dg_2(2,0,0)*t3dg_3(0,2,0)
+				    + t3dg_2(2,0,1)*t3dg_3(0,2,1)
+				    + t3dg_2(2,0,2)*t3dg_3(0,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,0,0,2)");
+  test_for_zero(t4ddg_1(2,0,1,0) - (t3dg_2(2,0,0)*t3dg_3(1,0,0)
+				    + t3dg_2(2,0,1)*t3dg_3(1,0,1)
+				    + t3dg_2(2,0,2)*t3dg_3(1,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,0,1,0)");
+  test_for_zero(t4ddg_1(2,0,1,1) - (t3dg_2(2,0,0)*t3dg_3(1,1,0)
+				    + t3dg_2(2,0,1)*t3dg_3(1,1,1)
+				    + t3dg_2(2,0,2)*t3dg_3(1,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,0,1,1)");
+  test_for_zero(t4ddg_1(2,0,1,2) - (t3dg_2(2,0,0)*t3dg_3(1,2,0)
+				    + t3dg_2(2,0,1)*t3dg_3(1,2,1)
+				    + t3dg_2(2,0,2)*t3dg_3(1,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,0,1,2)");
+  test_for_zero(t4ddg_1(2,0,2,0) - (t3dg_2(2,0,0)*t3dg_3(2,0,0)
+				    + t3dg_2(2,0,1)*t3dg_3(2,0,1)
+				    + t3dg_2(2,0,2)*t3dg_3(2,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,0,2,0)");
+  test_for_zero(t4ddg_1(2,0,2,1) - (t3dg_2(2,0,0)*t3dg_3(2,1,0)
+				    + t3dg_2(2,0,1)*t3dg_3(2,1,1)
+				    + t3dg_2(2,0,2)*t3dg_3(2,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,0,2,1)");
+  test_for_zero(t4ddg_1(2,0,2,2) - (t3dg_2(2,0,0)*t3dg_3(2,2,0)
+				    + t3dg_2(2,0,1)*t3dg_3(2,2,1)
+				    + t3dg_2(2,0,2)*t3dg_3(2,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,0,2,2)");
+  test_for_zero(t4ddg_1(2,1,0,0) - (t3dg_2(2,1,0)*t3dg_3(0,0,0)
+				    + t3dg_2(2,1,1)*t3dg_3(0,0,1)
+				    + t3dg_2(2,1,2)*t3dg_3(0,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,1,0,0)");
+  test_for_zero(t4ddg_1(2,1,0,1) - (t3dg_2(2,1,0)*t3dg_3(0,1,0)
+				    + t3dg_2(2,1,1)*t3dg_3(0,1,1)
+				    + t3dg_2(2,1,2)*t3dg_3(0,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,1,0,1)");
+  test_for_zero(t4ddg_1(2,1,0,2) - (t3dg_2(2,1,0)*t3dg_3(0,2,0)
+				    + t3dg_2(2,1,1)*t3dg_3(0,2,1)
+				    + t3dg_2(2,1,2)*t3dg_3(0,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,1,0,2)");
+  test_for_zero(t4ddg_1(2,1,1,0) - (t3dg_2(2,1,0)*t3dg_3(1,0,0)
+				    + t3dg_2(2,1,1)*t3dg_3(1,0,1)
+				    + t3dg_2(2,1,2)*t3dg_3(1,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,1,1,0)");
+  test_for_zero(t4ddg_1(2,1,1,1) - (t3dg_2(2,1,0)*t3dg_3(1,1,0)
+				    + t3dg_2(2,1,1)*t3dg_3(1,1,1)
+				    + t3dg_2(2,1,2)*t3dg_3(1,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,1,1,1)");
+  test_for_zero(t4ddg_1(2,1,1,2) - (t3dg_2(2,1,0)*t3dg_3(1,2,0)
+				    + t3dg_2(2,1,1)*t3dg_3(1,2,1)
+				    + t3dg_2(2,1,2)*t3dg_3(1,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,1,1,2)");
+  test_for_zero(t4ddg_1(2,1,2,0) - (t3dg_2(2,1,0)*t3dg_3(2,0,0)
+				    + t3dg_2(2,1,1)*t3dg_3(2,0,1)
+				    + t3dg_2(2,1,2)*t3dg_3(2,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,1,2,0)");
+  test_for_zero(t4ddg_1(2,1,2,1) - (t3dg_2(2,1,0)*t3dg_3(2,1,0)
+				    + t3dg_2(2,1,1)*t3dg_3(2,1,1)
+				    + t3dg_2(2,1,2)*t3dg_3(2,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,1,2,1)");
+  test_for_zero(t4ddg_1(2,1,2,2) - (t3dg_2(2,1,0)*t3dg_3(2,2,0)
+				    + t3dg_2(2,1,1)*t3dg_3(2,2,1)
+				    + t3dg_2(2,1,2)*t3dg_3(2,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,1,2,2)");
+  test_for_zero(t4ddg_1(2,2,0,0) - (t3dg_2(2,2,0)*t3dg_3(0,0,0)
+				    + t3dg_2(2,2,1)*t3dg_3(0,0,1)
+				    + t3dg_2(2,2,2)*t3dg_3(0,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,2,0,0)");
+  test_for_zero(t4ddg_1(2,2,0,1) - (t3dg_2(2,2,0)*t3dg_3(0,1,0)
+				    + t3dg_2(2,2,1)*t3dg_3(0,1,1)
+				    + t3dg_2(2,2,2)*t3dg_3(0,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,2,0,1)");
+  test_for_zero(t4ddg_1(2,2,0,2) - (t3dg_2(2,2,0)*t3dg_3(0,2,0)
+				    + t3dg_2(2,2,1)*t3dg_3(0,2,1)
+				    + t3dg_2(2,2,2)*t3dg_3(0,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,2,0,2)");
+  test_for_zero(t4ddg_1(2,2,1,0) - (t3dg_2(2,2,0)*t3dg_3(1,0,0)
+				    + t3dg_2(2,2,1)*t3dg_3(1,0,1)
+				    + t3dg_2(2,2,2)*t3dg_3(1,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,2,1,0)");
+  test_for_zero(t4ddg_1(2,2,1,1) - (t3dg_2(2,2,0)*t3dg_3(1,1,0)
+				    + t3dg_2(2,2,1)*t3dg_3(1,1,1)
+				    + t3dg_2(2,2,2)*t3dg_3(1,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,2,1,1)");
+  test_for_zero(t4ddg_1(2,2,1,2) - (t3dg_2(2,2,0)*t3dg_3(1,2,0)
+				    + t3dg_2(2,2,1)*t3dg_3(1,2,1)
+				    + t3dg_2(2,2,2)*t3dg_3(1,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,2,1,2)");
+  test_for_zero(t4ddg_1(2,2,2,0) - (t3dg_2(2,2,0)*t3dg_3(2,0,0)
+				    + t3dg_2(2,2,1)*t3dg_3(2,0,1)
+				    + t3dg_2(2,2,2)*t3dg_3(2,0,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,2,2,0)");
+  test_for_zero(t4ddg_1(2,2,2,1) - (t3dg_2(2,2,0)*t3dg_3(2,1,0)
+				    + t3dg_2(2,2,1)*t3dg_3(2,1,1)
+				    + t3dg_2(2,2,2)*t3dg_3(2,1,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,2) - (t3dg_2(2,2,0)*t3dg_3(2,2,0)
+				    + t3dg_2(2,2,1)*t3dg_3(2,2,1)
+				    + t3dg_2(2,2,2)*t3dg_3(2,2,2))
+		,"T3dg(i,j,k)*T3dg(l,m,k)(2,2,2,2)");
+
+  t4ddg_2(i,j,l,m)=t2s_2(i,j)*t2s_3(l,m);
+  t4ddg_3(i,j,l,m)=t2s_3(i,j)*t2s_2(l,m);
+  test_for_zero(t4ddg_2(0,0,0,0) - (t2s_2(0,0)*t2s_3(0,0))
+		,"T2s(i,j)*T2s(l,m)(0,0,0,0)");
+  test_for_zero(t4ddg_2(0,0,0,1) - (t2s_2(0,0)*t2s_3(0,1))
+		,"T2s(i,j)*T2s(l,m)(0,0,0,1)");
+  test_for_zero(t4ddg_2(0,0,0,2) - (t2s_2(0,0)*t2s_3(0,2))
+		,"T2s(i,j)*T2s(l,m)(0,0,0,2)");
+  test_for_zero(t4ddg_2(0,0,1,0) - (t2s_2(0,0)*t2s_3(1,0))
+		,"T2s(i,j)*T2s(l,m)(0,0,1,0)");
+  test_for_zero(t4ddg_2(0,0,1,1) - (t2s_2(0,0)*t2s_3(1,1))
+		,"T2s(i,j)*T2s(l,m)(0,0,1,1)");
+  test_for_zero(t4ddg_2(0,0,1,2) - (t2s_2(0,0)*t2s_3(1,2))
+		,"T2s(i,j)*T2s(l,m)(0,0,1,2)");
+  test_for_zero(t4ddg_2(0,0,2,0) - (t2s_2(0,0)*t2s_3(2,0))
+		,"T2s(i,j)*T2s(l,m)(0,0,2,0)");
+  test_for_zero(t4ddg_2(0,0,2,1) - (t2s_2(0,0)*t2s_3(2,1))
+		,"T2s(i,j)*T2s(l,m)(0,0,2,1)");
+  test_for_zero(t4ddg_2(0,0,2,2) - (t2s_2(0,0)*t2s_3(2,2))
+		,"T2s(i,j)*T2s(l,m)(0,0,2,2)");
+  test_for_zero(t4ddg_2(0,1,0,0) - (t2s_2(0,1)*t2s_3(0,0))
+		,"T2s(i,j)*T2s(l,m)(0,1,0,0)");
+  test_for_zero(t4ddg_2(0,1,0,1) - (t2s_2(0,1)*t2s_3(0,1))
+		,"T2s(i,j)*T2s(l,m)(0,1,0,1)");
+  test_for_zero(t4ddg_2(0,1,0,2) - (t2s_2(0,1)*t2s_3(0,2))
+		,"T2s(i,j)*T2s(l,m)(0,1,0,2)");
+  test_for_zero(t4ddg_2(0,1,1,0) - (t2s_2(0,1)*t2s_3(1,0))
+		,"T2s(i,j)*T2s(l,m)(0,1,1,0)");
+  test_for_zero(t4ddg_2(0,1,1,1) - (t2s_2(0,1)*t2s_3(1,1))
+		,"T2s(i,j)*T2s(l,m)(0,1,1,1)");
+  test_for_zero(t4ddg_2(0,1,1,2) - (t2s_2(0,1)*t2s_3(1,2))
+		,"T2s(i,j)*T2s(l,m)(0,1,1,2)");
+  test_for_zero(t4ddg_2(0,1,2,0) - (t2s_2(0,1)*t2s_3(2,0))
+		,"T2s(i,j)*T2s(l,m)(0,1,2,0)");
+  test_for_zero(t4ddg_2(0,1,2,1) - (t2s_2(0,1)*t2s_3(2,1))
+		,"T2s(i,j)*T2s(l,m)(0,1,2,1)");
+  test_for_zero(t4ddg_2(0,1,2,2) - (t2s_2(0,1)*t2s_3(2,2))
+		,"T2s(i,j)*T2s(l,m)(0,1,2,2)");
+  test_for_zero(t4ddg_2(0,2,0,0) - (t2s_2(0,2)*t2s_3(0,0))
+		,"T2s(i,j)*T2s(l,m)(0,2,0,0)");
+  test_for_zero(t4ddg_2(0,2,0,1) - (t2s_2(0,2)*t2s_3(0,1))
+		,"T2s(i,j)*T2s(l,m)(0,2,0,1)");
+  test_for_zero(t4ddg_2(0,2,0,2) - (t2s_2(0,2)*t2s_3(0,2))
+		,"T2s(i,j)*T2s(l,m)(0,2,0,2)");
+  test_for_zero(t4ddg_2(0,2,1,0) - (t2s_2(0,2)*t2s_3(1,0))
+		,"T2s(i,j)*T2s(l,m)(0,2,1,0)");
+  test_for_zero(t4ddg_2(0,2,1,1) - (t2s_2(0,2)*t2s_3(1,1))
+		,"T2s(i,j)*T2s(l,m)(0,2,1,1)");
+  test_for_zero(t4ddg_2(0,2,1,2) - (t2s_2(0,2)*t2s_3(1,2))
+		,"T2s(i,j)*T2s(l,m)(0,2,1,2)");
+  test_for_zero(t4ddg_2(0,2,2,0) - (t2s_2(0,2)*t2s_3(2,0))
+		,"T2s(i,j)*T2s(l,m)(0,2,2,0)");
+  test_for_zero(t4ddg_2(0,2,2,1) - (t2s_2(0,2)*t2s_3(2,1))
+		,"T2s(i,j)*T2s(l,m)(0,2,2,1)");
+  test_for_zero(t4ddg_2(0,2,2,2) - (t2s_2(0,2)*t2s_3(2,2))
+		,"T2s(i,j)*T2s(l,m)(0,2,2,2)");
+  test_for_zero(t4ddg_2(1,0,0,0) - (t2s_2(1,0)*t2s_3(0,0))
+		,"T2s(i,j)*T2s(l,m)(1,0,0,0)");
+  test_for_zero(t4ddg_2(1,0,0,1) - (t2s_2(1,0)*t2s_3(0,1))
+		,"T2s(i,j)*T2s(l,m)(1,0,0,1)");
+  test_for_zero(t4ddg_2(1,0,0,2) - (t2s_2(1,0)*t2s_3(0,2))
+		,"T2s(i,j)*T2s(l,m)(1,0,0,2)");
+  test_for_zero(t4ddg_2(1,0,1,0) - (t2s_2(1,0)*t2s_3(1,0))
+		,"T2s(i,j)*T2s(l,m)(1,0,1,0)");
+  test_for_zero(t4ddg_2(1,0,1,1) - (t2s_2(1,0)*t2s_3(1,1))
+		,"T2s(i,j)*T2s(l,m)(1,0,1,1)");
+  test_for_zero(t4ddg_2(1,0,1,2) - (t2s_2(1,0)*t2s_3(1,2))
+		,"T2s(i,j)*T2s(l,m)(1,0,1,2)");
+  test_for_zero(t4ddg_2(1,0,2,0) - (t2s_2(1,0)*t2s_3(2,0))
+		,"T2s(i,j)*T2s(l,m)(1,0,2,0)");
+  test_for_zero(t4ddg_2(1,0,2,1) - (t2s_2(1,0)*t2s_3(2,1))
+		,"T2s(i,j)*T2s(l,m)(1,0,2,1)");
+  test_for_zero(t4ddg_2(1,0,2,2) - (t2s_2(1,0)*t2s_3(2,2))
+		,"T2s(i,j)*T2s(l,m)(1,0,2,2)");
+  test_for_zero(t4ddg_2(1,1,0,0) - (t2s_2(1,1)*t2s_3(0,0))
+		,"T2s(i,j)*T2s(l,m)(1,1,0,0)");
+  test_for_zero(t4ddg_2(1,1,0,1) - (t2s_2(1,1)*t2s_3(0,1))
+		,"T2s(i,j)*T2s(l,m)(1,1,0,1)");
+  test_for_zero(t4ddg_2(1,1,0,2) - (t2s_2(1,1)*t2s_3(0,2))
+		,"T2s(i,j)*T2s(l,m)(1,1,0,2)");
+  test_for_zero(t4ddg_2(1,1,1,0) - (t2s_2(1,1)*t2s_3(1,0))
+		,"T2s(i,j)*T2s(l,m)(1,1,1,0)");
+  test_for_zero(t4ddg_2(1,1,1,1) - (t2s_2(1,1)*t2s_3(1,1))
+		,"T2s(i,j)*T2s(l,m)(1,1,1,1)");
+  test_for_zero(t4ddg_2(1,1,1,2) - (t2s_2(1,1)*t2s_3(1,2))
+		,"T2s(i,j)*T2s(l,m)(1,1,1,2)");
+  test_for_zero(t4ddg_2(1,1,2,0) - (t2s_2(1,1)*t2s_3(2,0))
+		,"T2s(i,j)*T2s(l,m)(1,1,2,0)");
+  test_for_zero(t4ddg_2(1,1,2,1) - (t2s_2(1,1)*t2s_3(2,1))
+		,"T2s(i,j)*T2s(l,m)(1,1,2,1)");
+  test_for_zero(t4ddg_2(1,1,2,2) - (t2s_2(1,1)*t2s_3(2,2))
+		,"T2s(i,j)*T2s(l,m)(1,1,2,2)");
+  test_for_zero(t4ddg_2(1,2,0,0) - (t2s_2(1,2)*t2s_3(0,0))
+		,"T2s(i,j)*T2s(l,m)(1,2,0,0)");
+  test_for_zero(t4ddg_2(1,2,0,1) - (t2s_2(1,2)*t2s_3(0,1))
+		,"T2s(i,j)*T2s(l,m)(1,2,0,1)");
+  test_for_zero(t4ddg_2(1,2,0,2) - (t2s_2(1,2)*t2s_3(0,2))
+		,"T2s(i,j)*T2s(l,m)(1,2,0,2)");
+  test_for_zero(t4ddg_2(1,2,1,0) - (t2s_2(1,2)*t2s_3(1,0))
+		,"T2s(i,j)*T2s(l,m)(1,2,1,0)");
+  test_for_zero(t4ddg_2(1,2,1,1) - (t2s_2(1,2)*t2s_3(1,1))
+		,"T2s(i,j)*T2s(l,m)(1,2,1,1)");
+  test_for_zero(t4ddg_2(1,2,1,2) - (t2s_2(1,2)*t2s_3(1,2))
+		,"T2s(i,j)*T2s(l,m)(1,2,1,2)");
+  test_for_zero(t4ddg_2(1,2,2,0) - (t2s_2(1,2)*t2s_3(2,0))
+		,"T2s(i,j)*T2s(l,m)(1,2,2,0)");
+  test_for_zero(t4ddg_2(1,2,2,1) - (t2s_2(1,2)*t2s_3(2,1))
+		,"T2s(i,j)*T2s(l,m)(1,2,2,1)");
+  test_for_zero(t4ddg_2(1,2,2,2) - (t2s_2(1,2)*t2s_3(2,2))
+		,"T2s(i,j)*T2s(l,m)(1,2,2,2)");
+  test_for_zero(t4ddg_2(2,0,0,0) - (t2s_2(2,0)*t2s_3(0,0))
+		,"T2s(i,j)*T2s(l,m)(2,0,0,0)");
+  test_for_zero(t4ddg_2(2,0,0,1) - (t2s_2(2,0)*t2s_3(0,1))
+		,"T2s(i,j)*T2s(l,m)(2,0,0,1)");
+  test_for_zero(t4ddg_2(2,0,0,2) - (t2s_2(2,0)*t2s_3(0,2))
+		,"T2s(i,j)*T2s(l,m)(2,0,0,2)");
+  test_for_zero(t4ddg_2(2,0,1,0) - (t2s_2(2,0)*t2s_3(1,0))
+		,"T2s(i,j)*T2s(l,m)(2,0,1,0)");
+  test_for_zero(t4ddg_2(2,0,1,1) - (t2s_2(2,0)*t2s_3(1,1))
+		,"T2s(i,j)*T2s(l,m)(2,0,1,1)");
+  test_for_zero(t4ddg_2(2,0,1,2) - (t2s_2(2,0)*t2s_3(1,2))
+		,"T2s(i,j)*T2s(l,m)(2,0,1,2)");
+  test_for_zero(t4ddg_2(2,0,2,0) - (t2s_2(2,0)*t2s_3(2,0))
+		,"T2s(i,j)*T2s(l,m)(2,0,2,0)");
+  test_for_zero(t4ddg_2(2,0,2,1) - (t2s_2(2,0)*t2s_3(2,1))
+		,"T2s(i,j)*T2s(l,m)(2,0,2,1)");
+  test_for_zero(t4ddg_2(2,0,2,2) - (t2s_2(2,0)*t2s_3(2,2))
+		,"T2s(i,j)*T2s(l,m)(2,0,2,2)");
+  test_for_zero(t4ddg_2(2,1,0,0) - (t2s_2(2,1)*t2s_3(0,0))
+		,"T2s(i,j)*T2s(l,m)(2,1,0,0)");
+  test_for_zero(t4ddg_2(2,1,0,1) - (t2s_2(2,1)*t2s_3(0,1))
+		,"T2s(i,j)*T2s(l,m)(2,1,0,1)");
+  test_for_zero(t4ddg_2(2,1,0,2) - (t2s_2(2,1)*t2s_3(0,2))
+		,"T2s(i,j)*T2s(l,m)(2,1,0,2)");
+  test_for_zero(t4ddg_2(2,1,1,0) - (t2s_2(2,1)*t2s_3(1,0))
+		,"T2s(i,j)*T2s(l,m)(2,1,1,0)");
+  test_for_zero(t4ddg_2(2,1,1,1) - (t2s_2(2,1)*t2s_3(1,1))
+		,"T2s(i,j)*T2s(l,m)(2,1,1,1)");
+  test_for_zero(t4ddg_2(2,1,1,2) - (t2s_2(2,1)*t2s_3(1,2))
+		,"T2s(i,j)*T2s(l,m)(2,1,1,2)");
+  test_for_zero(t4ddg_2(2,1,2,0) - (t2s_2(2,1)*t2s_3(2,0))
+		,"T2s(i,j)*T2s(l,m)(2,1,2,0)");
+  test_for_zero(t4ddg_2(2,1,2,1) - (t2s_2(2,1)*t2s_3(2,1))
+		,"T2s(i,j)*T2s(l,m)(2,1,2,1)");
+  test_for_zero(t4ddg_2(2,1,2,2) - (t2s_2(2,1)*t2s_3(2,2))
+		,"T2s(i,j)*T2s(l,m)(2,1,2,2)");
+  test_for_zero(t4ddg_2(2,2,0,0) - (t2s_2(2,2)*t2s_3(0,0))
+		,"T2s(i,j)*T2s(l,m)(2,2,0,0)");
+  test_for_zero(t4ddg_2(2,2,0,1) - (t2s_2(2,2)*t2s_3(0,1))
+		,"T2s(i,j)*T2s(l,m)(2,2,0,1)");
+  test_for_zero(t4ddg_2(2,2,0,2) - (t2s_2(2,2)*t2s_3(0,2))
+		,"T2s(i,j)*T2s(l,m)(2,2,0,2)");
+  test_for_zero(t4ddg_2(2,2,1,0) - (t2s_2(2,2)*t2s_3(1,0))
+		,"T2s(i,j)*T2s(l,m)(2,2,1,0)");
+  test_for_zero(t4ddg_2(2,2,1,1) - (t2s_2(2,2)*t2s_3(1,1))
+		,"T2s(i,j)*T2s(l,m)(2,2,1,1)");
+  test_for_zero(t4ddg_2(2,2,1,2) - (t2s_2(2,2)*t2s_3(1,2))
+		,"T2s(i,j)*T2s(l,m)(2,2,1,2)");
+  test_for_zero(t4ddg_2(2,2,2,0) - (t2s_2(2,2)*t2s_3(2,0))
+		,"T2s(i,j)*T2s(l,m)(2,2,2,0)");
+  test_for_zero(t4ddg_2(2,2,2,1) - (t2s_2(2,2)*t2s_3(2,1))
+		,"T2s(i,j)*T2s(l,m)(2,2,2,1)");
+  test_for_zero(t4ddg_2(2,2,2,2) - (t2s_2(2,2)*t2s_3(2,2))
+		,"T2s(i,j)*T2s(l,m)(2,2,2,2)");
+
+  test_for_zero(t4ddg_1(i,j,k,l)*t4ddg_2(i,k,j,l)
+		- t4ddg_1(0,0,0,0)*t4ddg_2(0,0,0,0)
+		- t4ddg_1(0,0,0,1)*t4ddg_2(0,0,0,1)
+		- t4ddg_1(0,0,0,2)*t4ddg_2(0,0,0,2)
+		- t4ddg_1(0,0,1,0)*t4ddg_2(0,1,0,0)
+		- t4ddg_1(0,0,1,1)*t4ddg_2(0,1,0,1)
+		- t4ddg_1(0,0,1,2)*t4ddg_2(0,1,0,2)
+		- t4ddg_1(0,0,2,0)*t4ddg_2(0,2,0,0)
+		- t4ddg_1(0,0,2,1)*t4ddg_2(0,2,0,1)
+		- t4ddg_1(0,0,2,2)*t4ddg_2(0,2,0,2)
+		- t4ddg_1(0,1,0,0)*t4ddg_2(0,0,1,0)
+		- t4ddg_1(0,1,0,1)*t4ddg_2(0,0,1,1)
+		- t4ddg_1(0,1,0,2)*t4ddg_2(0,0,1,2)
+		- t4ddg_1(0,1,1,0)*t4ddg_2(0,1,1,0)
+		- t4ddg_1(0,1,1,1)*t4ddg_2(0,1,1,1)
+		- t4ddg_1(0,1,1,2)*t4ddg_2(0,1,1,2)
+		- t4ddg_1(0,1,2,0)*t4ddg_2(0,2,1,0)
+		- t4ddg_1(0,1,2,1)*t4ddg_2(0,2,1,1)
+		- t4ddg_1(0,1,2,2)*t4ddg_2(0,2,1,2)
+		- t4ddg_1(0,2,0,0)*t4ddg_2(0,0,2,0)
+		- t4ddg_1(0,2,0,1)*t4ddg_2(0,0,2,1)
+		- t4ddg_1(0,2,0,2)*t4ddg_2(0,0,2,2)
+		- t4ddg_1(0,2,1,0)*t4ddg_2(0,1,2,0)
+		- t4ddg_1(0,2,1,1)*t4ddg_2(0,1,2,1)
+		- t4ddg_1(0,2,1,2)*t4ddg_2(0,1,2,2)
+		- t4ddg_1(0,2,2,0)*t4ddg_2(0,2,2,0)
+		- t4ddg_1(0,2,2,1)*t4ddg_2(0,2,2,1)
+		- t4ddg_1(0,2,2,2)*t4ddg_2(0,2,2,2)
+
+		- t4ddg_1(1,0,0,0)*t4ddg_2(1,0,0,0)
+		- t4ddg_1(1,0,0,1)*t4ddg_2(1,0,0,1)
+		- t4ddg_1(1,0,0,2)*t4ddg_2(1,0,0,2)
+		- t4ddg_1(1,0,1,0)*t4ddg_2(1,1,0,0)
+		- t4ddg_1(1,0,1,1)*t4ddg_2(1,1,0,1)
+		- t4ddg_1(1,0,1,2)*t4ddg_2(1,1,0,2)
+		- t4ddg_1(1,0,2,0)*t4ddg_2(1,2,0,0)
+		- t4ddg_1(1,0,2,1)*t4ddg_2(1,2,0,1)
+		- t4ddg_1(1,0,2,2)*t4ddg_2(1,2,0,2)
+		- t4ddg_1(1,1,0,0)*t4ddg_2(1,0,1,0)
+		- t4ddg_1(1,1,0,1)*t4ddg_2(1,0,1,1)
+		- t4ddg_1(1,1,0,2)*t4ddg_2(1,0,1,2)
+		- t4ddg_1(1,1,1,0)*t4ddg_2(1,1,1,0)
+		- t4ddg_1(1,1,1,1)*t4ddg_2(1,1,1,1)
+		- t4ddg_1(1,1,1,2)*t4ddg_2(1,1,1,2)
+		- t4ddg_1(1,1,2,0)*t4ddg_2(1,2,1,0)
+		- t4ddg_1(1,1,2,1)*t4ddg_2(1,2,1,1)
+		- t4ddg_1(1,1,2,2)*t4ddg_2(1,2,1,2)
+		- t4ddg_1(1,2,0,0)*t4ddg_2(1,0,2,0)
+		- t4ddg_1(1,2,0,1)*t4ddg_2(1,0,2,1)
+		- t4ddg_1(1,2,0,2)*t4ddg_2(1,0,2,2)
+		- t4ddg_1(1,2,1,0)*t4ddg_2(1,1,2,0)
+		- t4ddg_1(1,2,1,1)*t4ddg_2(1,1,2,1)
+		- t4ddg_1(1,2,1,2)*t4ddg_2(1,1,2,2)
+		- t4ddg_1(1,2,2,0)*t4ddg_2(1,2,2,0)
+		- t4ddg_1(1,2,2,1)*t4ddg_2(1,2,2,1)
+		- t4ddg_1(1,2,2,2)*t4ddg_2(1,2,2,2)
+
+		- t4ddg_1(2,0,0,0)*t4ddg_2(2,0,0,0)
+		- t4ddg_1(2,0,0,1)*t4ddg_2(2,0,0,1)
+		- t4ddg_1(2,0,0,2)*t4ddg_2(2,0,0,2)
+		- t4ddg_1(2,0,1,0)*t4ddg_2(2,1,0,0)
+		- t4ddg_1(2,0,1,1)*t4ddg_2(2,1,0,1)
+		- t4ddg_1(2,0,1,2)*t4ddg_2(2,1,0,2)
+		- t4ddg_1(2,0,2,0)*t4ddg_2(2,2,0,0)
+		- t4ddg_1(2,0,2,1)*t4ddg_2(2,2,0,1)
+		- t4ddg_1(2,0,2,2)*t4ddg_2(2,2,0,2)
+		- t4ddg_1(2,1,0,0)*t4ddg_2(2,0,1,0)
+		- t4ddg_1(2,1,0,1)*t4ddg_2(2,0,1,1)
+		- t4ddg_1(2,1,0,2)*t4ddg_2(2,0,1,2)
+		- t4ddg_1(2,1,1,0)*t4ddg_2(2,1,1,0)
+		- t4ddg_1(2,1,1,1)*t4ddg_2(2,1,1,1)
+		- t4ddg_1(2,1,1,2)*t4ddg_2(2,1,1,2)
+		- t4ddg_1(2,1,2,0)*t4ddg_2(2,2,1,0)
+		- t4ddg_1(2,1,2,1)*t4ddg_2(2,2,1,1)
+		- t4ddg_1(2,1,2,2)*t4ddg_2(2,2,1,2)
+		- t4ddg_1(2,2,0,0)*t4ddg_2(2,0,2,0)
+		- t4ddg_1(2,2,0,1)*t4ddg_2(2,0,2,1)
+		- t4ddg_1(2,2,0,2)*t4ddg_2(2,0,2,2)
+		- t4ddg_1(2,2,1,0)*t4ddg_2(2,1,2,0)
+		- t4ddg_1(2,2,1,1)*t4ddg_2(2,1,2,1)
+		- t4ddg_1(2,2,1,2)*t4ddg_2(2,1,2,2)
+		- t4ddg_1(2,2,2,0)*t4ddg_2(2,2,2,0)
+		- t4ddg_1(2,2,2,1)*t4ddg_2(2,2,2,1)
+		- t4ddg_1(2,2,2,2)*t4ddg_2(2,2,2,2)
+		,"T4ddg(i,j,k,l)*T4ddg(i,j,k,l)");
+
+  t4ddg_1(i,j,k,l)=t4ddg_2(i,j,k,l)+t4ddg_3(i,j,k,l);
+  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)+t4ddg_3(0,0,0,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,0,0,0)");
+  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)+t4ddg_3(0,0,0,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,0,0,1)");
+  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)+t4ddg_3(0,0,0,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,0,0,2)");
+  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)+t4ddg_3(0,0,1,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,0,1,0)");
+  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)+t4ddg_3(0,0,1,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,0,1,1)");
+  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)+t4ddg_3(0,0,1,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,0,1,2)");
+  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)+t4ddg_3(0,0,2,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,0,2,0)");
+  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)+t4ddg_3(0,0,2,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,0,2,1)");
+  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)+t4ddg_3(0,0,2,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,0,2,2)");
+  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)+t4ddg_3(0,1,0,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,1,0,0)");
+  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)+t4ddg_3(0,1,0,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,1,0,1)");
+  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)+t4ddg_3(0,1,0,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,1,0,2)");
+  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)+t4ddg_3(0,1,1,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,1,1,0)");
+  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)+t4ddg_3(0,1,1,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,1,1,1)");
+  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)+t4ddg_3(0,1,1,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,1,1,2)");
+  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)+t4ddg_3(0,1,2,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,1,2,0)");
+  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)+t4ddg_3(0,1,2,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,1,2,1)");
+  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)+t4ddg_3(0,1,2,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,1,2,2)");
+  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)+t4ddg_3(0,2,0,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,2,0,0)");
+  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)+t4ddg_3(0,2,0,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,2,0,1)");
+  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)+t4ddg_3(0,2,0,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,2,0,2)");
+  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)+t4ddg_3(0,2,1,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,2,1,0)");
+  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)+t4ddg_3(0,2,1,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,2,1,1)");
+  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)+t4ddg_3(0,2,1,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,2,1,2)");
+  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)+t4ddg_3(0,2,2,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,2,2,0)");
+  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)+t4ddg_3(0,2,2,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,2,2,1)");
+  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)+t4ddg_3(0,2,2,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(0,2,2,2)");
+  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)+t4ddg_3(1,0,0,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,0,0,0)");
+  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)+t4ddg_3(1,0,0,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,0,0,1)");
+  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)+t4ddg_3(1,0,0,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,0,0,2)");
+  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)+t4ddg_3(1,0,1,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,0,1,0)");
+  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)+t4ddg_3(1,0,1,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,0,1,1)");
+  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)+t4ddg_3(1,0,1,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,0,1,2)");
+  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)+t4ddg_3(1,0,2,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,0,2,0)");
+  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)+t4ddg_3(1,0,2,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,0,2,1)");
+  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)+t4ddg_3(1,0,2,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,0,2,2)");
+  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)+t4ddg_3(1,1,0,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,1,0,0)");
+  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)+t4ddg_3(1,1,0,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,1,0,1)");
+  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)+t4ddg_3(1,1,0,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,1,0,2)");
+  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)+t4ddg_3(1,1,1,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)+t4ddg_3(1,1,1,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,1,1,1)");
+  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)+t4ddg_3(1,1,1,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,1,1,2)");
+  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)+t4ddg_3(1,1,2,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,1,2,0)");
+  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)+t4ddg_3(1,1,2,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,1,2,1)");
+  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)+t4ddg_3(1,1,2,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,1,2,2)");
+  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)+t4ddg_3(1,2,0,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,2,0,0)");
+  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)+t4ddg_3(1,2,0,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,2,0,1)");
+  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)+t4ddg_3(1,2,0,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,2,0,2)");
+  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)+t4ddg_3(1,2,1,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,2,1,0)");
+  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)+t4ddg_3(1,2,1,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,2,1,1)");
+  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)+t4ddg_3(1,2,1,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,2,1,2)");
+  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)+t4ddg_3(1,2,2,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,2,2,0)");
+  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)+t4ddg_3(1,2,2,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,2,2,1)");
+  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)+t4ddg_3(1,2,2,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(1,2,2,2)");
+  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)+t4ddg_3(2,0,0,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,0,0,0)");
+  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)+t4ddg_3(2,0,0,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,0,0,1)");
+  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)+t4ddg_3(2,0,0,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,0,0,2)");
+  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)+t4ddg_3(2,0,1,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,0,1,0)");
+  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)+t4ddg_3(2,0,1,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,0,1,1)");
+  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)+t4ddg_3(2,0,1,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,0,1,2)");
+  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)+t4ddg_3(2,0,2,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,0,2,0)");
+  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)+t4ddg_3(2,0,2,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,0,2,1)");
+  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)+t4ddg_3(2,0,2,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,0,2,2)");
+  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)+t4ddg_3(2,1,0,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,1,0,0)");
+  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)+t4ddg_3(2,1,0,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,1,0,1)");
+  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)+t4ddg_3(2,1,0,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,1,0,2)");
+  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)+t4ddg_3(2,1,1,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,1,1,0)");
+  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)+t4ddg_3(2,1,1,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,1,1,1)");
+  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)+t4ddg_3(2,1,1,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,1,1,2)");
+  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)+t4ddg_3(2,1,2,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,1,2,0)");
+  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)+t4ddg_3(2,1,2,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,1,2,1)");
+  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)+t4ddg_3(2,1,2,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,1,2,2)");
+  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)+t4ddg_3(2,2,0,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,2,0,0)");
+  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)+t4ddg_3(2,2,0,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,2,0,1)");
+  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)+t4ddg_3(2,2,0,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,2,0,2)");
+  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)+t4ddg_3(2,2,1,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,2,1,0)");
+  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)+t4ddg_3(2,2,1,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,2,1,1)");
+  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)+t4ddg_3(2,2,1,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,2,1,2)");
+  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)+t4ddg_3(2,2,2,0))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,2,2,0)");
+  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)+t4ddg_3(2,2,2,1))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)+t4ddg_3(2,2,2,2))
+		,"T4ddg(i,j,k,l)+T4ddg(i,j,k,l)(2,2,2,2)");
+
+  t4ddg_1(i,j,k,l)=t4ddg_2(i,j,k,l)+t4ddg_3(k,l,i,j);
+  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)+t4ddg_3(0,0,0,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,0,0,0)");
+  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)+t4ddg_3(0,1,0,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,0,0,1)");
+  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)+t4ddg_3(0,2,0,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,0,0,2)");
+  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)+t4ddg_3(1,0,0,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,0,1,0)");
+  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)+t4ddg_3(1,1,0,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,0,1,1)");
+  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)+t4ddg_3(1,2,0,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,0,1,2)");
+  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)+t4ddg_3(2,0,0,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,0,2,0)");
+  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)+t4ddg_3(2,1,0,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,0,2,1)");
+  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)+t4ddg_3(2,2,0,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,0,2,2)");
+  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)+t4ddg_3(0,0,0,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,1,0,0)");
+  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)+t4ddg_3(0,1,0,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,1,0,1)");
+  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)+t4ddg_3(0,2,0,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,1,0,2)");
+  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)+t4ddg_3(1,0,0,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,1,1,0)");
+  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)+t4ddg_3(1,1,0,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,1,1,1)");
+  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)+t4ddg_3(1,2,0,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,1,1,2)");
+  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)+t4ddg_3(2,0,0,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,1,2,0)");
+  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)+t4ddg_3(2,1,0,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,1,2,1)");
+  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)+t4ddg_3(2,2,0,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,1,2,2)");
+  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)+t4ddg_3(0,0,0,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,2,0,0)");
+  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)+t4ddg_3(0,1,0,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,2,0,1)");
+  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)+t4ddg_3(0,2,0,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,2,0,2)");
+  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)+t4ddg_3(1,0,0,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,2,1,0)");
+  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)+t4ddg_3(1,1,0,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,2,1,1)");
+  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)+t4ddg_3(1,2,0,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,2,1,2)");
+  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)+t4ddg_3(2,0,0,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,2,2,0)");
+  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)+t4ddg_3(2,1,0,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,2,2,1)");
+  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)+t4ddg_3(2,2,0,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(0,2,2,2)");
+  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)+t4ddg_3(0,0,1,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,0,0,0)");
+  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)+t4ddg_3(0,1,1,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,0,0,1)");
+  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)+t4ddg_3(0,2,1,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,0,0,2)");
+  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)+t4ddg_3(1,0,1,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,0,1,0)");
+  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)+t4ddg_3(1,1,1,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,0,1,1)");
+  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)+t4ddg_3(1,2,1,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,0,1,2)");
+  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)+t4ddg_3(2,0,1,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,0,2,0)");
+  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)+t4ddg_3(2,1,1,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,0,2,1)");
+  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)+t4ddg_3(2,2,1,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,0,2,2)");
+  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)+t4ddg_3(0,0,1,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,1,0,0)");
+  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)+t4ddg_3(0,1,1,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,1,0,1)");
+  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)+t4ddg_3(0,2,1,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,1,0,2)");
+  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)+t4ddg_3(1,0,1,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)+t4ddg_3(1,1,1,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,1,1,1)");
+  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)+t4ddg_3(1,2,1,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,1,1,2)");
+  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)+t4ddg_3(2,0,1,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,1,2,0)");
+  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)+t4ddg_3(2,1,1,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,1,2,1)");
+  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)+t4ddg_3(2,2,1,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,1,2,2)");
+  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)+t4ddg_3(0,0,1,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,2,0,0)");
+  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)+t4ddg_3(0,1,1,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,2,0,1)");
+  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)+t4ddg_3(0,2,1,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,2,0,2)");
+  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)+t4ddg_3(1,0,1,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,2,1,0)");
+  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)+t4ddg_3(1,1,1,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,2,1,1)");
+  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)+t4ddg_3(1,2,1,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,2,1,2)");
+  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)+t4ddg_3(2,0,1,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,2,2,0)");
+  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)+t4ddg_3(2,1,1,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,2,2,1)");
+  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)+t4ddg_3(2,2,1,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(1,2,2,2)");
+  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)+t4ddg_3(0,0,2,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,0,0,0)");
+  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)+t4ddg_3(0,1,2,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,0,0,1)");
+  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)+t4ddg_3(0,2,2,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,0,0,2)");
+  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)+t4ddg_3(1,0,2,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,0,1,0)");
+  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)+t4ddg_3(1,1,2,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,0,1,1)");
+  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)+t4ddg_3(1,2,2,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,0,1,2)");
+  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)+t4ddg_3(2,0,2,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,0,2,0)");
+  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)+t4ddg_3(2,1,2,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,0,2,1)");
+  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)+t4ddg_3(2,2,2,0))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,0,2,2)");
+  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)+t4ddg_3(0,0,2,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,1,0,0)");
+  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)+t4ddg_3(0,1,2,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,1,0,1)");
+  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)+t4ddg_3(0,2,2,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,1,0,2)");
+  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)+t4ddg_3(1,0,2,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,1,1,0)");
+  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)+t4ddg_3(1,1,2,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,1,1,1)");
+  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)+t4ddg_3(1,2,2,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,1,1,2)");
+  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)+t4ddg_3(2,0,2,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,1,2,0)");
+  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)+t4ddg_3(2,1,2,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,1,2,1)");
+  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)+t4ddg_3(2,2,2,1))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,1,2,2)");
+  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)+t4ddg_3(0,0,2,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,2,0,0)");
+  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)+t4ddg_3(0,1,2,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,2,0,1)");
+  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)+t4ddg_3(0,2,2,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,2,0,2)");
+  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)+t4ddg_3(1,0,2,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,2,1,0)");
+  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)+t4ddg_3(1,1,2,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,2,1,1)");
+  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)+t4ddg_3(1,2,2,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,2,1,2)");
+  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)+t4ddg_3(2,0,2,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,2,2,0)");
+  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)+t4ddg_3(2,1,2,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)+t4ddg_3(2,2,2,2))
+		,"T4ddg(i,j,k,l)+T4ddg(k,l,i,j)(2,2,2,2)");
+
+
+  t4ddg_1(i,j,k,l)=t4ddg_2(i,j,k,l)-t4ddg_3(i,j,k,l);
+  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)-t4ddg_3(0,0,0,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,0,0,0)");
+  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)-t4ddg_3(0,0,0,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,0,0,1)");
+  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)-t4ddg_3(0,0,0,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,0,0,2)");
+  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)-t4ddg_3(0,0,1,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,0,1,0)");
+  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)-t4ddg_3(0,0,1,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,0,1,1)");
+  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)-t4ddg_3(0,0,1,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,0,1,2)");
+  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)-t4ddg_3(0,0,2,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,0,2,0)");
+  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)-t4ddg_3(0,0,2,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,0,2,1)");
+  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)-t4ddg_3(0,0,2,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,0,2,2)");
+  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)-t4ddg_3(0,1,0,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,1,0,0)");
+  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)-t4ddg_3(0,1,0,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,1,0,1)");
+  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)-t4ddg_3(0,1,0,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,1,0,2)");
+  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)-t4ddg_3(0,1,1,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,1,1,0)");
+  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)-t4ddg_3(0,1,1,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,1,1,1)");
+  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)-t4ddg_3(0,1,1,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,1,1,2)");
+  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)-t4ddg_3(0,1,2,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,1,2,0)");
+  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)-t4ddg_3(0,1,2,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,1,2,1)");
+  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)-t4ddg_3(0,1,2,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,1,2,2)");
+  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)-t4ddg_3(0,2,0,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,2,0,0)");
+  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)-t4ddg_3(0,2,0,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,2,0,1)");
+  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)-t4ddg_3(0,2,0,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,2,0,2)");
+  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)-t4ddg_3(0,2,1,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,2,1,0)");
+  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)-t4ddg_3(0,2,1,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,2,1,1)");
+  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)-t4ddg_3(0,2,1,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,2,1,2)");
+  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)-t4ddg_3(0,2,2,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,2,2,0)");
+  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)-t4ddg_3(0,2,2,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,2,2,1)");
+  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)-t4ddg_3(0,2,2,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(0,2,2,2)");
+  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)-t4ddg_3(1,0,0,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,0,0,0)");
+  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)-t4ddg_3(1,0,0,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,0,0,1)");
+  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)-t4ddg_3(1,0,0,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,0,0,2)");
+  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)-t4ddg_3(1,0,1,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,0,1,0)");
+  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)-t4ddg_3(1,0,1,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,0,1,1)");
+  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)-t4ddg_3(1,0,1,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,0,1,2)");
+  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)-t4ddg_3(1,0,2,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,0,2,0)");
+  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)-t4ddg_3(1,0,2,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,0,2,1)");
+  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)-t4ddg_3(1,0,2,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,0,2,2)");
+  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)-t4ddg_3(1,1,0,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,1,0,0)");
+  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)-t4ddg_3(1,1,0,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,1,0,1)");
+  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)-t4ddg_3(1,1,0,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,1,0,2)");
+  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)-t4ddg_3(1,1,1,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)-t4ddg_3(1,1,1,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,1,1,1)");
+  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)-t4ddg_3(1,1,1,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,1,1,2)");
+  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)-t4ddg_3(1,1,2,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,1,2,0)");
+  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)-t4ddg_3(1,1,2,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,1,2,1)");
+  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)-t4ddg_3(1,1,2,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,1,2,2)");
+  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)-t4ddg_3(1,2,0,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,2,0,0)");
+  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)-t4ddg_3(1,2,0,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,2,0,1)");
+  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)-t4ddg_3(1,2,0,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,2,0,2)");
+  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)-t4ddg_3(1,2,1,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,2,1,0)");
+  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)-t4ddg_3(1,2,1,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,2,1,1)");
+  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)-t4ddg_3(1,2,1,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,2,1,2)");
+  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)-t4ddg_3(1,2,2,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,2,2,0)");
+  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)-t4ddg_3(1,2,2,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,2,2,1)");
+  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)-t4ddg_3(1,2,2,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(1,2,2,2)");
+  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)-t4ddg_3(2,0,0,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,0,0,0)");
+  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)-t4ddg_3(2,0,0,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,0,0,1)");
+  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)-t4ddg_3(2,0,0,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,0,0,2)");
+  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)-t4ddg_3(2,0,1,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,0,1,0)");
+  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)-t4ddg_3(2,0,1,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,0,1,1)");
+  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)-t4ddg_3(2,0,1,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,0,1,2)");
+  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)-t4ddg_3(2,0,2,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,0,2,0)");
+  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)-t4ddg_3(2,0,2,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,0,2,1)");
+  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)-t4ddg_3(2,0,2,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,0,2,2)");
+  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)-t4ddg_3(2,1,0,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,1,0,0)");
+  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)-t4ddg_3(2,1,0,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,1,0,1)");
+  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)-t4ddg_3(2,1,0,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,1,0,2)");
+  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)-t4ddg_3(2,1,1,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,1,1,0)");
+  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)-t4ddg_3(2,1,1,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,1,1,1)");
+  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)-t4ddg_3(2,1,1,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,1,1,2)");
+  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)-t4ddg_3(2,1,2,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,1,2,0)");
+  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)-t4ddg_3(2,1,2,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,1,2,1)");
+  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)-t4ddg_3(2,1,2,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,1,2,2)");
+  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)-t4ddg_3(2,2,0,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,2,0,0)");
+  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)-t4ddg_3(2,2,0,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,2,0,1)");
+  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)-t4ddg_3(2,2,0,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,2,0,2)");
+  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)-t4ddg_3(2,2,1,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,2,1,0)");
+  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)-t4ddg_3(2,2,1,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,2,1,1)");
+  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)-t4ddg_3(2,2,1,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,2,1,2)");
+  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)-t4ddg_3(2,2,2,0))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,2,2,0)");
+  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)-t4ddg_3(2,2,2,1))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)-t4ddg_3(2,2,2,2))
+		,"T4ddg(i,j,k,l)-T4ddg(i,j,k,l)(2,2,2,2)");
+
+  t4ddg_2(i,k,j,l)=t2s_2(i,k)*t2s_2(j,l);
+  t4ddg_3(i,l,j,k)=t2s_2(i,l)*t2s_2(j,k);
+  t4ddg_1(i,j,k,l)=(t4ddg_2(i,k,j,l) || t4ddg_3(i,l,j,k));
+  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)+t4ddg_3(0,0,0,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,0,0,0)");
+  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)+t4ddg_3(0,1,0,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,0,0,1)");
+  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)+t4ddg_3(0,2,0,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,0,0,2)");
+  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,0,1,0)+t4ddg_3(0,0,1,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,0,1,0)");
+  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,0,1,1)+t4ddg_3(0,1,1,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,0,1,1)");
+  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,0,1,2)+t4ddg_3(0,2,1,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,0,1,2)");
+  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,0,2,0)+t4ddg_3(0,0,2,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,0,2,0)");
+  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,0,2,1)+t4ddg_3(0,1,2,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,0,2,1)");
+  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,0,2,2)+t4ddg_3(0,2,2,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,0,2,2)");
+  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,1,0,0)+t4ddg_3(0,0,0,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,1,0,0)");
+  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,1,0,1)+t4ddg_3(0,1,0,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,1,0,1)");
+  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,1,0,2)+t4ddg_3(0,2,0,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,1,0,2)");
+  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)+t4ddg_3(0,0,1,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,1,1,0)");
+  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)+t4ddg_3(0,1,1,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,1,1,1)");
+  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)+t4ddg_3(0,2,1,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,1,1,2)");
+  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,1,2,0)+t4ddg_3(0,0,2,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,1,2,0)");
+  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,1,2,1)+t4ddg_3(0,1,2,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,1,2,1)");
+  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,1,2,2)+t4ddg_3(0,2,2,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,1,2,2)");
+  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,2,0,0)+t4ddg_3(0,0,0,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,2,0,0)");
+  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,2,0,1)+t4ddg_3(0,1,0,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,2,0,1)");
+  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,2,0,2)+t4ddg_3(0,2,0,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,2,0,2)");
+  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,2,1,0)+t4ddg_3(0,0,1,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,2,1,0)");
+  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,2,1,1)+t4ddg_3(0,1,1,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,2,1,1)");
+  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,2,1,2)+t4ddg_3(0,2,1,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,2,1,2)");
+  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)+t4ddg_3(0,0,2,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,2,2,0)");
+  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)+t4ddg_3(0,1,2,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,2,2,1)");
+  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)+t4ddg_3(0,2,2,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(0,2,2,2)");
+  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)+t4ddg_3(1,0,0,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,0,0,0)");
+  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)+t4ddg_3(1,1,0,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,0,0,1)");
+  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)+t4ddg_3(1,2,0,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,0,0,2)");
+  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,0,1,0)+t4ddg_3(1,0,1,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,0,1,0)");
+  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,0,1,1)+t4ddg_3(1,1,1,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,0,1,1)");
+  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,0,1,2)+t4ddg_3(1,2,1,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,0,1,2)");
+  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,0,2,0)+t4ddg_3(1,0,2,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,0,2,0)");
+  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,0,2,1)+t4ddg_3(1,1,2,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,0,2,1)");
+  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,0,2,2)+t4ddg_3(1,2,2,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,0,2,2)");
+  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,1,0,0)+t4ddg_3(1,0,0,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,1,0,0)");
+  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,1,0,1)+t4ddg_3(1,1,0,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,1,0,1)");
+  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,1,0,2)+t4ddg_3(1,2,0,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,1,0,2)");
+  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)+t4ddg_3(1,0,1,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)+t4ddg_3(1,1,1,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,1,1,1)");
+  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)+t4ddg_3(1,2,1,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,1,1,2)");
+  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,1,2,0)+t4ddg_3(1,0,2,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,1,2,0)");
+  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,1,2,1)+t4ddg_3(1,1,2,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,1,2,1)");
+  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,1,2,2)+t4ddg_3(1,2,2,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,1,2,2)");
+  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,2,0,0)+t4ddg_3(1,0,0,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,2,0,0)");
+  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,2,0,1)+t4ddg_3(1,1,0,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,2,0,1)");
+  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,2,0,2)+t4ddg_3(1,2,0,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,2,0,2)");
+  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,2,1,0)+t4ddg_3(1,0,1,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,2,1,0)");
+  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,2,1,1)+t4ddg_3(1,1,1,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,2,1,1)");
+  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,2,1,2)+t4ddg_3(1,2,1,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,2,1,2)");
+  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)+t4ddg_3(1,0,2,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,2,2,0)");
+  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)+t4ddg_3(1,1,2,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,2,2,1)");
+  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)+t4ddg_3(1,2,2,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(1,2,2,2)");
+  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)+t4ddg_3(2,0,0,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,0,0,0)");
+  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)+t4ddg_3(2,1,0,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,0,0,1)");
+  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)+t4ddg_3(2,2,0,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,0,0,2)");
+  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,0,1,0)+t4ddg_3(2,0,1,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,0,1,0)");
+  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,0,1,1)+t4ddg_3(2,1,1,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,0,1,1)");
+  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,0,1,2)+t4ddg_3(2,2,1,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,0,1,2)");
+  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,0,2,0)+t4ddg_3(2,0,2,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,0,2,0)");
+  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,0,2,1)+t4ddg_3(2,1,2,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,0,2,1)");
+  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,0,2,2)+t4ddg_3(2,2,2,0))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,0,2,2)");
+  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,1,0,0)+t4ddg_3(2,0,0,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,1,0,0)");
+  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,1,0,1)+t4ddg_3(2,1,0,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,1,0,1)");
+  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,1,0,2)+t4ddg_3(2,2,0,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,1,0,2)");
+  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)+t4ddg_3(2,0,1,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,1,1,0)");
+  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)+t4ddg_3(2,1,1,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,1,1,1)");
+  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)+t4ddg_3(2,2,1,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,1,1,2)");
+  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,1,2,0)+t4ddg_3(2,0,2,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,1,2,0)");
+  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,1,2,1)+t4ddg_3(2,1,2,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,1,2,1)");
+  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,1,2,2)+t4ddg_3(2,2,2,1))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,1,2,2)");
+  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,2,0,0)+t4ddg_3(2,0,0,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,2,0,0)");
+  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,2,0,1)+t4ddg_3(2,1,0,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,2,0,1)");
+  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,2,0,2)+t4ddg_3(2,2,0,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,2,0,2)");
+  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,2,1,0)+t4ddg_3(2,0,1,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,2,1,0)");
+  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,2,1,1)+t4ddg_3(2,1,1,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,2,1,1)");
+  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,2,1,2)+t4ddg_3(2,2,1,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,2,1,2)");
+  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)+t4ddg_3(2,0,2,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,2,2,0)");
+  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)+t4ddg_3(2,1,2,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)+t4ddg_3(2,2,2,2))
+		,"T4ddg(i,k,j,l)||T4ddg(i,l,j,k)(2,2,2,2)");
+
+  cout << endl;
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T4ddg/test_T4ddgII.C
--- a/tests/conformance/T4ddg/test_T4ddgII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,849 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T4ddgII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-		Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-		Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-		const Tensor2<double,3,3> &t2_3,
-		Tensor2_symmetric<double,3> &t2s_1,
-		const Tensor2_symmetric<double,3> &t2s_2,
-		const Tensor2_symmetric<double,3> &t2s_3,
-		Tensor3_dg<double,3,3> &t3dg_1,
-		const Tensor3_dg<double,3,3> &t3dg_2,
-		const Tensor3_dg<double,3,3> &t3dg_3,
-		Tensor3_christof<double,3,3> &t3ch_1,
-		const Tensor3_christof<double,3,3> &t3ch_2,
-		const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  Tensor4_ddg<double,3,3> t4ddg_1, t4ddg_2, t4ddg_3;
-
-  t4ddg_2(i,k,j,l)=t2s_2(i,k)*t2s_2(j,l);
-  t4ddg_3(i,l,j,k)=t2s_2(i,l)*t2s_2(j,k);
-  t4ddg_1(i,k,m,n)=(t4ddg_2(i,j,k,l) ^ t4ddg_3(j,l,m,n));
-  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)*t4ddg_3(0,0,0,0)
-				    + t4ddg_2(0,0,0,1)*t4ddg_3(0,1,0,0)
-				    + t4ddg_2(0,0,0,2)*t4ddg_3(0,2,0,0)
-				    + t4ddg_2(0,1,0,0)*t4ddg_3(1,0,0,0)
-				    + t4ddg_2(0,1,0,1)*t4ddg_3(1,1,0,0)
-				    + t4ddg_2(0,1,0,2)*t4ddg_3(1,2,0,0)
-				    + t4ddg_2(0,2,0,0)*t4ddg_3(2,0,0,0)
-				    + t4ddg_2(0,2,0,1)*t4ddg_3(2,1,0,0)
-				    + t4ddg_2(0,2,0,2)*t4ddg_3(2,2,0,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,0,0,0)");
-  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,0)*t4ddg_3(0,0,0,1)
-				    + t4ddg_2(0,0,0,1)*t4ddg_3(0,1,0,1)
-				    + t4ddg_2(0,0,0,2)*t4ddg_3(0,2,0,1)
-				    + t4ddg_2(0,1,0,0)*t4ddg_3(1,0,0,1)
-				    + t4ddg_2(0,1,0,1)*t4ddg_3(1,1,0,1)
-				    + t4ddg_2(0,1,0,2)*t4ddg_3(1,2,0,1)
-				    + t4ddg_2(0,2,0,0)*t4ddg_3(2,0,0,1)
-				    + t4ddg_2(0,2,0,1)*t4ddg_3(2,1,0,1)
-				    + t4ddg_2(0,2,0,2)*t4ddg_3(2,2,0,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,0,0,1)");
-  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,0)*t4ddg_3(0,0,0,2)
-				    + t4ddg_2(0,0,0,1)*t4ddg_3(0,1,0,2)
-				    + t4ddg_2(0,0,0,2)*t4ddg_3(0,2,0,2)
-				    + t4ddg_2(0,1,0,0)*t4ddg_3(1,0,0,2)
-				    + t4ddg_2(0,1,0,1)*t4ddg_3(1,1,0,2)
-				    + t4ddg_2(0,1,0,2)*t4ddg_3(1,2,0,2)
-				    + t4ddg_2(0,2,0,0)*t4ddg_3(2,0,0,2)
-				    + t4ddg_2(0,2,0,1)*t4ddg_3(2,1,0,2)
-				    + t4ddg_2(0,2,0,2)*t4ddg_3(2,2,0,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,0,0,2)");
-  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,0,1,0)*t4ddg_3(0,0,0,0)
-				    + t4ddg_2(0,0,1,1)*t4ddg_3(0,1,0,0)
-				    + t4ddg_2(0,0,1,2)*t4ddg_3(0,2,0,0)
-				    + t4ddg_2(0,1,1,0)*t4ddg_3(1,0,0,0)
-				    + t4ddg_2(0,1,1,1)*t4ddg_3(1,1,0,0)
-				    + t4ddg_2(0,1,1,2)*t4ddg_3(1,2,0,0)
-				    + t4ddg_2(0,2,1,0)*t4ddg_3(2,0,0,0)
-				    + t4ddg_2(0,2,1,1)*t4ddg_3(2,1,0,0)
-				    + t4ddg_2(0,2,1,2)*t4ddg_3(2,2,0,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,0,1,0)");
-  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,0,1,0)*t4ddg_3(0,0,0,1)
-				    + t4ddg_2(0,0,1,1)*t4ddg_3(0,1,0,1)
-				    + t4ddg_2(0,0,1,2)*t4ddg_3(0,2,0,1)
-				    + t4ddg_2(0,1,1,0)*t4ddg_3(1,0,0,1)
-				    + t4ddg_2(0,1,1,1)*t4ddg_3(1,1,0,1)
-				    + t4ddg_2(0,1,1,2)*t4ddg_3(1,2,0,1)
-				    + t4ddg_2(0,2,1,0)*t4ddg_3(2,0,0,1)
-				    + t4ddg_2(0,2,1,1)*t4ddg_3(2,1,0,1)
-				    + t4ddg_2(0,2,1,2)*t4ddg_3(2,2,0,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,0,1,1)");
-  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,0,1,0)*t4ddg_3(0,0,0,2)
-				    + t4ddg_2(0,0,1,1)*t4ddg_3(0,1,0,2)
-				    + t4ddg_2(0,0,1,2)*t4ddg_3(0,2,0,2)
-				    + t4ddg_2(0,1,1,0)*t4ddg_3(1,0,0,2)
-				    + t4ddg_2(0,1,1,1)*t4ddg_3(1,1,0,2)
-				    + t4ddg_2(0,1,1,2)*t4ddg_3(1,2,0,2)
-				    + t4ddg_2(0,2,1,0)*t4ddg_3(2,0,0,2)
-				    + t4ddg_2(0,2,1,1)*t4ddg_3(2,1,0,2)
-				    + t4ddg_2(0,2,1,2)*t4ddg_3(2,2,0,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,0,1,2)");
-  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,0,2,0)*t4ddg_3(0,0,0,0)
-				    + t4ddg_2(0,0,2,1)*t4ddg_3(0,1,0,0)
-				    + t4ddg_2(0,0,2,2)*t4ddg_3(0,2,0,0)
-				    + t4ddg_2(0,1,2,0)*t4ddg_3(1,0,0,0)
-				    + t4ddg_2(0,1,2,1)*t4ddg_3(1,1,0,0)
-				    + t4ddg_2(0,1,2,2)*t4ddg_3(1,2,0,0)
-				    + t4ddg_2(0,2,2,0)*t4ddg_3(2,0,0,0)
-				    + t4ddg_2(0,2,2,1)*t4ddg_3(2,1,0,0)
-				    + t4ddg_2(0,2,2,2)*t4ddg_3(2,2,0,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,0,2,0)");
-  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,0,2,0)*t4ddg_3(0,0,0,1)
-				    + t4ddg_2(0,0,2,1)*t4ddg_3(0,1,0,1)
-				    + t4ddg_2(0,0,2,2)*t4ddg_3(0,2,0,1)
-				    + t4ddg_2(0,1,2,0)*t4ddg_3(1,0,0,1)
-				    + t4ddg_2(0,1,2,1)*t4ddg_3(1,1,0,1)
-				    + t4ddg_2(0,1,2,2)*t4ddg_3(1,2,0,1)
-				    + t4ddg_2(0,2,2,0)*t4ddg_3(2,0,0,1)
-				    + t4ddg_2(0,2,2,1)*t4ddg_3(2,1,0,1)
-				    + t4ddg_2(0,2,2,2)*t4ddg_3(2,2,0,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,0,2,1)");
-  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,0,2,0)*t4ddg_3(0,0,0,2)
-				    + t4ddg_2(0,0,2,1)*t4ddg_3(0,1,0,2)
-				    + t4ddg_2(0,0,2,2)*t4ddg_3(0,2,0,2)
-				    + t4ddg_2(0,1,2,0)*t4ddg_3(1,0,0,2)
-				    + t4ddg_2(0,1,2,1)*t4ddg_3(1,1,0,2)
-				    + t4ddg_2(0,1,2,2)*t4ddg_3(1,2,0,2)
-				    + t4ddg_2(0,2,2,0)*t4ddg_3(2,0,0,2)
-				    + t4ddg_2(0,2,2,1)*t4ddg_3(2,1,0,2)
-				    + t4ddg_2(0,2,2,2)*t4ddg_3(2,2,0,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,0,2,2)");
-  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,0,0)*t4ddg_3(0,0,1,0)
-				    + t4ddg_2(0,0,0,1)*t4ddg_3(0,1,1,0)
-				    + t4ddg_2(0,0,0,2)*t4ddg_3(0,2,1,0)
-				    + t4ddg_2(0,1,0,0)*t4ddg_3(1,0,1,0)
-				    + t4ddg_2(0,1,0,1)*t4ddg_3(1,1,1,0)
-				    + t4ddg_2(0,1,0,2)*t4ddg_3(1,2,1,0)
-				    + t4ddg_2(0,2,0,0)*t4ddg_3(2,0,1,0)
-				    + t4ddg_2(0,2,0,1)*t4ddg_3(2,1,1,0)
-				    + t4ddg_2(0,2,0,2)*t4ddg_3(2,2,1,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,1,0,0)");
-  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,0,0)*t4ddg_3(0,0,1,1)
-				    + t4ddg_2(0,0,0,1)*t4ddg_3(0,1,1,1)
-				    + t4ddg_2(0,0,0,2)*t4ddg_3(0,2,1,1)
-				    + t4ddg_2(0,1,0,0)*t4ddg_3(1,0,1,1)
-				    + t4ddg_2(0,1,0,1)*t4ddg_3(1,1,1,1)
-				    + t4ddg_2(0,1,0,2)*t4ddg_3(1,2,1,1)
-				    + t4ddg_2(0,2,0,0)*t4ddg_3(2,0,1,1)
-				    + t4ddg_2(0,2,0,1)*t4ddg_3(2,1,1,1)
-				    + t4ddg_2(0,2,0,2)*t4ddg_3(2,2,1,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,1,0,1)");
-  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,0,0)*t4ddg_3(0,0,1,2)
-				    + t4ddg_2(0,0,0,1)*t4ddg_3(0,1,1,2)
-				    + t4ddg_2(0,0,0,2)*t4ddg_3(0,2,1,2)
-				    + t4ddg_2(0,1,0,0)*t4ddg_3(1,0,1,2)
-				    + t4ddg_2(0,1,0,1)*t4ddg_3(1,1,1,2)
-				    + t4ddg_2(0,1,0,2)*t4ddg_3(1,2,1,2)
-				    + t4ddg_2(0,2,0,0)*t4ddg_3(2,0,1,2)
-				    + t4ddg_2(0,2,0,1)*t4ddg_3(2,1,1,2)
-				    + t4ddg_2(0,2,0,2)*t4ddg_3(2,2,1,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,1,0,2)");
-  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,0,1,0)*t4ddg_3(0,0,1,0)
-				    + t4ddg_2(0,0,1,1)*t4ddg_3(0,1,1,0)
-				    + t4ddg_2(0,0,1,2)*t4ddg_3(0,2,1,0)
-				    + t4ddg_2(0,1,1,0)*t4ddg_3(1,0,1,0)
-				    + t4ddg_2(0,1,1,1)*t4ddg_3(1,1,1,0)
-				    + t4ddg_2(0,1,1,2)*t4ddg_3(1,2,1,0)
-				    + t4ddg_2(0,2,1,0)*t4ddg_3(2,0,1,0)
-				    + t4ddg_2(0,2,1,1)*t4ddg_3(2,1,1,0)
-				    + t4ddg_2(0,2,1,2)*t4ddg_3(2,2,1,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,1,1,0)");
-  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,0,1,0)*t4ddg_3(0,0,1,1)
-				    + t4ddg_2(0,0,1,1)*t4ddg_3(0,1,1,1)
-				    + t4ddg_2(0,0,1,2)*t4ddg_3(0,2,1,1)
-				    + t4ddg_2(0,1,1,0)*t4ddg_3(1,0,1,1)
-				    + t4ddg_2(0,1,1,1)*t4ddg_3(1,1,1,1)
-				    + t4ddg_2(0,1,1,2)*t4ddg_3(1,2,1,1)
-				    + t4ddg_2(0,2,1,0)*t4ddg_3(2,0,1,1)
-				    + t4ddg_2(0,2,1,1)*t4ddg_3(2,1,1,1)
-				    + t4ddg_2(0,2,1,2)*t4ddg_3(2,2,1,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,1,1,1)");
-  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,0,1,0)*t4ddg_3(0,0,1,2)
-				    + t4ddg_2(0,0,1,1)*t4ddg_3(0,1,1,2)
-				    + t4ddg_2(0,0,1,2)*t4ddg_3(0,2,1,2)
-				    + t4ddg_2(0,1,1,0)*t4ddg_3(1,0,1,2)
-				    + t4ddg_2(0,1,1,1)*t4ddg_3(1,1,1,2)
-				    + t4ddg_2(0,1,1,2)*t4ddg_3(1,2,1,2)
-				    + t4ddg_2(0,2,1,0)*t4ddg_3(2,0,1,2)
-				    + t4ddg_2(0,2,1,1)*t4ddg_3(2,1,1,2)
-				    + t4ddg_2(0,2,1,2)*t4ddg_3(2,2,1,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,1,1,2)");
-  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,0,2,0)*t4ddg_3(0,0,1,0)
-				    + t4ddg_2(0,0,2,1)*t4ddg_3(0,1,1,0)
-				    + t4ddg_2(0,0,2,2)*t4ddg_3(0,2,1,0)
-				    + t4ddg_2(0,1,2,0)*t4ddg_3(1,0,1,0)
-				    + t4ddg_2(0,1,2,1)*t4ddg_3(1,1,1,0)
-				    + t4ddg_2(0,1,2,2)*t4ddg_3(1,2,1,0)
-				    + t4ddg_2(0,2,2,0)*t4ddg_3(2,0,1,0)
-				    + t4ddg_2(0,2,2,1)*t4ddg_3(2,1,1,0)
-				    + t4ddg_2(0,2,2,2)*t4ddg_3(2,2,1,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,1,2,0)");
-  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,0,2,0)*t4ddg_3(0,0,1,1)
-				    + t4ddg_2(0,0,2,1)*t4ddg_3(0,1,1,1)
-				    + t4ddg_2(0,0,2,2)*t4ddg_3(0,2,1,1)
-				    + t4ddg_2(0,1,2,0)*t4ddg_3(1,0,1,1)
-				    + t4ddg_2(0,1,2,1)*t4ddg_3(1,1,1,1)
-				    + t4ddg_2(0,1,2,2)*t4ddg_3(1,2,1,1)
-				    + t4ddg_2(0,2,2,0)*t4ddg_3(2,0,1,1)
-				    + t4ddg_2(0,2,2,1)*t4ddg_3(2,1,1,1)
-				    + t4ddg_2(0,2,2,2)*t4ddg_3(2,2,1,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,1,2,1)");
-  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,0,2,0)*t4ddg_3(0,0,1,2)
-				    + t4ddg_2(0,0,2,1)*t4ddg_3(0,1,1,2)
-				    + t4ddg_2(0,0,2,2)*t4ddg_3(0,2,1,2)
-				    + t4ddg_2(0,1,2,0)*t4ddg_3(1,0,1,2)
-				    + t4ddg_2(0,1,2,1)*t4ddg_3(1,1,1,2)
-				    + t4ddg_2(0,1,2,2)*t4ddg_3(1,2,1,2)
-				    + t4ddg_2(0,2,2,0)*t4ddg_3(2,0,1,2)
-				    + t4ddg_2(0,2,2,1)*t4ddg_3(2,1,1,2)
-				    + t4ddg_2(0,2,2,2)*t4ddg_3(2,2,1,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,1,2,2)");
-  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,0,0)*t4ddg_3(0,0,2,0)
-				    + t4ddg_2(0,0,0,1)*t4ddg_3(0,1,2,0)
-				    + t4ddg_2(0,0,0,2)*t4ddg_3(0,2,2,0)
-				    + t4ddg_2(0,1,0,0)*t4ddg_3(1,0,2,0)
-				    + t4ddg_2(0,1,0,1)*t4ddg_3(1,1,2,0)
-				    + t4ddg_2(0,1,0,2)*t4ddg_3(1,2,2,0)
-				    + t4ddg_2(0,2,0,0)*t4ddg_3(2,0,2,0)
-				    + t4ddg_2(0,2,0,1)*t4ddg_3(2,1,2,0)
-				    + t4ddg_2(0,2,0,2)*t4ddg_3(2,2,2,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,2,0,0)");
-  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,0,0)*t4ddg_3(0,0,2,1)
-				    + t4ddg_2(0,0,0,1)*t4ddg_3(0,1,2,1)
-				    + t4ddg_2(0,0,0,2)*t4ddg_3(0,2,2,1)
-				    + t4ddg_2(0,1,0,0)*t4ddg_3(1,0,2,1)
-				    + t4ddg_2(0,1,0,1)*t4ddg_3(1,1,2,1)
-				    + t4ddg_2(0,1,0,2)*t4ddg_3(1,2,2,1)
-				    + t4ddg_2(0,2,0,0)*t4ddg_3(2,0,2,1)
-				    + t4ddg_2(0,2,0,1)*t4ddg_3(2,1,2,1)
-				    + t4ddg_2(0,2,0,2)*t4ddg_3(2,2,2,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,2,0,1)");
-  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,0,0)*t4ddg_3(0,0,2,2)
-				    + t4ddg_2(0,0,0,1)*t4ddg_3(0,1,2,2)
-				    + t4ddg_2(0,0,0,2)*t4ddg_3(0,2,2,2)
-				    + t4ddg_2(0,1,0,0)*t4ddg_3(1,0,2,2)
-				    + t4ddg_2(0,1,0,1)*t4ddg_3(1,1,2,2)
-				    + t4ddg_2(0,1,0,2)*t4ddg_3(1,2,2,2)
-				    + t4ddg_2(0,2,0,0)*t4ddg_3(2,0,2,2)
-				    + t4ddg_2(0,2,0,1)*t4ddg_3(2,1,2,2)
-				    + t4ddg_2(0,2,0,2)*t4ddg_3(2,2,2,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,2,0,2)");
-  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,0,1,0)*t4ddg_3(0,0,2,0)
-				    + t4ddg_2(0,0,1,1)*t4ddg_3(0,1,2,0)
-				    + t4ddg_2(0,0,1,2)*t4ddg_3(0,2,2,0)
-				    + t4ddg_2(0,1,1,0)*t4ddg_3(1,0,2,0)
-				    + t4ddg_2(0,1,1,1)*t4ddg_3(1,1,2,0)
-				    + t4ddg_2(0,1,1,2)*t4ddg_3(1,2,2,0)
-				    + t4ddg_2(0,2,1,0)*t4ddg_3(2,0,2,0)
-				    + t4ddg_2(0,2,1,1)*t4ddg_3(2,1,2,0)
-				    + t4ddg_2(0,2,1,2)*t4ddg_3(2,2,2,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,2,1,0)");
-  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,0,1,0)*t4ddg_3(0,0,2,1)
-				    + t4ddg_2(0,0,1,1)*t4ddg_3(0,1,2,1)
-				    + t4ddg_2(0,0,1,2)*t4ddg_3(0,2,2,1)
-				    + t4ddg_2(0,1,1,0)*t4ddg_3(1,0,2,1)
-				    + t4ddg_2(0,1,1,1)*t4ddg_3(1,1,2,1)
-				    + t4ddg_2(0,1,1,2)*t4ddg_3(1,2,2,1)
-				    + t4ddg_2(0,2,1,0)*t4ddg_3(2,0,2,1)
-				    + t4ddg_2(0,2,1,1)*t4ddg_3(2,1,2,1)
-				    + t4ddg_2(0,2,1,2)*t4ddg_3(2,2,2,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,2,1,1)");
-  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,0,1,0)*t4ddg_3(0,0,2,2)
-				    + t4ddg_2(0,0,1,1)*t4ddg_3(0,1,2,2)
-				    + t4ddg_2(0,0,1,2)*t4ddg_3(0,2,2,2)
-				    + t4ddg_2(0,1,1,0)*t4ddg_3(1,0,2,2)
-				    + t4ddg_2(0,1,1,1)*t4ddg_3(1,1,2,2)
-				    + t4ddg_2(0,1,1,2)*t4ddg_3(1,2,2,2)
-				    + t4ddg_2(0,2,1,0)*t4ddg_3(2,0,2,2)
-				    + t4ddg_2(0,2,1,1)*t4ddg_3(2,1,2,2)
-				    + t4ddg_2(0,2,1,2)*t4ddg_3(2,2,2,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,2,1,2)");
-  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,0,2,0)*t4ddg_3(0,0,2,0)
-				    + t4ddg_2(0,0,2,1)*t4ddg_3(0,1,2,0)
-				    + t4ddg_2(0,0,2,2)*t4ddg_3(0,2,2,0)
-				    + t4ddg_2(0,1,2,0)*t4ddg_3(1,0,2,0)
-				    + t4ddg_2(0,1,2,1)*t4ddg_3(1,1,2,0)
-				    + t4ddg_2(0,1,2,2)*t4ddg_3(1,2,2,0)
-				    + t4ddg_2(0,2,2,0)*t4ddg_3(2,0,2,0)
-				    + t4ddg_2(0,2,2,1)*t4ddg_3(2,1,2,0)
-				    + t4ddg_2(0,2,2,2)*t4ddg_3(2,2,2,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,2,2,0)");
-  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,0,2,0)*t4ddg_3(0,0,2,1)
-				    + t4ddg_2(0,0,2,1)*t4ddg_3(0,1,2,1)
-				    + t4ddg_2(0,0,2,2)*t4ddg_3(0,2,2,1)
-				    + t4ddg_2(0,1,2,0)*t4ddg_3(1,0,2,1)
-				    + t4ddg_2(0,1,2,1)*t4ddg_3(1,1,2,1)
-				    + t4ddg_2(0,1,2,2)*t4ddg_3(1,2,2,1)
-				    + t4ddg_2(0,2,2,0)*t4ddg_3(2,0,2,1)
-				    + t4ddg_2(0,2,2,1)*t4ddg_3(2,1,2,1)
-				    + t4ddg_2(0,2,2,2)*t4ddg_3(2,2,2,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,2,2,1)");
-  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,0,2,0)*t4ddg_3(0,0,2,2)
-				    + t4ddg_2(0,0,2,1)*t4ddg_3(0,1,2,2)
-				    + t4ddg_2(0,0,2,2)*t4ddg_3(0,2,2,2)
-				    + t4ddg_2(0,1,2,0)*t4ddg_3(1,0,2,2)
-				    + t4ddg_2(0,1,2,1)*t4ddg_3(1,1,2,2)
-				    + t4ddg_2(0,1,2,2)*t4ddg_3(1,2,2,2)
-				    + t4ddg_2(0,2,2,0)*t4ddg_3(2,0,2,2)
-				    + t4ddg_2(0,2,2,1)*t4ddg_3(2,1,2,2)
-				    + t4ddg_2(0,2,2,2)*t4ddg_3(2,2,2,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,2,2,2)");
-  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)*t4ddg_3(0,0,0,0)
-				    + t4ddg_2(1,0,0,1)*t4ddg_3(0,1,0,0)
-				    + t4ddg_2(1,0,0,2)*t4ddg_3(0,2,0,0)
-				    + t4ddg_2(1,1,0,0)*t4ddg_3(1,0,0,0)
-				    + t4ddg_2(1,1,0,1)*t4ddg_3(1,1,0,0)
-				    + t4ddg_2(1,1,0,2)*t4ddg_3(1,2,0,0)
-				    + t4ddg_2(1,2,0,0)*t4ddg_3(2,0,0,0)
-				    + t4ddg_2(1,2,0,1)*t4ddg_3(2,1,0,0)
-				    + t4ddg_2(1,2,0,2)*t4ddg_3(2,2,0,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,0,0,0)");
-  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,0)*t4ddg_3(0,0,0,1)
-				    + t4ddg_2(1,0,0,1)*t4ddg_3(0,1,0,1)
-				    + t4ddg_2(1,0,0,2)*t4ddg_3(0,2,0,1)
-				    + t4ddg_2(1,1,0,0)*t4ddg_3(1,0,0,1)
-				    + t4ddg_2(1,1,0,1)*t4ddg_3(1,1,0,1)
-				    + t4ddg_2(1,1,0,2)*t4ddg_3(1,2,0,1)
-				    + t4ddg_2(1,2,0,0)*t4ddg_3(2,0,0,1)
-				    + t4ddg_2(1,2,0,1)*t4ddg_3(2,1,0,1)
-				    + t4ddg_2(1,2,0,2)*t4ddg_3(2,2,0,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,0,0,1)");
-  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,0)*t4ddg_3(0,0,0,2)
-				    + t4ddg_2(1,0,0,1)*t4ddg_3(0,1,0,2)
-				    + t4ddg_2(1,0,0,2)*t4ddg_3(0,2,0,2)
-				    + t4ddg_2(1,1,0,0)*t4ddg_3(1,0,0,2)
-				    + t4ddg_2(1,1,0,1)*t4ddg_3(1,1,0,2)
-				    + t4ddg_2(1,1,0,2)*t4ddg_3(1,2,0,2)
-				    + t4ddg_2(1,2,0,0)*t4ddg_3(2,0,0,2)
-				    + t4ddg_2(1,2,0,1)*t4ddg_3(2,1,0,2)
-				    + t4ddg_2(1,2,0,2)*t4ddg_3(2,2,0,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,0,0,2)");
-  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,0,1,0)*t4ddg_3(0,0,0,0)
-				    + t4ddg_2(1,0,1,1)*t4ddg_3(0,1,0,0)
-				    + t4ddg_2(1,0,1,2)*t4ddg_3(0,2,0,0)
-				    + t4ddg_2(1,1,1,0)*t4ddg_3(1,0,0,0)
-				    + t4ddg_2(1,1,1,1)*t4ddg_3(1,1,0,0)
-				    + t4ddg_2(1,1,1,2)*t4ddg_3(1,2,0,0)
-				    + t4ddg_2(1,2,1,0)*t4ddg_3(2,0,0,0)
-				    + t4ddg_2(1,2,1,1)*t4ddg_3(2,1,0,0)
-				    + t4ddg_2(1,2,1,2)*t4ddg_3(2,2,0,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,0,1,0)");
-  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,0,1,0)*t4ddg_3(0,0,0,1)
-				    + t4ddg_2(1,0,1,1)*t4ddg_3(0,1,0,1)
-				    + t4ddg_2(1,0,1,2)*t4ddg_3(0,2,0,1)
-				    + t4ddg_2(1,1,1,0)*t4ddg_3(1,0,0,1)
-				    + t4ddg_2(1,1,1,1)*t4ddg_3(1,1,0,1)
-				    + t4ddg_2(1,1,1,2)*t4ddg_3(1,2,0,1)
-				    + t4ddg_2(1,2,1,0)*t4ddg_3(2,0,0,1)
-				    + t4ddg_2(1,2,1,1)*t4ddg_3(2,1,0,1)
-				    + t4ddg_2(1,2,1,2)*t4ddg_3(2,2,0,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,0,1,1)");
-  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,0,1,0)*t4ddg_3(0,0,0,2)
-				    + t4ddg_2(1,0,1,1)*t4ddg_3(0,1,0,2)
-				    + t4ddg_2(1,0,1,2)*t4ddg_3(0,2,0,2)
-				    + t4ddg_2(1,1,1,0)*t4ddg_3(1,0,0,2)
-				    + t4ddg_2(1,1,1,1)*t4ddg_3(1,1,0,2)
-				    + t4ddg_2(1,1,1,2)*t4ddg_3(1,2,0,2)
-				    + t4ddg_2(1,2,1,0)*t4ddg_3(2,0,0,2)
-				    + t4ddg_2(1,2,1,1)*t4ddg_3(2,1,0,2)
-				    + t4ddg_2(1,2,1,2)*t4ddg_3(2,2,0,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,0,1,2)");
-  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,0,2,0)*t4ddg_3(0,0,0,0)
-				    + t4ddg_2(1,0,2,1)*t4ddg_3(0,1,0,0)
-				    + t4ddg_2(1,0,2,2)*t4ddg_3(0,2,0,0)
-				    + t4ddg_2(1,1,2,0)*t4ddg_3(1,0,0,0)
-				    + t4ddg_2(1,1,2,1)*t4ddg_3(1,1,0,0)
-				    + t4ddg_2(1,1,2,2)*t4ddg_3(1,2,0,0)
-				    + t4ddg_2(1,2,2,0)*t4ddg_3(2,0,0,0)
-				    + t4ddg_2(1,2,2,1)*t4ddg_3(2,1,0,0)
-				    + t4ddg_2(1,2,2,2)*t4ddg_3(2,2,0,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,0,2,0)");
-  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,0,2,0)*t4ddg_3(0,0,0,1)
-				    + t4ddg_2(1,0,2,1)*t4ddg_3(0,1,0,1)
-				    + t4ddg_2(1,0,2,2)*t4ddg_3(0,2,0,1)
-				    + t4ddg_2(1,1,2,0)*t4ddg_3(1,0,0,1)
-				    + t4ddg_2(1,1,2,1)*t4ddg_3(1,1,0,1)
-				    + t4ddg_2(1,1,2,2)*t4ddg_3(1,2,0,1)
-				    + t4ddg_2(1,2,2,0)*t4ddg_3(2,0,0,1)
-				    + t4ddg_2(1,2,2,1)*t4ddg_3(2,1,0,1)
-				    + t4ddg_2(1,2,2,2)*t4ddg_3(2,2,0,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,0,2,1)");
-  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,0,2,0)*t4ddg_3(0,0,0,2)
-				    + t4ddg_2(1,0,2,1)*t4ddg_3(0,1,0,2)
-				    + t4ddg_2(1,0,2,2)*t4ddg_3(0,2,0,2)
-				    + t4ddg_2(1,1,2,0)*t4ddg_3(1,0,0,2)
-				    + t4ddg_2(1,1,2,1)*t4ddg_3(1,1,0,2)
-				    + t4ddg_2(1,1,2,2)*t4ddg_3(1,2,0,2)
-				    + t4ddg_2(1,2,2,0)*t4ddg_3(2,0,0,2)
-				    + t4ddg_2(1,2,2,1)*t4ddg_3(2,1,0,2)
-				    + t4ddg_2(1,2,2,2)*t4ddg_3(2,2,0,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,0,2,2)");
-  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,0,0)*t4ddg_3(0,0,1,0)
-				    + t4ddg_2(1,0,0,1)*t4ddg_3(0,1,1,0)
-				    + t4ddg_2(1,0,0,2)*t4ddg_3(0,2,1,0)
-				    + t4ddg_2(1,1,0,0)*t4ddg_3(1,0,1,0)
-				    + t4ddg_2(1,1,0,1)*t4ddg_3(1,1,1,0)
-				    + t4ddg_2(1,1,0,2)*t4ddg_3(1,2,1,0)
-				    + t4ddg_2(1,2,0,0)*t4ddg_3(2,0,1,0)
-				    + t4ddg_2(1,2,0,1)*t4ddg_3(2,1,1,0)
-				    + t4ddg_2(1,2,0,2)*t4ddg_3(2,2,1,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,1,0,0)");
-  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,0,0)*t4ddg_3(0,0,1,1)
-				    + t4ddg_2(1,0,0,1)*t4ddg_3(0,1,1,1)
-				    + t4ddg_2(1,0,0,2)*t4ddg_3(0,2,1,1)
-				    + t4ddg_2(1,1,0,0)*t4ddg_3(1,0,1,1)
-				    + t4ddg_2(1,1,0,1)*t4ddg_3(1,1,1,1)
-				    + t4ddg_2(1,1,0,2)*t4ddg_3(1,2,1,1)
-				    + t4ddg_2(1,2,0,0)*t4ddg_3(2,0,1,1)
-				    + t4ddg_2(1,2,0,1)*t4ddg_3(2,1,1,1)
-				    + t4ddg_2(1,2,0,2)*t4ddg_3(2,2,1,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,1,0,1)");
-  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,0,0)*t4ddg_3(0,0,1,2)
-				    + t4ddg_2(1,0,0,1)*t4ddg_3(0,1,1,2)
-				    + t4ddg_2(1,0,0,2)*t4ddg_3(0,2,1,2)
-				    + t4ddg_2(1,1,0,0)*t4ddg_3(1,0,1,2)
-				    + t4ddg_2(1,1,0,1)*t4ddg_3(1,1,1,2)
-				    + t4ddg_2(1,1,0,2)*t4ddg_3(1,2,1,2)
-				    + t4ddg_2(1,2,0,0)*t4ddg_3(2,0,1,2)
-				    + t4ddg_2(1,2,0,1)*t4ddg_3(2,1,1,2)
-				    + t4ddg_2(1,2,0,2)*t4ddg_3(2,2,1,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,1,0,2)");
-  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,0,1,0)*t4ddg_3(0,0,1,0)
-				    + t4ddg_2(1,0,1,1)*t4ddg_3(0,1,1,0)
-				    + t4ddg_2(1,0,1,2)*t4ddg_3(0,2,1,0)
-				    + t4ddg_2(1,1,1,0)*t4ddg_3(1,0,1,0)
-				    + t4ddg_2(1,1,1,1)*t4ddg_3(1,1,1,0)
-				    + t4ddg_2(1,1,1,2)*t4ddg_3(1,2,1,0)
-				    + t4ddg_2(1,2,1,0)*t4ddg_3(2,0,1,0)
-				    + t4ddg_2(1,2,1,1)*t4ddg_3(2,1,1,0)
-				    + t4ddg_2(1,2,1,2)*t4ddg_3(2,2,1,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,0,1,0)*t4ddg_3(0,0,1,1)
-				    + t4ddg_2(1,0,1,1)*t4ddg_3(0,1,1,1)
-				    + t4ddg_2(1,0,1,2)*t4ddg_3(0,2,1,1)
-				    + t4ddg_2(1,1,1,0)*t4ddg_3(1,0,1,1)
-				    + t4ddg_2(1,1,1,1)*t4ddg_3(1,1,1,1)
-				    + t4ddg_2(1,1,1,2)*t4ddg_3(1,2,1,1)
-				    + t4ddg_2(1,2,1,0)*t4ddg_3(2,0,1,1)
-				    + t4ddg_2(1,2,1,1)*t4ddg_3(2,1,1,1)
-				    + t4ddg_2(1,2,1,2)*t4ddg_3(2,2,1,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,1,1,1)");
-  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,0,1,0)*t4ddg_3(0,0,1,2)
-				    + t4ddg_2(1,0,1,1)*t4ddg_3(0,1,1,2)
-				    + t4ddg_2(1,0,1,2)*t4ddg_3(0,2,1,2)
-				    + t4ddg_2(1,1,1,0)*t4ddg_3(1,0,1,2)
-				    + t4ddg_2(1,1,1,1)*t4ddg_3(1,1,1,2)
-				    + t4ddg_2(1,1,1,2)*t4ddg_3(1,2,1,2)
-				    + t4ddg_2(1,2,1,0)*t4ddg_3(2,0,1,2)
-				    + t4ddg_2(1,2,1,1)*t4ddg_3(2,1,1,2)
-				    + t4ddg_2(1,2,1,2)*t4ddg_3(2,2,1,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,1,1,2)");
-  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,0,2,0)*t4ddg_3(0,0,1,0)
-				    + t4ddg_2(1,0,2,1)*t4ddg_3(0,1,1,0)
-				    + t4ddg_2(1,0,2,2)*t4ddg_3(0,2,1,0)
-				    + t4ddg_2(1,1,2,0)*t4ddg_3(1,0,1,0)
-				    + t4ddg_2(1,1,2,1)*t4ddg_3(1,1,1,0)
-				    + t4ddg_2(1,1,2,2)*t4ddg_3(1,2,1,0)
-				    + t4ddg_2(1,2,2,0)*t4ddg_3(2,0,1,0)
-				    + t4ddg_2(1,2,2,1)*t4ddg_3(2,1,1,0)
-				    + t4ddg_2(1,2,2,2)*t4ddg_3(2,2,1,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,1,2,0)");
-  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,0,2,0)*t4ddg_3(0,0,1,1)
-				    + t4ddg_2(1,0,2,1)*t4ddg_3(0,1,1,1)
-				    + t4ddg_2(1,0,2,2)*t4ddg_3(0,2,1,1)
-				    + t4ddg_2(1,1,2,0)*t4ddg_3(1,0,1,1)
-				    + t4ddg_2(1,1,2,1)*t4ddg_3(1,1,1,1)
-				    + t4ddg_2(1,1,2,2)*t4ddg_3(1,2,1,1)
-				    + t4ddg_2(1,2,2,0)*t4ddg_3(2,0,1,1)
-				    + t4ddg_2(1,2,2,1)*t4ddg_3(2,1,1,1)
-				    + t4ddg_2(1,2,2,2)*t4ddg_3(2,2,1,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,1,2,1)");
-  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,0,2,0)*t4ddg_3(0,0,1,2)
-				    + t4ddg_2(1,0,2,1)*t4ddg_3(0,1,1,2)
-				    + t4ddg_2(1,0,2,2)*t4ddg_3(0,2,1,2)
-				    + t4ddg_2(1,1,2,0)*t4ddg_3(1,0,1,2)
-				    + t4ddg_2(1,1,2,1)*t4ddg_3(1,1,1,2)
-				    + t4ddg_2(1,1,2,2)*t4ddg_3(1,2,1,2)
-				    + t4ddg_2(1,2,2,0)*t4ddg_3(2,0,1,2)
-				    + t4ddg_2(1,2,2,1)*t4ddg_3(2,1,1,2)
-				    + t4ddg_2(1,2,2,2)*t4ddg_3(2,2,1,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,1,2,2)");
-  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,0,0)*t4ddg_3(0,0,2,0)
-				    + t4ddg_2(1,0,0,1)*t4ddg_3(0,1,2,0)
-				    + t4ddg_2(1,0,0,2)*t4ddg_3(0,2,2,0)
-				    + t4ddg_2(1,1,0,0)*t4ddg_3(1,0,2,0)
-				    + t4ddg_2(1,1,0,1)*t4ddg_3(1,1,2,0)
-				    + t4ddg_2(1,1,0,2)*t4ddg_3(1,2,2,0)
-				    + t4ddg_2(1,2,0,0)*t4ddg_3(2,0,2,0)
-				    + t4ddg_2(1,2,0,1)*t4ddg_3(2,1,2,0)
-				    + t4ddg_2(1,2,0,2)*t4ddg_3(2,2,2,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,2,0,0)");
-  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,0,0)*t4ddg_3(0,0,2,1)
-				    + t4ddg_2(1,0,0,1)*t4ddg_3(0,1,2,1)
-				    + t4ddg_2(1,0,0,2)*t4ddg_3(0,2,2,1)
-				    + t4ddg_2(1,1,0,0)*t4ddg_3(1,0,2,1)
-				    + t4ddg_2(1,1,0,1)*t4ddg_3(1,1,2,1)
-				    + t4ddg_2(1,1,0,2)*t4ddg_3(1,2,2,1)
-				    + t4ddg_2(1,2,0,0)*t4ddg_3(2,0,2,1)
-				    + t4ddg_2(1,2,0,1)*t4ddg_3(2,1,2,1)
-				    + t4ddg_2(1,2,0,2)*t4ddg_3(2,2,2,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,2,0,1)");
-  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,0,0)*t4ddg_3(0,0,2,2)
-				    + t4ddg_2(1,0,0,1)*t4ddg_3(0,1,2,2)
-				    + t4ddg_2(1,0,0,2)*t4ddg_3(0,2,2,2)
-				    + t4ddg_2(1,1,0,0)*t4ddg_3(1,0,2,2)
-				    + t4ddg_2(1,1,0,1)*t4ddg_3(1,1,2,2)
-				    + t4ddg_2(1,1,0,2)*t4ddg_3(1,2,2,2)
-				    + t4ddg_2(1,2,0,0)*t4ddg_3(2,0,2,2)
-				    + t4ddg_2(1,2,0,1)*t4ddg_3(2,1,2,2)
-				    + t4ddg_2(1,2,0,2)*t4ddg_3(2,2,2,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,2,0,2)");
-  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,0,1,0)*t4ddg_3(0,0,2,0)
-				    + t4ddg_2(1,0,1,1)*t4ddg_3(0,1,2,0)
-				    + t4ddg_2(1,0,1,2)*t4ddg_3(0,2,2,0)
-				    + t4ddg_2(1,1,1,0)*t4ddg_3(1,0,2,0)
-				    + t4ddg_2(1,1,1,1)*t4ddg_3(1,1,2,0)
-				    + t4ddg_2(1,1,1,2)*t4ddg_3(1,2,2,0)
-				    + t4ddg_2(1,2,1,0)*t4ddg_3(2,0,2,0)
-				    + t4ddg_2(1,2,1,1)*t4ddg_3(2,1,2,0)
-				    + t4ddg_2(1,2,1,2)*t4ddg_3(2,2,2,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,2,1,0)");
-  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,0,1,0)*t4ddg_3(0,0,2,1)
-				    + t4ddg_2(1,0,1,1)*t4ddg_3(0,1,2,1)
-				    + t4ddg_2(1,0,1,2)*t4ddg_3(0,2,2,1)
-				    + t4ddg_2(1,1,1,0)*t4ddg_3(1,0,2,1)
-				    + t4ddg_2(1,1,1,1)*t4ddg_3(1,1,2,1)
-				    + t4ddg_2(1,1,1,2)*t4ddg_3(1,2,2,1)
-				    + t4ddg_2(1,2,1,0)*t4ddg_3(2,0,2,1)
-				    + t4ddg_2(1,2,1,1)*t4ddg_3(2,1,2,1)
-				    + t4ddg_2(1,2,1,2)*t4ddg_3(2,2,2,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,2,1,1)");
-  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,0,1,0)*t4ddg_3(0,0,2,2)
-				    + t4ddg_2(1,0,1,1)*t4ddg_3(0,1,2,2)
-				    + t4ddg_2(1,0,1,2)*t4ddg_3(0,2,2,2)
-				    + t4ddg_2(1,1,1,0)*t4ddg_3(1,0,2,2)
-				    + t4ddg_2(1,1,1,1)*t4ddg_3(1,1,2,2)
-				    + t4ddg_2(1,1,1,2)*t4ddg_3(1,2,2,2)
-				    + t4ddg_2(1,2,1,0)*t4ddg_3(2,0,2,2)
-				    + t4ddg_2(1,2,1,1)*t4ddg_3(2,1,2,2)
-				    + t4ddg_2(1,2,1,2)*t4ddg_3(2,2,2,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,2,1,2)");
-  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,0,2,0)*t4ddg_3(0,0,2,0)
-				    + t4ddg_2(1,0,2,1)*t4ddg_3(0,1,2,0)
-				    + t4ddg_2(1,0,2,2)*t4ddg_3(0,2,2,0)
-				    + t4ddg_2(1,1,2,0)*t4ddg_3(1,0,2,0)
-				    + t4ddg_2(1,1,2,1)*t4ddg_3(1,1,2,0)
-				    + t4ddg_2(1,1,2,2)*t4ddg_3(1,2,2,0)
-				    + t4ddg_2(1,2,2,0)*t4ddg_3(2,0,2,0)
-				    + t4ddg_2(1,2,2,1)*t4ddg_3(2,1,2,0)
-				    + t4ddg_2(1,2,2,2)*t4ddg_3(2,2,2,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,2,2,0)");
-  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,0,2,0)*t4ddg_3(0,0,2,1)
-				    + t4ddg_2(1,0,2,1)*t4ddg_3(0,1,2,1)
-				    + t4ddg_2(1,0,2,2)*t4ddg_3(0,2,2,1)
-				    + t4ddg_2(1,1,2,0)*t4ddg_3(1,0,2,1)
-				    + t4ddg_2(1,1,2,1)*t4ddg_3(1,1,2,1)
-				    + t4ddg_2(1,1,2,2)*t4ddg_3(1,2,2,1)
-				    + t4ddg_2(1,2,2,0)*t4ddg_3(2,0,2,1)
-				    + t4ddg_2(1,2,2,1)*t4ddg_3(2,1,2,1)
-				    + t4ddg_2(1,2,2,2)*t4ddg_3(2,2,2,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,2,2,1)");
-  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,0,2,0)*t4ddg_3(0,0,2,2)
-				    + t4ddg_2(1,0,2,1)*t4ddg_3(0,1,2,2)
-				    + t4ddg_2(1,0,2,2)*t4ddg_3(0,2,2,2)
-				    + t4ddg_2(1,1,2,0)*t4ddg_3(1,0,2,2)
-				    + t4ddg_2(1,1,2,1)*t4ddg_3(1,1,2,2)
-				    + t4ddg_2(1,1,2,2)*t4ddg_3(1,2,2,2)
-				    + t4ddg_2(1,2,2,0)*t4ddg_3(2,0,2,2)
-				    + t4ddg_2(1,2,2,1)*t4ddg_3(2,1,2,2)
-				    + t4ddg_2(1,2,2,2)*t4ddg_3(2,2,2,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,2,2,2)");
-  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)*t4ddg_3(0,0,0,0)
-				    + t4ddg_2(2,0,0,1)*t4ddg_3(0,1,0,0)
-				    + t4ddg_2(2,0,0,2)*t4ddg_3(0,2,0,0)
-				    + t4ddg_2(2,1,0,0)*t4ddg_3(1,0,0,0)
-				    + t4ddg_2(2,1,0,1)*t4ddg_3(1,1,0,0)
-				    + t4ddg_2(2,1,0,2)*t4ddg_3(1,2,0,0)
-				    + t4ddg_2(2,2,0,0)*t4ddg_3(2,0,0,0)
-				    + t4ddg_2(2,2,0,1)*t4ddg_3(2,1,0,0)
-				    + t4ddg_2(2,2,0,2)*t4ddg_3(2,2,0,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,0,0,0)");
-  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,0)*t4ddg_3(0,0,0,1)
-				    + t4ddg_2(2,0,0,1)*t4ddg_3(0,1,0,1)
-				    + t4ddg_2(2,0,0,2)*t4ddg_3(0,2,0,1)
-				    + t4ddg_2(2,1,0,0)*t4ddg_3(1,0,0,1)
-				    + t4ddg_2(2,1,0,1)*t4ddg_3(1,1,0,1)
-				    + t4ddg_2(2,1,0,2)*t4ddg_3(1,2,0,1)
-				    + t4ddg_2(2,2,0,0)*t4ddg_3(2,0,0,1)
-				    + t4ddg_2(2,2,0,1)*t4ddg_3(2,1,0,1)
-				    + t4ddg_2(2,2,0,2)*t4ddg_3(2,2,0,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,0,0,1)");
-  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,0)*t4ddg_3(0,0,0,2)
-				    + t4ddg_2(2,0,0,1)*t4ddg_3(0,1,0,2)
-				    + t4ddg_2(2,0,0,2)*t4ddg_3(0,2,0,2)
-				    + t4ddg_2(2,1,0,0)*t4ddg_3(1,0,0,2)
-				    + t4ddg_2(2,1,0,1)*t4ddg_3(1,1,0,2)
-				    + t4ddg_2(2,1,0,2)*t4ddg_3(1,2,0,2)
-				    + t4ddg_2(2,2,0,0)*t4ddg_3(2,0,0,2)
-				    + t4ddg_2(2,2,0,1)*t4ddg_3(2,1,0,2)
-				    + t4ddg_2(2,2,0,2)*t4ddg_3(2,2,0,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,0,0,2)");
-  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,0,1,0)*t4ddg_3(0,0,0,0)
-				    + t4ddg_2(2,0,1,1)*t4ddg_3(0,1,0,0)
-				    + t4ddg_2(2,0,1,2)*t4ddg_3(0,2,0,0)
-				    + t4ddg_2(2,1,1,0)*t4ddg_3(1,0,0,0)
-				    + t4ddg_2(2,1,1,1)*t4ddg_3(1,1,0,0)
-				    + t4ddg_2(2,1,1,2)*t4ddg_3(1,2,0,0)
-				    + t4ddg_2(2,2,1,0)*t4ddg_3(2,0,0,0)
-				    + t4ddg_2(2,2,1,1)*t4ddg_3(2,1,0,0)
-				    + t4ddg_2(2,2,1,2)*t4ddg_3(2,2,0,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,0,1,0)");
-  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,0,1,0)*t4ddg_3(0,0,0,1)
-				    + t4ddg_2(2,0,1,1)*t4ddg_3(0,1,0,1)
-				    + t4ddg_2(2,0,1,2)*t4ddg_3(0,2,0,1)
-				    + t4ddg_2(2,1,1,0)*t4ddg_3(1,0,0,1)
-				    + t4ddg_2(2,1,1,1)*t4ddg_3(1,1,0,1)
-				    + t4ddg_2(2,1,1,2)*t4ddg_3(1,2,0,1)
-				    + t4ddg_2(2,2,1,0)*t4ddg_3(2,0,0,1)
-				    + t4ddg_2(2,2,1,1)*t4ddg_3(2,1,0,1)
-				    + t4ddg_2(2,2,1,2)*t4ddg_3(2,2,0,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,0,1,1)");
-  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,0,1,0)*t4ddg_3(0,0,0,2)
-				    + t4ddg_2(2,0,1,1)*t4ddg_3(0,1,0,2)
-				    + t4ddg_2(2,0,1,2)*t4ddg_3(0,2,0,2)
-				    + t4ddg_2(2,1,1,0)*t4ddg_3(1,0,0,2)
-				    + t4ddg_2(2,1,1,1)*t4ddg_3(1,1,0,2)
-				    + t4ddg_2(2,1,1,2)*t4ddg_3(1,2,0,2)
-				    + t4ddg_2(2,2,1,0)*t4ddg_3(2,0,0,2)
-				    + t4ddg_2(2,2,1,1)*t4ddg_3(2,1,0,2)
-				    + t4ddg_2(2,2,1,2)*t4ddg_3(2,2,0,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,0,1,2)");
-  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,0,2,0)*t4ddg_3(0,0,0,0)
-				    + t4ddg_2(2,0,2,1)*t4ddg_3(0,1,0,0)
-				    + t4ddg_2(2,0,2,2)*t4ddg_3(0,2,0,0)
-				    + t4ddg_2(2,1,2,0)*t4ddg_3(1,0,0,0)
-				    + t4ddg_2(2,1,2,1)*t4ddg_3(1,1,0,0)
-				    + t4ddg_2(2,1,2,2)*t4ddg_3(1,2,0,0)
-				    + t4ddg_2(2,2,2,0)*t4ddg_3(2,0,0,0)
-				    + t4ddg_2(2,2,2,1)*t4ddg_3(2,1,0,0)
-				    + t4ddg_2(2,2,2,2)*t4ddg_3(2,2,0,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,0,2,0)");
-  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,0,2,0)*t4ddg_3(0,0,0,1)
-				    + t4ddg_2(2,0,2,1)*t4ddg_3(0,1,0,1)
-				    + t4ddg_2(2,0,2,2)*t4ddg_3(0,2,0,1)
-				    + t4ddg_2(2,1,2,0)*t4ddg_3(1,0,0,1)
-				    + t4ddg_2(2,1,2,1)*t4ddg_3(1,1,0,1)
-				    + t4ddg_2(2,1,2,2)*t4ddg_3(1,2,0,1)
-				    + t4ddg_2(2,2,2,0)*t4ddg_3(2,0,0,1)
-				    + t4ddg_2(2,2,2,1)*t4ddg_3(2,1,0,1)
-				    + t4ddg_2(2,2,2,2)*t4ddg_3(2,2,0,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,0,2,1)");
-  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,0,2,0)*t4ddg_3(0,0,0,2)
-				    + t4ddg_2(2,0,2,1)*t4ddg_3(0,1,0,2)
-				    + t4ddg_2(2,0,2,2)*t4ddg_3(0,2,0,2)
-				    + t4ddg_2(2,1,2,0)*t4ddg_3(1,0,0,2)
-				    + t4ddg_2(2,1,2,1)*t4ddg_3(1,1,0,2)
-				    + t4ddg_2(2,1,2,2)*t4ddg_3(1,2,0,2)
-				    + t4ddg_2(2,2,2,0)*t4ddg_3(2,0,0,2)
-				    + t4ddg_2(2,2,2,1)*t4ddg_3(2,1,0,2)
-				    + t4ddg_2(2,2,2,2)*t4ddg_3(2,2,0,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,0,2,2)");
-  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,0,0)*t4ddg_3(0,0,1,0)
-				    + t4ddg_2(2,0,0,1)*t4ddg_3(0,1,1,0)
-				    + t4ddg_2(2,0,0,2)*t4ddg_3(0,2,1,0)
-				    + t4ddg_2(2,1,0,0)*t4ddg_3(1,0,1,0)
-				    + t4ddg_2(2,1,0,1)*t4ddg_3(1,1,1,0)
-				    + t4ddg_2(2,1,0,2)*t4ddg_3(1,2,1,0)
-				    + t4ddg_2(2,2,0,0)*t4ddg_3(2,0,1,0)
-				    + t4ddg_2(2,2,0,1)*t4ddg_3(2,1,1,0)
-				    + t4ddg_2(2,2,0,2)*t4ddg_3(2,2,1,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,1,0,0)");
-  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,0,0)*t4ddg_3(0,0,1,1)
-				    + t4ddg_2(2,0,0,1)*t4ddg_3(0,1,1,1)
-				    + t4ddg_2(2,0,0,2)*t4ddg_3(0,2,1,1)
-				    + t4ddg_2(2,1,0,0)*t4ddg_3(1,0,1,1)
-				    + t4ddg_2(2,1,0,1)*t4ddg_3(1,1,1,1)
-				    + t4ddg_2(2,1,0,2)*t4ddg_3(1,2,1,1)
-				    + t4ddg_2(2,2,0,0)*t4ddg_3(2,0,1,1)
-				    + t4ddg_2(2,2,0,1)*t4ddg_3(2,1,1,1)
-				    + t4ddg_2(2,2,0,2)*t4ddg_3(2,2,1,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,1,0,1)");
-  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,0,0)*t4ddg_3(0,0,1,2)
-				    + t4ddg_2(2,0,0,1)*t4ddg_3(0,1,1,2)
-				    + t4ddg_2(2,0,0,2)*t4ddg_3(0,2,1,2)
-				    + t4ddg_2(2,1,0,0)*t4ddg_3(1,0,1,2)
-				    + t4ddg_2(2,1,0,1)*t4ddg_3(1,1,1,2)
-				    + t4ddg_2(2,1,0,2)*t4ddg_3(1,2,1,2)
-				    + t4ddg_2(2,2,0,0)*t4ddg_3(2,0,1,2)
-				    + t4ddg_2(2,2,0,1)*t4ddg_3(2,1,1,2)
-				    + t4ddg_2(2,2,0,2)*t4ddg_3(2,2,1,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,1,0,2)");
-  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,0,1,0)*t4ddg_3(0,0,1,0)
-				    + t4ddg_2(2,0,1,1)*t4ddg_3(0,1,1,0)
-				    + t4ddg_2(2,0,1,2)*t4ddg_3(0,2,1,0)
-				    + t4ddg_2(2,1,1,0)*t4ddg_3(1,0,1,0)
-				    + t4ddg_2(2,1,1,1)*t4ddg_3(1,1,1,0)
-				    + t4ddg_2(2,1,1,2)*t4ddg_3(1,2,1,0)
-				    + t4ddg_2(2,2,1,0)*t4ddg_3(2,0,1,0)
-				    + t4ddg_2(2,2,1,1)*t4ddg_3(2,1,1,0)
-				    + t4ddg_2(2,2,1,2)*t4ddg_3(2,2,1,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,1,1,0)");
-  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,0,1,0)*t4ddg_3(0,0,1,1)
-				    + t4ddg_2(2,0,1,1)*t4ddg_3(0,1,1,1)
-				    + t4ddg_2(2,0,1,2)*t4ddg_3(0,2,1,1)
-				    + t4ddg_2(2,1,1,0)*t4ddg_3(1,0,1,1)
-				    + t4ddg_2(2,1,1,1)*t4ddg_3(1,1,1,1)
-				    + t4ddg_2(2,1,1,2)*t4ddg_3(1,2,1,1)
-				    + t4ddg_2(2,2,1,0)*t4ddg_3(2,0,1,1)
-				    + t4ddg_2(2,2,1,1)*t4ddg_3(2,1,1,1)
-				    + t4ddg_2(2,2,1,2)*t4ddg_3(2,2,1,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,1,1,1)");
-  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,0,1,0)*t4ddg_3(0,0,1,2)
-				    + t4ddg_2(2,0,1,1)*t4ddg_3(0,1,1,2)
-				    + t4ddg_2(2,0,1,2)*t4ddg_3(0,2,1,2)
-				    + t4ddg_2(2,1,1,0)*t4ddg_3(1,0,1,2)
-				    + t4ddg_2(2,1,1,1)*t4ddg_3(1,1,1,2)
-				    + t4ddg_2(2,1,1,2)*t4ddg_3(1,2,1,2)
-				    + t4ddg_2(2,2,1,0)*t4ddg_3(2,0,1,2)
-				    + t4ddg_2(2,2,1,1)*t4ddg_3(2,1,1,2)
-				    + t4ddg_2(2,2,1,2)*t4ddg_3(2,2,1,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,1,1,2)");
-  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,0,2,0)*t4ddg_3(0,0,1,0)
-				    + t4ddg_2(2,0,2,1)*t4ddg_3(0,1,1,0)
-				    + t4ddg_2(2,0,2,2)*t4ddg_3(0,2,1,0)
-				    + t4ddg_2(2,1,2,0)*t4ddg_3(1,0,1,0)
-				    + t4ddg_2(2,1,2,1)*t4ddg_3(1,1,1,0)
-				    + t4ddg_2(2,1,2,2)*t4ddg_3(1,2,1,0)
-				    + t4ddg_2(2,2,2,0)*t4ddg_3(2,0,1,0)
-				    + t4ddg_2(2,2,2,1)*t4ddg_3(2,1,1,0)
-				    + t4ddg_2(2,2,2,2)*t4ddg_3(2,2,1,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,1,2,0)");
-  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,0,2,0)*t4ddg_3(0,0,1,1)
-				    + t4ddg_2(2,0,2,1)*t4ddg_3(0,1,1,1)
-				    + t4ddg_2(2,0,2,2)*t4ddg_3(0,2,1,1)
-				    + t4ddg_2(2,1,2,0)*t4ddg_3(1,0,1,1)
-				    + t4ddg_2(2,1,2,1)*t4ddg_3(1,1,1,1)
-				    + t4ddg_2(2,1,2,2)*t4ddg_3(1,2,1,1)
-				    + t4ddg_2(2,2,2,0)*t4ddg_3(2,0,1,1)
-				    + t4ddg_2(2,2,2,1)*t4ddg_3(2,1,1,1)
-				    + t4ddg_2(2,2,2,2)*t4ddg_3(2,2,1,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,1,2,1)");
-  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,0,2,0)*t4ddg_3(0,0,1,2)
-				    + t4ddg_2(2,0,2,1)*t4ddg_3(0,1,1,2)
-				    + t4ddg_2(2,0,2,2)*t4ddg_3(0,2,1,2)
-				    + t4ddg_2(2,1,2,0)*t4ddg_3(1,0,1,2)
-				    + t4ddg_2(2,1,2,1)*t4ddg_3(1,1,1,2)
-				    + t4ddg_2(2,1,2,2)*t4ddg_3(1,2,1,2)
-				    + t4ddg_2(2,2,2,0)*t4ddg_3(2,0,1,2)
-				    + t4ddg_2(2,2,2,1)*t4ddg_3(2,1,1,2)
-				    + t4ddg_2(2,2,2,2)*t4ddg_3(2,2,1,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,1,2,2)");
-  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,0,0)*t4ddg_3(0,0,2,0)
-				    + t4ddg_2(2,0,0,1)*t4ddg_3(0,1,2,0)
-				    + t4ddg_2(2,0,0,2)*t4ddg_3(0,2,2,0)
-				    + t4ddg_2(2,1,0,0)*t4ddg_3(1,0,2,0)
-				    + t4ddg_2(2,1,0,1)*t4ddg_3(1,1,2,0)
-				    + t4ddg_2(2,1,0,2)*t4ddg_3(1,2,2,0)
-				    + t4ddg_2(2,2,0,0)*t4ddg_3(2,0,2,0)
-				    + t4ddg_2(2,2,0,1)*t4ddg_3(2,1,2,0)
-				    + t4ddg_2(2,2,0,2)*t4ddg_3(2,2,2,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,2,0,0)");
-  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,0,0)*t4ddg_3(0,0,2,1)
-				    + t4ddg_2(2,0,0,1)*t4ddg_3(0,1,2,1)
-				    + t4ddg_2(2,0,0,2)*t4ddg_3(0,2,2,1)
-				    + t4ddg_2(2,1,0,0)*t4ddg_3(1,0,2,1)
-				    + t4ddg_2(2,1,0,1)*t4ddg_3(1,1,2,1)
-				    + t4ddg_2(2,1,0,2)*t4ddg_3(1,2,2,1)
-				    + t4ddg_2(2,2,0,0)*t4ddg_3(2,0,2,1)
-				    + t4ddg_2(2,2,0,1)*t4ddg_3(2,1,2,1)
-				    + t4ddg_2(2,2,0,2)*t4ddg_3(2,2,2,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,2,0,1)");
-  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,0,0)*t4ddg_3(0,0,2,2)
-				    + t4ddg_2(2,0,0,1)*t4ddg_3(0,1,2,2)
-				    + t4ddg_2(2,0,0,2)*t4ddg_3(0,2,2,2)
-				    + t4ddg_2(2,1,0,0)*t4ddg_3(1,0,2,2)
-				    + t4ddg_2(2,1,0,1)*t4ddg_3(1,1,2,2)
-				    + t4ddg_2(2,1,0,2)*t4ddg_3(1,2,2,2)
-				    + t4ddg_2(2,2,0,0)*t4ddg_3(2,0,2,2)
-				    + t4ddg_2(2,2,0,1)*t4ddg_3(2,1,2,2)
-				    + t4ddg_2(2,2,0,2)*t4ddg_3(2,2,2,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,2,0,2)");
-  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,0,1,0)*t4ddg_3(0,0,2,0)
-				    + t4ddg_2(2,0,1,1)*t4ddg_3(0,1,2,0)
-				    + t4ddg_2(2,0,1,2)*t4ddg_3(0,2,2,0)
-				    + t4ddg_2(2,1,1,0)*t4ddg_3(1,0,2,0)
-				    + t4ddg_2(2,1,1,1)*t4ddg_3(1,1,2,0)
-				    + t4ddg_2(2,1,1,2)*t4ddg_3(1,2,2,0)
-				    + t4ddg_2(2,2,1,0)*t4ddg_3(2,0,2,0)
-				    + t4ddg_2(2,2,1,1)*t4ddg_3(2,1,2,0)
-				    + t4ddg_2(2,2,1,2)*t4ddg_3(2,2,2,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,2,1,0)");
-  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,0,1,0)*t4ddg_3(0,0,2,1)
-				    + t4ddg_2(2,0,1,1)*t4ddg_3(0,1,2,1)
-				    + t4ddg_2(2,0,1,2)*t4ddg_3(0,2,2,1)
-				    + t4ddg_2(2,1,1,0)*t4ddg_3(1,0,2,1)
-				    + t4ddg_2(2,1,1,1)*t4ddg_3(1,1,2,1)
-				    + t4ddg_2(2,1,1,2)*t4ddg_3(1,2,2,1)
-				    + t4ddg_2(2,2,1,0)*t4ddg_3(2,0,2,1)
-				    + t4ddg_2(2,2,1,1)*t4ddg_3(2,1,2,1)
-				    + t4ddg_2(2,2,1,2)*t4ddg_3(2,2,2,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,2,1,1)");
-  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,0,1,0)*t4ddg_3(0,0,2,2)
-				    + t4ddg_2(2,0,1,1)*t4ddg_3(0,1,2,2)
-				    + t4ddg_2(2,0,1,2)*t4ddg_3(0,2,2,2)
-				    + t4ddg_2(2,1,1,0)*t4ddg_3(1,0,2,2)
-				    + t4ddg_2(2,1,1,1)*t4ddg_3(1,1,2,2)
-				    + t4ddg_2(2,1,1,2)*t4ddg_3(1,2,2,2)
-				    + t4ddg_2(2,2,1,0)*t4ddg_3(2,0,2,2)
-				    + t4ddg_2(2,2,1,1)*t4ddg_3(2,1,2,2)
-				    + t4ddg_2(2,2,1,2)*t4ddg_3(2,2,2,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,2,1,2)");
-  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,0,2,0)*t4ddg_3(0,0,2,0)
-				    + t4ddg_2(2,0,2,1)*t4ddg_3(0,1,2,0)
-				    + t4ddg_2(2,0,2,2)*t4ddg_3(0,2,2,0)
-				    + t4ddg_2(2,1,2,0)*t4ddg_3(1,0,2,0)
-				    + t4ddg_2(2,1,2,1)*t4ddg_3(1,1,2,0)
-				    + t4ddg_2(2,1,2,2)*t4ddg_3(1,2,2,0)
-				    + t4ddg_2(2,2,2,0)*t4ddg_3(2,0,2,0)
-				    + t4ddg_2(2,2,2,1)*t4ddg_3(2,1,2,0)
-				    + t4ddg_2(2,2,2,2)*t4ddg_3(2,2,2,0))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,2,2,0)");
-  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,0,2,0)*t4ddg_3(0,0,2,1)
-				    + t4ddg_2(2,0,2,1)*t4ddg_3(0,1,2,1)
-				    + t4ddg_2(2,0,2,2)*t4ddg_3(0,2,2,1)
-				    + t4ddg_2(2,1,2,0)*t4ddg_3(1,0,2,1)
-				    + t4ddg_2(2,1,2,1)*t4ddg_3(1,1,2,1)
-				    + t4ddg_2(2,1,2,2)*t4ddg_3(1,2,2,1)
-				    + t4ddg_2(2,2,2,0)*t4ddg_3(2,0,2,1)
-				    + t4ddg_2(2,2,2,1)*t4ddg_3(2,1,2,1)
-				    + t4ddg_2(2,2,2,2)*t4ddg_3(2,2,2,1))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,0,2,0)*t4ddg_3(0,0,2,2)
-				    + t4ddg_2(2,0,2,1)*t4ddg_3(0,1,2,2)
-				    + t4ddg_2(2,0,2,2)*t4ddg_3(0,2,2,2)
-				    + t4ddg_2(2,1,2,0)*t4ddg_3(1,0,2,2)
-				    + t4ddg_2(2,1,2,1)*t4ddg_3(1,1,2,2)
-				    + t4ddg_2(2,1,2,2)*t4ddg_3(1,2,2,2)
-				    + t4ddg_2(2,2,2,0)*t4ddg_3(2,0,2,2)
-				    + t4ddg_2(2,2,2,1)*t4ddg_3(2,1,2,2)
-				    + t4ddg_2(2,2,2,2)*t4ddg_3(2,2,2,2))
-		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,2,2,2)");
-  cout << endl;
-
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T4ddg/test_T4ddgII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T4ddg/test_T4ddgII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,849 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T4ddgII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+		Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+		Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+		const Tensor2<double,3,3> &t2_3,
+		Tensor2_symmetric<double,3> &t2s_1,
+		const Tensor2_symmetric<double,3> &t2s_2,
+		const Tensor2_symmetric<double,3> &t2s_3,
+		Tensor3_dg<double,3,3> &t3dg_1,
+		const Tensor3_dg<double,3,3> &t3dg_2,
+		const Tensor3_dg<double,3,3> &t3dg_3,
+		Tensor3_christof<double,3,3> &t3ch_1,
+		const Tensor3_christof<double,3,3> &t3ch_2,
+		const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  Tensor4_ddg<double,3,3> t4ddg_1, t4ddg_2, t4ddg_3;
+
+  t4ddg_2(i,k,j,l)=t2s_2(i,k)*t2s_2(j,l);
+  t4ddg_3(i,l,j,k)=t2s_2(i,l)*t2s_2(j,k);
+  t4ddg_1(i,k,m,n)=(t4ddg_2(i,j,k,l) ^ t4ddg_3(j,l,m,n));
+  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)*t4ddg_3(0,0,0,0)
+				    + t4ddg_2(0,0,0,1)*t4ddg_3(0,1,0,0)
+				    + t4ddg_2(0,0,0,2)*t4ddg_3(0,2,0,0)
+				    + t4ddg_2(0,1,0,0)*t4ddg_3(1,0,0,0)
+				    + t4ddg_2(0,1,0,1)*t4ddg_3(1,1,0,0)
+				    + t4ddg_2(0,1,0,2)*t4ddg_3(1,2,0,0)
+				    + t4ddg_2(0,2,0,0)*t4ddg_3(2,0,0,0)
+				    + t4ddg_2(0,2,0,1)*t4ddg_3(2,1,0,0)
+				    + t4ddg_2(0,2,0,2)*t4ddg_3(2,2,0,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,0,0,0)");
+  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,0)*t4ddg_3(0,0,0,1)
+				    + t4ddg_2(0,0,0,1)*t4ddg_3(0,1,0,1)
+				    + t4ddg_2(0,0,0,2)*t4ddg_3(0,2,0,1)
+				    + t4ddg_2(0,1,0,0)*t4ddg_3(1,0,0,1)
+				    + t4ddg_2(0,1,0,1)*t4ddg_3(1,1,0,1)
+				    + t4ddg_2(0,1,0,2)*t4ddg_3(1,2,0,1)
+				    + t4ddg_2(0,2,0,0)*t4ddg_3(2,0,0,1)
+				    + t4ddg_2(0,2,0,1)*t4ddg_3(2,1,0,1)
+				    + t4ddg_2(0,2,0,2)*t4ddg_3(2,2,0,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,0,0,1)");
+  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,0)*t4ddg_3(0,0,0,2)
+				    + t4ddg_2(0,0,0,1)*t4ddg_3(0,1,0,2)
+				    + t4ddg_2(0,0,0,2)*t4ddg_3(0,2,0,2)
+				    + t4ddg_2(0,1,0,0)*t4ddg_3(1,0,0,2)
+				    + t4ddg_2(0,1,0,1)*t4ddg_3(1,1,0,2)
+				    + t4ddg_2(0,1,0,2)*t4ddg_3(1,2,0,2)
+				    + t4ddg_2(0,2,0,0)*t4ddg_3(2,0,0,2)
+				    + t4ddg_2(0,2,0,1)*t4ddg_3(2,1,0,2)
+				    + t4ddg_2(0,2,0,2)*t4ddg_3(2,2,0,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,0,0,2)");
+  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,0,1,0)*t4ddg_3(0,0,0,0)
+				    + t4ddg_2(0,0,1,1)*t4ddg_3(0,1,0,0)
+				    + t4ddg_2(0,0,1,2)*t4ddg_3(0,2,0,0)
+				    + t4ddg_2(0,1,1,0)*t4ddg_3(1,0,0,0)
+				    + t4ddg_2(0,1,1,1)*t4ddg_3(1,1,0,0)
+				    + t4ddg_2(0,1,1,2)*t4ddg_3(1,2,0,0)
+				    + t4ddg_2(0,2,1,0)*t4ddg_3(2,0,0,0)
+				    + t4ddg_2(0,2,1,1)*t4ddg_3(2,1,0,0)
+				    + t4ddg_2(0,2,1,2)*t4ddg_3(2,2,0,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,0,1,0)");
+  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,0,1,0)*t4ddg_3(0,0,0,1)
+				    + t4ddg_2(0,0,1,1)*t4ddg_3(0,1,0,1)
+				    + t4ddg_2(0,0,1,2)*t4ddg_3(0,2,0,1)
+				    + t4ddg_2(0,1,1,0)*t4ddg_3(1,0,0,1)
+				    + t4ddg_2(0,1,1,1)*t4ddg_3(1,1,0,1)
+				    + t4ddg_2(0,1,1,2)*t4ddg_3(1,2,0,1)
+				    + t4ddg_2(0,2,1,0)*t4ddg_3(2,0,0,1)
+				    + t4ddg_2(0,2,1,1)*t4ddg_3(2,1,0,1)
+				    + t4ddg_2(0,2,1,2)*t4ddg_3(2,2,0,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,0,1,1)");
+  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,0,1,0)*t4ddg_3(0,0,0,2)
+				    + t4ddg_2(0,0,1,1)*t4ddg_3(0,1,0,2)
+				    + t4ddg_2(0,0,1,2)*t4ddg_3(0,2,0,2)
+				    + t4ddg_2(0,1,1,0)*t4ddg_3(1,0,0,2)
+				    + t4ddg_2(0,1,1,1)*t4ddg_3(1,1,0,2)
+				    + t4ddg_2(0,1,1,2)*t4ddg_3(1,2,0,2)
+				    + t4ddg_2(0,2,1,0)*t4ddg_3(2,0,0,2)
+				    + t4ddg_2(0,2,1,1)*t4ddg_3(2,1,0,2)
+				    + t4ddg_2(0,2,1,2)*t4ddg_3(2,2,0,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,0,1,2)");
+  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,0,2,0)*t4ddg_3(0,0,0,0)
+				    + t4ddg_2(0,0,2,1)*t4ddg_3(0,1,0,0)
+				    + t4ddg_2(0,0,2,2)*t4ddg_3(0,2,0,0)
+				    + t4ddg_2(0,1,2,0)*t4ddg_3(1,0,0,0)
+				    + t4ddg_2(0,1,2,1)*t4ddg_3(1,1,0,0)
+				    + t4ddg_2(0,1,2,2)*t4ddg_3(1,2,0,0)
+				    + t4ddg_2(0,2,2,0)*t4ddg_3(2,0,0,0)
+				    + t4ddg_2(0,2,2,1)*t4ddg_3(2,1,0,0)
+				    + t4ddg_2(0,2,2,2)*t4ddg_3(2,2,0,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,0,2,0)");
+  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,0,2,0)*t4ddg_3(0,0,0,1)
+				    + t4ddg_2(0,0,2,1)*t4ddg_3(0,1,0,1)
+				    + t4ddg_2(0,0,2,2)*t4ddg_3(0,2,0,1)
+				    + t4ddg_2(0,1,2,0)*t4ddg_3(1,0,0,1)
+				    + t4ddg_2(0,1,2,1)*t4ddg_3(1,1,0,1)
+				    + t4ddg_2(0,1,2,2)*t4ddg_3(1,2,0,1)
+				    + t4ddg_2(0,2,2,0)*t4ddg_3(2,0,0,1)
+				    + t4ddg_2(0,2,2,1)*t4ddg_3(2,1,0,1)
+				    + t4ddg_2(0,2,2,2)*t4ddg_3(2,2,0,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,0,2,1)");
+  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,0,2,0)*t4ddg_3(0,0,0,2)
+				    + t4ddg_2(0,0,2,1)*t4ddg_3(0,1,0,2)
+				    + t4ddg_2(0,0,2,2)*t4ddg_3(0,2,0,2)
+				    + t4ddg_2(0,1,2,0)*t4ddg_3(1,0,0,2)
+				    + t4ddg_2(0,1,2,1)*t4ddg_3(1,1,0,2)
+				    + t4ddg_2(0,1,2,2)*t4ddg_3(1,2,0,2)
+				    + t4ddg_2(0,2,2,0)*t4ddg_3(2,0,0,2)
+				    + t4ddg_2(0,2,2,1)*t4ddg_3(2,1,0,2)
+				    + t4ddg_2(0,2,2,2)*t4ddg_3(2,2,0,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,0,2,2)");
+  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,0,0)*t4ddg_3(0,0,1,0)
+				    + t4ddg_2(0,0,0,1)*t4ddg_3(0,1,1,0)
+				    + t4ddg_2(0,0,0,2)*t4ddg_3(0,2,1,0)
+				    + t4ddg_2(0,1,0,0)*t4ddg_3(1,0,1,0)
+				    + t4ddg_2(0,1,0,1)*t4ddg_3(1,1,1,0)
+				    + t4ddg_2(0,1,0,2)*t4ddg_3(1,2,1,0)
+				    + t4ddg_2(0,2,0,0)*t4ddg_3(2,0,1,0)
+				    + t4ddg_2(0,2,0,1)*t4ddg_3(2,1,1,0)
+				    + t4ddg_2(0,2,0,2)*t4ddg_3(2,2,1,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,1,0,0)");
+  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,0,0)*t4ddg_3(0,0,1,1)
+				    + t4ddg_2(0,0,0,1)*t4ddg_3(0,1,1,1)
+				    + t4ddg_2(0,0,0,2)*t4ddg_3(0,2,1,1)
+				    + t4ddg_2(0,1,0,0)*t4ddg_3(1,0,1,1)
+				    + t4ddg_2(0,1,0,1)*t4ddg_3(1,1,1,1)
+				    + t4ddg_2(0,1,0,2)*t4ddg_3(1,2,1,1)
+				    + t4ddg_2(0,2,0,0)*t4ddg_3(2,0,1,1)
+				    + t4ddg_2(0,2,0,1)*t4ddg_3(2,1,1,1)
+				    + t4ddg_2(0,2,0,2)*t4ddg_3(2,2,1,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,1,0,1)");
+  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,0,0)*t4ddg_3(0,0,1,2)
+				    + t4ddg_2(0,0,0,1)*t4ddg_3(0,1,1,2)
+				    + t4ddg_2(0,0,0,2)*t4ddg_3(0,2,1,2)
+				    + t4ddg_2(0,1,0,0)*t4ddg_3(1,0,1,2)
+				    + t4ddg_2(0,1,0,1)*t4ddg_3(1,1,1,2)
+				    + t4ddg_2(0,1,0,2)*t4ddg_3(1,2,1,2)
+				    + t4ddg_2(0,2,0,0)*t4ddg_3(2,0,1,2)
+				    + t4ddg_2(0,2,0,1)*t4ddg_3(2,1,1,2)
+				    + t4ddg_2(0,2,0,2)*t4ddg_3(2,2,1,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,1,0,2)");
+  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,0,1,0)*t4ddg_3(0,0,1,0)
+				    + t4ddg_2(0,0,1,1)*t4ddg_3(0,1,1,0)
+				    + t4ddg_2(0,0,1,2)*t4ddg_3(0,2,1,0)
+				    + t4ddg_2(0,1,1,0)*t4ddg_3(1,0,1,0)
+				    + t4ddg_2(0,1,1,1)*t4ddg_3(1,1,1,0)
+				    + t4ddg_2(0,1,1,2)*t4ddg_3(1,2,1,0)
+				    + t4ddg_2(0,2,1,0)*t4ddg_3(2,0,1,0)
+				    + t4ddg_2(0,2,1,1)*t4ddg_3(2,1,1,0)
+				    + t4ddg_2(0,2,1,2)*t4ddg_3(2,2,1,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,1,1,0)");
+  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,0,1,0)*t4ddg_3(0,0,1,1)
+				    + t4ddg_2(0,0,1,1)*t4ddg_3(0,1,1,1)
+				    + t4ddg_2(0,0,1,2)*t4ddg_3(0,2,1,1)
+				    + t4ddg_2(0,1,1,0)*t4ddg_3(1,0,1,1)
+				    + t4ddg_2(0,1,1,1)*t4ddg_3(1,1,1,1)
+				    + t4ddg_2(0,1,1,2)*t4ddg_3(1,2,1,1)
+				    + t4ddg_2(0,2,1,0)*t4ddg_3(2,0,1,1)
+				    + t4ddg_2(0,2,1,1)*t4ddg_3(2,1,1,1)
+				    + t4ddg_2(0,2,1,2)*t4ddg_3(2,2,1,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,1,1,1)");
+  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,0,1,0)*t4ddg_3(0,0,1,2)
+				    + t4ddg_2(0,0,1,1)*t4ddg_3(0,1,1,2)
+				    + t4ddg_2(0,0,1,2)*t4ddg_3(0,2,1,2)
+				    + t4ddg_2(0,1,1,0)*t4ddg_3(1,0,1,2)
+				    + t4ddg_2(0,1,1,1)*t4ddg_3(1,1,1,2)
+				    + t4ddg_2(0,1,1,2)*t4ddg_3(1,2,1,2)
+				    + t4ddg_2(0,2,1,0)*t4ddg_3(2,0,1,2)
+				    + t4ddg_2(0,2,1,1)*t4ddg_3(2,1,1,2)
+				    + t4ddg_2(0,2,1,2)*t4ddg_3(2,2,1,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,1,1,2)");
+  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,0,2,0)*t4ddg_3(0,0,1,0)
+				    + t4ddg_2(0,0,2,1)*t4ddg_3(0,1,1,0)
+				    + t4ddg_2(0,0,2,2)*t4ddg_3(0,2,1,0)
+				    + t4ddg_2(0,1,2,0)*t4ddg_3(1,0,1,0)
+				    + t4ddg_2(0,1,2,1)*t4ddg_3(1,1,1,0)
+				    + t4ddg_2(0,1,2,2)*t4ddg_3(1,2,1,0)
+				    + t4ddg_2(0,2,2,0)*t4ddg_3(2,0,1,0)
+				    + t4ddg_2(0,2,2,1)*t4ddg_3(2,1,1,0)
+				    + t4ddg_2(0,2,2,2)*t4ddg_3(2,2,1,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,1,2,0)");
+  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,0,2,0)*t4ddg_3(0,0,1,1)
+				    + t4ddg_2(0,0,2,1)*t4ddg_3(0,1,1,1)
+				    + t4ddg_2(0,0,2,2)*t4ddg_3(0,2,1,1)
+				    + t4ddg_2(0,1,2,0)*t4ddg_3(1,0,1,1)
+				    + t4ddg_2(0,1,2,1)*t4ddg_3(1,1,1,1)
+				    + t4ddg_2(0,1,2,2)*t4ddg_3(1,2,1,1)
+				    + t4ddg_2(0,2,2,0)*t4ddg_3(2,0,1,1)
+				    + t4ddg_2(0,2,2,1)*t4ddg_3(2,1,1,1)
+				    + t4ddg_2(0,2,2,2)*t4ddg_3(2,2,1,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,1,2,1)");
+  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,0,2,0)*t4ddg_3(0,0,1,2)
+				    + t4ddg_2(0,0,2,1)*t4ddg_3(0,1,1,2)
+				    + t4ddg_2(0,0,2,2)*t4ddg_3(0,2,1,2)
+				    + t4ddg_2(0,1,2,0)*t4ddg_3(1,0,1,2)
+				    + t4ddg_2(0,1,2,1)*t4ddg_3(1,1,1,2)
+				    + t4ddg_2(0,1,2,2)*t4ddg_3(1,2,1,2)
+				    + t4ddg_2(0,2,2,0)*t4ddg_3(2,0,1,2)
+				    + t4ddg_2(0,2,2,1)*t4ddg_3(2,1,1,2)
+				    + t4ddg_2(0,2,2,2)*t4ddg_3(2,2,1,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,1,2,2)");
+  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,0,0)*t4ddg_3(0,0,2,0)
+				    + t4ddg_2(0,0,0,1)*t4ddg_3(0,1,2,0)
+				    + t4ddg_2(0,0,0,2)*t4ddg_3(0,2,2,0)
+				    + t4ddg_2(0,1,0,0)*t4ddg_3(1,0,2,0)
+				    + t4ddg_2(0,1,0,1)*t4ddg_3(1,1,2,0)
+				    + t4ddg_2(0,1,0,2)*t4ddg_3(1,2,2,0)
+				    + t4ddg_2(0,2,0,0)*t4ddg_3(2,0,2,0)
+				    + t4ddg_2(0,2,0,1)*t4ddg_3(2,1,2,0)
+				    + t4ddg_2(0,2,0,2)*t4ddg_3(2,2,2,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,2,0,0)");
+  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,0,0)*t4ddg_3(0,0,2,1)
+				    + t4ddg_2(0,0,0,1)*t4ddg_3(0,1,2,1)
+				    + t4ddg_2(0,0,0,2)*t4ddg_3(0,2,2,1)
+				    + t4ddg_2(0,1,0,0)*t4ddg_3(1,0,2,1)
+				    + t4ddg_2(0,1,0,1)*t4ddg_3(1,1,2,1)
+				    + t4ddg_2(0,1,0,2)*t4ddg_3(1,2,2,1)
+				    + t4ddg_2(0,2,0,0)*t4ddg_3(2,0,2,1)
+				    + t4ddg_2(0,2,0,1)*t4ddg_3(2,1,2,1)
+				    + t4ddg_2(0,2,0,2)*t4ddg_3(2,2,2,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,2,0,1)");
+  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,0,0)*t4ddg_3(0,0,2,2)
+				    + t4ddg_2(0,0,0,1)*t4ddg_3(0,1,2,2)
+				    + t4ddg_2(0,0,0,2)*t4ddg_3(0,2,2,2)
+				    + t4ddg_2(0,1,0,0)*t4ddg_3(1,0,2,2)
+				    + t4ddg_2(0,1,0,1)*t4ddg_3(1,1,2,2)
+				    + t4ddg_2(0,1,0,2)*t4ddg_3(1,2,2,2)
+				    + t4ddg_2(0,2,0,0)*t4ddg_3(2,0,2,2)
+				    + t4ddg_2(0,2,0,1)*t4ddg_3(2,1,2,2)
+				    + t4ddg_2(0,2,0,2)*t4ddg_3(2,2,2,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,2,0,2)");
+  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,0,1,0)*t4ddg_3(0,0,2,0)
+				    + t4ddg_2(0,0,1,1)*t4ddg_3(0,1,2,0)
+				    + t4ddg_2(0,0,1,2)*t4ddg_3(0,2,2,0)
+				    + t4ddg_2(0,1,1,0)*t4ddg_3(1,0,2,0)
+				    + t4ddg_2(0,1,1,1)*t4ddg_3(1,1,2,0)
+				    + t4ddg_2(0,1,1,2)*t4ddg_3(1,2,2,0)
+				    + t4ddg_2(0,2,1,0)*t4ddg_3(2,0,2,0)
+				    + t4ddg_2(0,2,1,1)*t4ddg_3(2,1,2,0)
+				    + t4ddg_2(0,2,1,2)*t4ddg_3(2,2,2,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,2,1,0)");
+  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,0,1,0)*t4ddg_3(0,0,2,1)
+				    + t4ddg_2(0,0,1,1)*t4ddg_3(0,1,2,1)
+				    + t4ddg_2(0,0,1,2)*t4ddg_3(0,2,2,1)
+				    + t4ddg_2(0,1,1,0)*t4ddg_3(1,0,2,1)
+				    + t4ddg_2(0,1,1,1)*t4ddg_3(1,1,2,1)
+				    + t4ddg_2(0,1,1,2)*t4ddg_3(1,2,2,1)
+				    + t4ddg_2(0,2,1,0)*t4ddg_3(2,0,2,1)
+				    + t4ddg_2(0,2,1,1)*t4ddg_3(2,1,2,1)
+				    + t4ddg_2(0,2,1,2)*t4ddg_3(2,2,2,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,2,1,1)");
+  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,0,1,0)*t4ddg_3(0,0,2,2)
+				    + t4ddg_2(0,0,1,1)*t4ddg_3(0,1,2,2)
+				    + t4ddg_2(0,0,1,2)*t4ddg_3(0,2,2,2)
+				    + t4ddg_2(0,1,1,0)*t4ddg_3(1,0,2,2)
+				    + t4ddg_2(0,1,1,1)*t4ddg_3(1,1,2,2)
+				    + t4ddg_2(0,1,1,2)*t4ddg_3(1,2,2,2)
+				    + t4ddg_2(0,2,1,0)*t4ddg_3(2,0,2,2)
+				    + t4ddg_2(0,2,1,1)*t4ddg_3(2,1,2,2)
+				    + t4ddg_2(0,2,1,2)*t4ddg_3(2,2,2,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,2,1,2)");
+  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,0,2,0)*t4ddg_3(0,0,2,0)
+				    + t4ddg_2(0,0,2,1)*t4ddg_3(0,1,2,0)
+				    + t4ddg_2(0,0,2,2)*t4ddg_3(0,2,2,0)
+				    + t4ddg_2(0,1,2,0)*t4ddg_3(1,0,2,0)
+				    + t4ddg_2(0,1,2,1)*t4ddg_3(1,1,2,0)
+				    + t4ddg_2(0,1,2,2)*t4ddg_3(1,2,2,0)
+				    + t4ddg_2(0,2,2,0)*t4ddg_3(2,0,2,0)
+				    + t4ddg_2(0,2,2,1)*t4ddg_3(2,1,2,0)
+				    + t4ddg_2(0,2,2,2)*t4ddg_3(2,2,2,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,2,2,0)");
+  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,0,2,0)*t4ddg_3(0,0,2,1)
+				    + t4ddg_2(0,0,2,1)*t4ddg_3(0,1,2,1)
+				    + t4ddg_2(0,0,2,2)*t4ddg_3(0,2,2,1)
+				    + t4ddg_2(0,1,2,0)*t4ddg_3(1,0,2,1)
+				    + t4ddg_2(0,1,2,1)*t4ddg_3(1,1,2,1)
+				    + t4ddg_2(0,1,2,2)*t4ddg_3(1,2,2,1)
+				    + t4ddg_2(0,2,2,0)*t4ddg_3(2,0,2,1)
+				    + t4ddg_2(0,2,2,1)*t4ddg_3(2,1,2,1)
+				    + t4ddg_2(0,2,2,2)*t4ddg_3(2,2,2,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,2,2,1)");
+  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,0,2,0)*t4ddg_3(0,0,2,2)
+				    + t4ddg_2(0,0,2,1)*t4ddg_3(0,1,2,2)
+				    + t4ddg_2(0,0,2,2)*t4ddg_3(0,2,2,2)
+				    + t4ddg_2(0,1,2,0)*t4ddg_3(1,0,2,2)
+				    + t4ddg_2(0,1,2,1)*t4ddg_3(1,1,2,2)
+				    + t4ddg_2(0,1,2,2)*t4ddg_3(1,2,2,2)
+				    + t4ddg_2(0,2,2,0)*t4ddg_3(2,0,2,2)
+				    + t4ddg_2(0,2,2,1)*t4ddg_3(2,1,2,2)
+				    + t4ddg_2(0,2,2,2)*t4ddg_3(2,2,2,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(0,2,2,2)");
+  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)*t4ddg_3(0,0,0,0)
+				    + t4ddg_2(1,0,0,1)*t4ddg_3(0,1,0,0)
+				    + t4ddg_2(1,0,0,2)*t4ddg_3(0,2,0,0)
+				    + t4ddg_2(1,1,0,0)*t4ddg_3(1,0,0,0)
+				    + t4ddg_2(1,1,0,1)*t4ddg_3(1,1,0,0)
+				    + t4ddg_2(1,1,0,2)*t4ddg_3(1,2,0,0)
+				    + t4ddg_2(1,2,0,0)*t4ddg_3(2,0,0,0)
+				    + t4ddg_2(1,2,0,1)*t4ddg_3(2,1,0,0)
+				    + t4ddg_2(1,2,0,2)*t4ddg_3(2,2,0,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,0,0,0)");
+  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,0)*t4ddg_3(0,0,0,1)
+				    + t4ddg_2(1,0,0,1)*t4ddg_3(0,1,0,1)
+				    + t4ddg_2(1,0,0,2)*t4ddg_3(0,2,0,1)
+				    + t4ddg_2(1,1,0,0)*t4ddg_3(1,0,0,1)
+				    + t4ddg_2(1,1,0,1)*t4ddg_3(1,1,0,1)
+				    + t4ddg_2(1,1,0,2)*t4ddg_3(1,2,0,1)
+				    + t4ddg_2(1,2,0,0)*t4ddg_3(2,0,0,1)
+				    + t4ddg_2(1,2,0,1)*t4ddg_3(2,1,0,1)
+				    + t4ddg_2(1,2,0,2)*t4ddg_3(2,2,0,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,0,0,1)");
+  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,0)*t4ddg_3(0,0,0,2)
+				    + t4ddg_2(1,0,0,1)*t4ddg_3(0,1,0,2)
+				    + t4ddg_2(1,0,0,2)*t4ddg_3(0,2,0,2)
+				    + t4ddg_2(1,1,0,0)*t4ddg_3(1,0,0,2)
+				    + t4ddg_2(1,1,0,1)*t4ddg_3(1,1,0,2)
+				    + t4ddg_2(1,1,0,2)*t4ddg_3(1,2,0,2)
+				    + t4ddg_2(1,2,0,0)*t4ddg_3(2,0,0,2)
+				    + t4ddg_2(1,2,0,1)*t4ddg_3(2,1,0,2)
+				    + t4ddg_2(1,2,0,2)*t4ddg_3(2,2,0,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,0,0,2)");
+  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,0,1,0)*t4ddg_3(0,0,0,0)
+				    + t4ddg_2(1,0,1,1)*t4ddg_3(0,1,0,0)
+				    + t4ddg_2(1,0,1,2)*t4ddg_3(0,2,0,0)
+				    + t4ddg_2(1,1,1,0)*t4ddg_3(1,0,0,0)
+				    + t4ddg_2(1,1,1,1)*t4ddg_3(1,1,0,0)
+				    + t4ddg_2(1,1,1,2)*t4ddg_3(1,2,0,0)
+				    + t4ddg_2(1,2,1,0)*t4ddg_3(2,0,0,0)
+				    + t4ddg_2(1,2,1,1)*t4ddg_3(2,1,0,0)
+				    + t4ddg_2(1,2,1,2)*t4ddg_3(2,2,0,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,0,1,0)");
+  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,0,1,0)*t4ddg_3(0,0,0,1)
+				    + t4ddg_2(1,0,1,1)*t4ddg_3(0,1,0,1)
+				    + t4ddg_2(1,0,1,2)*t4ddg_3(0,2,0,1)
+				    + t4ddg_2(1,1,1,0)*t4ddg_3(1,0,0,1)
+				    + t4ddg_2(1,1,1,1)*t4ddg_3(1,1,0,1)
+				    + t4ddg_2(1,1,1,2)*t4ddg_3(1,2,0,1)
+				    + t4ddg_2(1,2,1,0)*t4ddg_3(2,0,0,1)
+				    + t4ddg_2(1,2,1,1)*t4ddg_3(2,1,0,1)
+				    + t4ddg_2(1,2,1,2)*t4ddg_3(2,2,0,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,0,1,1)");
+  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,0,1,0)*t4ddg_3(0,0,0,2)
+				    + t4ddg_2(1,0,1,1)*t4ddg_3(0,1,0,2)
+				    + t4ddg_2(1,0,1,2)*t4ddg_3(0,2,0,2)
+				    + t4ddg_2(1,1,1,0)*t4ddg_3(1,0,0,2)
+				    + t4ddg_2(1,1,1,1)*t4ddg_3(1,1,0,2)
+				    + t4ddg_2(1,1,1,2)*t4ddg_3(1,2,0,2)
+				    + t4ddg_2(1,2,1,0)*t4ddg_3(2,0,0,2)
+				    + t4ddg_2(1,2,1,1)*t4ddg_3(2,1,0,2)
+				    + t4ddg_2(1,2,1,2)*t4ddg_3(2,2,0,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,0,1,2)");
+  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,0,2,0)*t4ddg_3(0,0,0,0)
+				    + t4ddg_2(1,0,2,1)*t4ddg_3(0,1,0,0)
+				    + t4ddg_2(1,0,2,2)*t4ddg_3(0,2,0,0)
+				    + t4ddg_2(1,1,2,0)*t4ddg_3(1,0,0,0)
+				    + t4ddg_2(1,1,2,1)*t4ddg_3(1,1,0,0)
+				    + t4ddg_2(1,1,2,2)*t4ddg_3(1,2,0,0)
+				    + t4ddg_2(1,2,2,0)*t4ddg_3(2,0,0,0)
+				    + t4ddg_2(1,2,2,1)*t4ddg_3(2,1,0,0)
+				    + t4ddg_2(1,2,2,2)*t4ddg_3(2,2,0,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,0,2,0)");
+  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,0,2,0)*t4ddg_3(0,0,0,1)
+				    + t4ddg_2(1,0,2,1)*t4ddg_3(0,1,0,1)
+				    + t4ddg_2(1,0,2,2)*t4ddg_3(0,2,0,1)
+				    + t4ddg_2(1,1,2,0)*t4ddg_3(1,0,0,1)
+				    + t4ddg_2(1,1,2,1)*t4ddg_3(1,1,0,1)
+				    + t4ddg_2(1,1,2,2)*t4ddg_3(1,2,0,1)
+				    + t4ddg_2(1,2,2,0)*t4ddg_3(2,0,0,1)
+				    + t4ddg_2(1,2,2,1)*t4ddg_3(2,1,0,1)
+				    + t4ddg_2(1,2,2,2)*t4ddg_3(2,2,0,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,0,2,1)");
+  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,0,2,0)*t4ddg_3(0,0,0,2)
+				    + t4ddg_2(1,0,2,1)*t4ddg_3(0,1,0,2)
+				    + t4ddg_2(1,0,2,2)*t4ddg_3(0,2,0,2)
+				    + t4ddg_2(1,1,2,0)*t4ddg_3(1,0,0,2)
+				    + t4ddg_2(1,1,2,1)*t4ddg_3(1,1,0,2)
+				    + t4ddg_2(1,1,2,2)*t4ddg_3(1,2,0,2)
+				    + t4ddg_2(1,2,2,0)*t4ddg_3(2,0,0,2)
+				    + t4ddg_2(1,2,2,1)*t4ddg_3(2,1,0,2)
+				    + t4ddg_2(1,2,2,2)*t4ddg_3(2,2,0,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,0,2,2)");
+  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,0,0)*t4ddg_3(0,0,1,0)
+				    + t4ddg_2(1,0,0,1)*t4ddg_3(0,1,1,0)
+				    + t4ddg_2(1,0,0,2)*t4ddg_3(0,2,1,0)
+				    + t4ddg_2(1,1,0,0)*t4ddg_3(1,0,1,0)
+				    + t4ddg_2(1,1,0,1)*t4ddg_3(1,1,1,0)
+				    + t4ddg_2(1,1,0,2)*t4ddg_3(1,2,1,0)
+				    + t4ddg_2(1,2,0,0)*t4ddg_3(2,0,1,0)
+				    + t4ddg_2(1,2,0,1)*t4ddg_3(2,1,1,0)
+				    + t4ddg_2(1,2,0,2)*t4ddg_3(2,2,1,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,1,0,0)");
+  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,0,0)*t4ddg_3(0,0,1,1)
+				    + t4ddg_2(1,0,0,1)*t4ddg_3(0,1,1,1)
+				    + t4ddg_2(1,0,0,2)*t4ddg_3(0,2,1,1)
+				    + t4ddg_2(1,1,0,0)*t4ddg_3(1,0,1,1)
+				    + t4ddg_2(1,1,0,1)*t4ddg_3(1,1,1,1)
+				    + t4ddg_2(1,1,0,2)*t4ddg_3(1,2,1,1)
+				    + t4ddg_2(1,2,0,0)*t4ddg_3(2,0,1,1)
+				    + t4ddg_2(1,2,0,1)*t4ddg_3(2,1,1,1)
+				    + t4ddg_2(1,2,0,2)*t4ddg_3(2,2,1,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,1,0,1)");
+  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,0,0)*t4ddg_3(0,0,1,2)
+				    + t4ddg_2(1,0,0,1)*t4ddg_3(0,1,1,2)
+				    + t4ddg_2(1,0,0,2)*t4ddg_3(0,2,1,2)
+				    + t4ddg_2(1,1,0,0)*t4ddg_3(1,0,1,2)
+				    + t4ddg_2(1,1,0,1)*t4ddg_3(1,1,1,2)
+				    + t4ddg_2(1,1,0,2)*t4ddg_3(1,2,1,2)
+				    + t4ddg_2(1,2,0,0)*t4ddg_3(2,0,1,2)
+				    + t4ddg_2(1,2,0,1)*t4ddg_3(2,1,1,2)
+				    + t4ddg_2(1,2,0,2)*t4ddg_3(2,2,1,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,1,0,2)");
+  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,0,1,0)*t4ddg_3(0,0,1,0)
+				    + t4ddg_2(1,0,1,1)*t4ddg_3(0,1,1,0)
+				    + t4ddg_2(1,0,1,2)*t4ddg_3(0,2,1,0)
+				    + t4ddg_2(1,1,1,0)*t4ddg_3(1,0,1,0)
+				    + t4ddg_2(1,1,1,1)*t4ddg_3(1,1,1,0)
+				    + t4ddg_2(1,1,1,2)*t4ddg_3(1,2,1,0)
+				    + t4ddg_2(1,2,1,0)*t4ddg_3(2,0,1,0)
+				    + t4ddg_2(1,2,1,1)*t4ddg_3(2,1,1,0)
+				    + t4ddg_2(1,2,1,2)*t4ddg_3(2,2,1,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,0,1,0)*t4ddg_3(0,0,1,1)
+				    + t4ddg_2(1,0,1,1)*t4ddg_3(0,1,1,1)
+				    + t4ddg_2(1,0,1,2)*t4ddg_3(0,2,1,1)
+				    + t4ddg_2(1,1,1,0)*t4ddg_3(1,0,1,1)
+				    + t4ddg_2(1,1,1,1)*t4ddg_3(1,1,1,1)
+				    + t4ddg_2(1,1,1,2)*t4ddg_3(1,2,1,1)
+				    + t4ddg_2(1,2,1,0)*t4ddg_3(2,0,1,1)
+				    + t4ddg_2(1,2,1,1)*t4ddg_3(2,1,1,1)
+				    + t4ddg_2(1,2,1,2)*t4ddg_3(2,2,1,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,1,1,1)");
+  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,0,1,0)*t4ddg_3(0,0,1,2)
+				    + t4ddg_2(1,0,1,1)*t4ddg_3(0,1,1,2)
+				    + t4ddg_2(1,0,1,2)*t4ddg_3(0,2,1,2)
+				    + t4ddg_2(1,1,1,0)*t4ddg_3(1,0,1,2)
+				    + t4ddg_2(1,1,1,1)*t4ddg_3(1,1,1,2)
+				    + t4ddg_2(1,1,1,2)*t4ddg_3(1,2,1,2)
+				    + t4ddg_2(1,2,1,0)*t4ddg_3(2,0,1,2)
+				    + t4ddg_2(1,2,1,1)*t4ddg_3(2,1,1,2)
+				    + t4ddg_2(1,2,1,2)*t4ddg_3(2,2,1,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,1,1,2)");
+  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,0,2,0)*t4ddg_3(0,0,1,0)
+				    + t4ddg_2(1,0,2,1)*t4ddg_3(0,1,1,0)
+				    + t4ddg_2(1,0,2,2)*t4ddg_3(0,2,1,0)
+				    + t4ddg_2(1,1,2,0)*t4ddg_3(1,0,1,0)
+				    + t4ddg_2(1,1,2,1)*t4ddg_3(1,1,1,0)
+				    + t4ddg_2(1,1,2,2)*t4ddg_3(1,2,1,0)
+				    + t4ddg_2(1,2,2,0)*t4ddg_3(2,0,1,0)
+				    + t4ddg_2(1,2,2,1)*t4ddg_3(2,1,1,0)
+				    + t4ddg_2(1,2,2,2)*t4ddg_3(2,2,1,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,1,2,0)");
+  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,0,2,0)*t4ddg_3(0,0,1,1)
+				    + t4ddg_2(1,0,2,1)*t4ddg_3(0,1,1,1)
+				    + t4ddg_2(1,0,2,2)*t4ddg_3(0,2,1,1)
+				    + t4ddg_2(1,1,2,0)*t4ddg_3(1,0,1,1)
+				    + t4ddg_2(1,1,2,1)*t4ddg_3(1,1,1,1)
+				    + t4ddg_2(1,1,2,2)*t4ddg_3(1,2,1,1)
+				    + t4ddg_2(1,2,2,0)*t4ddg_3(2,0,1,1)
+				    + t4ddg_2(1,2,2,1)*t4ddg_3(2,1,1,1)
+				    + t4ddg_2(1,2,2,2)*t4ddg_3(2,2,1,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,1,2,1)");
+  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,0,2,0)*t4ddg_3(0,0,1,2)
+				    + t4ddg_2(1,0,2,1)*t4ddg_3(0,1,1,2)
+				    + t4ddg_2(1,0,2,2)*t4ddg_3(0,2,1,2)
+				    + t4ddg_2(1,1,2,0)*t4ddg_3(1,0,1,2)
+				    + t4ddg_2(1,1,2,1)*t4ddg_3(1,1,1,2)
+				    + t4ddg_2(1,1,2,2)*t4ddg_3(1,2,1,2)
+				    + t4ddg_2(1,2,2,0)*t4ddg_3(2,0,1,2)
+				    + t4ddg_2(1,2,2,1)*t4ddg_3(2,1,1,2)
+				    + t4ddg_2(1,2,2,2)*t4ddg_3(2,2,1,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,1,2,2)");
+  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,0,0)*t4ddg_3(0,0,2,0)
+				    + t4ddg_2(1,0,0,1)*t4ddg_3(0,1,2,0)
+				    + t4ddg_2(1,0,0,2)*t4ddg_3(0,2,2,0)
+				    + t4ddg_2(1,1,0,0)*t4ddg_3(1,0,2,0)
+				    + t4ddg_2(1,1,0,1)*t4ddg_3(1,1,2,0)
+				    + t4ddg_2(1,1,0,2)*t4ddg_3(1,2,2,0)
+				    + t4ddg_2(1,2,0,0)*t4ddg_3(2,0,2,0)
+				    + t4ddg_2(1,2,0,1)*t4ddg_3(2,1,2,0)
+				    + t4ddg_2(1,2,0,2)*t4ddg_3(2,2,2,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,2,0,0)");
+  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,0,0)*t4ddg_3(0,0,2,1)
+				    + t4ddg_2(1,0,0,1)*t4ddg_3(0,1,2,1)
+				    + t4ddg_2(1,0,0,2)*t4ddg_3(0,2,2,1)
+				    + t4ddg_2(1,1,0,0)*t4ddg_3(1,0,2,1)
+				    + t4ddg_2(1,1,0,1)*t4ddg_3(1,1,2,1)
+				    + t4ddg_2(1,1,0,2)*t4ddg_3(1,2,2,1)
+				    + t4ddg_2(1,2,0,0)*t4ddg_3(2,0,2,1)
+				    + t4ddg_2(1,2,0,1)*t4ddg_3(2,1,2,1)
+				    + t4ddg_2(1,2,0,2)*t4ddg_3(2,2,2,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,2,0,1)");
+  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,0,0)*t4ddg_3(0,0,2,2)
+				    + t4ddg_2(1,0,0,1)*t4ddg_3(0,1,2,2)
+				    + t4ddg_2(1,0,0,2)*t4ddg_3(0,2,2,2)
+				    + t4ddg_2(1,1,0,0)*t4ddg_3(1,0,2,2)
+				    + t4ddg_2(1,1,0,1)*t4ddg_3(1,1,2,2)
+				    + t4ddg_2(1,1,0,2)*t4ddg_3(1,2,2,2)
+				    + t4ddg_2(1,2,0,0)*t4ddg_3(2,0,2,2)
+				    + t4ddg_2(1,2,0,1)*t4ddg_3(2,1,2,2)
+				    + t4ddg_2(1,2,0,2)*t4ddg_3(2,2,2,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,2,0,2)");
+  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,0,1,0)*t4ddg_3(0,0,2,0)
+				    + t4ddg_2(1,0,1,1)*t4ddg_3(0,1,2,0)
+				    + t4ddg_2(1,0,1,2)*t4ddg_3(0,2,2,0)
+				    + t4ddg_2(1,1,1,0)*t4ddg_3(1,0,2,0)
+				    + t4ddg_2(1,1,1,1)*t4ddg_3(1,1,2,0)
+				    + t4ddg_2(1,1,1,2)*t4ddg_3(1,2,2,0)
+				    + t4ddg_2(1,2,1,0)*t4ddg_3(2,0,2,0)
+				    + t4ddg_2(1,2,1,1)*t4ddg_3(2,1,2,0)
+				    + t4ddg_2(1,2,1,2)*t4ddg_3(2,2,2,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,2,1,0)");
+  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,0,1,0)*t4ddg_3(0,0,2,1)
+				    + t4ddg_2(1,0,1,1)*t4ddg_3(0,1,2,1)
+				    + t4ddg_2(1,0,1,2)*t4ddg_3(0,2,2,1)
+				    + t4ddg_2(1,1,1,0)*t4ddg_3(1,0,2,1)
+				    + t4ddg_2(1,1,1,1)*t4ddg_3(1,1,2,1)
+				    + t4ddg_2(1,1,1,2)*t4ddg_3(1,2,2,1)
+				    + t4ddg_2(1,2,1,0)*t4ddg_3(2,0,2,1)
+				    + t4ddg_2(1,2,1,1)*t4ddg_3(2,1,2,1)
+				    + t4ddg_2(1,2,1,2)*t4ddg_3(2,2,2,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,2,1,1)");
+  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,0,1,0)*t4ddg_3(0,0,2,2)
+				    + t4ddg_2(1,0,1,1)*t4ddg_3(0,1,2,2)
+				    + t4ddg_2(1,0,1,2)*t4ddg_3(0,2,2,2)
+				    + t4ddg_2(1,1,1,0)*t4ddg_3(1,0,2,2)
+				    + t4ddg_2(1,1,1,1)*t4ddg_3(1,1,2,2)
+				    + t4ddg_2(1,1,1,2)*t4ddg_3(1,2,2,2)
+				    + t4ddg_2(1,2,1,0)*t4ddg_3(2,0,2,2)
+				    + t4ddg_2(1,2,1,1)*t4ddg_3(2,1,2,2)
+				    + t4ddg_2(1,2,1,2)*t4ddg_3(2,2,2,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,2,1,2)");
+  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,0,2,0)*t4ddg_3(0,0,2,0)
+				    + t4ddg_2(1,0,2,1)*t4ddg_3(0,1,2,0)
+				    + t4ddg_2(1,0,2,2)*t4ddg_3(0,2,2,0)
+				    + t4ddg_2(1,1,2,0)*t4ddg_3(1,0,2,0)
+				    + t4ddg_2(1,1,2,1)*t4ddg_3(1,1,2,0)
+				    + t4ddg_2(1,1,2,2)*t4ddg_3(1,2,2,0)
+				    + t4ddg_2(1,2,2,0)*t4ddg_3(2,0,2,0)
+				    + t4ddg_2(1,2,2,1)*t4ddg_3(2,1,2,0)
+				    + t4ddg_2(1,2,2,2)*t4ddg_3(2,2,2,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,2,2,0)");
+  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,0,2,0)*t4ddg_3(0,0,2,1)
+				    + t4ddg_2(1,0,2,1)*t4ddg_3(0,1,2,1)
+				    + t4ddg_2(1,0,2,2)*t4ddg_3(0,2,2,1)
+				    + t4ddg_2(1,1,2,0)*t4ddg_3(1,0,2,1)
+				    + t4ddg_2(1,1,2,1)*t4ddg_3(1,1,2,1)
+				    + t4ddg_2(1,1,2,2)*t4ddg_3(1,2,2,1)
+				    + t4ddg_2(1,2,2,0)*t4ddg_3(2,0,2,1)
+				    + t4ddg_2(1,2,2,1)*t4ddg_3(2,1,2,1)
+				    + t4ddg_2(1,2,2,2)*t4ddg_3(2,2,2,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,2,2,1)");
+  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,0,2,0)*t4ddg_3(0,0,2,2)
+				    + t4ddg_2(1,0,2,1)*t4ddg_3(0,1,2,2)
+				    + t4ddg_2(1,0,2,2)*t4ddg_3(0,2,2,2)
+				    + t4ddg_2(1,1,2,0)*t4ddg_3(1,0,2,2)
+				    + t4ddg_2(1,1,2,1)*t4ddg_3(1,1,2,2)
+				    + t4ddg_2(1,1,2,2)*t4ddg_3(1,2,2,2)
+				    + t4ddg_2(1,2,2,0)*t4ddg_3(2,0,2,2)
+				    + t4ddg_2(1,2,2,1)*t4ddg_3(2,1,2,2)
+				    + t4ddg_2(1,2,2,2)*t4ddg_3(2,2,2,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(1,2,2,2)");
+  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)*t4ddg_3(0,0,0,0)
+				    + t4ddg_2(2,0,0,1)*t4ddg_3(0,1,0,0)
+				    + t4ddg_2(2,0,0,2)*t4ddg_3(0,2,0,0)
+				    + t4ddg_2(2,1,0,0)*t4ddg_3(1,0,0,0)
+				    + t4ddg_2(2,1,0,1)*t4ddg_3(1,1,0,0)
+				    + t4ddg_2(2,1,0,2)*t4ddg_3(1,2,0,0)
+				    + t4ddg_2(2,2,0,0)*t4ddg_3(2,0,0,0)
+				    + t4ddg_2(2,2,0,1)*t4ddg_3(2,1,0,0)
+				    + t4ddg_2(2,2,0,2)*t4ddg_3(2,2,0,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,0,0,0)");
+  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,0)*t4ddg_3(0,0,0,1)
+				    + t4ddg_2(2,0,0,1)*t4ddg_3(0,1,0,1)
+				    + t4ddg_2(2,0,0,2)*t4ddg_3(0,2,0,1)
+				    + t4ddg_2(2,1,0,0)*t4ddg_3(1,0,0,1)
+				    + t4ddg_2(2,1,0,1)*t4ddg_3(1,1,0,1)
+				    + t4ddg_2(2,1,0,2)*t4ddg_3(1,2,0,1)
+				    + t4ddg_2(2,2,0,0)*t4ddg_3(2,0,0,1)
+				    + t4ddg_2(2,2,0,1)*t4ddg_3(2,1,0,1)
+				    + t4ddg_2(2,2,0,2)*t4ddg_3(2,2,0,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,0,0,1)");
+  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,0)*t4ddg_3(0,0,0,2)
+				    + t4ddg_2(2,0,0,1)*t4ddg_3(0,1,0,2)
+				    + t4ddg_2(2,0,0,2)*t4ddg_3(0,2,0,2)
+				    + t4ddg_2(2,1,0,0)*t4ddg_3(1,0,0,2)
+				    + t4ddg_2(2,1,0,1)*t4ddg_3(1,1,0,2)
+				    + t4ddg_2(2,1,0,2)*t4ddg_3(1,2,0,2)
+				    + t4ddg_2(2,2,0,0)*t4ddg_3(2,0,0,2)
+				    + t4ddg_2(2,2,0,1)*t4ddg_3(2,1,0,2)
+				    + t4ddg_2(2,2,0,2)*t4ddg_3(2,2,0,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,0,0,2)");
+  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,0,1,0)*t4ddg_3(0,0,0,0)
+				    + t4ddg_2(2,0,1,1)*t4ddg_3(0,1,0,0)
+				    + t4ddg_2(2,0,1,2)*t4ddg_3(0,2,0,0)
+				    + t4ddg_2(2,1,1,0)*t4ddg_3(1,0,0,0)
+				    + t4ddg_2(2,1,1,1)*t4ddg_3(1,1,0,0)
+				    + t4ddg_2(2,1,1,2)*t4ddg_3(1,2,0,0)
+				    + t4ddg_2(2,2,1,0)*t4ddg_3(2,0,0,0)
+				    + t4ddg_2(2,2,1,1)*t4ddg_3(2,1,0,0)
+				    + t4ddg_2(2,2,1,2)*t4ddg_3(2,2,0,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,0,1,0)");
+  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,0,1,0)*t4ddg_3(0,0,0,1)
+				    + t4ddg_2(2,0,1,1)*t4ddg_3(0,1,0,1)
+				    + t4ddg_2(2,0,1,2)*t4ddg_3(0,2,0,1)
+				    + t4ddg_2(2,1,1,0)*t4ddg_3(1,0,0,1)
+				    + t4ddg_2(2,1,1,1)*t4ddg_3(1,1,0,1)
+				    + t4ddg_2(2,1,1,2)*t4ddg_3(1,2,0,1)
+				    + t4ddg_2(2,2,1,0)*t4ddg_3(2,0,0,1)
+				    + t4ddg_2(2,2,1,1)*t4ddg_3(2,1,0,1)
+				    + t4ddg_2(2,2,1,2)*t4ddg_3(2,2,0,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,0,1,1)");
+  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,0,1,0)*t4ddg_3(0,0,0,2)
+				    + t4ddg_2(2,0,1,1)*t4ddg_3(0,1,0,2)
+				    + t4ddg_2(2,0,1,2)*t4ddg_3(0,2,0,2)
+				    + t4ddg_2(2,1,1,0)*t4ddg_3(1,0,0,2)
+				    + t4ddg_2(2,1,1,1)*t4ddg_3(1,1,0,2)
+				    + t4ddg_2(2,1,1,2)*t4ddg_3(1,2,0,2)
+				    + t4ddg_2(2,2,1,0)*t4ddg_3(2,0,0,2)
+				    + t4ddg_2(2,2,1,1)*t4ddg_3(2,1,0,2)
+				    + t4ddg_2(2,2,1,2)*t4ddg_3(2,2,0,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,0,1,2)");
+  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,0,2,0)*t4ddg_3(0,0,0,0)
+				    + t4ddg_2(2,0,2,1)*t4ddg_3(0,1,0,0)
+				    + t4ddg_2(2,0,2,2)*t4ddg_3(0,2,0,0)
+				    + t4ddg_2(2,1,2,0)*t4ddg_3(1,0,0,0)
+				    + t4ddg_2(2,1,2,1)*t4ddg_3(1,1,0,0)
+				    + t4ddg_2(2,1,2,2)*t4ddg_3(1,2,0,0)
+				    + t4ddg_2(2,2,2,0)*t4ddg_3(2,0,0,0)
+				    + t4ddg_2(2,2,2,1)*t4ddg_3(2,1,0,0)
+				    + t4ddg_2(2,2,2,2)*t4ddg_3(2,2,0,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,0,2,0)");
+  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,0,2,0)*t4ddg_3(0,0,0,1)
+				    + t4ddg_2(2,0,2,1)*t4ddg_3(0,1,0,1)
+				    + t4ddg_2(2,0,2,2)*t4ddg_3(0,2,0,1)
+				    + t4ddg_2(2,1,2,0)*t4ddg_3(1,0,0,1)
+				    + t4ddg_2(2,1,2,1)*t4ddg_3(1,1,0,1)
+				    + t4ddg_2(2,1,2,2)*t4ddg_3(1,2,0,1)
+				    + t4ddg_2(2,2,2,0)*t4ddg_3(2,0,0,1)
+				    + t4ddg_2(2,2,2,1)*t4ddg_3(2,1,0,1)
+				    + t4ddg_2(2,2,2,2)*t4ddg_3(2,2,0,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,0,2,1)");
+  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,0,2,0)*t4ddg_3(0,0,0,2)
+				    + t4ddg_2(2,0,2,1)*t4ddg_3(0,1,0,2)
+				    + t4ddg_2(2,0,2,2)*t4ddg_3(0,2,0,2)
+				    + t4ddg_2(2,1,2,0)*t4ddg_3(1,0,0,2)
+				    + t4ddg_2(2,1,2,1)*t4ddg_3(1,1,0,2)
+				    + t4ddg_2(2,1,2,2)*t4ddg_3(1,2,0,2)
+				    + t4ddg_2(2,2,2,0)*t4ddg_3(2,0,0,2)
+				    + t4ddg_2(2,2,2,1)*t4ddg_3(2,1,0,2)
+				    + t4ddg_2(2,2,2,2)*t4ddg_3(2,2,0,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,0,2,2)");
+  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,0,0)*t4ddg_3(0,0,1,0)
+				    + t4ddg_2(2,0,0,1)*t4ddg_3(0,1,1,0)
+				    + t4ddg_2(2,0,0,2)*t4ddg_3(0,2,1,0)
+				    + t4ddg_2(2,1,0,0)*t4ddg_3(1,0,1,0)
+				    + t4ddg_2(2,1,0,1)*t4ddg_3(1,1,1,0)
+				    + t4ddg_2(2,1,0,2)*t4ddg_3(1,2,1,0)
+				    + t4ddg_2(2,2,0,0)*t4ddg_3(2,0,1,0)
+				    + t4ddg_2(2,2,0,1)*t4ddg_3(2,1,1,0)
+				    + t4ddg_2(2,2,0,2)*t4ddg_3(2,2,1,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,1,0,0)");
+  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,0,0)*t4ddg_3(0,0,1,1)
+				    + t4ddg_2(2,0,0,1)*t4ddg_3(0,1,1,1)
+				    + t4ddg_2(2,0,0,2)*t4ddg_3(0,2,1,1)
+				    + t4ddg_2(2,1,0,0)*t4ddg_3(1,0,1,1)
+				    + t4ddg_2(2,1,0,1)*t4ddg_3(1,1,1,1)
+				    + t4ddg_2(2,1,0,2)*t4ddg_3(1,2,1,1)
+				    + t4ddg_2(2,2,0,0)*t4ddg_3(2,0,1,1)
+				    + t4ddg_2(2,2,0,1)*t4ddg_3(2,1,1,1)
+				    + t4ddg_2(2,2,0,2)*t4ddg_3(2,2,1,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,1,0,1)");
+  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,0,0)*t4ddg_3(0,0,1,2)
+				    + t4ddg_2(2,0,0,1)*t4ddg_3(0,1,1,2)
+				    + t4ddg_2(2,0,0,2)*t4ddg_3(0,2,1,2)
+				    + t4ddg_2(2,1,0,0)*t4ddg_3(1,0,1,2)
+				    + t4ddg_2(2,1,0,1)*t4ddg_3(1,1,1,2)
+				    + t4ddg_2(2,1,0,2)*t4ddg_3(1,2,1,2)
+				    + t4ddg_2(2,2,0,0)*t4ddg_3(2,0,1,2)
+				    + t4ddg_2(2,2,0,1)*t4ddg_3(2,1,1,2)
+				    + t4ddg_2(2,2,0,2)*t4ddg_3(2,2,1,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,1,0,2)");
+  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,0,1,0)*t4ddg_3(0,0,1,0)
+				    + t4ddg_2(2,0,1,1)*t4ddg_3(0,1,1,0)
+				    + t4ddg_2(2,0,1,2)*t4ddg_3(0,2,1,0)
+				    + t4ddg_2(2,1,1,0)*t4ddg_3(1,0,1,0)
+				    + t4ddg_2(2,1,1,1)*t4ddg_3(1,1,1,0)
+				    + t4ddg_2(2,1,1,2)*t4ddg_3(1,2,1,0)
+				    + t4ddg_2(2,2,1,0)*t4ddg_3(2,0,1,0)
+				    + t4ddg_2(2,2,1,1)*t4ddg_3(2,1,1,0)
+				    + t4ddg_2(2,2,1,2)*t4ddg_3(2,2,1,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,1,1,0)");
+  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,0,1,0)*t4ddg_3(0,0,1,1)
+				    + t4ddg_2(2,0,1,1)*t4ddg_3(0,1,1,1)
+				    + t4ddg_2(2,0,1,2)*t4ddg_3(0,2,1,1)
+				    + t4ddg_2(2,1,1,0)*t4ddg_3(1,0,1,1)
+				    + t4ddg_2(2,1,1,1)*t4ddg_3(1,1,1,1)
+				    + t4ddg_2(2,1,1,2)*t4ddg_3(1,2,1,1)
+				    + t4ddg_2(2,2,1,0)*t4ddg_3(2,0,1,1)
+				    + t4ddg_2(2,2,1,1)*t4ddg_3(2,1,1,1)
+				    + t4ddg_2(2,2,1,2)*t4ddg_3(2,2,1,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,1,1,1)");
+  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,0,1,0)*t4ddg_3(0,0,1,2)
+				    + t4ddg_2(2,0,1,1)*t4ddg_3(0,1,1,2)
+				    + t4ddg_2(2,0,1,2)*t4ddg_3(0,2,1,2)
+				    + t4ddg_2(2,1,1,0)*t4ddg_3(1,0,1,2)
+				    + t4ddg_2(2,1,1,1)*t4ddg_3(1,1,1,2)
+				    + t4ddg_2(2,1,1,2)*t4ddg_3(1,2,1,2)
+				    + t4ddg_2(2,2,1,0)*t4ddg_3(2,0,1,2)
+				    + t4ddg_2(2,2,1,1)*t4ddg_3(2,1,1,2)
+				    + t4ddg_2(2,2,1,2)*t4ddg_3(2,2,1,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,1,1,2)");
+  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,0,2,0)*t4ddg_3(0,0,1,0)
+				    + t4ddg_2(2,0,2,1)*t4ddg_3(0,1,1,0)
+				    + t4ddg_2(2,0,2,2)*t4ddg_3(0,2,1,0)
+				    + t4ddg_2(2,1,2,0)*t4ddg_3(1,0,1,0)
+				    + t4ddg_2(2,1,2,1)*t4ddg_3(1,1,1,0)
+				    + t4ddg_2(2,1,2,2)*t4ddg_3(1,2,1,0)
+				    + t4ddg_2(2,2,2,0)*t4ddg_3(2,0,1,0)
+				    + t4ddg_2(2,2,2,1)*t4ddg_3(2,1,1,0)
+				    + t4ddg_2(2,2,2,2)*t4ddg_3(2,2,1,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,1,2,0)");
+  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,0,2,0)*t4ddg_3(0,0,1,1)
+				    + t4ddg_2(2,0,2,1)*t4ddg_3(0,1,1,1)
+				    + t4ddg_2(2,0,2,2)*t4ddg_3(0,2,1,1)
+				    + t4ddg_2(2,1,2,0)*t4ddg_3(1,0,1,1)
+				    + t4ddg_2(2,1,2,1)*t4ddg_3(1,1,1,1)
+				    + t4ddg_2(2,1,2,2)*t4ddg_3(1,2,1,1)
+				    + t4ddg_2(2,2,2,0)*t4ddg_3(2,0,1,1)
+				    + t4ddg_2(2,2,2,1)*t4ddg_3(2,1,1,1)
+				    + t4ddg_2(2,2,2,2)*t4ddg_3(2,2,1,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,1,2,1)");
+  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,0,2,0)*t4ddg_3(0,0,1,2)
+				    + t4ddg_2(2,0,2,1)*t4ddg_3(0,1,1,2)
+				    + t4ddg_2(2,0,2,2)*t4ddg_3(0,2,1,2)
+				    + t4ddg_2(2,1,2,0)*t4ddg_3(1,0,1,2)
+				    + t4ddg_2(2,1,2,1)*t4ddg_3(1,1,1,2)
+				    + t4ddg_2(2,1,2,2)*t4ddg_3(1,2,1,2)
+				    + t4ddg_2(2,2,2,0)*t4ddg_3(2,0,1,2)
+				    + t4ddg_2(2,2,2,1)*t4ddg_3(2,1,1,2)
+				    + t4ddg_2(2,2,2,2)*t4ddg_3(2,2,1,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,1,2,2)");
+  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,0,0)*t4ddg_3(0,0,2,0)
+				    + t4ddg_2(2,0,0,1)*t4ddg_3(0,1,2,0)
+				    + t4ddg_2(2,0,0,2)*t4ddg_3(0,2,2,0)
+				    + t4ddg_2(2,1,0,0)*t4ddg_3(1,0,2,0)
+				    + t4ddg_2(2,1,0,1)*t4ddg_3(1,1,2,0)
+				    + t4ddg_2(2,1,0,2)*t4ddg_3(1,2,2,0)
+				    + t4ddg_2(2,2,0,0)*t4ddg_3(2,0,2,0)
+				    + t4ddg_2(2,2,0,1)*t4ddg_3(2,1,2,0)
+				    + t4ddg_2(2,2,0,2)*t4ddg_3(2,2,2,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,2,0,0)");
+  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,0,0)*t4ddg_3(0,0,2,1)
+				    + t4ddg_2(2,0,0,1)*t4ddg_3(0,1,2,1)
+				    + t4ddg_2(2,0,0,2)*t4ddg_3(0,2,2,1)
+				    + t4ddg_2(2,1,0,0)*t4ddg_3(1,0,2,1)
+				    + t4ddg_2(2,1,0,1)*t4ddg_3(1,1,2,1)
+				    + t4ddg_2(2,1,0,2)*t4ddg_3(1,2,2,1)
+				    + t4ddg_2(2,2,0,0)*t4ddg_3(2,0,2,1)
+				    + t4ddg_2(2,2,0,1)*t4ddg_3(2,1,2,1)
+				    + t4ddg_2(2,2,0,2)*t4ddg_3(2,2,2,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,2,0,1)");
+  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,0,0)*t4ddg_3(0,0,2,2)
+				    + t4ddg_2(2,0,0,1)*t4ddg_3(0,1,2,2)
+				    + t4ddg_2(2,0,0,2)*t4ddg_3(0,2,2,2)
+				    + t4ddg_2(2,1,0,0)*t4ddg_3(1,0,2,2)
+				    + t4ddg_2(2,1,0,1)*t4ddg_3(1,1,2,2)
+				    + t4ddg_2(2,1,0,2)*t4ddg_3(1,2,2,2)
+				    + t4ddg_2(2,2,0,0)*t4ddg_3(2,0,2,2)
+				    + t4ddg_2(2,2,0,1)*t4ddg_3(2,1,2,2)
+				    + t4ddg_2(2,2,0,2)*t4ddg_3(2,2,2,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,2,0,2)");
+  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,0,1,0)*t4ddg_3(0,0,2,0)
+				    + t4ddg_2(2,0,1,1)*t4ddg_3(0,1,2,0)
+				    + t4ddg_2(2,0,1,2)*t4ddg_3(0,2,2,0)
+				    + t4ddg_2(2,1,1,0)*t4ddg_3(1,0,2,0)
+				    + t4ddg_2(2,1,1,1)*t4ddg_3(1,1,2,0)
+				    + t4ddg_2(2,1,1,2)*t4ddg_3(1,2,2,0)
+				    + t4ddg_2(2,2,1,0)*t4ddg_3(2,0,2,0)
+				    + t4ddg_2(2,2,1,1)*t4ddg_3(2,1,2,0)
+				    + t4ddg_2(2,2,1,2)*t4ddg_3(2,2,2,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,2,1,0)");
+  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,0,1,0)*t4ddg_3(0,0,2,1)
+				    + t4ddg_2(2,0,1,1)*t4ddg_3(0,1,2,1)
+				    + t4ddg_2(2,0,1,2)*t4ddg_3(0,2,2,1)
+				    + t4ddg_2(2,1,1,0)*t4ddg_3(1,0,2,1)
+				    + t4ddg_2(2,1,1,1)*t4ddg_3(1,1,2,1)
+				    + t4ddg_2(2,1,1,2)*t4ddg_3(1,2,2,1)
+				    + t4ddg_2(2,2,1,0)*t4ddg_3(2,0,2,1)
+				    + t4ddg_2(2,2,1,1)*t4ddg_3(2,1,2,1)
+				    + t4ddg_2(2,2,1,2)*t4ddg_3(2,2,2,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,2,1,1)");
+  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,0,1,0)*t4ddg_3(0,0,2,2)
+				    + t4ddg_2(2,0,1,1)*t4ddg_3(0,1,2,2)
+				    + t4ddg_2(2,0,1,2)*t4ddg_3(0,2,2,2)
+				    + t4ddg_2(2,1,1,0)*t4ddg_3(1,0,2,2)
+				    + t4ddg_2(2,1,1,1)*t4ddg_3(1,1,2,2)
+				    + t4ddg_2(2,1,1,2)*t4ddg_3(1,2,2,2)
+				    + t4ddg_2(2,2,1,0)*t4ddg_3(2,0,2,2)
+				    + t4ddg_2(2,2,1,1)*t4ddg_3(2,1,2,2)
+				    + t4ddg_2(2,2,1,2)*t4ddg_3(2,2,2,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,2,1,2)");
+  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,0,2,0)*t4ddg_3(0,0,2,0)
+				    + t4ddg_2(2,0,2,1)*t4ddg_3(0,1,2,0)
+				    + t4ddg_2(2,0,2,2)*t4ddg_3(0,2,2,0)
+				    + t4ddg_2(2,1,2,0)*t4ddg_3(1,0,2,0)
+				    + t4ddg_2(2,1,2,1)*t4ddg_3(1,1,2,0)
+				    + t4ddg_2(2,1,2,2)*t4ddg_3(1,2,2,0)
+				    + t4ddg_2(2,2,2,0)*t4ddg_3(2,0,2,0)
+				    + t4ddg_2(2,2,2,1)*t4ddg_3(2,1,2,0)
+				    + t4ddg_2(2,2,2,2)*t4ddg_3(2,2,2,0))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,2,2,0)");
+  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,0,2,0)*t4ddg_3(0,0,2,1)
+				    + t4ddg_2(2,0,2,1)*t4ddg_3(0,1,2,1)
+				    + t4ddg_2(2,0,2,2)*t4ddg_3(0,2,2,1)
+				    + t4ddg_2(2,1,2,0)*t4ddg_3(1,0,2,1)
+				    + t4ddg_2(2,1,2,1)*t4ddg_3(1,1,2,1)
+				    + t4ddg_2(2,1,2,2)*t4ddg_3(1,2,2,1)
+				    + t4ddg_2(2,2,2,0)*t4ddg_3(2,0,2,1)
+				    + t4ddg_2(2,2,2,1)*t4ddg_3(2,1,2,1)
+				    + t4ddg_2(2,2,2,2)*t4ddg_3(2,2,2,1))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,0,2,0)*t4ddg_3(0,0,2,2)
+				    + t4ddg_2(2,0,2,1)*t4ddg_3(0,1,2,2)
+				    + t4ddg_2(2,0,2,2)*t4ddg_3(0,2,2,2)
+				    + t4ddg_2(2,1,2,0)*t4ddg_3(1,0,2,2)
+				    + t4ddg_2(2,1,2,1)*t4ddg_3(1,1,2,2)
+				    + t4ddg_2(2,1,2,2)*t4ddg_3(1,2,2,2)
+				    + t4ddg_2(2,2,2,0)*t4ddg_3(2,0,2,2)
+				    + t4ddg_2(2,2,2,1)*t4ddg_3(2,1,2,2)
+				    + t4ddg_2(2,2,2,2)*t4ddg_3(2,2,2,2))
+		,"T4ddg(i,j,k,l)^T4ddg(j,l,m,n)(2,2,2,2)");
+  cout << endl;
+
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T4ddg/test_T4ddgIII.C
--- a/tests/conformance/T4ddg/test_T4ddgIII.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2058 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T4ddgIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-		Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-		Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-		const Tensor2<double,3,3> &t2_3,
-		Tensor2_symmetric<double,3> &t2s_1,
-		const Tensor2_symmetric<double,3> &t2s_2,
-		const Tensor2_symmetric<double,3> &t2s_3,
-		Tensor3_dg<double,3,3> &t3dg_1,
-		const Tensor3_dg<double,3,3> &t3dg_2,
-		const Tensor3_dg<double,3,3> &t3dg_3,
-		Tensor3_christof<double,3,3> &t3ch_1,
-		const Tensor3_christof<double,3,3> &t3ch_2,
-		const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  Tensor4_ddg<double,3,3> t4ddg_1, t4ddg_2, t4ddg_3;
-
-  t4ddg_2(i,k,j,l)=t2s_2(i,k)*t2s_3(j,l);
-  t2_1(i,k)=t4ddg_2(i,j,k,l)*t2s_2(j,l);
-  test_for_zero(t2_1(0,0) - (t4ddg_2(0,0,0,0)*t2s_2(0,0)
-			     + t4ddg_2(0,0,0,1)*t2s_2(0,1)
-			     + t4ddg_2(0,0,0,2)*t2s_2(0,2)
-			     + t4ddg_2(0,1,0,0)*t2s_2(1,0)
-			     + t4ddg_2(0,1,0,1)*t2s_2(1,1)
-			     + t4ddg_2(0,1,0,2)*t2s_2(1,2)
-			     + t4ddg_2(0,2,0,0)*t2s_2(2,0)
-			     + t4ddg_2(0,2,0,1)*t2s_2(2,1)
-			     + t4ddg_2(0,2,0,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)*T2s(j,l)(0,0)");
-  test_for_zero(t2_1(0,1) - (t4ddg_2(0,0,1,0)*t2s_2(0,0)
-			     + t4ddg_2(0,0,1,1)*t2s_2(0,1)
-			     + t4ddg_2(0,0,1,2)*t2s_2(0,2)
-			     + t4ddg_2(0,1,1,0)*t2s_2(1,0)
-			     + t4ddg_2(0,1,1,1)*t2s_2(1,1)
-			     + t4ddg_2(0,1,1,2)*t2s_2(1,2)
-			     + t4ddg_2(0,2,1,0)*t2s_2(2,0)
-			     + t4ddg_2(0,2,1,1)*t2s_2(2,1)
-			     + t4ddg_2(0,2,1,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)*T2s(j,l)(0,1)");
-  test_for_zero(t2_1(0,2) - (t4ddg_2(0,0,2,0)*t2s_2(0,0)
-			     + t4ddg_2(0,0,2,1)*t2s_2(0,1)
-			     + t4ddg_2(0,0,2,2)*t2s_2(0,2)
-			     + t4ddg_2(0,1,2,0)*t2s_2(1,0)
-			     + t4ddg_2(0,1,2,1)*t2s_2(1,1)
-			     + t4ddg_2(0,1,2,2)*t2s_2(1,2)
-			     + t4ddg_2(0,2,2,0)*t2s_2(2,0)
-			     + t4ddg_2(0,2,2,1)*t2s_2(2,1)
-			     + t4ddg_2(0,2,2,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)*T2s(j,l)(0,2)");
-  test_for_zero(t2_1(1,0) - (t4ddg_2(1,0,0,0)*t2s_2(0,0)
-			     + t4ddg_2(1,0,0,1)*t2s_2(0,1)
-			     + t4ddg_2(1,0,0,2)*t2s_2(0,2)
-			     + t4ddg_2(1,1,0,0)*t2s_2(1,0)
-			     + t4ddg_2(1,1,0,1)*t2s_2(1,1)
-			     + t4ddg_2(1,1,0,2)*t2s_2(1,2)
-			     + t4ddg_2(1,2,0,0)*t2s_2(2,0)
-			     + t4ddg_2(1,2,0,1)*t2s_2(2,1)
-			     + t4ddg_2(1,2,0,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)*T2s(j,l)(1,0)");
-  test_for_zero(t2_1(1,1) - (t4ddg_2(1,0,1,0)*t2s_2(0,0)
-			     + t4ddg_2(1,0,1,1)*t2s_2(0,1)
-			     + t4ddg_2(1,0,1,2)*t2s_2(0,2)
-			     + t4ddg_2(1,1,1,0)*t2s_2(1,0)
-			     + t4ddg_2(1,1,1,1)*t2s_2(1,1)
-			     + t4ddg_2(1,1,1,2)*t2s_2(1,2)
-			     + t4ddg_2(1,2,1,0)*t2s_2(2,0)
-			     + t4ddg_2(1,2,1,1)*t2s_2(2,1)
-			     + t4ddg_2(1,2,1,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)*T2s(j,l)(1,1)");
-  test_for_zero(t2_1(1,2) - (t4ddg_2(1,0,2,0)*t2s_2(0,0)
-			     + t4ddg_2(1,0,2,1)*t2s_2(0,1)
-			     + t4ddg_2(1,0,2,2)*t2s_2(0,2)
-			     + t4ddg_2(1,1,2,0)*t2s_2(1,0)
-			     + t4ddg_2(1,1,2,1)*t2s_2(1,1)
-			     + t4ddg_2(1,1,2,2)*t2s_2(1,2)
-			     + t4ddg_2(1,2,2,0)*t2s_2(2,0)
-			     + t4ddg_2(1,2,2,1)*t2s_2(2,1)
-			     + t4ddg_2(1,2,2,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)*T2s(j,l)(1,2)");
-  test_for_zero(t2_1(2,0) - (t4ddg_2(2,0,0,0)*t2s_2(0,0)
-			     + t4ddg_2(2,0,0,1)*t2s_2(0,1)
-			     + t4ddg_2(2,0,0,2)*t2s_2(0,2)
-			     + t4ddg_2(2,1,0,0)*t2s_2(1,0)
-			     + t4ddg_2(2,1,0,1)*t2s_2(1,1)
-			     + t4ddg_2(2,1,0,2)*t2s_2(1,2)
-			     + t4ddg_2(2,2,0,0)*t2s_2(2,0)
-			     + t4ddg_2(2,2,0,1)*t2s_2(2,1)
-			     + t4ddg_2(2,2,0,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)*T2s(j,l)(2,0)");
-  test_for_zero(t2_1(2,1) - (t4ddg_2(2,0,1,0)*t2s_2(0,0)
-			     + t4ddg_2(2,0,1,1)*t2s_2(0,1)
-			     + t4ddg_2(2,0,1,2)*t2s_2(0,2)
-			     + t4ddg_2(2,1,1,0)*t2s_2(1,0)
-			     + t4ddg_2(2,1,1,1)*t2s_2(1,1)
-			     + t4ddg_2(2,1,1,2)*t2s_2(1,2)
-			     + t4ddg_2(2,2,1,0)*t2s_2(2,0)
-			     + t4ddg_2(2,2,1,1)*t2s_2(2,1)
-			     + t4ddg_2(2,2,1,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)*T2s(j,l)(2,1)");
-  test_for_zero(t2_1(2,2) - (t4ddg_2(2,0,2,0)*t2s_2(0,0)
-			     + t4ddg_2(2,0,2,1)*t2s_2(0,1)
-			     + t4ddg_2(2,0,2,2)*t2s_2(0,2)
-			     + t4ddg_2(2,1,2,0)*t2s_2(1,0)
-			     + t4ddg_2(2,1,2,1)*t2s_2(1,1)
-			     + t4ddg_2(2,1,2,2)*t2s_2(1,2)
-			     + t4ddg_2(2,2,2,0)*t2s_2(2,0)
-			     + t4ddg_2(2,2,2,1)*t2s_2(2,1)
-			     + t4ddg_2(2,2,2,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)*T2s(j,l)(2,2)");
-
-  t2_1(i,k)=t2s_3(j,l)*t4ddg_2(i,j,k,l);
-  test_for_zero(t2_1(0,0) - (t4ddg_2(0,0,0,0)*t2s_3(0,0)
-			     + t4ddg_2(0,0,0,1)*t2s_3(0,1)
-			     + t4ddg_2(0,0,0,2)*t2s_3(0,2)
-			     + t4ddg_2(0,1,0,0)*t2s_3(1,0)
-			     + t4ddg_2(0,1,0,1)*t2s_3(1,1)
-			     + t4ddg_2(0,1,0,2)*t2s_3(1,2)
-			     + t4ddg_2(0,2,0,0)*t2s_3(2,0)
-			     + t4ddg_2(0,2,0,1)*t2s_3(2,1)
-			     + t4ddg_2(0,2,0,2)*t2s_3(2,2))
-		,"T2s(j,l)*T4ddg(i,j,k,l)(0,0)");
-  test_for_zero(t2_1(0,1) - (t4ddg_2(0,0,1,0)*t2s_3(0,0)
-			     + t4ddg_2(0,0,1,1)*t2s_3(0,1)
-			     + t4ddg_2(0,0,1,2)*t2s_3(0,2)
-			     + t4ddg_2(0,1,1,0)*t2s_3(1,0)
-			     + t4ddg_2(0,1,1,1)*t2s_3(1,1)
-			     + t4ddg_2(0,1,1,2)*t2s_3(1,2)
-			     + t4ddg_2(0,2,1,0)*t2s_3(2,0)
-			     + t4ddg_2(0,2,1,1)*t2s_3(2,1)
-			     + t4ddg_2(0,2,1,2)*t2s_3(2,2))
-		,"T2s(j,l)*T4ddg(i,j,k,l)(0,1)");
-  test_for_zero(t2_1(0,2) - (t4ddg_2(0,0,2,0)*t2s_3(0,0)
-			     + t4ddg_2(0,0,2,1)*t2s_3(0,1)
-			     + t4ddg_2(0,0,2,2)*t2s_3(0,2)
-			     + t4ddg_2(0,1,2,0)*t2s_3(1,0)
-			     + t4ddg_2(0,1,2,1)*t2s_3(1,1)
-			     + t4ddg_2(0,1,2,2)*t2s_3(1,2)
-			     + t4ddg_2(0,2,2,0)*t2s_3(2,0)
-			     + t4ddg_2(0,2,2,1)*t2s_3(2,1)
-			     + t4ddg_2(0,2,2,2)*t2s_3(2,2))
-		,"T2s(j,l)*T4ddg(i,j,k,l)(0,2)");
-  test_for_zero(t2_1(1,0) - (t4ddg_2(1,0,0,0)*t2s_3(0,0)
-			     + t4ddg_2(1,0,0,1)*t2s_3(0,1)
-			     + t4ddg_2(1,0,0,2)*t2s_3(0,2)
-			     + t4ddg_2(1,1,0,0)*t2s_3(1,0)
-			     + t4ddg_2(1,1,0,1)*t2s_3(1,1)
-			     + t4ddg_2(1,1,0,2)*t2s_3(1,2)
-			     + t4ddg_2(1,2,0,0)*t2s_3(2,0)
-			     + t4ddg_2(1,2,0,1)*t2s_3(2,1)
-			     + t4ddg_2(1,2,0,2)*t2s_3(2,2))
-		,"T2s(j,l)*T4ddg(i,j,k,l)(1,0)");
-  test_for_zero(t2_1(1,1) - (t4ddg_2(1,0,1,0)*t2s_3(0,0)
-			     + t4ddg_2(1,0,1,1)*t2s_3(0,1)
-			     + t4ddg_2(1,0,1,2)*t2s_3(0,2)
-			     + t4ddg_2(1,1,1,0)*t2s_3(1,0)
-			     + t4ddg_2(1,1,1,1)*t2s_3(1,1)
-			     + t4ddg_2(1,1,1,2)*t2s_3(1,2)
-			     + t4ddg_2(1,2,1,0)*t2s_3(2,0)
-			     + t4ddg_2(1,2,1,1)*t2s_3(2,1)
-			     + t4ddg_2(1,2,1,2)*t2s_3(2,2))
-		,"T2s(j,l)*T4ddg(i,j,k,l)(1,1)");
-  test_for_zero(t2_1(1,2) - (t4ddg_2(1,0,2,0)*t2s_3(0,0)
-			     + t4ddg_2(1,0,2,1)*t2s_3(0,1)
-			     + t4ddg_2(1,0,2,2)*t2s_3(0,2)
-			     + t4ddg_2(1,1,2,0)*t2s_3(1,0)
-			     + t4ddg_2(1,1,2,1)*t2s_3(1,1)
-			     + t4ddg_2(1,1,2,2)*t2s_3(1,2)
-			     + t4ddg_2(1,2,2,0)*t2s_3(2,0)
-			     + t4ddg_2(1,2,2,1)*t2s_3(2,1)
-			     + t4ddg_2(1,2,2,2)*t2s_3(2,2))
-		,"T2s(j,l)*T4ddg(i,j,k,l)(1,2)");
-  test_for_zero(t2_1(2,0) - (t4ddg_2(2,0,0,0)*t2s_3(0,0)
-			     + t4ddg_2(2,0,0,1)*t2s_3(0,1)
-			     + t4ddg_2(2,0,0,2)*t2s_3(0,2)
-			     + t4ddg_2(2,1,0,0)*t2s_3(1,0)
-			     + t4ddg_2(2,1,0,1)*t2s_3(1,1)
-			     + t4ddg_2(2,1,0,2)*t2s_3(1,2)
-			     + t4ddg_2(2,2,0,0)*t2s_3(2,0)
-			     + t4ddg_2(2,2,0,1)*t2s_3(2,1)
-			     + t4ddg_2(2,2,0,2)*t2s_3(2,2))
-		,"T2s(j,l)*T4ddg(i,j,k,l)(2,0)");
-  test_for_zero(t2_1(2,1) - (t4ddg_2(2,0,1,0)*t2s_3(0,0)
-			     + t4ddg_2(2,0,1,1)*t2s_3(0,1)
-			     + t4ddg_2(2,0,1,2)*t2s_3(0,2)
-			     + t4ddg_2(2,1,1,0)*t2s_3(1,0)
-			     + t4ddg_2(2,1,1,1)*t2s_3(1,1)
-			     + t4ddg_2(2,1,1,2)*t2s_3(1,2)
-			     + t4ddg_2(2,2,1,0)*t2s_3(2,0)
-			     + t4ddg_2(2,2,1,1)*t2s_3(2,1)
-			     + t4ddg_2(2,2,1,2)*t2s_3(2,2))
-		,"T2s(j,l)*T4ddg(i,j,k,l)(2,1)");
-  test_for_zero(t2_1(2,2) - (t4ddg_2(2,0,2,0)*t2s_3(0,0)
-			     + t4ddg_2(2,0,2,1)*t2s_3(0,1)
-			     + t4ddg_2(2,0,2,2)*t2s_3(0,2)
-			     + t4ddg_2(2,1,2,0)*t2s_3(1,0)
-			     + t4ddg_2(2,1,2,1)*t2s_3(1,1)
-			     + t4ddg_2(2,1,2,2)*t2s_3(1,2)
-			     + t4ddg_2(2,2,2,0)*t2s_3(2,0)
-			     + t4ddg_2(2,2,2,1)*t2s_3(2,1)
-			     + t4ddg_2(2,2,2,2)*t2s_3(2,2))
-		,"T2s(j,l)*T4ddg(i,j,k,l)(2,2)");
-
-  t2s_1(j,l)=t4ddg_2(i,k,j,l)*t2s_2(i,k);
-  test_for_zero(t2s_1(0,0) - (t4ddg_2(0,0,0,0)*t2s_2(0,0)
-			      + t4ddg_2(0,1,0,0)*t2s_2(0,1)
-			      + t4ddg_2(0,2,0,0)*t2s_2(0,2)
-			      + t4ddg_2(1,0,0,0)*t2s_2(1,0)
-			      + t4ddg_2(1,1,0,0)*t2s_2(1,1)
-			      + t4ddg_2(1,2,0,0)*t2s_2(1,2)
-			      + t4ddg_2(2,0,0,0)*t2s_2(2,0)
-			      + t4ddg_2(2,1,0,0)*t2s_2(2,1)
-			      + t4ddg_2(2,2,0,0)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)*T2s(i,k)(0,0)");
-  test_for_zero(t2s_1(0,1) - (t4ddg_2(0,0,0,1)*t2s_2(0,0)
-			      + t4ddg_2(0,1,0,1)*t2s_2(0,1)
-			      + t4ddg_2(0,2,0,1)*t2s_2(0,2)
-			      + t4ddg_2(1,0,0,1)*t2s_2(1,0)
-			      + t4ddg_2(1,1,0,1)*t2s_2(1,1)
-			      + t4ddg_2(1,2,0,1)*t2s_2(1,2)
-			      + t4ddg_2(2,0,0,1)*t2s_2(2,0)
-			      + t4ddg_2(2,1,0,1)*t2s_2(2,1)
-			      + t4ddg_2(2,2,0,1)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)*T2s(i,k)(0,1)");
-  test_for_zero(t2s_1(0,2) - (t4ddg_2(0,0,0,2)*t2s_2(0,0)
-			      + t4ddg_2(0,1,0,2)*t2s_2(0,1)
-			      + t4ddg_2(0,2,0,2)*t2s_2(0,2)
-			      + t4ddg_2(1,0,0,2)*t2s_2(1,0)
-			      + t4ddg_2(1,1,0,2)*t2s_2(1,1)
-			      + t4ddg_2(1,2,0,2)*t2s_2(1,2)
-			      + t4ddg_2(2,0,0,2)*t2s_2(2,0)
-			      + t4ddg_2(2,1,0,2)*t2s_2(2,1)
-			      + t4ddg_2(2,2,0,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)*T2s(i,k)(0,2)");
-  test_for_zero(t2s_1(1,0) - (t4ddg_2(0,0,1,0)*t2s_2(0,0)
-			      + t4ddg_2(0,1,1,0)*t2s_2(0,1)
-			      + t4ddg_2(0,2,1,0)*t2s_2(0,2)
-			      + t4ddg_2(1,0,1,0)*t2s_2(1,0)
-			      + t4ddg_2(1,1,1,0)*t2s_2(1,1)
-			      + t4ddg_2(1,2,1,0)*t2s_2(1,2)
-			      + t4ddg_2(2,0,1,0)*t2s_2(2,0)
-			      + t4ddg_2(2,1,1,0)*t2s_2(2,1)
-			      + t4ddg_2(2,2,1,0)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)*T2s(i,k)(1,0)");
-  test_for_zero(t2s_1(1,1) - (t4ddg_2(0,0,1,1)*t2s_2(0,0)
-			      + t4ddg_2(0,1,1,1)*t2s_2(0,1)
-			      + t4ddg_2(0,2,1,1)*t2s_2(0,2)
-			      + t4ddg_2(1,0,1,1)*t2s_2(1,0)
-			      + t4ddg_2(1,1,1,1)*t2s_2(1,1)
-			      + t4ddg_2(1,2,1,1)*t2s_2(1,2)
-			      + t4ddg_2(2,0,1,1)*t2s_2(2,0)
-			      + t4ddg_2(2,1,1,1)*t2s_2(2,1)
-			      + t4ddg_2(2,2,1,1)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)*T2s(i,k)(1,1)");
-  test_for_zero(t2s_1(1,2) - (t4ddg_2(0,0,1,2)*t2s_2(0,0)
-			      + t4ddg_2(0,1,1,2)*t2s_2(0,1)
-			      + t4ddg_2(0,2,1,2)*t2s_2(0,2)
-			      + t4ddg_2(1,0,1,2)*t2s_2(1,0)
-			      + t4ddg_2(1,1,1,2)*t2s_2(1,1)
-			      + t4ddg_2(1,2,1,2)*t2s_2(1,2)
-			      + t4ddg_2(2,0,1,2)*t2s_2(2,0)
-			      + t4ddg_2(2,1,1,2)*t2s_2(2,1)
-			      + t4ddg_2(2,2,1,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)*T2s(i,k)(1,2)");
-  test_for_zero(t2s_1(2,0) - (t4ddg_2(0,0,2,0)*t2s_2(0,0)
-			      + t4ddg_2(0,1,2,0)*t2s_2(0,1)
-			      + t4ddg_2(0,2,2,0)*t2s_2(0,2)
-			      + t4ddg_2(1,0,2,0)*t2s_2(1,0)
-			      + t4ddg_2(1,1,2,0)*t2s_2(1,1)
-			      + t4ddg_2(1,2,2,0)*t2s_2(1,2)
-			      + t4ddg_2(2,0,2,0)*t2s_2(2,0)
-			      + t4ddg_2(2,1,2,0)*t2s_2(2,1)
-			      + t4ddg_2(2,2,2,0)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)*T2s(i,k)(2,0)");
-  test_for_zero(t2s_1(2,1) - (t4ddg_2(0,0,2,1)*t2s_2(0,0)
-			      + t4ddg_2(0,1,2,1)*t2s_2(0,1)
-			      + t4ddg_2(0,2,2,1)*t2s_2(0,2)
-			      + t4ddg_2(1,0,2,1)*t2s_2(1,0)
-			      + t4ddg_2(1,1,2,1)*t2s_2(1,1)
-			      + t4ddg_2(1,2,2,1)*t2s_2(1,2)
-			      + t4ddg_2(2,0,2,1)*t2s_2(2,0)
-			      + t4ddg_2(2,1,2,1)*t2s_2(2,1)
-			      + t4ddg_2(2,2,2,1)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)*T2s(i,k)(2,1)");
-  test_for_zero(t2s_1(2,2) - (t4ddg_2(0,0,2,2)*t2s_2(0,0)
-			      + t4ddg_2(0,1,2,2)*t2s_2(0,1)
-			      + t4ddg_2(0,2,2,2)*t2s_2(0,2)
-			      + t4ddg_2(1,0,2,2)*t2s_2(1,0)
-			      + t4ddg_2(1,1,2,2)*t2s_2(1,1)
-			      + t4ddg_2(1,2,2,2)*t2s_2(1,2)
-			      + t4ddg_2(2,0,2,2)*t2s_2(2,0)
-			      + t4ddg_2(2,1,2,2)*t2s_2(2,1)
-			      + t4ddg_2(2,2,2,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)*T2s(i,k)(2,2)");
-
-  t2s_1(j,l)=t2s_3(i,k)*t4ddg_2(i,k,j,l);
-  test_for_zero(t2s_1(0,0) - (t4ddg_2(0,0,0,0)*t2s_3(0,0)
-			      + t4ddg_2(0,1,0,0)*t2s_3(0,1)
-			      + t4ddg_2(0,2,0,0)*t2s_3(0,2)
-			      + t4ddg_2(1,0,0,0)*t2s_3(1,0)
-			      + t4ddg_2(1,1,0,0)*t2s_3(1,1)
-			      + t4ddg_2(1,2,0,0)*t2s_3(1,2)
-			      + t4ddg_2(2,0,0,0)*t2s_3(2,0)
-			      + t4ddg_2(2,1,0,0)*t2s_3(2,1)
-			      + t4ddg_2(2,2,0,0)*t2s_3(2,2))
-		,"T2s(i,k)*T4ddg(i,j,k,l)(0,0)");
-  test_for_zero(t2s_1(0,1) - (t4ddg_2(0,0,0,1)*t2s_3(0,0)
-			      + t4ddg_2(0,1,0,1)*t2s_3(0,1)
-			      + t4ddg_2(0,2,0,1)*t2s_3(0,2)
-			      + t4ddg_2(1,0,0,1)*t2s_3(1,0)
-			      + t4ddg_2(1,1,0,1)*t2s_3(1,1)
-			      + t4ddg_2(1,2,0,1)*t2s_3(1,2)
-			      + t4ddg_2(2,0,0,1)*t2s_3(2,0)
-			      + t4ddg_2(2,1,0,1)*t2s_3(2,1)
-			      + t4ddg_2(2,2,0,1)*t2s_3(2,2))
-		,"T2s(i,k)*T4ddg(i,j,k,l)(0,1)");
-  test_for_zero(t2s_1(0,2) - (t4ddg_2(0,0,0,2)*t2s_3(0,0)
-			      + t4ddg_2(0,1,0,2)*t2s_3(0,1)
-			      + t4ddg_2(0,2,0,2)*t2s_3(0,2)
-			      + t4ddg_2(1,0,0,2)*t2s_3(1,0)
-			      + t4ddg_2(1,1,0,2)*t2s_3(1,1)
-			      + t4ddg_2(1,2,0,2)*t2s_3(1,2)
-			      + t4ddg_2(2,0,0,2)*t2s_3(2,0)
-			      + t4ddg_2(2,1,0,2)*t2s_3(2,1)
-			      + t4ddg_2(2,2,0,2)*t2s_3(2,2))
-		,"T2s(i,k)*T4ddg(i,j,k,l)(0,2)");
-  test_for_zero(t2s_1(1,0) - (t4ddg_2(0,0,1,0)*t2s_3(0,0)
-			      + t4ddg_2(0,1,1,0)*t2s_3(0,1)
-			      + t4ddg_2(0,2,1,0)*t2s_3(0,2)
-			      + t4ddg_2(1,0,1,0)*t2s_3(1,0)
-			      + t4ddg_2(1,1,1,0)*t2s_3(1,1)
-			      + t4ddg_2(1,2,1,0)*t2s_3(1,2)
-			      + t4ddg_2(2,0,1,0)*t2s_3(2,0)
-			      + t4ddg_2(2,1,1,0)*t2s_3(2,1)
-			      + t4ddg_2(2,2,1,0)*t2s_3(2,2))
-		,"T2s(i,k)*T4ddg(i,j,k,l)(1,0)");
-  test_for_zero(t2s_1(1,1) - (t4ddg_2(0,0,1,1)*t2s_3(0,0)
-			      + t4ddg_2(0,1,1,1)*t2s_3(0,1)
-			      + t4ddg_2(0,2,1,1)*t2s_3(0,2)
-			      + t4ddg_2(1,0,1,1)*t2s_3(1,0)
-			      + t4ddg_2(1,1,1,1)*t2s_3(1,1)
-			      + t4ddg_2(1,2,1,1)*t2s_3(1,2)
-			      + t4ddg_2(2,0,1,1)*t2s_3(2,0)
-			      + t4ddg_2(2,1,1,1)*t2s_3(2,1)
-			      + t4ddg_2(2,2,1,1)*t2s_3(2,2))
-		,"T2s(i,k)*T4ddg(i,j,k,l)(1,1)");
-  test_for_zero(t2s_1(1,2) - (t4ddg_2(0,0,1,2)*t2s_3(0,0)
-			      + t4ddg_2(0,1,1,2)*t2s_3(0,1)
-			      + t4ddg_2(0,2,1,2)*t2s_3(0,2)
-			      + t4ddg_2(1,0,1,2)*t2s_3(1,0)
-			      + t4ddg_2(1,1,1,2)*t2s_3(1,1)
-			      + t4ddg_2(1,2,1,2)*t2s_3(1,2)
-			      + t4ddg_2(2,0,1,2)*t2s_3(2,0)
-			      + t4ddg_2(2,1,1,2)*t2s_3(2,1)
-			      + t4ddg_2(2,2,1,2)*t2s_3(2,2))
-		,"T2s(i,k)*T4ddg(i,j,k,l)(1,2)");
-  test_for_zero(t2s_1(2,0) - (t4ddg_2(0,0,2,0)*t2s_3(0,0)
-			      + t4ddg_2(0,1,2,0)*t2s_3(0,1)
-			      + t4ddg_2(0,2,2,0)*t2s_3(0,2)
-			      + t4ddg_2(1,0,2,0)*t2s_3(1,0)
-			      + t4ddg_2(1,1,2,0)*t2s_3(1,1)
-			      + t4ddg_2(1,2,2,0)*t2s_3(1,2)
-			      + t4ddg_2(2,0,2,0)*t2s_3(2,0)
-			      + t4ddg_2(2,1,2,0)*t2s_3(2,1)
-			      + t4ddg_2(2,2,2,0)*t2s_3(2,2))
-		,"T2s(i,k)*T4ddg(i,j,k,l)(2,0)");
-  test_for_zero(t2s_1(2,1) - (t4ddg_2(0,0,2,1)*t2s_3(0,0)
-			      + t4ddg_2(0,1,2,1)*t2s_3(0,1)
-			      + t4ddg_2(0,2,2,1)*t2s_3(0,2)
-			      + t4ddg_2(1,0,2,1)*t2s_3(1,0)
-			      + t4ddg_2(1,1,2,1)*t2s_3(1,1)
-			      + t4ddg_2(1,2,2,1)*t2s_3(1,2)
-			      + t4ddg_2(2,0,2,1)*t2s_3(2,0)
-			      + t4ddg_2(2,1,2,1)*t2s_3(2,1)
-			      + t4ddg_2(2,2,2,1)*t2s_3(2,2))
-		,"T2s(i,k)*T4ddg(i,j,k,l)(2,1)");
-  test_for_zero(t2s_1(2,2) - (t4ddg_2(0,0,2,2)*t2s_3(0,0)
-			      + t4ddg_2(0,1,2,2)*t2s_3(0,1)
-			      + t4ddg_2(0,2,2,2)*t2s_3(0,2)
-			      + t4ddg_2(1,0,2,2)*t2s_3(1,0)
-			      + t4ddg_2(1,1,2,2)*t2s_3(1,1)
-			      + t4ddg_2(1,2,2,2)*t2s_3(1,2)
-			      + t4ddg_2(2,0,2,2)*t2s_3(2,0)
-			      + t4ddg_2(2,1,2,2)*t2s_3(2,1)
-			      + t4ddg_2(2,2,2,2)*t2s_3(2,2))
-		,"T2s(i,k)*T4ddg(i,j,k,l)(2,2)");
-
-  t4ddg_1(i,j,k,l)=(t4ddg_2(i,j,k,l)&t2s_3(i,j));
-  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)*t2s_3(0,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,0,0,0)");
-  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)*t2s_3(0,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,0,0,1)");
-  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)*t2s_3(0,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,0,0,2)");
-  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)*t2s_3(0,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,0,1,0)");
-  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)*t2s_3(0,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,0,1,1)");
-  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)*t2s_3(0,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,0,1,2)");
-  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)*t2s_3(0,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,0,2,0)");
-  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)*t2s_3(0,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,0,2,1)");
-  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)*t2s_3(0,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,0,2,2)");
-  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)*t2s_3(0,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,1,0,0)");
-  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)*t2s_3(0,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,1,0,1)");
-  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)*t2s_3(0,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,1,0,2)");
-  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)*t2s_3(0,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,1,1,0)");
-  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)*t2s_3(0,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,1,1,1)");
-  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)*t2s_3(0,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,1,1,2)");
-  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)*t2s_3(0,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,1,2,0)");
-  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)*t2s_3(0,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,1,2,1)");
-  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)*t2s_3(0,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,1,2,2)");
-  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)*t2s_3(0,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,2,0,0)");
-  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)*t2s_3(0,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,2,0,1)");
-  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)*t2s_3(0,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,2,0,2)");
-  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)*t2s_3(0,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,2,1,0)");
-  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)*t2s_3(0,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,2,1,1)");
-  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)*t2s_3(0,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,2,1,2)");
-  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)*t2s_3(0,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,2,2,0)");
-  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)*t2s_3(0,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,2,2,1)");
-  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)*t2s_3(0,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(0,2,2,2)");
-  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)*t2s_3(1,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,0,0,0)");
-  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)*t2s_3(1,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,0,0,1)");
-  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)*t2s_3(1,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,0,0,2)");
-  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)*t2s_3(1,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,0,1,0)");
-  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)*t2s_3(1,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,0,1,1)");
-  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)*t2s_3(1,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,0,1,2)");
-  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)*t2s_3(1,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,0,2,0)");
-  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)*t2s_3(1,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,0,2,1)");
-  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)*t2s_3(1,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,0,2,2)");
-  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)*t2s_3(1,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,1,0,0)");
-  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)*t2s_3(1,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,1,0,1)");
-  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)*t2s_3(1,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,1,0,2)");
-  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)*t2s_3(1,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)*t2s_3(1,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,1,1,1)");
-  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)*t2s_3(1,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,1,1,2)");
-  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)*t2s_3(1,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,1,2,0)");
-  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)*t2s_3(1,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,1,2,1)");
-  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)*t2s_3(1,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,1,2,2)");
-  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)*t2s_3(1,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,2,0,0)");
-  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)*t2s_3(1,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,2,0,1)");
-  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)*t2s_3(1,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,2,0,2)");
-  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)*t2s_3(1,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,2,1,0)");
-  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)*t2s_3(1,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,2,1,1)");
-  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)*t2s_3(1,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,2,1,2)");
-  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)*t2s_3(1,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,2,2,0)");
-  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)*t2s_3(1,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,2,2,1)");
-  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)*t2s_3(1,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(1,2,2,2)");
-  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)*t2s_3(2,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,0,0,0)");
-  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)*t2s_3(2,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,0,0,1)");
-  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)*t2s_3(2,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,0,0,2)");
-  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)*t2s_3(2,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,0,1,0)");
-  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)*t2s_3(2,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,0,1,1)");
-  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)*t2s_3(2,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,0,1,2)");
-  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)*t2s_3(2,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,0,2,0)");
-  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)*t2s_3(2,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,0,2,1)");
-  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)*t2s_3(2,0))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,0,2,2)");
-  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)*t2s_3(2,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,1,0,0)");
-  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)*t2s_3(2,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,1,0,1)");
-  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)*t2s_3(2,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,1,0,2)");
-  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)*t2s_3(2,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,1,1,0)");
-  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)*t2s_3(2,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,1,1,1)");
-  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)*t2s_3(2,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,1,1,2)");
-  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)*t2s_3(2,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,1,2,0)");
-  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)*t2s_3(2,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,1,2,1)");
-  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)*t2s_3(2,1))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,1,2,2)");
-  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)*t2s_3(2,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,2,0,0)");
-  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)*t2s_3(2,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,2,0,1)");
-  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)*t2s_3(2,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,2,0,2)");
-  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)*t2s_3(2,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,2,1,0)");
-  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)*t2s_3(2,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,2,1,1)");
-  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)*t2s_3(2,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,2,1,2)");
-  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)*t2s_3(2,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,2,2,0)");
-  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)*t2s_3(2,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)*t2s_3(2,2))
-		,"T4ddg(i,j,k,l)&T2s(i,j)(2,2,2,2)");
-
-  t4ddg_1(i,j,k,l)=(t2s_2(i,j)&t4ddg_2(i,j,k,l));
-  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)*t2s_2(0,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,0,0,0)");
-  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)*t2s_2(0,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,0,0,1)");
-  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)*t2s_2(0,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,0,0,2)");
-  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)*t2s_2(0,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,0,1,0)");
-  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)*t2s_2(0,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,0,1,1)");
-  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)*t2s_2(0,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,0,1,2)");
-  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)*t2s_2(0,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,0,2,0)");
-  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)*t2s_2(0,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,0,2,1)");
-  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)*t2s_2(0,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,0,2,2)");
-  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)*t2s_2(0,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,1,0,0)");
-  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)*t2s_2(0,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,1,0,1)");
-  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)*t2s_2(0,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,1,0,2)");
-  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)*t2s_2(0,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,1,1,0)");
-  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)*t2s_2(0,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,1,1,1)");
-  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)*t2s_2(0,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,1,1,2)");
-  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)*t2s_2(0,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,1,2,0)");
-  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)*t2s_2(0,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,1,2,1)");
-  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)*t2s_2(0,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,1,2,2)");
-  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)*t2s_2(0,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,2,0,0)");
-  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)*t2s_2(0,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,2,0,1)");
-  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)*t2s_2(0,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,2,0,2)");
-  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)*t2s_2(0,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,2,1,0)");
-  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)*t2s_2(0,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,2,1,1)");
-  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)*t2s_2(0,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,2,1,2)");
-  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)*t2s_2(0,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,2,2,0)");
-  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)*t2s_2(0,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,2,2,1)");
-  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)*t2s_2(0,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(0,2,2,2)");
-  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)*t2s_2(1,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,0,0,0)");
-  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)*t2s_2(1,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,0,0,1)");
-  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)*t2s_2(1,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,0,0,2)");
-  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)*t2s_2(1,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,0,1,0)");
-  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)*t2s_2(1,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,0,1,1)");
-  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)*t2s_2(1,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,0,1,2)");
-  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)*t2s_2(1,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,0,2,0)");
-  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)*t2s_2(1,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,0,2,1)");
-  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)*t2s_2(1,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,0,2,2)");
-  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)*t2s_2(1,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,1,0,0)");
-  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)*t2s_2(1,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,1,0,1)");
-  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)*t2s_2(1,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,1,0,2)");
-  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)*t2s_2(1,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)*t2s_2(1,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,1,1,1)");
-  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)*t2s_2(1,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,1,1,2)");
-  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)*t2s_2(1,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,1,2,0)");
-  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)*t2s_2(1,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,1,2,1)");
-  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)*t2s_2(1,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,1,2,2)");
-  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)*t2s_2(1,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,2,0,0)");
-  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)*t2s_2(1,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,2,0,1)");
-  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)*t2s_2(1,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,2,0,2)");
-  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)*t2s_2(1,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,2,1,0)");
-  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)*t2s_2(1,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,2,1,1)");
-  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)*t2s_2(1,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,2,1,2)");
-  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)*t2s_2(1,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,2,2,0)");
-  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)*t2s_2(1,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,2,2,1)");
-  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)*t2s_2(1,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(1,2,2,2)");
-  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)*t2s_2(2,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,0,0,0)");
-  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)*t2s_2(2,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,0,0,1)");
-  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)*t2s_2(2,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,0,0,2)");
-  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)*t2s_2(2,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,0,1,0)");
-  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)*t2s_2(2,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,0,1,1)");
-  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)*t2s_2(2,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,0,1,2)");
-  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)*t2s_2(2,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,0,2,0)");
-  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)*t2s_2(2,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,0,2,1)");
-  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)*t2s_2(2,0))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,0,2,2)");
-  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)*t2s_2(2,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,1,0,0)");
-  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)*t2s_2(2,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,1,0,1)");
-  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)*t2s_2(2,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,1,0,2)");
-  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)*t2s_2(2,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,1,1,0)");
-  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)*t2s_2(2,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,1,1,1)");
-  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)*t2s_2(2,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,1,1,2)");
-  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)*t2s_2(2,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,1,2,0)");
-  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)*t2s_2(2,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,1,2,1)");
-  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)*t2s_2(2,1))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,1,2,2)");
-  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)*t2s_2(2,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,2,0,0)");
-  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)*t2s_2(2,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,2,0,1)");
-  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)*t2s_2(2,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,2,0,2)");
-  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)*t2s_2(2,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,2,1,0)");
-  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)*t2s_2(2,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,2,1,1)");
-  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)*t2s_2(2,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,2,1,2)");
-  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)*t2s_2(2,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,2,2,0)");
-  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)*t2s_2(2,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)*t2s_2(2,2))
-		,"T2s(i,j)&T4ddg(i,j,k,l)(2,2,2,2)");
-
-  t4ddg_1(i,j,k,l)=(t4ddg_2(i,j,k,l)&t2s_3(k,l));
-  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)*t2s_3(0,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,0,0,0)");
-  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)*t2s_3(0,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,0,0,1)");
-  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)*t2s_3(0,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,0,0,2)");
-  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)*t2s_3(1,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,0,1,0)");
-  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)*t2s_3(1,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,0,1,1)");
-  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)*t2s_3(1,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,0,1,2)");
-  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)*t2s_3(2,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,0,2,0)");
-  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)*t2s_3(2,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,0,2,1)");
-  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)*t2s_3(2,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,0,2,2)");
-  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)*t2s_3(0,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,1,0,0)");
-  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)*t2s_3(0,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,1,0,1)");
-  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)*t2s_3(0,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,1,0,2)");
-  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)*t2s_3(1,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,1,1,0)");
-  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)*t2s_3(1,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,1,1,1)");
-  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)*t2s_3(1,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,1,1,2)");
-  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)*t2s_3(2,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,1,2,0)");
-  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)*t2s_3(2,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,1,2,1)");
-  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)*t2s_3(2,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,1,2,2)");
-  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)*t2s_3(0,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,2,0,0)");
-  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)*t2s_3(0,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,2,0,1)");
-  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)*t2s_3(0,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,2,0,2)");
-  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)*t2s_3(1,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,2,1,0)");
-  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)*t2s_3(1,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,2,1,1)");
-  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)*t2s_3(1,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,2,1,2)");
-  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)*t2s_3(2,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,2,2,0)");
-  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)*t2s_3(2,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,2,2,1)");
-  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)*t2s_3(2,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(0,2,2,2)");
-  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)*t2s_3(0,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,0,0,0)");
-  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)*t2s_3(0,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,0,0,1)");
-  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)*t2s_3(0,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,0,0,2)");
-  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)*t2s_3(1,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,0,1,0)");
-  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)*t2s_3(1,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,0,1,1)");
-  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)*t2s_3(1,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,0,1,2)");
-  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)*t2s_3(2,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,0,2,0)");
-  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)*t2s_3(2,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,0,2,1)");
-  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)*t2s_3(2,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,0,2,2)");
-  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)*t2s_3(0,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,1,0,0)");
-  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)*t2s_3(0,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,1,0,1)");
-  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)*t2s_3(0,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,1,0,2)");
-  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)*t2s_3(1,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)*t2s_3(1,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,1,1,1)");
-  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)*t2s_3(1,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,1,1,2)");
-  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)*t2s_3(2,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,1,2,0)");
-  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)*t2s_3(2,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,1,2,1)");
-  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)*t2s_3(2,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,1,2,2)");
-  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)*t2s_3(0,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,2,0,0)");
-  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)*t2s_3(0,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,2,0,1)");
-  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)*t2s_3(0,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,2,0,2)");
-  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)*t2s_3(1,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,2,1,0)");
-  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)*t2s_3(1,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,2,1,1)");
-  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)*t2s_3(1,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,2,1,2)");
-  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)*t2s_3(2,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,2,2,0)");
-  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)*t2s_3(2,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,2,2,1)");
-  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)*t2s_3(2,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(1,2,2,2)");
-  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)*t2s_3(0,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,0,0,0)");
-  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)*t2s_3(0,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,0,0,1)");
-  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)*t2s_3(0,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,0,0,2)");
-  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)*t2s_3(1,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,0,1,0)");
-  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)*t2s_3(1,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,0,1,1)");
-  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)*t2s_3(1,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,0,1,2)");
-  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)*t2s_3(2,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,0,2,0)");
-  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)*t2s_3(2,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,0,2,1)");
-  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)*t2s_3(2,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,0,2,2)");
-  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)*t2s_3(0,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,1,0,0)");
-  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)*t2s_3(0,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,1,0,1)");
-  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)*t2s_3(0,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,1,0,2)");
-  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)*t2s_3(1,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,1,1,0)");
-  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)*t2s_3(1,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,1,1,1)");
-  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)*t2s_3(1,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,1,1,2)");
-  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)*t2s_3(2,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,1,2,0)");
-  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)*t2s_3(2,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,1,2,1)");
-  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)*t2s_3(2,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,1,2,2)");
-  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)*t2s_3(0,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,2,0,0)");
-  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)*t2s_3(0,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,2,0,1)");
-  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)*t2s_3(0,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,2,0,2)");
-  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)*t2s_3(1,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,2,1,0)");
-  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)*t2s_3(1,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,2,1,1)");
-  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)*t2s_3(1,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,2,1,2)");
-  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)*t2s_3(2,0))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,2,2,0)");
-  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)*t2s_3(2,1))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)*t2s_3(2,2))
-		,"T4ddg(i,j,k,l)&T2s(k,l)(2,2,2,2)");
-
-  t4ddg_1(i,j,k,l)=(t2s_2(k,l)&t4ddg_2(i,j,k,l));
-  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)*t2s_2(0,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,0,0,0)");
-  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)*t2s_2(0,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,0,0,1)");
-  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)*t2s_2(0,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,0,0,2)");
-  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)*t2s_2(1,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,0,1,0)");
-  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)*t2s_2(1,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,0,1,1)");
-  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)*t2s_2(1,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,0,1,2)");
-  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)*t2s_2(2,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,0,2,0)");
-  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)*t2s_2(2,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,0,2,1)");
-  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)*t2s_2(2,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,0,2,2)");
-  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)*t2s_2(0,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,1,0,0)");
-  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)*t2s_2(0,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,1,0,1)");
-  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)*t2s_2(0,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,1,0,2)");
-  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)*t2s_2(1,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,1,1,0)");
-  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)*t2s_2(1,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,1,1,1)");
-  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)*t2s_2(1,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,1,1,2)");
-  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)*t2s_2(2,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,1,2,0)");
-  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)*t2s_2(2,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,1,2,1)");
-  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)*t2s_2(2,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,1,2,2)");
-  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)*t2s_2(0,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,2,0,0)");
-  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)*t2s_2(0,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,2,0,1)");
-  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)*t2s_2(0,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,2,0,2)");
-  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)*t2s_2(1,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,2,1,0)");
-  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)*t2s_2(1,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,2,1,1)");
-  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)*t2s_2(1,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,2,1,2)");
-  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)*t2s_2(2,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,2,2,0)");
-  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)*t2s_2(2,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,2,2,1)");
-  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)*t2s_2(2,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(0,2,2,2)");
-  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)*t2s_2(0,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,0,0,0)");
-  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)*t2s_2(0,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,0,0,1)");
-  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)*t2s_2(0,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,0,0,2)");
-  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)*t2s_2(1,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,0,1,0)");
-  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)*t2s_2(1,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,0,1,1)");
-  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)*t2s_2(1,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,0,1,2)");
-  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)*t2s_2(2,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,0,2,0)");
-  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)*t2s_2(2,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,0,2,1)");
-  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)*t2s_2(2,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,0,2,2)");
-  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)*t2s_2(0,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,1,0,0)");
-  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)*t2s_2(0,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,1,0,1)");
-  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)*t2s_2(0,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,1,0,2)");
-  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)*t2s_2(1,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)*t2s_2(1,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,1,1,1)");
-  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)*t2s_2(1,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,1,1,2)");
-  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)*t2s_2(2,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,1,2,0)");
-  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)*t2s_2(2,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,1,2,1)");
-  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)*t2s_2(2,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,1,2,2)");
-  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)*t2s_2(0,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,2,0,0)");
-  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)*t2s_2(0,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,2,0,1)");
-  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)*t2s_2(0,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,2,0,2)");
-  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)*t2s_2(1,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,2,1,0)");
-  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)*t2s_2(1,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,2,1,1)");
-  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)*t2s_2(1,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,2,1,2)");
-  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)*t2s_2(2,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,2,2,0)");
-  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)*t2s_2(2,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,2,2,1)");
-  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)*t2s_2(2,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(1,2,2,2)");
-  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)*t2s_2(0,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,0,0,0)");
-  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)*t2s_2(0,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,0,0,1)");
-  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)*t2s_2(0,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,0,0,2)");
-  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)*t2s_2(1,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,0,1,0)");
-  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)*t2s_2(1,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,0,1,1)");
-  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)*t2s_2(1,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,0,1,2)");
-  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)*t2s_2(2,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,0,2,0)");
-  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)*t2s_2(2,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,0,2,1)");
-  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)*t2s_2(2,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,0,2,2)");
-  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)*t2s_2(0,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,1,0,0)");
-  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)*t2s_2(0,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,1,0,1)");
-  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)*t2s_2(0,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,1,0,2)");
-  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)*t2s_2(1,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,1,1,0)");
-  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)*t2s_2(1,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,1,1,1)");
-  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)*t2s_2(1,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,1,1,2)");
-  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)*t2s_2(2,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,1,2,0)");
-  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)*t2s_2(2,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,1,2,1)");
-  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)*t2s_2(2,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,1,2,2)");
-  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)*t2s_2(0,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,2,0,0)");
-  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)*t2s_2(0,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,2,0,1)");
-  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)*t2s_2(0,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,2,0,2)");
-  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)*t2s_2(1,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,2,1,0)");
-  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)*t2s_2(1,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,2,1,1)");
-  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)*t2s_2(1,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,2,1,2)");
-  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)*t2s_2(2,0))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,2,2,0)");
-  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)*t2s_2(2,1))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)*t2s_2(2,2))
-		,"T2s(k,l)&T4ddg(i,j,k,l)(2,2,2,2)");
-
-  t4ddg_1(i,j,k,l)=(t4ddg_2(i,j,k,l)%t2s_3(i,j));
-  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)/t2s_3(0,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,0,0,0)");
-  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)/t2s_3(0,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,0,0,1)");
-  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)/t2s_3(0,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,0,0,2)");
-  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)/t2s_3(0,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,0,1,0)");
-  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)/t2s_3(0,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,0,1,1)");
-  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)/t2s_3(0,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,0,1,2)");
-  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)/t2s_3(0,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,0,2,0)");
-  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)/t2s_3(0,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,0,2,1)");
-  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)/t2s_3(0,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,0,2,2)");
-  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)/t2s_3(0,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,1,0,0)");
-  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)/t2s_3(0,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,1,0,1)");
-  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)/t2s_3(0,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,1,0,2)");
-  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)/t2s_3(0,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,1,1,0)");
-  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)/t2s_3(0,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,1,1,1)");
-  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)/t2s_3(0,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,1,1,2)");
-  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)/t2s_3(0,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,1,2,0)");
-  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)/t2s_3(0,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,1,2,1)");
-  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)/t2s_3(0,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,1,2,2)");
-  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)/t2s_3(0,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,2,0,0)");
-  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)/t2s_3(0,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,2,0,1)");
-  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)/t2s_3(0,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,2,0,2)");
-  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)/t2s_3(0,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,2,1,0)");
-  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)/t2s_3(0,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,2,1,1)");
-  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)/t2s_3(0,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,2,1,2)");
-  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)/t2s_3(0,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,2,2,0)");
-  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)/t2s_3(0,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,2,2,1)");
-  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)/t2s_3(0,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(0,2,2,2)");
-  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)/t2s_3(1,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,0,0,0)");
-  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)/t2s_3(1,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,0,0,1)");
-  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)/t2s_3(1,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,0,0,2)");
-  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)/t2s_3(1,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,0,1,0)");
-  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)/t2s_3(1,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,0,1,1)");
-  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)/t2s_3(1,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,0,1,2)");
-  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)/t2s_3(1,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,0,2,0)");
-  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)/t2s_3(1,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,0,2,1)");
-  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)/t2s_3(1,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,0,2,2)");
-  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)/t2s_3(1,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,1,0,0)");
-  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)/t2s_3(1,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,1,0,1)");
-  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)/t2s_3(1,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,1,0,2)");
-  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)/t2s_3(1,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)/t2s_3(1,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,1,1,1)");
-  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)/t2s_3(1,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,1,1,2)");
-  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)/t2s_3(1,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,1,2,0)");
-  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)/t2s_3(1,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,1,2,1)");
-  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)/t2s_3(1,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,1,2,2)");
-  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)/t2s_3(1,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,2,0,0)");
-  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)/t2s_3(1,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,2,0,1)");
-  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)/t2s_3(1,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,2,0,2)");
-  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)/t2s_3(1,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,2,1,0)");
-  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)/t2s_3(1,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,2,1,1)");
-  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)/t2s_3(1,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,2,1,2)");
-  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)/t2s_3(1,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,2,2,0)");
-  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)/t2s_3(1,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,2,2,1)");
-  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)/t2s_3(1,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(1,2,2,2)");
-  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)/t2s_3(2,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,0,0,0)");
-  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)/t2s_3(2,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,0,0,1)");
-  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)/t2s_3(2,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,0,0,2)");
-  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)/t2s_3(2,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,0,1,0)");
-  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)/t2s_3(2,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,0,1,1)");
-  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)/t2s_3(2,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,0,1,2)");
-  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)/t2s_3(2,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,0,2,0)");
-  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)/t2s_3(2,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,0,2,1)");
-  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)/t2s_3(2,0))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,0,2,2)");
-  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)/t2s_3(2,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,1,0,0)");
-  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)/t2s_3(2,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,1,0,1)");
-  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)/t2s_3(2,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,1,0,2)");
-  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)/t2s_3(2,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,1,1,0)");
-  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)/t2s_3(2,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,1,1,1)");
-  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)/t2s_3(2,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,1,1,2)");
-  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)/t2s_3(2,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,1,2,0)");
-  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)/t2s_3(2,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,1,2,1)");
-  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)/t2s_3(2,1))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,1,2,2)");
-  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)/t2s_3(2,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,2,0,0)");
-  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)/t2s_3(2,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,2,0,1)");
-  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)/t2s_3(2,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,2,0,2)");
-  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)/t2s_3(2,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,2,1,0)");
-  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)/t2s_3(2,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,2,1,1)");
-  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)/t2s_3(2,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,2,1,2)");
-  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)/t2s_3(2,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,2,2,0)");
-  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)/t2s_3(2,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)/t2s_3(2,2))
-		,"T4ddg(i,j,k,l)%T2s(i,j)(2,2,2,2)");
-
-  t4ddg_1(i,j,k,l)=(t2s_2(i,j)%t4ddg_2(i,j,k,l));
-  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)/t2s_2(0,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,0,0,0)");
-  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)/t2s_2(0,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,0,0,1)");
-  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)/t2s_2(0,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,0,0,2)");
-  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)/t2s_2(0,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,0,1,0)");
-  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)/t2s_2(0,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,0,1,1)");
-  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)/t2s_2(0,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,0,1,2)");
-  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)/t2s_2(0,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,0,2,0)");
-  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)/t2s_2(0,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,0,2,1)");
-  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)/t2s_2(0,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,0,2,2)");
-  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)/t2s_2(0,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,1,0,0)");
-  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)/t2s_2(0,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,1,0,1)");
-  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)/t2s_2(0,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,1,0,2)");
-  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)/t2s_2(0,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,1,1,0)");
-  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)/t2s_2(0,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,1,1,1)");
-  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)/t2s_2(0,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,1,1,2)");
-  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)/t2s_2(0,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,1,2,0)");
-  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)/t2s_2(0,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,1,2,1)");
-  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)/t2s_2(0,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,1,2,2)");
-  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)/t2s_2(0,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,2,0,0)");
-  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)/t2s_2(0,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,2,0,1)");
-  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)/t2s_2(0,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,2,0,2)");
-  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)/t2s_2(0,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,2,1,0)");
-  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)/t2s_2(0,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,2,1,1)");
-  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)/t2s_2(0,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,2,1,2)");
-  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)/t2s_2(0,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,2,2,0)");
-  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)/t2s_2(0,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,2,2,1)");
-  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)/t2s_2(0,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(0,2,2,2)");
-  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)/t2s_2(1,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,0,0,0)");
-  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)/t2s_2(1,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,0,0,1)");
-  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)/t2s_2(1,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,0,0,2)");
-  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)/t2s_2(1,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,0,1,0)");
-  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)/t2s_2(1,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,0,1,1)");
-  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)/t2s_2(1,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,0,1,2)");
-  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)/t2s_2(1,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,0,2,0)");
-  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)/t2s_2(1,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,0,2,1)");
-  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)/t2s_2(1,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,0,2,2)");
-  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)/t2s_2(1,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,1,0,0)");
-  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)/t2s_2(1,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,1,0,1)");
-  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)/t2s_2(1,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,1,0,2)");
-  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)/t2s_2(1,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)/t2s_2(1,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,1,1,1)");
-  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)/t2s_2(1,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,1,1,2)");
-  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)/t2s_2(1,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,1,2,0)");
-  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)/t2s_2(1,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,1,2,1)");
-  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)/t2s_2(1,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,1,2,2)");
-  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)/t2s_2(1,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,2,0,0)");
-  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)/t2s_2(1,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,2,0,1)");
-  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)/t2s_2(1,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,2,0,2)");
-  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)/t2s_2(1,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,2,1,0)");
-  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)/t2s_2(1,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,2,1,1)");
-  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)/t2s_2(1,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,2,1,2)");
-  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)/t2s_2(1,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,2,2,0)");
-  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)/t2s_2(1,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,2,2,1)");
-  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)/t2s_2(1,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(1,2,2,2)");
-  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)/t2s_2(2,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,0,0,0)");
-  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)/t2s_2(2,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,0,0,1)");
-  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)/t2s_2(2,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,0,0,2)");
-  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)/t2s_2(2,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,0,1,0)");
-  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)/t2s_2(2,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,0,1,1)");
-  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)/t2s_2(2,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,0,1,2)");
-  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)/t2s_2(2,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,0,2,0)");
-  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)/t2s_2(2,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,0,2,1)");
-  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)/t2s_2(2,0))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,0,2,2)");
-  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)/t2s_2(2,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,1,0,0)");
-  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)/t2s_2(2,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,1,0,1)");
-  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)/t2s_2(2,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,1,0,2)");
-  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)/t2s_2(2,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,1,1,0)");
-  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)/t2s_2(2,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,1,1,1)");
-  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)/t2s_2(2,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,1,1,2)");
-  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)/t2s_2(2,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,1,2,0)");
-  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)/t2s_2(2,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,1,2,1)");
-  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)/t2s_2(2,1))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,1,2,2)");
-  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)/t2s_2(2,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,2,0,0)");
-  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)/t2s_2(2,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,2,0,1)");
-  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)/t2s_2(2,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,2,0,2)");
-  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)/t2s_2(2,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,2,1,0)");
-  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)/t2s_2(2,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,2,1,1)");
-  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)/t2s_2(2,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,2,1,2)");
-  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)/t2s_2(2,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,2,2,0)");
-  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)/t2s_2(2,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)/t2s_2(2,2))
-		,"T2s(i,j)%T4ddg(i,j,k,l)(2,2,2,2)");
-
-  t4ddg_1(i,j,k,l)=(t4ddg_2(i,j,k,l)%t2s_3(k,l));
-  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)/t2s_3(0,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,0,0,0)");
-  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)/t2s_3(0,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,0,0,1)");
-  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)/t2s_3(0,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,0,0,2)");
-  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)/t2s_3(1,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,0,1,0)");
-  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)/t2s_3(1,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,0,1,1)");
-  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)/t2s_3(1,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,0,1,2)");
-  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)/t2s_3(2,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,0,2,0)");
-  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)/t2s_3(2,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,0,2,1)");
-  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)/t2s_3(2,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,0,2,2)");
-  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)/t2s_3(0,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,1,0,0)");
-  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)/t2s_3(0,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,1,0,1)");
-  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)/t2s_3(0,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,1,0,2)");
-  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)/t2s_3(1,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,1,1,0)");
-  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)/t2s_3(1,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,1,1,1)");
-  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)/t2s_3(1,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,1,1,2)");
-  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)/t2s_3(2,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,1,2,0)");
-  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)/t2s_3(2,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,1,2,1)");
-  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)/t2s_3(2,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,1,2,2)");
-  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)/t2s_3(0,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,2,0,0)");
-  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)/t2s_3(0,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,2,0,1)");
-  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)/t2s_3(0,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,2,0,2)");
-  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)/t2s_3(1,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,2,1,0)");
-  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)/t2s_3(1,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,2,1,1)");
-  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)/t2s_3(1,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,2,1,2)");
-  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)/t2s_3(2,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,2,2,0)");
-  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)/t2s_3(2,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,2,2,1)");
-  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)/t2s_3(2,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(0,2,2,2)");
-  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)/t2s_3(0,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,0,0,0)");
-  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)/t2s_3(0,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,0,0,1)");
-  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)/t2s_3(0,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,0,0,2)");
-  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)/t2s_3(1,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,0,1,0)");
-  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)/t2s_3(1,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,0,1,1)");
-  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)/t2s_3(1,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,0,1,2)");
-  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)/t2s_3(2,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,0,2,0)");
-  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)/t2s_3(2,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,0,2,1)");
-  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)/t2s_3(2,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,0,2,2)");
-  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)/t2s_3(0,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,1,0,0)");
-  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)/t2s_3(0,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,1,0,1)");
-  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)/t2s_3(0,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,1,0,2)");
-  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)/t2s_3(1,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)/t2s_3(1,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,1,1,1)");
-  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)/t2s_3(1,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,1,1,2)");
-  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)/t2s_3(2,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,1,2,0)");
-  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)/t2s_3(2,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,1,2,1)");
-  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)/t2s_3(2,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,1,2,2)");
-  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)/t2s_3(0,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,2,0,0)");
-  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)/t2s_3(0,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,2,0,1)");
-  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)/t2s_3(0,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,2,0,2)");
-  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)/t2s_3(1,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,2,1,0)");
-  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)/t2s_3(1,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,2,1,1)");
-  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)/t2s_3(1,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,2,1,2)");
-  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)/t2s_3(2,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,2,2,0)");
-  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)/t2s_3(2,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,2,2,1)");
-  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)/t2s_3(2,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(1,2,2,2)");
-  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)/t2s_3(0,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,0,0,0)");
-  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)/t2s_3(0,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,0,0,1)");
-  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)/t2s_3(0,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,0,0,2)");
-  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)/t2s_3(1,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,0,1,0)");
-  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)/t2s_3(1,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,0,1,1)");
-  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)/t2s_3(1,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,0,1,2)");
-  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)/t2s_3(2,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,0,2,0)");
-  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)/t2s_3(2,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,0,2,1)");
-  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)/t2s_3(2,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,0,2,2)");
-  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)/t2s_3(0,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,1,0,0)");
-  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)/t2s_3(0,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,1,0,1)");
-  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)/t2s_3(0,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,1,0,2)");
-  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)/t2s_3(1,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,1,1,0)");
-  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)/t2s_3(1,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,1,1,1)");
-  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)/t2s_3(1,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,1,1,2)");
-  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)/t2s_3(2,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,1,2,0)");
-  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)/t2s_3(2,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,1,2,1)");
-  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)/t2s_3(2,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,1,2,2)");
-  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)/t2s_3(0,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,2,0,0)");
-  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)/t2s_3(0,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,2,0,1)");
-  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)/t2s_3(0,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,2,0,2)");
-  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)/t2s_3(1,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,2,1,0)");
-  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)/t2s_3(1,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,2,1,1)");
-  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)/t2s_3(1,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,2,1,2)");
-  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)/t2s_3(2,0))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,2,2,0)");
-  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)/t2s_3(2,1))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)/t2s_3(2,2))
-		,"T4ddg(i,j,k,l)%T2s(k,l)(2,2,2,2)");
-
-  t4ddg_1(i,j,k,l)=(t2s_2(k,l)%t4ddg_2(i,j,k,l));
-  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)/t2s_2(0,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,0,0,0)");
-  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)/t2s_2(0,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,0,0,1)");
-  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)/t2s_2(0,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,0,0,2)");
-  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)/t2s_2(1,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,0,1,0)");
-  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)/t2s_2(1,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,0,1,1)");
-  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)/t2s_2(1,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,0,1,2)");
-  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)/t2s_2(2,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,0,2,0)");
-  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)/t2s_2(2,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,0,2,1)");
-  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)/t2s_2(2,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,0,2,2)");
-  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)/t2s_2(0,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,1,0,0)");
-  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)/t2s_2(0,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,1,0,1)");
-  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)/t2s_2(0,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,1,0,2)");
-  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)/t2s_2(1,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,1,1,0)");
-  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)/t2s_2(1,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,1,1,1)");
-  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)/t2s_2(1,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,1,1,2)");
-  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)/t2s_2(2,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,1,2,0)");
-  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)/t2s_2(2,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,1,2,1)");
-  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)/t2s_2(2,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,1,2,2)");
-  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)/t2s_2(0,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,2,0,0)");
-  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)/t2s_2(0,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,2,0,1)");
-  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)/t2s_2(0,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,2,0,2)");
-  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)/t2s_2(1,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,2,1,0)");
-  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)/t2s_2(1,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,2,1,1)");
-  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)/t2s_2(1,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,2,1,2)");
-  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)/t2s_2(2,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,2,2,0)");
-  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)/t2s_2(2,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,2,2,1)");
-  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)/t2s_2(2,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(0,2,2,2)");
-  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)/t2s_2(0,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,0,0,0)");
-  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)/t2s_2(0,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,0,0,1)");
-  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)/t2s_2(0,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,0,0,2)");
-  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)/t2s_2(1,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,0,1,0)");
-  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)/t2s_2(1,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,0,1,1)");
-  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)/t2s_2(1,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,0,1,2)");
-  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)/t2s_2(2,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,0,2,0)");
-  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)/t2s_2(2,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,0,2,1)");
-  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)/t2s_2(2,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,0,2,2)");
-  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)/t2s_2(0,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,1,0,0)");
-  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)/t2s_2(0,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,1,0,1)");
-  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)/t2s_2(0,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,1,0,2)");
-  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)/t2s_2(1,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)/t2s_2(1,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,1,1,1)");
-  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)/t2s_2(1,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,1,1,2)");
-  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)/t2s_2(2,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,1,2,0)");
-  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)/t2s_2(2,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,1,2,1)");
-  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)/t2s_2(2,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,1,2,2)");
-  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)/t2s_2(0,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,2,0,0)");
-  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)/t2s_2(0,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,2,0,1)");
-  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)/t2s_2(0,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,2,0,2)");
-  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)/t2s_2(1,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,2,1,0)");
-  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)/t2s_2(1,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,2,1,1)");
-  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)/t2s_2(1,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,2,1,2)");
-  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)/t2s_2(2,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,2,2,0)");
-  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)/t2s_2(2,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,2,2,1)");
-  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)/t2s_2(2,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(1,2,2,2)");
-  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)/t2s_2(0,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,0,0,0)");
-  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)/t2s_2(0,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,0,0,1)");
-  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)/t2s_2(0,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,0,0,2)");
-  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)/t2s_2(1,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,0,1,0)");
-  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)/t2s_2(1,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,0,1,1)");
-  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)/t2s_2(1,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,0,1,2)");
-  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)/t2s_2(2,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,0,2,0)");
-  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)/t2s_2(2,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,0,2,1)");
-  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)/t2s_2(2,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,0,2,2)");
-  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)/t2s_2(0,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,1,0,0)");
-  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)/t2s_2(0,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,1,0,1)");
-  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)/t2s_2(0,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,1,0,2)");
-  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)/t2s_2(1,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,1,1,0)");
-  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)/t2s_2(1,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,1,1,1)");
-  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)/t2s_2(1,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,1,1,2)");
-  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)/t2s_2(2,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,1,2,0)");
-  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)/t2s_2(2,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,1,2,1)");
-  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)/t2s_2(2,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,1,2,2)");
-  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)/t2s_2(0,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,2,0,0)");
-  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)/t2s_2(0,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,2,0,1)");
-  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)/t2s_2(0,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,2,0,2)");
-  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)/t2s_2(1,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,2,1,0)");
-  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)/t2s_2(1,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,2,1,1)");
-  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)/t2s_2(1,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,2,1,2)");
-  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)/t2s_2(2,0))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,2,2,0)");
-  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)/t2s_2(2,1))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)/t2s_2(2,2))
-		,"T2s(k,l)%T4ddg(i,j,k,l)(2,2,2,2)");
-
-  /* I originally put these declarations for unknown reasons, but they
-     won't work because the result is not a Tensor4_ddg.  The
-     multiplication messes up the symmetries. */
-
-
-//    t4ddg_1(i,j,k,l)=(t4ddg_2(i,j,k,l)&t2s_3(j,l));
-//    test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)*t2s_3(0,0))
-//        test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)*t2s_3(0,1))
-//        test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)*t2s_3(0,2))
-//        test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)*t2s_3(0,0))
-//        test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)*t2s_3(0,1))
-//        test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)*t2s_3(0,2))
-//        test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)*t2s_3(0,0))
-//        test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)*t2s_3(0,1))
-//        test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)*t2s_3(0,2))
-//        test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)*t2s_3(1,0))
-//        test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)*t2s_3(1,1))
-//        test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)*t2s_3(1,2))
-//        test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)*t2s_3(1,0))
-//        test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)*t2s_3(1,1))
-//        test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)*t2s_3(1,2))
-//        test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)*t2s_3(1,0))
-//        test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)*t2s_3(1,1))
-//        test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)*t2s_3(1,2))
-//        test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)*t2s_3(2,0))
-//        test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)*t2s_3(2,1))
-//        test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)*t2s_3(2,2))
-//        test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)*t2s_3(2,0))
-//        test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)*t2s_3(2,1))
-//        test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)*t2s_3(2,2))
-//        test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)*t2s_3(2,0))
-//        test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)*t2s_3(2,1))
-//        test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)*t2s_3(2,2))
-//        test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)*t2s_3(0,0))
-//        test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)*t2s_3(0,1))
-//        test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)*t2s_3(0,2))
-//        test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)*t2s_3(0,0))
-//        test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)*t2s_3(0,1))
-//        test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)*t2s_3(0,2))
-//        test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)*t2s_3(0,0))
-//        test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)*t2s_3(0,1))
-//        test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)*t2s_3(0,2))
-//        test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)*t2s_3(1,0))
-//        test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)*t2s_3(1,1))
-//        test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)*t2s_3(1,2))
-//        test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)*t2s_3(1,0))
-//        test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)*t2s_3(1,1))
-//        test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)*t2s_3(1,2))
-//        test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)*t2s_3(1,0))
-//        test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)*t2s_3(1,1))
-//        test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)*t2s_3(1,2))
-//        test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)*t2s_3(2,0))
-//        test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)*t2s_3(2,1))
-//        test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)*t2s_3(2,2))
-//        test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)*t2s_3(2,0))
-//        test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)*t2s_3(2,1))
-//        test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)*t2s_3(2,2))
-//        test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)*t2s_3(2,0))
-//        test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)*t2s_3(2,1))
-//        test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)*t2s_3(2,2))
-//        test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)*t2s_3(0,0))
-//        test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)*t2s_3(0,1))
-//        test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)*t2s_3(0,2))
-//        test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)*t2s_3(0,0))
-//        test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)*t2s_3(0,1))
-//        test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)*t2s_3(0,2))
-//        test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)*t2s_3(0,0))
-//        test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)*t2s_3(0,1))
-//        test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)*t2s_3(0,2))
-//        test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)*t2s_3(1,0))
-//        test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)*t2s_3(1,1))
-//        test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)*t2s_3(1,2))
-//        test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)*t2s_3(1,0))
-//        test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)*t2s_3(1,1))
-//        test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)*t2s_3(1,2))
-//        test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)*t2s_3(1,0))
-//        test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)*t2s_3(1,1))
-//        test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)*t2s_3(1,2))
-//        test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)*t2s_3(2,0))
-//        test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)*t2s_3(2,1))
-//        test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)*t2s_3(2,2))
-//        test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)*t2s_3(2,0))
-//        test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)*t2s_3(2,1))
-//        test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)*t2s_3(2,2))
-//        test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)*t2s_3(2,0))
-//        test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)*t2s_3(2,1))
-//        test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)*t2s_3(2,2)));
-
-
-//    t4ddg_1(i,j,k,l)=(t2s_2(j,l)&t4ddg_2(i,j,k,l));
-//    test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)*t2s_2(0,0))
-//        test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)*t2s_2(0,1))
-//        test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)*t2s_2(0,2))
-//        test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)*t2s_2(0,0))
-//        test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)*t2s_2(0,1))
-//        test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)*t2s_2(0,2))
-//        test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)*t2s_2(0,0))
-//        test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)*t2s_2(0,1))
-//        test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)*t2s_2(0,2))
-//        test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)*t2s_2(1,0))
-//        test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)*t2s_2(1,1))
-//        test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)*t2s_2(1,2))
-//        test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)*t2s_2(1,0))
-//        test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)*t2s_2(1,1))
-//        test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)*t2s_2(1,2))
-//        test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)*t2s_2(1,0))
-//        test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)*t2s_2(1,1))
-//        test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)*t2s_2(1,2))
-//        test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)*t2s_2(2,0))
-//        test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)*t2s_2(2,1))
-//        test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)*t2s_2(2,2))
-//        test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)*t2s_2(2,0))
-//        test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)*t2s_2(2,1))
-//        test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)*t2s_2(2,2))
-//        test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)*t2s_2(2,0))
-//        test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)*t2s_2(2,1))
-//        test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)*t2s_2(2,2))
-//        test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)*t2s_2(0,0))
-//        test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)*t2s_2(0,1))
-//        test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)*t2s_2(0,2))
-//        test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)*t2s_2(0,0))
-//        test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)*t2s_2(0,1))
-//        test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)*t2s_2(0,2))
-//        test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)*t2s_2(0,0))
-//        test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)*t2s_2(0,1))
-//        test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)*t2s_2(0,2))
-//        test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)*t2s_2(1,0))
-//        test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)*t2s_2(1,1))
-//        test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)*t2s_2(1,2))
-//        test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)*t2s_2(1,0))
-//        test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)*t2s_2(1,1))
-//        test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)*t2s_2(1,2))
-//        test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)*t2s_2(1,0))
-//        test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)*t2s_2(1,1))
-//        test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)*t2s_2(1,2))
-//        test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)*t2s_2(2,0))
-//        test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)*t2s_2(2,1))
-//        test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)*t2s_2(2,2))
-//        test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)*t2s_2(2,0))
-//        test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)*t2s_2(2,1))
-//        test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)*t2s_2(2,2))
-//        test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)*t2s_2(2,0))
-//        test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)*t2s_2(2,1))
-//        test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)*t2s_2(2,2))
-//        test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)*t2s_2(0,0))
-//        test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)*t2s_2(0,1))
-//        test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)*t2s_2(0,2))
-//        test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)*t2s_2(0,0))
-//        test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)*t2s_2(0,1))
-//        test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)*t2s_2(0,2))
-//        test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)*t2s_2(0,0))
-//        test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)*t2s_2(0,1))
-//        test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)*t2s_2(0,2))
-//        test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)*t2s_2(1,0))
-//        test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)*t2s_2(1,1))
-//        test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)*t2s_2(1,2))
-//        test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)*t2s_2(1,0))
-//        test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)*t2s_2(1,1))
-//        test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)*t2s_2(1,2))
-//        test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)*t2s_2(1,0))
-//        test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)*t2s_2(1,1))
-//        test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)*t2s_2(1,2))
-//        test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)*t2s_2(2,0))
-//        test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)*t2s_2(2,1))
-//        test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)*t2s_2(2,2))
-//        test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)*t2s_2(2,0))
-//        test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)*t2s_2(2,1))
-//        test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)*t2s_2(2,2))
-//        test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)*t2s_2(2,0))
-//        test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)*t2s_2(2,1))
-//        test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)*t2s_2(2,2)));
-//    cout << endl;
-
-
-//    t4ddg_1(i,j,k,l)=(t4ddg_2(i,j,k,l)&t2s_3(l,j));
-//    test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)*t2s_3(0,0))
-//        test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)*t2s_3(0,1))
-//        test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)*t2s_3(0,2))
-//        test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)*t2s_3(0,0))
-//        test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)*t2s_3(0,1))
-//        test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)*t2s_3(0,2))
-//        test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)*t2s_3(0,0))
-//        test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)*t2s_3(0,1))
-//        test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)*t2s_3(0,2))
-//        test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)*t2s_3(1,0))
-//        test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)*t2s_3(1,1))
-//        test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)*t2s_3(1,2))
-//        test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)*t2s_3(1,0))
-//        test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)*t2s_3(1,1))
-//        test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)*t2s_3(1,2))
-//        test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)*t2s_3(1,0))
-//        test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)*t2s_3(1,1))
-//        test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)*t2s_3(1,2))
-//        test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)*t2s_3(2,0))
-//        test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)*t2s_3(2,1))
-//        test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)*t2s_3(2,2))
-//        test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)*t2s_3(2,0))
-//        test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)*t2s_3(2,1))
-//        test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)*t2s_3(2,2))
-//        test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)*t2s_3(2,0))
-//        test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)*t2s_3(2,1))
-//        test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)*t2s_3(2,2))
-//        test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)*t2s_3(0,0))
-//        test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)*t2s_3(0,1))
-//        test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)*t2s_3(0,2))
-//        test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)*t2s_3(0,0))
-//        test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)*t2s_3(0,1))
-//        test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)*t2s_3(0,2))
-//        test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)*t2s_3(0,0))
-//        test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)*t2s_3(0,1))
-//        test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)*t2s_3(0,2))
-//        test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)*t2s_3(1,0))
-//        test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)*t2s_3(1,1))
-//        test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)*t2s_3(1,2))
-//        test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)*t2s_3(1,0))
-//        test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)*t2s_3(1,1))
-//        test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)*t2s_3(1,2))
-//        test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)*t2s_3(1,0))
-//        test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)*t2s_3(1,1))
-//        test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)*t2s_3(1,2))
-//        test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)*t2s_3(2,0))
-//        test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)*t2s_3(2,1))
-//        test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)*t2s_3(2,2))
-//        test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)*t2s_3(2,0))
-//        test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)*t2s_3(2,1))
-//        test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)*t2s_3(2,2))
-//        test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)*t2s_3(2,0))
-//        test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)*t2s_3(2,1))
-//        test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)*t2s_3(2,2))
-//        test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)*t2s_3(0,0))
-//        test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)*t2s_3(0,1))
-//        test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)*t2s_3(0,2))
-//        test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)*t2s_3(0,0))
-//        test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)*t2s_3(0,1))
-//        test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)*t2s_3(0,2))
-//        test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)*t2s_3(0,0))
-//        test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)*t2s_3(0,1))
-//        test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)*t2s_3(0,2))
-//        test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)*t2s_3(1,0))
-//        test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)*t2s_3(1,1))
-//        test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)*t2s_3(1,2))
-//        test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)*t2s_3(1,0))
-//        test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)*t2s_3(1,1))
-//        test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)*t2s_3(1,2))
-//        test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)*t2s_3(1,0))
-//        test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)*t2s_3(1,1))
-//        test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)*t2s_3(1,2))
-//        test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)*t2s_3(2,0))
-//        test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)*t2s_3(2,1))
-//        test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)*t2s_3(2,2))
-//        test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)*t2s_3(2,0))
-//        test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)*t2s_3(2,1))
-//        test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)*t2s_3(2,2))
-//        test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)*t2s_3(2,0))
-//        test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)*t2s_3(2,1))
-//        test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)*t2s_3(2,2)));
-//    cout << endl;
-
-
-//    t4ddg_1(i,j,k,l)=(t2s_2(l,j)&t4ddg_2(i,j,k,l));
-//    test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)*t2s_2(0,0))
-//        test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)*t2s_2(0,1))
-//        test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)*t2s_2(0,2))
-//        test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)*t2s_2(0,0))
-//        test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)*t2s_2(0,1))
-//        test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)*t2s_2(0,2))
-//        test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)*t2s_2(0,0))
-//        test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)*t2s_2(0,1))
-//        test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)*t2s_2(0,2))
-//        test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)*t2s_2(1,0))
-//        test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)*t2s_2(1,1))
-//        test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)*t2s_2(1,2))
-//        test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)*t2s_2(1,0))
-//        test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)*t2s_2(1,1))
-//        test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)*t2s_2(1,2))
-//        test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)*t2s_2(1,0))
-//        test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)*t2s_2(1,1))
-//        test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)*t2s_2(1,2))
-//        test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)*t2s_2(2,0))
-//        test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)*t2s_2(2,1))
-//        test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)*t2s_2(2,2))
-//        test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)*t2s_2(2,0))
-//        test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)*t2s_2(2,1))
-//        test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)*t2s_2(2,2))
-//        test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)*t2s_2(2,0))
-//        test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)*t2s_2(2,1))
-//        test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)*t2s_2(2,2))
-//        test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)*t2s_2(0,0))
-//        test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)*t2s_2(0,1))
-//        test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)*t2s_2(0,2))
-//        test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)*t2s_2(0,0))
-//        test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)*t2s_2(0,1))
-//        test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)*t2s_2(0,2))
-//        test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)*t2s_2(0,0))
-//        test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)*t2s_2(0,1))
-//        test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)*t2s_2(0,2))
-//        test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)*t2s_2(1,0))
-//        test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)*t2s_2(1,1))
-//        test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)*t2s_2(1,2))
-//        test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)*t2s_2(1,0))
-//        test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)*t2s_2(1,1))
-//        test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)*t2s_2(1,2))
-//        test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)*t2s_2(1,0))
-//        test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)*t2s_2(1,1))
-//        test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)*t2s_2(1,2))
-//        test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)*t2s_2(2,0))
-//        test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)*t2s_2(2,1))
-//        test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)*t2s_2(2,2))
-//        test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)*t2s_2(2,0))
-//        test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)*t2s_2(2,1))
-//        test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)*t2s_2(2,2))
-//        test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)*t2s_2(2,0))
-//        test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)*t2s_2(2,1))
-//        test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)*t2s_2(2,2))
-//        test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)*t2s_2(0,0))
-//        test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)*t2s_2(0,1))
-//        test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)*t2s_2(0,2))
-//        test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)*t2s_2(0,0))
-//        test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)*t2s_2(0,1))
-//        test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)*t2s_2(0,2))
-//        test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)*t2s_2(0,0))
-//        test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)*t2s_2(0,1))
-//        test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)*t2s_2(0,2))
-//        test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)*t2s_2(1,0))
-//        test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)*t2s_2(1,1))
-//        test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)*t2s_2(1,2))
-//        test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)*t2s_2(1,0))
-//        test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)*t2s_2(1,1))
-//        test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)*t2s_2(1,2))
-//        test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)*t2s_2(1,0))
-//        test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)*t2s_2(1,1))
-//        test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)*t2s_2(1,2))
-//        test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)*t2s_2(2,0))
-//        test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)*t2s_2(2,1))
-//        test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)*t2s_2(2,2))
-//        test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)*t2s_2(2,0))
-//        test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)*t2s_2(2,1))
-//        test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)*t2s_2(2,2))
-//        test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)*t2s_2(2,0))
-//        test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)*t2s_2(2,1))
-//        test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)*t2s_2(2,2)));
-
-  cout << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T4ddg/test_T4ddgIII.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T4ddg/test_T4ddgIII.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,2058 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T4ddgIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+		Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+		Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+		const Tensor2<double,3,3> &t2_3,
+		Tensor2_symmetric<double,3> &t2s_1,
+		const Tensor2_symmetric<double,3> &t2s_2,
+		const Tensor2_symmetric<double,3> &t2s_3,
+		Tensor3_dg<double,3,3> &t3dg_1,
+		const Tensor3_dg<double,3,3> &t3dg_2,
+		const Tensor3_dg<double,3,3> &t3dg_3,
+		Tensor3_christof<double,3,3> &t3ch_1,
+		const Tensor3_christof<double,3,3> &t3ch_2,
+		const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  Tensor4_ddg<double,3,3> t4ddg_1, t4ddg_2, t4ddg_3;
+
+  t4ddg_2(i,k,j,l)=t2s_2(i,k)*t2s_3(j,l);
+  t2_1(i,k)=t4ddg_2(i,j,k,l)*t2s_2(j,l);
+  test_for_zero(t2_1(0,0) - (t4ddg_2(0,0,0,0)*t2s_2(0,0)
+			     + t4ddg_2(0,0,0,1)*t2s_2(0,1)
+			     + t4ddg_2(0,0,0,2)*t2s_2(0,2)
+			     + t4ddg_2(0,1,0,0)*t2s_2(1,0)
+			     + t4ddg_2(0,1,0,1)*t2s_2(1,1)
+			     + t4ddg_2(0,1,0,2)*t2s_2(1,2)
+			     + t4ddg_2(0,2,0,0)*t2s_2(2,0)
+			     + t4ddg_2(0,2,0,1)*t2s_2(2,1)
+			     + t4ddg_2(0,2,0,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)*T2s(j,l)(0,0)");
+  test_for_zero(t2_1(0,1) - (t4ddg_2(0,0,1,0)*t2s_2(0,0)
+			     + t4ddg_2(0,0,1,1)*t2s_2(0,1)
+			     + t4ddg_2(0,0,1,2)*t2s_2(0,2)
+			     + t4ddg_2(0,1,1,0)*t2s_2(1,0)
+			     + t4ddg_2(0,1,1,1)*t2s_2(1,1)
+			     + t4ddg_2(0,1,1,2)*t2s_2(1,2)
+			     + t4ddg_2(0,2,1,0)*t2s_2(2,0)
+			     + t4ddg_2(0,2,1,1)*t2s_2(2,1)
+			     + t4ddg_2(0,2,1,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)*T2s(j,l)(0,1)");
+  test_for_zero(t2_1(0,2) - (t4ddg_2(0,0,2,0)*t2s_2(0,0)
+			     + t4ddg_2(0,0,2,1)*t2s_2(0,1)
+			     + t4ddg_2(0,0,2,2)*t2s_2(0,2)
+			     + t4ddg_2(0,1,2,0)*t2s_2(1,0)
+			     + t4ddg_2(0,1,2,1)*t2s_2(1,1)
+			     + t4ddg_2(0,1,2,2)*t2s_2(1,2)
+			     + t4ddg_2(0,2,2,0)*t2s_2(2,0)
+			     + t4ddg_2(0,2,2,1)*t2s_2(2,1)
+			     + t4ddg_2(0,2,2,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)*T2s(j,l)(0,2)");
+  test_for_zero(t2_1(1,0) - (t4ddg_2(1,0,0,0)*t2s_2(0,0)
+			     + t4ddg_2(1,0,0,1)*t2s_2(0,1)
+			     + t4ddg_2(1,0,0,2)*t2s_2(0,2)
+			     + t4ddg_2(1,1,0,0)*t2s_2(1,0)
+			     + t4ddg_2(1,1,0,1)*t2s_2(1,1)
+			     + t4ddg_2(1,1,0,2)*t2s_2(1,2)
+			     + t4ddg_2(1,2,0,0)*t2s_2(2,0)
+			     + t4ddg_2(1,2,0,1)*t2s_2(2,1)
+			     + t4ddg_2(1,2,0,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)*T2s(j,l)(1,0)");
+  test_for_zero(t2_1(1,1) - (t4ddg_2(1,0,1,0)*t2s_2(0,0)
+			     + t4ddg_2(1,0,1,1)*t2s_2(0,1)
+			     + t4ddg_2(1,0,1,2)*t2s_2(0,2)
+			     + t4ddg_2(1,1,1,0)*t2s_2(1,0)
+			     + t4ddg_2(1,1,1,1)*t2s_2(1,1)
+			     + t4ddg_2(1,1,1,2)*t2s_2(1,2)
+			     + t4ddg_2(1,2,1,0)*t2s_2(2,0)
+			     + t4ddg_2(1,2,1,1)*t2s_2(2,1)
+			     + t4ddg_2(1,2,1,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)*T2s(j,l)(1,1)");
+  test_for_zero(t2_1(1,2) - (t4ddg_2(1,0,2,0)*t2s_2(0,0)
+			     + t4ddg_2(1,0,2,1)*t2s_2(0,1)
+			     + t4ddg_2(1,0,2,2)*t2s_2(0,2)
+			     + t4ddg_2(1,1,2,0)*t2s_2(1,0)
+			     + t4ddg_2(1,1,2,1)*t2s_2(1,1)
+			     + t4ddg_2(1,1,2,2)*t2s_2(1,2)
+			     + t4ddg_2(1,2,2,0)*t2s_2(2,0)
+			     + t4ddg_2(1,2,2,1)*t2s_2(2,1)
+			     + t4ddg_2(1,2,2,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)*T2s(j,l)(1,2)");
+  test_for_zero(t2_1(2,0) - (t4ddg_2(2,0,0,0)*t2s_2(0,0)
+			     + t4ddg_2(2,0,0,1)*t2s_2(0,1)
+			     + t4ddg_2(2,0,0,2)*t2s_2(0,2)
+			     + t4ddg_2(2,1,0,0)*t2s_2(1,0)
+			     + t4ddg_2(2,1,0,1)*t2s_2(1,1)
+			     + t4ddg_2(2,1,0,2)*t2s_2(1,2)
+			     + t4ddg_2(2,2,0,0)*t2s_2(2,0)
+			     + t4ddg_2(2,2,0,1)*t2s_2(2,1)
+			     + t4ddg_2(2,2,0,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)*T2s(j,l)(2,0)");
+  test_for_zero(t2_1(2,1) - (t4ddg_2(2,0,1,0)*t2s_2(0,0)
+			     + t4ddg_2(2,0,1,1)*t2s_2(0,1)
+			     + t4ddg_2(2,0,1,2)*t2s_2(0,2)
+			     + t4ddg_2(2,1,1,0)*t2s_2(1,0)
+			     + t4ddg_2(2,1,1,1)*t2s_2(1,1)
+			     + t4ddg_2(2,1,1,2)*t2s_2(1,2)
+			     + t4ddg_2(2,2,1,0)*t2s_2(2,0)
+			     + t4ddg_2(2,2,1,1)*t2s_2(2,1)
+			     + t4ddg_2(2,2,1,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)*T2s(j,l)(2,1)");
+  test_for_zero(t2_1(2,2) - (t4ddg_2(2,0,2,0)*t2s_2(0,0)
+			     + t4ddg_2(2,0,2,1)*t2s_2(0,1)
+			     + t4ddg_2(2,0,2,2)*t2s_2(0,2)
+			     + t4ddg_2(2,1,2,0)*t2s_2(1,0)
+			     + t4ddg_2(2,1,2,1)*t2s_2(1,1)
+			     + t4ddg_2(2,1,2,2)*t2s_2(1,2)
+			     + t4ddg_2(2,2,2,0)*t2s_2(2,0)
+			     + t4ddg_2(2,2,2,1)*t2s_2(2,1)
+			     + t4ddg_2(2,2,2,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)*T2s(j,l)(2,2)");
+
+  t2_1(i,k)=t2s_3(j,l)*t4ddg_2(i,j,k,l);
+  test_for_zero(t2_1(0,0) - (t4ddg_2(0,0,0,0)*t2s_3(0,0)
+			     + t4ddg_2(0,0,0,1)*t2s_3(0,1)
+			     + t4ddg_2(0,0,0,2)*t2s_3(0,2)
+			     + t4ddg_2(0,1,0,0)*t2s_3(1,0)
+			     + t4ddg_2(0,1,0,1)*t2s_3(1,1)
+			     + t4ddg_2(0,1,0,2)*t2s_3(1,2)
+			     + t4ddg_2(0,2,0,0)*t2s_3(2,0)
+			     + t4ddg_2(0,2,0,1)*t2s_3(2,1)
+			     + t4ddg_2(0,2,0,2)*t2s_3(2,2))
+		,"T2s(j,l)*T4ddg(i,j,k,l)(0,0)");
+  test_for_zero(t2_1(0,1) - (t4ddg_2(0,0,1,0)*t2s_3(0,0)
+			     + t4ddg_2(0,0,1,1)*t2s_3(0,1)
+			     + t4ddg_2(0,0,1,2)*t2s_3(0,2)
+			     + t4ddg_2(0,1,1,0)*t2s_3(1,0)
+			     + t4ddg_2(0,1,1,1)*t2s_3(1,1)
+			     + t4ddg_2(0,1,1,2)*t2s_3(1,2)
+			     + t4ddg_2(0,2,1,0)*t2s_3(2,0)
+			     + t4ddg_2(0,2,1,1)*t2s_3(2,1)
+			     + t4ddg_2(0,2,1,2)*t2s_3(2,2))
+		,"T2s(j,l)*T4ddg(i,j,k,l)(0,1)");
+  test_for_zero(t2_1(0,2) - (t4ddg_2(0,0,2,0)*t2s_3(0,0)
+			     + t4ddg_2(0,0,2,1)*t2s_3(0,1)
+			     + t4ddg_2(0,0,2,2)*t2s_3(0,2)
+			     + t4ddg_2(0,1,2,0)*t2s_3(1,0)
+			     + t4ddg_2(0,1,2,1)*t2s_3(1,1)
+			     + t4ddg_2(0,1,2,2)*t2s_3(1,2)
+			     + t4ddg_2(0,2,2,0)*t2s_3(2,0)
+			     + t4ddg_2(0,2,2,1)*t2s_3(2,1)
+			     + t4ddg_2(0,2,2,2)*t2s_3(2,2))
+		,"T2s(j,l)*T4ddg(i,j,k,l)(0,2)");
+  test_for_zero(t2_1(1,0) - (t4ddg_2(1,0,0,0)*t2s_3(0,0)
+			     + t4ddg_2(1,0,0,1)*t2s_3(0,1)
+			     + t4ddg_2(1,0,0,2)*t2s_3(0,2)
+			     + t4ddg_2(1,1,0,0)*t2s_3(1,0)
+			     + t4ddg_2(1,1,0,1)*t2s_3(1,1)
+			     + t4ddg_2(1,1,0,2)*t2s_3(1,2)
+			     + t4ddg_2(1,2,0,0)*t2s_3(2,0)
+			     + t4ddg_2(1,2,0,1)*t2s_3(2,1)
+			     + t4ddg_2(1,2,0,2)*t2s_3(2,2))
+		,"T2s(j,l)*T4ddg(i,j,k,l)(1,0)");
+  test_for_zero(t2_1(1,1) - (t4ddg_2(1,0,1,0)*t2s_3(0,0)
+			     + t4ddg_2(1,0,1,1)*t2s_3(0,1)
+			     + t4ddg_2(1,0,1,2)*t2s_3(0,2)
+			     + t4ddg_2(1,1,1,0)*t2s_3(1,0)
+			     + t4ddg_2(1,1,1,1)*t2s_3(1,1)
+			     + t4ddg_2(1,1,1,2)*t2s_3(1,2)
+			     + t4ddg_2(1,2,1,0)*t2s_3(2,0)
+			     + t4ddg_2(1,2,1,1)*t2s_3(2,1)
+			     + t4ddg_2(1,2,1,2)*t2s_3(2,2))
+		,"T2s(j,l)*T4ddg(i,j,k,l)(1,1)");
+  test_for_zero(t2_1(1,2) - (t4ddg_2(1,0,2,0)*t2s_3(0,0)
+			     + t4ddg_2(1,0,2,1)*t2s_3(0,1)
+			     + t4ddg_2(1,0,2,2)*t2s_3(0,2)
+			     + t4ddg_2(1,1,2,0)*t2s_3(1,0)
+			     + t4ddg_2(1,1,2,1)*t2s_3(1,1)
+			     + t4ddg_2(1,1,2,2)*t2s_3(1,2)
+			     + t4ddg_2(1,2,2,0)*t2s_3(2,0)
+			     + t4ddg_2(1,2,2,1)*t2s_3(2,1)
+			     + t4ddg_2(1,2,2,2)*t2s_3(2,2))
+		,"T2s(j,l)*T4ddg(i,j,k,l)(1,2)");
+  test_for_zero(t2_1(2,0) - (t4ddg_2(2,0,0,0)*t2s_3(0,0)
+			     + t4ddg_2(2,0,0,1)*t2s_3(0,1)
+			     + t4ddg_2(2,0,0,2)*t2s_3(0,2)
+			     + t4ddg_2(2,1,0,0)*t2s_3(1,0)
+			     + t4ddg_2(2,1,0,1)*t2s_3(1,1)
+			     + t4ddg_2(2,1,0,2)*t2s_3(1,2)
+			     + t4ddg_2(2,2,0,0)*t2s_3(2,0)
+			     + t4ddg_2(2,2,0,1)*t2s_3(2,1)
+			     + t4ddg_2(2,2,0,2)*t2s_3(2,2))
+		,"T2s(j,l)*T4ddg(i,j,k,l)(2,0)");
+  test_for_zero(t2_1(2,1) - (t4ddg_2(2,0,1,0)*t2s_3(0,0)
+			     + t4ddg_2(2,0,1,1)*t2s_3(0,1)
+			     + t4ddg_2(2,0,1,2)*t2s_3(0,2)
+			     + t4ddg_2(2,1,1,0)*t2s_3(1,0)
+			     + t4ddg_2(2,1,1,1)*t2s_3(1,1)
+			     + t4ddg_2(2,1,1,2)*t2s_3(1,2)
+			     + t4ddg_2(2,2,1,0)*t2s_3(2,0)
+			     + t4ddg_2(2,2,1,1)*t2s_3(2,1)
+			     + t4ddg_2(2,2,1,2)*t2s_3(2,2))
+		,"T2s(j,l)*T4ddg(i,j,k,l)(2,1)");
+  test_for_zero(t2_1(2,2) - (t4ddg_2(2,0,2,0)*t2s_3(0,0)
+			     + t4ddg_2(2,0,2,1)*t2s_3(0,1)
+			     + t4ddg_2(2,0,2,2)*t2s_3(0,2)
+			     + t4ddg_2(2,1,2,0)*t2s_3(1,0)
+			     + t4ddg_2(2,1,2,1)*t2s_3(1,1)
+			     + t4ddg_2(2,1,2,2)*t2s_3(1,2)
+			     + t4ddg_2(2,2,2,0)*t2s_3(2,0)
+			     + t4ddg_2(2,2,2,1)*t2s_3(2,1)
+			     + t4ddg_2(2,2,2,2)*t2s_3(2,2))
+		,"T2s(j,l)*T4ddg(i,j,k,l)(2,2)");
+
+  t2s_1(j,l)=t4ddg_2(i,k,j,l)*t2s_2(i,k);
+  test_for_zero(t2s_1(0,0) - (t4ddg_2(0,0,0,0)*t2s_2(0,0)
+			      + t4ddg_2(0,1,0,0)*t2s_2(0,1)
+			      + t4ddg_2(0,2,0,0)*t2s_2(0,2)
+			      + t4ddg_2(1,0,0,0)*t2s_2(1,0)
+			      + t4ddg_2(1,1,0,0)*t2s_2(1,1)
+			      + t4ddg_2(1,2,0,0)*t2s_2(1,2)
+			      + t4ddg_2(2,0,0,0)*t2s_2(2,0)
+			      + t4ddg_2(2,1,0,0)*t2s_2(2,1)
+			      + t4ddg_2(2,2,0,0)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)*T2s(i,k)(0,0)");
+  test_for_zero(t2s_1(0,1) - (t4ddg_2(0,0,0,1)*t2s_2(0,0)
+			      + t4ddg_2(0,1,0,1)*t2s_2(0,1)
+			      + t4ddg_2(0,2,0,1)*t2s_2(0,2)
+			      + t4ddg_2(1,0,0,1)*t2s_2(1,0)
+			      + t4ddg_2(1,1,0,1)*t2s_2(1,1)
+			      + t4ddg_2(1,2,0,1)*t2s_2(1,2)
+			      + t4ddg_2(2,0,0,1)*t2s_2(2,0)
+			      + t4ddg_2(2,1,0,1)*t2s_2(2,1)
+			      + t4ddg_2(2,2,0,1)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)*T2s(i,k)(0,1)");
+  test_for_zero(t2s_1(0,2) - (t4ddg_2(0,0,0,2)*t2s_2(0,0)
+			      + t4ddg_2(0,1,0,2)*t2s_2(0,1)
+			      + t4ddg_2(0,2,0,2)*t2s_2(0,2)
+			      + t4ddg_2(1,0,0,2)*t2s_2(1,0)
+			      + t4ddg_2(1,1,0,2)*t2s_2(1,1)
+			      + t4ddg_2(1,2,0,2)*t2s_2(1,2)
+			      + t4ddg_2(2,0,0,2)*t2s_2(2,0)
+			      + t4ddg_2(2,1,0,2)*t2s_2(2,1)
+			      + t4ddg_2(2,2,0,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)*T2s(i,k)(0,2)");
+  test_for_zero(t2s_1(1,0) - (t4ddg_2(0,0,1,0)*t2s_2(0,0)
+			      + t4ddg_2(0,1,1,0)*t2s_2(0,1)
+			      + t4ddg_2(0,2,1,0)*t2s_2(0,2)
+			      + t4ddg_2(1,0,1,0)*t2s_2(1,0)
+			      + t4ddg_2(1,1,1,0)*t2s_2(1,1)
+			      + t4ddg_2(1,2,1,0)*t2s_2(1,2)
+			      + t4ddg_2(2,0,1,0)*t2s_2(2,0)
+			      + t4ddg_2(2,1,1,0)*t2s_2(2,1)
+			      + t4ddg_2(2,2,1,0)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)*T2s(i,k)(1,0)");
+  test_for_zero(t2s_1(1,1) - (t4ddg_2(0,0,1,1)*t2s_2(0,0)
+			      + t4ddg_2(0,1,1,1)*t2s_2(0,1)
+			      + t4ddg_2(0,2,1,1)*t2s_2(0,2)
+			      + t4ddg_2(1,0,1,1)*t2s_2(1,0)
+			      + t4ddg_2(1,1,1,1)*t2s_2(1,1)
+			      + t4ddg_2(1,2,1,1)*t2s_2(1,2)
+			      + t4ddg_2(2,0,1,1)*t2s_2(2,0)
+			      + t4ddg_2(2,1,1,1)*t2s_2(2,1)
+			      + t4ddg_2(2,2,1,1)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)*T2s(i,k)(1,1)");
+  test_for_zero(t2s_1(1,2) - (t4ddg_2(0,0,1,2)*t2s_2(0,0)
+			      + t4ddg_2(0,1,1,2)*t2s_2(0,1)
+			      + t4ddg_2(0,2,1,2)*t2s_2(0,2)
+			      + t4ddg_2(1,0,1,2)*t2s_2(1,0)
+			      + t4ddg_2(1,1,1,2)*t2s_2(1,1)
+			      + t4ddg_2(1,2,1,2)*t2s_2(1,2)
+			      + t4ddg_2(2,0,1,2)*t2s_2(2,0)
+			      + t4ddg_2(2,1,1,2)*t2s_2(2,1)
+			      + t4ddg_2(2,2,1,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)*T2s(i,k)(1,2)");
+  test_for_zero(t2s_1(2,0) - (t4ddg_2(0,0,2,0)*t2s_2(0,0)
+			      + t4ddg_2(0,1,2,0)*t2s_2(0,1)
+			      + t4ddg_2(0,2,2,0)*t2s_2(0,2)
+			      + t4ddg_2(1,0,2,0)*t2s_2(1,0)
+			      + t4ddg_2(1,1,2,0)*t2s_2(1,1)
+			      + t4ddg_2(1,2,2,0)*t2s_2(1,2)
+			      + t4ddg_2(2,0,2,0)*t2s_2(2,0)
+			      + t4ddg_2(2,1,2,0)*t2s_2(2,1)
+			      + t4ddg_2(2,2,2,0)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)*T2s(i,k)(2,0)");
+  test_for_zero(t2s_1(2,1) - (t4ddg_2(0,0,2,1)*t2s_2(0,0)
+			      + t4ddg_2(0,1,2,1)*t2s_2(0,1)
+			      + t4ddg_2(0,2,2,1)*t2s_2(0,2)
+			      + t4ddg_2(1,0,2,1)*t2s_2(1,0)
+			      + t4ddg_2(1,1,2,1)*t2s_2(1,1)
+			      + t4ddg_2(1,2,2,1)*t2s_2(1,2)
+			      + t4ddg_2(2,0,2,1)*t2s_2(2,0)
+			      + t4ddg_2(2,1,2,1)*t2s_2(2,1)
+			      + t4ddg_2(2,2,2,1)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)*T2s(i,k)(2,1)");
+  test_for_zero(t2s_1(2,2) - (t4ddg_2(0,0,2,2)*t2s_2(0,0)
+			      + t4ddg_2(0,1,2,2)*t2s_2(0,1)
+			      + t4ddg_2(0,2,2,2)*t2s_2(0,2)
+			      + t4ddg_2(1,0,2,2)*t2s_2(1,0)
+			      + t4ddg_2(1,1,2,2)*t2s_2(1,1)
+			      + t4ddg_2(1,2,2,2)*t2s_2(1,2)
+			      + t4ddg_2(2,0,2,2)*t2s_2(2,0)
+			      + t4ddg_2(2,1,2,2)*t2s_2(2,1)
+			      + t4ddg_2(2,2,2,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)*T2s(i,k)(2,2)");
+
+  t2s_1(j,l)=t2s_3(i,k)*t4ddg_2(i,k,j,l);
+  test_for_zero(t2s_1(0,0) - (t4ddg_2(0,0,0,0)*t2s_3(0,0)
+			      + t4ddg_2(0,1,0,0)*t2s_3(0,1)
+			      + t4ddg_2(0,2,0,0)*t2s_3(0,2)
+			      + t4ddg_2(1,0,0,0)*t2s_3(1,0)
+			      + t4ddg_2(1,1,0,0)*t2s_3(1,1)
+			      + t4ddg_2(1,2,0,0)*t2s_3(1,2)
+			      + t4ddg_2(2,0,0,0)*t2s_3(2,0)
+			      + t4ddg_2(2,1,0,0)*t2s_3(2,1)
+			      + t4ddg_2(2,2,0,0)*t2s_3(2,2))
+		,"T2s(i,k)*T4ddg(i,j,k,l)(0,0)");
+  test_for_zero(t2s_1(0,1) - (t4ddg_2(0,0,0,1)*t2s_3(0,0)
+			      + t4ddg_2(0,1,0,1)*t2s_3(0,1)
+			      + t4ddg_2(0,2,0,1)*t2s_3(0,2)
+			      + t4ddg_2(1,0,0,1)*t2s_3(1,0)
+			      + t4ddg_2(1,1,0,1)*t2s_3(1,1)
+			      + t4ddg_2(1,2,0,1)*t2s_3(1,2)
+			      + t4ddg_2(2,0,0,1)*t2s_3(2,0)
+			      + t4ddg_2(2,1,0,1)*t2s_3(2,1)
+			      + t4ddg_2(2,2,0,1)*t2s_3(2,2))
+		,"T2s(i,k)*T4ddg(i,j,k,l)(0,1)");
+  test_for_zero(t2s_1(0,2) - (t4ddg_2(0,0,0,2)*t2s_3(0,0)
+			      + t4ddg_2(0,1,0,2)*t2s_3(0,1)
+			      + t4ddg_2(0,2,0,2)*t2s_3(0,2)
+			      + t4ddg_2(1,0,0,2)*t2s_3(1,0)
+			      + t4ddg_2(1,1,0,2)*t2s_3(1,1)
+			      + t4ddg_2(1,2,0,2)*t2s_3(1,2)
+			      + t4ddg_2(2,0,0,2)*t2s_3(2,0)
+			      + t4ddg_2(2,1,0,2)*t2s_3(2,1)
+			      + t4ddg_2(2,2,0,2)*t2s_3(2,2))
+		,"T2s(i,k)*T4ddg(i,j,k,l)(0,2)");
+  test_for_zero(t2s_1(1,0) - (t4ddg_2(0,0,1,0)*t2s_3(0,0)
+			      + t4ddg_2(0,1,1,0)*t2s_3(0,1)
+			      + t4ddg_2(0,2,1,0)*t2s_3(0,2)
+			      + t4ddg_2(1,0,1,0)*t2s_3(1,0)
+			      + t4ddg_2(1,1,1,0)*t2s_3(1,1)
+			      + t4ddg_2(1,2,1,0)*t2s_3(1,2)
+			      + t4ddg_2(2,0,1,0)*t2s_3(2,0)
+			      + t4ddg_2(2,1,1,0)*t2s_3(2,1)
+			      + t4ddg_2(2,2,1,0)*t2s_3(2,2))
+		,"T2s(i,k)*T4ddg(i,j,k,l)(1,0)");
+  test_for_zero(t2s_1(1,1) - (t4ddg_2(0,0,1,1)*t2s_3(0,0)
+			      + t4ddg_2(0,1,1,1)*t2s_3(0,1)
+			      + t4ddg_2(0,2,1,1)*t2s_3(0,2)
+			      + t4ddg_2(1,0,1,1)*t2s_3(1,0)
+			      + t4ddg_2(1,1,1,1)*t2s_3(1,1)
+			      + t4ddg_2(1,2,1,1)*t2s_3(1,2)
+			      + t4ddg_2(2,0,1,1)*t2s_3(2,0)
+			      + t4ddg_2(2,1,1,1)*t2s_3(2,1)
+			      + t4ddg_2(2,2,1,1)*t2s_3(2,2))
+		,"T2s(i,k)*T4ddg(i,j,k,l)(1,1)");
+  test_for_zero(t2s_1(1,2) - (t4ddg_2(0,0,1,2)*t2s_3(0,0)
+			      + t4ddg_2(0,1,1,2)*t2s_3(0,1)
+			      + t4ddg_2(0,2,1,2)*t2s_3(0,2)
+			      + t4ddg_2(1,0,1,2)*t2s_3(1,0)
+			      + t4ddg_2(1,1,1,2)*t2s_3(1,1)
+			      + t4ddg_2(1,2,1,2)*t2s_3(1,2)
+			      + t4ddg_2(2,0,1,2)*t2s_3(2,0)
+			      + t4ddg_2(2,1,1,2)*t2s_3(2,1)
+			      + t4ddg_2(2,2,1,2)*t2s_3(2,2))
+		,"T2s(i,k)*T4ddg(i,j,k,l)(1,2)");
+  test_for_zero(t2s_1(2,0) - (t4ddg_2(0,0,2,0)*t2s_3(0,0)
+			      + t4ddg_2(0,1,2,0)*t2s_3(0,1)
+			      + t4ddg_2(0,2,2,0)*t2s_3(0,2)
+			      + t4ddg_2(1,0,2,0)*t2s_3(1,0)
+			      + t4ddg_2(1,1,2,0)*t2s_3(1,1)
+			      + t4ddg_2(1,2,2,0)*t2s_3(1,2)
+			      + t4ddg_2(2,0,2,0)*t2s_3(2,0)
+			      + t4ddg_2(2,1,2,0)*t2s_3(2,1)
+			      + t4ddg_2(2,2,2,0)*t2s_3(2,2))
+		,"T2s(i,k)*T4ddg(i,j,k,l)(2,0)");
+  test_for_zero(t2s_1(2,1) - (t4ddg_2(0,0,2,1)*t2s_3(0,0)
+			      + t4ddg_2(0,1,2,1)*t2s_3(0,1)
+			      + t4ddg_2(0,2,2,1)*t2s_3(0,2)
+			      + t4ddg_2(1,0,2,1)*t2s_3(1,0)
+			      + t4ddg_2(1,1,2,1)*t2s_3(1,1)
+			      + t4ddg_2(1,2,2,1)*t2s_3(1,2)
+			      + t4ddg_2(2,0,2,1)*t2s_3(2,0)
+			      + t4ddg_2(2,1,2,1)*t2s_3(2,1)
+			      + t4ddg_2(2,2,2,1)*t2s_3(2,2))
+		,"T2s(i,k)*T4ddg(i,j,k,l)(2,1)");
+  test_for_zero(t2s_1(2,2) - (t4ddg_2(0,0,2,2)*t2s_3(0,0)
+			      + t4ddg_2(0,1,2,2)*t2s_3(0,1)
+			      + t4ddg_2(0,2,2,2)*t2s_3(0,2)
+			      + t4ddg_2(1,0,2,2)*t2s_3(1,0)
+			      + t4ddg_2(1,1,2,2)*t2s_3(1,1)
+			      + t4ddg_2(1,2,2,2)*t2s_3(1,2)
+			      + t4ddg_2(2,0,2,2)*t2s_3(2,0)
+			      + t4ddg_2(2,1,2,2)*t2s_3(2,1)
+			      + t4ddg_2(2,2,2,2)*t2s_3(2,2))
+		,"T2s(i,k)*T4ddg(i,j,k,l)(2,2)");
+
+  t4ddg_1(i,j,k,l)=(t4ddg_2(i,j,k,l)&t2s_3(i,j));
+  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)*t2s_3(0,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,0,0,0)");
+  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)*t2s_3(0,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,0,0,1)");
+  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)*t2s_3(0,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,0,0,2)");
+  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)*t2s_3(0,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,0,1,0)");
+  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)*t2s_3(0,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,0,1,1)");
+  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)*t2s_3(0,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,0,1,2)");
+  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)*t2s_3(0,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,0,2,0)");
+  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)*t2s_3(0,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,0,2,1)");
+  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)*t2s_3(0,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,0,2,2)");
+  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)*t2s_3(0,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,1,0,0)");
+  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)*t2s_3(0,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,1,0,1)");
+  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)*t2s_3(0,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,1,0,2)");
+  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)*t2s_3(0,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,1,1,0)");
+  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)*t2s_3(0,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,1,1,1)");
+  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)*t2s_3(0,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,1,1,2)");
+  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)*t2s_3(0,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,1,2,0)");
+  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)*t2s_3(0,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,1,2,1)");
+  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)*t2s_3(0,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,1,2,2)");
+  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)*t2s_3(0,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,2,0,0)");
+  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)*t2s_3(0,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,2,0,1)");
+  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)*t2s_3(0,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,2,0,2)");
+  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)*t2s_3(0,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,2,1,0)");
+  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)*t2s_3(0,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,2,1,1)");
+  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)*t2s_3(0,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,2,1,2)");
+  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)*t2s_3(0,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,2,2,0)");
+  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)*t2s_3(0,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,2,2,1)");
+  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)*t2s_3(0,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(0,2,2,2)");
+  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)*t2s_3(1,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,0,0,0)");
+  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)*t2s_3(1,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,0,0,1)");
+  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)*t2s_3(1,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,0,0,2)");
+  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)*t2s_3(1,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,0,1,0)");
+  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)*t2s_3(1,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,0,1,1)");
+  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)*t2s_3(1,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,0,1,2)");
+  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)*t2s_3(1,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,0,2,0)");
+  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)*t2s_3(1,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,0,2,1)");
+  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)*t2s_3(1,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,0,2,2)");
+  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)*t2s_3(1,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,1,0,0)");
+  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)*t2s_3(1,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,1,0,1)");
+  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)*t2s_3(1,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,1,0,2)");
+  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)*t2s_3(1,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)*t2s_3(1,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,1,1,1)");
+  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)*t2s_3(1,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,1,1,2)");
+  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)*t2s_3(1,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,1,2,0)");
+  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)*t2s_3(1,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,1,2,1)");
+  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)*t2s_3(1,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,1,2,2)");
+  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)*t2s_3(1,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,2,0,0)");
+  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)*t2s_3(1,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,2,0,1)");
+  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)*t2s_3(1,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,2,0,2)");
+  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)*t2s_3(1,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,2,1,0)");
+  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)*t2s_3(1,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,2,1,1)");
+  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)*t2s_3(1,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,2,1,2)");
+  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)*t2s_3(1,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,2,2,0)");
+  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)*t2s_3(1,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,2,2,1)");
+  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)*t2s_3(1,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(1,2,2,2)");
+  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)*t2s_3(2,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,0,0,0)");
+  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)*t2s_3(2,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,0,0,1)");
+  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)*t2s_3(2,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,0,0,2)");
+  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)*t2s_3(2,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,0,1,0)");
+  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)*t2s_3(2,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,0,1,1)");
+  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)*t2s_3(2,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,0,1,2)");
+  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)*t2s_3(2,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,0,2,0)");
+  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)*t2s_3(2,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,0,2,1)");
+  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)*t2s_3(2,0))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,0,2,2)");
+  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)*t2s_3(2,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,1,0,0)");
+  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)*t2s_3(2,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,1,0,1)");
+  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)*t2s_3(2,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,1,0,2)");
+  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)*t2s_3(2,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,1,1,0)");
+  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)*t2s_3(2,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,1,1,1)");
+  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)*t2s_3(2,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,1,1,2)");
+  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)*t2s_3(2,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,1,2,0)");
+  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)*t2s_3(2,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,1,2,1)");
+  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)*t2s_3(2,1))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,1,2,2)");
+  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)*t2s_3(2,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,2,0,0)");
+  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)*t2s_3(2,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,2,0,1)");
+  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)*t2s_3(2,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,2,0,2)");
+  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)*t2s_3(2,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,2,1,0)");
+  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)*t2s_3(2,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,2,1,1)");
+  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)*t2s_3(2,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,2,1,2)");
+  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)*t2s_3(2,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,2,2,0)");
+  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)*t2s_3(2,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)*t2s_3(2,2))
+		,"T4ddg(i,j,k,l)&T2s(i,j)(2,2,2,2)");
+
+  t4ddg_1(i,j,k,l)=(t2s_2(i,j)&t4ddg_2(i,j,k,l));
+  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)*t2s_2(0,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,0,0,0)");
+  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)*t2s_2(0,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,0,0,1)");
+  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)*t2s_2(0,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,0,0,2)");
+  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)*t2s_2(0,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,0,1,0)");
+  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)*t2s_2(0,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,0,1,1)");
+  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)*t2s_2(0,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,0,1,2)");
+  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)*t2s_2(0,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,0,2,0)");
+  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)*t2s_2(0,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,0,2,1)");
+  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)*t2s_2(0,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,0,2,2)");
+  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)*t2s_2(0,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,1,0,0)");
+  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)*t2s_2(0,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,1,0,1)");
+  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)*t2s_2(0,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,1,0,2)");
+  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)*t2s_2(0,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,1,1,0)");
+  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)*t2s_2(0,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,1,1,1)");
+  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)*t2s_2(0,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,1,1,2)");
+  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)*t2s_2(0,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,1,2,0)");
+  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)*t2s_2(0,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,1,2,1)");
+  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)*t2s_2(0,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,1,2,2)");
+  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)*t2s_2(0,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,2,0,0)");
+  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)*t2s_2(0,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,2,0,1)");
+  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)*t2s_2(0,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,2,0,2)");
+  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)*t2s_2(0,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,2,1,0)");
+  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)*t2s_2(0,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,2,1,1)");
+  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)*t2s_2(0,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,2,1,2)");
+  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)*t2s_2(0,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,2,2,0)");
+  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)*t2s_2(0,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,2,2,1)");
+  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)*t2s_2(0,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(0,2,2,2)");
+  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)*t2s_2(1,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,0,0,0)");
+  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)*t2s_2(1,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,0,0,1)");
+  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)*t2s_2(1,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,0,0,2)");
+  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)*t2s_2(1,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,0,1,0)");
+  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)*t2s_2(1,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,0,1,1)");
+  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)*t2s_2(1,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,0,1,2)");
+  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)*t2s_2(1,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,0,2,0)");
+  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)*t2s_2(1,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,0,2,1)");
+  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)*t2s_2(1,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,0,2,2)");
+  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)*t2s_2(1,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,1,0,0)");
+  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)*t2s_2(1,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,1,0,1)");
+  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)*t2s_2(1,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,1,0,2)");
+  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)*t2s_2(1,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)*t2s_2(1,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,1,1,1)");
+  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)*t2s_2(1,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,1,1,2)");
+  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)*t2s_2(1,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,1,2,0)");
+  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)*t2s_2(1,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,1,2,1)");
+  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)*t2s_2(1,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,1,2,2)");
+  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)*t2s_2(1,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,2,0,0)");
+  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)*t2s_2(1,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,2,0,1)");
+  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)*t2s_2(1,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,2,0,2)");
+  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)*t2s_2(1,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,2,1,0)");
+  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)*t2s_2(1,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,2,1,1)");
+  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)*t2s_2(1,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,2,1,2)");
+  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)*t2s_2(1,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,2,2,0)");
+  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)*t2s_2(1,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,2,2,1)");
+  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)*t2s_2(1,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(1,2,2,2)");
+  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)*t2s_2(2,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,0,0,0)");
+  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)*t2s_2(2,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,0,0,1)");
+  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)*t2s_2(2,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,0,0,2)");
+  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)*t2s_2(2,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,0,1,0)");
+  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)*t2s_2(2,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,0,1,1)");
+  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)*t2s_2(2,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,0,1,2)");
+  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)*t2s_2(2,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,0,2,0)");
+  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)*t2s_2(2,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,0,2,1)");
+  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)*t2s_2(2,0))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,0,2,2)");
+  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)*t2s_2(2,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,1,0,0)");
+  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)*t2s_2(2,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,1,0,1)");
+  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)*t2s_2(2,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,1,0,2)");
+  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)*t2s_2(2,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,1,1,0)");
+  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)*t2s_2(2,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,1,1,1)");
+  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)*t2s_2(2,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,1,1,2)");
+  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)*t2s_2(2,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,1,2,0)");
+  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)*t2s_2(2,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,1,2,1)");
+  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)*t2s_2(2,1))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,1,2,2)");
+  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)*t2s_2(2,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,2,0,0)");
+  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)*t2s_2(2,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,2,0,1)");
+  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)*t2s_2(2,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,2,0,2)");
+  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)*t2s_2(2,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,2,1,0)");
+  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)*t2s_2(2,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,2,1,1)");
+  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)*t2s_2(2,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,2,1,2)");
+  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)*t2s_2(2,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,2,2,0)");
+  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)*t2s_2(2,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)*t2s_2(2,2))
+		,"T2s(i,j)&T4ddg(i,j,k,l)(2,2,2,2)");
+
+  t4ddg_1(i,j,k,l)=(t4ddg_2(i,j,k,l)&t2s_3(k,l));
+  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)*t2s_3(0,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,0,0,0)");
+  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)*t2s_3(0,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,0,0,1)");
+  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)*t2s_3(0,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,0,0,2)");
+  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)*t2s_3(1,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,0,1,0)");
+  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)*t2s_3(1,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,0,1,1)");
+  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)*t2s_3(1,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,0,1,2)");
+  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)*t2s_3(2,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,0,2,0)");
+  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)*t2s_3(2,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,0,2,1)");
+  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)*t2s_3(2,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,0,2,2)");
+  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)*t2s_3(0,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,1,0,0)");
+  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)*t2s_3(0,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,1,0,1)");
+  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)*t2s_3(0,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,1,0,2)");
+  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)*t2s_3(1,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,1,1,0)");
+  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)*t2s_3(1,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,1,1,1)");
+  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)*t2s_3(1,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,1,1,2)");
+  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)*t2s_3(2,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,1,2,0)");
+  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)*t2s_3(2,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,1,2,1)");
+  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)*t2s_3(2,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,1,2,2)");
+  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)*t2s_3(0,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,2,0,0)");
+  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)*t2s_3(0,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,2,0,1)");
+  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)*t2s_3(0,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,2,0,2)");
+  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)*t2s_3(1,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,2,1,0)");
+  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)*t2s_3(1,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,2,1,1)");
+  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)*t2s_3(1,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,2,1,2)");
+  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)*t2s_3(2,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,2,2,0)");
+  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)*t2s_3(2,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,2,2,1)");
+  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)*t2s_3(2,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(0,2,2,2)");
+  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)*t2s_3(0,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,0,0,0)");
+  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)*t2s_3(0,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,0,0,1)");
+  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)*t2s_3(0,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,0,0,2)");
+  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)*t2s_3(1,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,0,1,0)");
+  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)*t2s_3(1,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,0,1,1)");
+  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)*t2s_3(1,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,0,1,2)");
+  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)*t2s_3(2,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,0,2,0)");
+  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)*t2s_3(2,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,0,2,1)");
+  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)*t2s_3(2,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,0,2,2)");
+  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)*t2s_3(0,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,1,0,0)");
+  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)*t2s_3(0,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,1,0,1)");
+  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)*t2s_3(0,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,1,0,2)");
+  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)*t2s_3(1,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)*t2s_3(1,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,1,1,1)");
+  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)*t2s_3(1,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,1,1,2)");
+  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)*t2s_3(2,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,1,2,0)");
+  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)*t2s_3(2,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,1,2,1)");
+  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)*t2s_3(2,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,1,2,2)");
+  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)*t2s_3(0,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,2,0,0)");
+  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)*t2s_3(0,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,2,0,1)");
+  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)*t2s_3(0,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,2,0,2)");
+  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)*t2s_3(1,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,2,1,0)");
+  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)*t2s_3(1,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,2,1,1)");
+  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)*t2s_3(1,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,2,1,2)");
+  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)*t2s_3(2,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,2,2,0)");
+  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)*t2s_3(2,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,2,2,1)");
+  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)*t2s_3(2,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(1,2,2,2)");
+  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)*t2s_3(0,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,0,0,0)");
+  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)*t2s_3(0,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,0,0,1)");
+  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)*t2s_3(0,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,0,0,2)");
+  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)*t2s_3(1,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,0,1,0)");
+  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)*t2s_3(1,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,0,1,1)");
+  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)*t2s_3(1,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,0,1,2)");
+  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)*t2s_3(2,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,0,2,0)");
+  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)*t2s_3(2,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,0,2,1)");
+  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)*t2s_3(2,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,0,2,2)");
+  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)*t2s_3(0,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,1,0,0)");
+  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)*t2s_3(0,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,1,0,1)");
+  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)*t2s_3(0,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,1,0,2)");
+  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)*t2s_3(1,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,1,1,0)");
+  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)*t2s_3(1,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,1,1,1)");
+  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)*t2s_3(1,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,1,1,2)");
+  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)*t2s_3(2,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,1,2,0)");
+  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)*t2s_3(2,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,1,2,1)");
+  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)*t2s_3(2,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,1,2,2)");
+  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)*t2s_3(0,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,2,0,0)");
+  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)*t2s_3(0,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,2,0,1)");
+  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)*t2s_3(0,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,2,0,2)");
+  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)*t2s_3(1,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,2,1,0)");
+  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)*t2s_3(1,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,2,1,1)");
+  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)*t2s_3(1,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,2,1,2)");
+  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)*t2s_3(2,0))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,2,2,0)");
+  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)*t2s_3(2,1))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)*t2s_3(2,2))
+		,"T4ddg(i,j,k,l)&T2s(k,l)(2,2,2,2)");
+
+  t4ddg_1(i,j,k,l)=(t2s_2(k,l)&t4ddg_2(i,j,k,l));
+  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)*t2s_2(0,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,0,0,0)");
+  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)*t2s_2(0,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,0,0,1)");
+  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)*t2s_2(0,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,0,0,2)");
+  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)*t2s_2(1,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,0,1,0)");
+  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)*t2s_2(1,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,0,1,1)");
+  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)*t2s_2(1,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,0,1,2)");
+  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)*t2s_2(2,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,0,2,0)");
+  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)*t2s_2(2,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,0,2,1)");
+  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)*t2s_2(2,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,0,2,2)");
+  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)*t2s_2(0,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,1,0,0)");
+  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)*t2s_2(0,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,1,0,1)");
+  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)*t2s_2(0,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,1,0,2)");
+  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)*t2s_2(1,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,1,1,0)");
+  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)*t2s_2(1,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,1,1,1)");
+  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)*t2s_2(1,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,1,1,2)");
+  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)*t2s_2(2,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,1,2,0)");
+  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)*t2s_2(2,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,1,2,1)");
+  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)*t2s_2(2,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,1,2,2)");
+  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)*t2s_2(0,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,2,0,0)");
+  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)*t2s_2(0,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,2,0,1)");
+  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)*t2s_2(0,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,2,0,2)");
+  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)*t2s_2(1,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,2,1,0)");
+  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)*t2s_2(1,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,2,1,1)");
+  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)*t2s_2(1,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,2,1,2)");
+  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)*t2s_2(2,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,2,2,0)");
+  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)*t2s_2(2,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,2,2,1)");
+  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)*t2s_2(2,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(0,2,2,2)");
+  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)*t2s_2(0,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,0,0,0)");
+  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)*t2s_2(0,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,0,0,1)");
+  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)*t2s_2(0,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,0,0,2)");
+  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)*t2s_2(1,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,0,1,0)");
+  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)*t2s_2(1,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,0,1,1)");
+  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)*t2s_2(1,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,0,1,2)");
+  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)*t2s_2(2,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,0,2,0)");
+  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)*t2s_2(2,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,0,2,1)");
+  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)*t2s_2(2,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,0,2,2)");
+  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)*t2s_2(0,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,1,0,0)");
+  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)*t2s_2(0,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,1,0,1)");
+  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)*t2s_2(0,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,1,0,2)");
+  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)*t2s_2(1,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)*t2s_2(1,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,1,1,1)");
+  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)*t2s_2(1,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,1,1,2)");
+  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)*t2s_2(2,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,1,2,0)");
+  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)*t2s_2(2,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,1,2,1)");
+  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)*t2s_2(2,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,1,2,2)");
+  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)*t2s_2(0,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,2,0,0)");
+  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)*t2s_2(0,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,2,0,1)");
+  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)*t2s_2(0,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,2,0,2)");
+  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)*t2s_2(1,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,2,1,0)");
+  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)*t2s_2(1,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,2,1,1)");
+  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)*t2s_2(1,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,2,1,2)");
+  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)*t2s_2(2,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,2,2,0)");
+  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)*t2s_2(2,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,2,2,1)");
+  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)*t2s_2(2,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(1,2,2,2)");
+  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)*t2s_2(0,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,0,0,0)");
+  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)*t2s_2(0,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,0,0,1)");
+  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)*t2s_2(0,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,0,0,2)");
+  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)*t2s_2(1,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,0,1,0)");
+  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)*t2s_2(1,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,0,1,1)");
+  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)*t2s_2(1,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,0,1,2)");
+  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)*t2s_2(2,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,0,2,0)");
+  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)*t2s_2(2,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,0,2,1)");
+  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)*t2s_2(2,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,0,2,2)");
+  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)*t2s_2(0,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,1,0,0)");
+  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)*t2s_2(0,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,1,0,1)");
+  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)*t2s_2(0,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,1,0,2)");
+  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)*t2s_2(1,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,1,1,0)");
+  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)*t2s_2(1,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,1,1,1)");
+  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)*t2s_2(1,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,1,1,2)");
+  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)*t2s_2(2,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,1,2,0)");
+  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)*t2s_2(2,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,1,2,1)");
+  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)*t2s_2(2,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,1,2,2)");
+  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)*t2s_2(0,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,2,0,0)");
+  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)*t2s_2(0,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,2,0,1)");
+  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)*t2s_2(0,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,2,0,2)");
+  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)*t2s_2(1,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,2,1,0)");
+  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)*t2s_2(1,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,2,1,1)");
+  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)*t2s_2(1,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,2,1,2)");
+  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)*t2s_2(2,0))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,2,2,0)");
+  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)*t2s_2(2,1))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)*t2s_2(2,2))
+		,"T2s(k,l)&T4ddg(i,j,k,l)(2,2,2,2)");
+
+  t4ddg_1(i,j,k,l)=(t4ddg_2(i,j,k,l)%t2s_3(i,j));
+  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)/t2s_3(0,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,0,0,0)");
+  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)/t2s_3(0,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,0,0,1)");
+  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)/t2s_3(0,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,0,0,2)");
+  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)/t2s_3(0,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,0,1,0)");
+  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)/t2s_3(0,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,0,1,1)");
+  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)/t2s_3(0,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,0,1,2)");
+  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)/t2s_3(0,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,0,2,0)");
+  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)/t2s_3(0,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,0,2,1)");
+  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)/t2s_3(0,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,0,2,2)");
+  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)/t2s_3(0,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,1,0,0)");
+  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)/t2s_3(0,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,1,0,1)");
+  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)/t2s_3(0,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,1,0,2)");
+  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)/t2s_3(0,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,1,1,0)");
+  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)/t2s_3(0,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,1,1,1)");
+  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)/t2s_3(0,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,1,1,2)");
+  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)/t2s_3(0,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,1,2,0)");
+  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)/t2s_3(0,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,1,2,1)");
+  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)/t2s_3(0,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,1,2,2)");
+  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)/t2s_3(0,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,2,0,0)");
+  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)/t2s_3(0,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,2,0,1)");
+  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)/t2s_3(0,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,2,0,2)");
+  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)/t2s_3(0,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,2,1,0)");
+  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)/t2s_3(0,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,2,1,1)");
+  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)/t2s_3(0,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,2,1,2)");
+  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)/t2s_3(0,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,2,2,0)");
+  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)/t2s_3(0,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,2,2,1)");
+  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)/t2s_3(0,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(0,2,2,2)");
+  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)/t2s_3(1,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,0,0,0)");
+  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)/t2s_3(1,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,0,0,1)");
+  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)/t2s_3(1,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,0,0,2)");
+  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)/t2s_3(1,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,0,1,0)");
+  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)/t2s_3(1,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,0,1,1)");
+  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)/t2s_3(1,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,0,1,2)");
+  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)/t2s_3(1,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,0,2,0)");
+  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)/t2s_3(1,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,0,2,1)");
+  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)/t2s_3(1,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,0,2,2)");
+  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)/t2s_3(1,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,1,0,0)");
+  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)/t2s_3(1,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,1,0,1)");
+  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)/t2s_3(1,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,1,0,2)");
+  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)/t2s_3(1,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)/t2s_3(1,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,1,1,1)");
+  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)/t2s_3(1,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,1,1,2)");
+  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)/t2s_3(1,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,1,2,0)");
+  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)/t2s_3(1,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,1,2,1)");
+  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)/t2s_3(1,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,1,2,2)");
+  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)/t2s_3(1,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,2,0,0)");
+  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)/t2s_3(1,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,2,0,1)");
+  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)/t2s_3(1,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,2,0,2)");
+  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)/t2s_3(1,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,2,1,0)");
+  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)/t2s_3(1,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,2,1,1)");
+  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)/t2s_3(1,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,2,1,2)");
+  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)/t2s_3(1,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,2,2,0)");
+  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)/t2s_3(1,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,2,2,1)");
+  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)/t2s_3(1,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(1,2,2,2)");
+  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)/t2s_3(2,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,0,0,0)");
+  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)/t2s_3(2,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,0,0,1)");
+  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)/t2s_3(2,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,0,0,2)");
+  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)/t2s_3(2,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,0,1,0)");
+  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)/t2s_3(2,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,0,1,1)");
+  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)/t2s_3(2,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,0,1,2)");
+  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)/t2s_3(2,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,0,2,0)");
+  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)/t2s_3(2,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,0,2,1)");
+  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)/t2s_3(2,0))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,0,2,2)");
+  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)/t2s_3(2,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,1,0,0)");
+  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)/t2s_3(2,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,1,0,1)");
+  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)/t2s_3(2,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,1,0,2)");
+  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)/t2s_3(2,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,1,1,0)");
+  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)/t2s_3(2,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,1,1,1)");
+  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)/t2s_3(2,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,1,1,2)");
+  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)/t2s_3(2,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,1,2,0)");
+  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)/t2s_3(2,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,1,2,1)");
+  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)/t2s_3(2,1))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,1,2,2)");
+  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)/t2s_3(2,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,2,0,0)");
+  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)/t2s_3(2,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,2,0,1)");
+  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)/t2s_3(2,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,2,0,2)");
+  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)/t2s_3(2,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,2,1,0)");
+  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)/t2s_3(2,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,2,1,1)");
+  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)/t2s_3(2,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,2,1,2)");
+  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)/t2s_3(2,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,2,2,0)");
+  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)/t2s_3(2,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)/t2s_3(2,2))
+		,"T4ddg(i,j,k,l)%T2s(i,j)(2,2,2,2)");
+
+  t4ddg_1(i,j,k,l)=(t2s_2(i,j)%t4ddg_2(i,j,k,l));
+  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)/t2s_2(0,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,0,0,0)");
+  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)/t2s_2(0,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,0,0,1)");
+  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)/t2s_2(0,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,0,0,2)");
+  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)/t2s_2(0,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,0,1,0)");
+  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)/t2s_2(0,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,0,1,1)");
+  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)/t2s_2(0,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,0,1,2)");
+  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)/t2s_2(0,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,0,2,0)");
+  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)/t2s_2(0,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,0,2,1)");
+  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)/t2s_2(0,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,0,2,2)");
+  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)/t2s_2(0,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,1,0,0)");
+  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)/t2s_2(0,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,1,0,1)");
+  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)/t2s_2(0,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,1,0,2)");
+  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)/t2s_2(0,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,1,1,0)");
+  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)/t2s_2(0,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,1,1,1)");
+  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)/t2s_2(0,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,1,1,2)");
+  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)/t2s_2(0,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,1,2,0)");
+  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)/t2s_2(0,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,1,2,1)");
+  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)/t2s_2(0,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,1,2,2)");
+  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)/t2s_2(0,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,2,0,0)");
+  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)/t2s_2(0,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,2,0,1)");
+  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)/t2s_2(0,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,2,0,2)");
+  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)/t2s_2(0,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,2,1,0)");
+  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)/t2s_2(0,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,2,1,1)");
+  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)/t2s_2(0,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,2,1,2)");
+  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)/t2s_2(0,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,2,2,0)");
+  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)/t2s_2(0,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,2,2,1)");
+  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)/t2s_2(0,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(0,2,2,2)");
+  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)/t2s_2(1,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,0,0,0)");
+  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)/t2s_2(1,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,0,0,1)");
+  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)/t2s_2(1,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,0,0,2)");
+  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)/t2s_2(1,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,0,1,0)");
+  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)/t2s_2(1,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,0,1,1)");
+  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)/t2s_2(1,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,0,1,2)");
+  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)/t2s_2(1,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,0,2,0)");
+  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)/t2s_2(1,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,0,2,1)");
+  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)/t2s_2(1,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,0,2,2)");
+  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)/t2s_2(1,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,1,0,0)");
+  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)/t2s_2(1,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,1,0,1)");
+  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)/t2s_2(1,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,1,0,2)");
+  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)/t2s_2(1,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)/t2s_2(1,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,1,1,1)");
+  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)/t2s_2(1,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,1,1,2)");
+  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)/t2s_2(1,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,1,2,0)");
+  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)/t2s_2(1,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,1,2,1)");
+  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)/t2s_2(1,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,1,2,2)");
+  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)/t2s_2(1,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,2,0,0)");
+  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)/t2s_2(1,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,2,0,1)");
+  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)/t2s_2(1,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,2,0,2)");
+  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)/t2s_2(1,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,2,1,0)");
+  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)/t2s_2(1,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,2,1,1)");
+  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)/t2s_2(1,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,2,1,2)");
+  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)/t2s_2(1,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,2,2,0)");
+  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)/t2s_2(1,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,2,2,1)");
+  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)/t2s_2(1,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(1,2,2,2)");
+  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)/t2s_2(2,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,0,0,0)");
+  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)/t2s_2(2,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,0,0,1)");
+  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)/t2s_2(2,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,0,0,2)");
+  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)/t2s_2(2,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,0,1,0)");
+  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)/t2s_2(2,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,0,1,1)");
+  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)/t2s_2(2,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,0,1,2)");
+  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)/t2s_2(2,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,0,2,0)");
+  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)/t2s_2(2,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,0,2,1)");
+  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)/t2s_2(2,0))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,0,2,2)");
+  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)/t2s_2(2,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,1,0,0)");
+  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)/t2s_2(2,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,1,0,1)");
+  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)/t2s_2(2,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,1,0,2)");
+  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)/t2s_2(2,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,1,1,0)");
+  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)/t2s_2(2,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,1,1,1)");
+  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)/t2s_2(2,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,1,1,2)");
+  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)/t2s_2(2,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,1,2,0)");
+  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)/t2s_2(2,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,1,2,1)");
+  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)/t2s_2(2,1))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,1,2,2)");
+  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)/t2s_2(2,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,2,0,0)");
+  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)/t2s_2(2,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,2,0,1)");
+  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)/t2s_2(2,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,2,0,2)");
+  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)/t2s_2(2,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,2,1,0)");
+  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)/t2s_2(2,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,2,1,1)");
+  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)/t2s_2(2,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,2,1,2)");
+  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)/t2s_2(2,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,2,2,0)");
+  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)/t2s_2(2,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)/t2s_2(2,2))
+		,"T2s(i,j)%T4ddg(i,j,k,l)(2,2,2,2)");
+
+  t4ddg_1(i,j,k,l)=(t4ddg_2(i,j,k,l)%t2s_3(k,l));
+  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)/t2s_3(0,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,0,0,0)");
+  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)/t2s_3(0,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,0,0,1)");
+  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)/t2s_3(0,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,0,0,2)");
+  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)/t2s_3(1,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,0,1,0)");
+  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)/t2s_3(1,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,0,1,1)");
+  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)/t2s_3(1,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,0,1,2)");
+  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)/t2s_3(2,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,0,2,0)");
+  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)/t2s_3(2,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,0,2,1)");
+  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)/t2s_3(2,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,0,2,2)");
+  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)/t2s_3(0,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,1,0,0)");
+  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)/t2s_3(0,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,1,0,1)");
+  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)/t2s_3(0,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,1,0,2)");
+  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)/t2s_3(1,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,1,1,0)");
+  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)/t2s_3(1,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,1,1,1)");
+  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)/t2s_3(1,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,1,1,2)");
+  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)/t2s_3(2,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,1,2,0)");
+  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)/t2s_3(2,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,1,2,1)");
+  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)/t2s_3(2,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,1,2,2)");
+  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)/t2s_3(0,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,2,0,0)");
+  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)/t2s_3(0,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,2,0,1)");
+  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)/t2s_3(0,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,2,0,2)");
+  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)/t2s_3(1,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,2,1,0)");
+  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)/t2s_3(1,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,2,1,1)");
+  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)/t2s_3(1,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,2,1,2)");
+  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)/t2s_3(2,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,2,2,0)");
+  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)/t2s_3(2,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,2,2,1)");
+  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)/t2s_3(2,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(0,2,2,2)");
+  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)/t2s_3(0,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,0,0,0)");
+  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)/t2s_3(0,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,0,0,1)");
+  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)/t2s_3(0,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,0,0,2)");
+  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)/t2s_3(1,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,0,1,0)");
+  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)/t2s_3(1,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,0,1,1)");
+  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)/t2s_3(1,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,0,1,2)");
+  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)/t2s_3(2,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,0,2,0)");
+  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)/t2s_3(2,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,0,2,1)");
+  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)/t2s_3(2,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,0,2,2)");
+  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)/t2s_3(0,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,1,0,0)");
+  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)/t2s_3(0,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,1,0,1)");
+  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)/t2s_3(0,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,1,0,2)");
+  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)/t2s_3(1,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)/t2s_3(1,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,1,1,1)");
+  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)/t2s_3(1,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,1,1,2)");
+  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)/t2s_3(2,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,1,2,0)");
+  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)/t2s_3(2,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,1,2,1)");
+  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)/t2s_3(2,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,1,2,2)");
+  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)/t2s_3(0,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,2,0,0)");
+  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)/t2s_3(0,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,2,0,1)");
+  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)/t2s_3(0,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,2,0,2)");
+  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)/t2s_3(1,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,2,1,0)");
+  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)/t2s_3(1,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,2,1,1)");
+  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)/t2s_3(1,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,2,1,2)");
+  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)/t2s_3(2,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,2,2,0)");
+  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)/t2s_3(2,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,2,2,1)");
+  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)/t2s_3(2,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(1,2,2,2)");
+  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)/t2s_3(0,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,0,0,0)");
+  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)/t2s_3(0,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,0,0,1)");
+  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)/t2s_3(0,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,0,0,2)");
+  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)/t2s_3(1,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,0,1,0)");
+  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)/t2s_3(1,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,0,1,1)");
+  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)/t2s_3(1,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,0,1,2)");
+  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)/t2s_3(2,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,0,2,0)");
+  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)/t2s_3(2,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,0,2,1)");
+  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)/t2s_3(2,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,0,2,2)");
+  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)/t2s_3(0,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,1,0,0)");
+  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)/t2s_3(0,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,1,0,1)");
+  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)/t2s_3(0,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,1,0,2)");
+  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)/t2s_3(1,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,1,1,0)");
+  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)/t2s_3(1,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,1,1,1)");
+  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)/t2s_3(1,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,1,1,2)");
+  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)/t2s_3(2,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,1,2,0)");
+  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)/t2s_3(2,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,1,2,1)");
+  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)/t2s_3(2,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,1,2,2)");
+  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)/t2s_3(0,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,2,0,0)");
+  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)/t2s_3(0,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,2,0,1)");
+  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)/t2s_3(0,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,2,0,2)");
+  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)/t2s_3(1,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,2,1,0)");
+  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)/t2s_3(1,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,2,1,1)");
+  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)/t2s_3(1,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,2,1,2)");
+  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)/t2s_3(2,0))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,2,2,0)");
+  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)/t2s_3(2,1))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)/t2s_3(2,2))
+		,"T4ddg(i,j,k,l)%T2s(k,l)(2,2,2,2)");
+
+  t4ddg_1(i,j,k,l)=(t2s_2(k,l)%t4ddg_2(i,j,k,l));
+  test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)/t2s_2(0,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,0,0,0)");
+  test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)/t2s_2(0,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,0,0,1)");
+  test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)/t2s_2(0,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,0,0,2)");
+  test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)/t2s_2(1,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,0,1,0)");
+  test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)/t2s_2(1,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,0,1,1)");
+  test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)/t2s_2(1,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,0,1,2)");
+  test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)/t2s_2(2,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,0,2,0)");
+  test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)/t2s_2(2,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,0,2,1)");
+  test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)/t2s_2(2,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,0,2,2)");
+  test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)/t2s_2(0,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,1,0,0)");
+  test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)/t2s_2(0,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,1,0,1)");
+  test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)/t2s_2(0,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,1,0,2)");
+  test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)/t2s_2(1,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,1,1,0)");
+  test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)/t2s_2(1,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,1,1,1)");
+  test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)/t2s_2(1,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,1,1,2)");
+  test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)/t2s_2(2,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,1,2,0)");
+  test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)/t2s_2(2,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,1,2,1)");
+  test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)/t2s_2(2,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,1,2,2)");
+  test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)/t2s_2(0,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,2,0,0)");
+  test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)/t2s_2(0,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,2,0,1)");
+  test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)/t2s_2(0,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,2,0,2)");
+  test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)/t2s_2(1,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,2,1,0)");
+  test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)/t2s_2(1,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,2,1,1)");
+  test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)/t2s_2(1,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,2,1,2)");
+  test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)/t2s_2(2,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,2,2,0)");
+  test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)/t2s_2(2,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,2,2,1)");
+  test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)/t2s_2(2,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(0,2,2,2)");
+  test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)/t2s_2(0,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,0,0,0)");
+  test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)/t2s_2(0,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,0,0,1)");
+  test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)/t2s_2(0,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,0,0,2)");
+  test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)/t2s_2(1,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,0,1,0)");
+  test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)/t2s_2(1,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,0,1,1)");
+  test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)/t2s_2(1,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,0,1,2)");
+  test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)/t2s_2(2,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,0,2,0)");
+  test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)/t2s_2(2,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,0,2,1)");
+  test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)/t2s_2(2,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,0,2,2)");
+  test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)/t2s_2(0,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,1,0,0)");
+  test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)/t2s_2(0,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,1,0,1)");
+  test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)/t2s_2(0,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,1,0,2)");
+  test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)/t2s_2(1,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)/t2s_2(1,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,1,1,1)");
+  test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)/t2s_2(1,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,1,1,2)");
+  test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)/t2s_2(2,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,1,2,0)");
+  test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)/t2s_2(2,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,1,2,1)");
+  test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)/t2s_2(2,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,1,2,2)");
+  test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)/t2s_2(0,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,2,0,0)");
+  test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)/t2s_2(0,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,2,0,1)");
+  test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)/t2s_2(0,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,2,0,2)");
+  test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)/t2s_2(1,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,2,1,0)");
+  test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)/t2s_2(1,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,2,1,1)");
+  test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)/t2s_2(1,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,2,1,2)");
+  test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)/t2s_2(2,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,2,2,0)");
+  test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)/t2s_2(2,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,2,2,1)");
+  test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)/t2s_2(2,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(1,2,2,2)");
+  test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)/t2s_2(0,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,0,0,0)");
+  test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)/t2s_2(0,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,0,0,1)");
+  test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)/t2s_2(0,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,0,0,2)");
+  test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)/t2s_2(1,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,0,1,0)");
+  test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)/t2s_2(1,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,0,1,1)");
+  test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)/t2s_2(1,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,0,1,2)");
+  test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)/t2s_2(2,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,0,2,0)");
+  test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)/t2s_2(2,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,0,2,1)");
+  test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)/t2s_2(2,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,0,2,2)");
+  test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)/t2s_2(0,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,1,0,0)");
+  test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)/t2s_2(0,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,1,0,1)");
+  test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)/t2s_2(0,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,1,0,2)");
+  test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)/t2s_2(1,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,1,1,0)");
+  test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)/t2s_2(1,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,1,1,1)");
+  test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)/t2s_2(1,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,1,1,2)");
+  test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)/t2s_2(2,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,1,2,0)");
+  test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)/t2s_2(2,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,1,2,1)");
+  test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)/t2s_2(2,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,1,2,2)");
+  test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)/t2s_2(0,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,2,0,0)");
+  test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)/t2s_2(0,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,2,0,1)");
+  test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)/t2s_2(0,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,2,0,2)");
+  test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)/t2s_2(1,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,2,1,0)");
+  test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)/t2s_2(1,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,2,1,1)");
+  test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)/t2s_2(1,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,2,1,2)");
+  test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)/t2s_2(2,0))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,2,2,0)");
+  test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)/t2s_2(2,1))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)/t2s_2(2,2))
+		,"T2s(k,l)%T4ddg(i,j,k,l)(2,2,2,2)");
+
+  /* I originally put these declarations for unknown reasons, but they
+     won't work because the result is not a Tensor4_ddg.  The
+     multiplication messes up the symmetries. */
+
+
+//    t4ddg_1(i,j,k,l)=(t4ddg_2(i,j,k,l)&t2s_3(j,l));
+//    test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)*t2s_3(0,0))
+//        test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)*t2s_3(0,1))
+//        test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)*t2s_3(0,2))
+//        test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)*t2s_3(0,0))
+//        test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)*t2s_3(0,1))
+//        test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)*t2s_3(0,2))
+//        test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)*t2s_3(0,0))
+//        test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)*t2s_3(0,1))
+//        test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)*t2s_3(0,2))
+//        test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)*t2s_3(1,0))
+//        test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)*t2s_3(1,1))
+//        test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)*t2s_3(1,2))
+//        test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)*t2s_3(1,0))
+//        test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)*t2s_3(1,1))
+//        test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)*t2s_3(1,2))
+//        test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)*t2s_3(1,0))
+//        test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)*t2s_3(1,1))
+//        test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)*t2s_3(1,2))
+//        test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)*t2s_3(2,0))
+//        test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)*t2s_3(2,1))
+//        test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)*t2s_3(2,2))
+//        test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)*t2s_3(2,0))
+//        test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)*t2s_3(2,1))
+//        test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)*t2s_3(2,2))
+//        test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)*t2s_3(2,0))
+//        test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)*t2s_3(2,1))
+//        test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)*t2s_3(2,2))
+//        test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)*t2s_3(0,0))
+//        test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)*t2s_3(0,1))
+//        test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)*t2s_3(0,2))
+//        test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)*t2s_3(0,0))
+//        test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)*t2s_3(0,1))
+//        test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)*t2s_3(0,2))
+//        test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)*t2s_3(0,0))
+//        test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)*t2s_3(0,1))
+//        test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)*t2s_3(0,2))
+//        test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)*t2s_3(1,0))
+//        test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)*t2s_3(1,1))
+//        test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)*t2s_3(1,2))
+//        test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)*t2s_3(1,0))
+//        test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)*t2s_3(1,1))
+//        test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)*t2s_3(1,2))
+//        test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)*t2s_3(1,0))
+//        test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)*t2s_3(1,1))
+//        test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)*t2s_3(1,2))
+//        test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)*t2s_3(2,0))
+//        test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)*t2s_3(2,1))
+//        test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)*t2s_3(2,2))
+//        test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)*t2s_3(2,0))
+//        test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)*t2s_3(2,1))
+//        test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)*t2s_3(2,2))
+//        test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)*t2s_3(2,0))
+//        test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)*t2s_3(2,1))
+//        test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)*t2s_3(2,2))
+//        test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)*t2s_3(0,0))
+//        test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)*t2s_3(0,1))
+//        test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)*t2s_3(0,2))
+//        test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)*t2s_3(0,0))
+//        test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)*t2s_3(0,1))
+//        test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)*t2s_3(0,2))
+//        test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)*t2s_3(0,0))
+//        test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)*t2s_3(0,1))
+//        test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)*t2s_3(0,2))
+//        test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)*t2s_3(1,0))
+//        test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)*t2s_3(1,1))
+//        test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)*t2s_3(1,2))
+//        test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)*t2s_3(1,0))
+//        test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)*t2s_3(1,1))
+//        test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)*t2s_3(1,2))
+//        test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)*t2s_3(1,0))
+//        test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)*t2s_3(1,1))
+//        test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)*t2s_3(1,2))
+//        test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)*t2s_3(2,0))
+//        test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)*t2s_3(2,1))
+//        test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)*t2s_3(2,2))
+//        test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)*t2s_3(2,0))
+//        test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)*t2s_3(2,1))
+//        test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)*t2s_3(2,2))
+//        test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)*t2s_3(2,0))
+//        test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)*t2s_3(2,1))
+//        test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)*t2s_3(2,2)));
+
+
+//    t4ddg_1(i,j,k,l)=(t2s_2(j,l)&t4ddg_2(i,j,k,l));
+//    test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)*t2s_2(0,0))
+//        test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)*t2s_2(0,1))
+//        test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)*t2s_2(0,2))
+//        test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)*t2s_2(0,0))
+//        test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)*t2s_2(0,1))
+//        test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)*t2s_2(0,2))
+//        test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)*t2s_2(0,0))
+//        test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)*t2s_2(0,1))
+//        test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)*t2s_2(0,2))
+//        test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)*t2s_2(1,0))
+//        test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)*t2s_2(1,1))
+//        test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)*t2s_2(1,2))
+//        test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)*t2s_2(1,0))
+//        test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)*t2s_2(1,1))
+//        test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)*t2s_2(1,2))
+//        test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)*t2s_2(1,0))
+//        test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)*t2s_2(1,1))
+//        test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)*t2s_2(1,2))
+//        test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)*t2s_2(2,0))
+//        test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)*t2s_2(2,1))
+//        test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)*t2s_2(2,2))
+//        test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)*t2s_2(2,0))
+//        test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)*t2s_2(2,1))
+//        test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)*t2s_2(2,2))
+//        test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)*t2s_2(2,0))
+//        test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)*t2s_2(2,1))
+//        test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)*t2s_2(2,2))
+//        test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)*t2s_2(0,0))
+//        test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)*t2s_2(0,1))
+//        test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)*t2s_2(0,2))
+//        test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)*t2s_2(0,0))
+//        test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)*t2s_2(0,1))
+//        test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)*t2s_2(0,2))
+//        test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)*t2s_2(0,0))
+//        test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)*t2s_2(0,1))
+//        test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)*t2s_2(0,2))
+//        test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)*t2s_2(1,0))
+//        test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)*t2s_2(1,1))
+//        test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)*t2s_2(1,2))
+//        test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)*t2s_2(1,0))
+//        test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)*t2s_2(1,1))
+//        test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)*t2s_2(1,2))
+//        test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)*t2s_2(1,0))
+//        test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)*t2s_2(1,1))
+//        test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)*t2s_2(1,2))
+//        test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)*t2s_2(2,0))
+//        test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)*t2s_2(2,1))
+//        test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)*t2s_2(2,2))
+//        test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)*t2s_2(2,0))
+//        test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)*t2s_2(2,1))
+//        test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)*t2s_2(2,2))
+//        test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)*t2s_2(2,0))
+//        test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)*t2s_2(2,1))
+//        test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)*t2s_2(2,2))
+//        test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)*t2s_2(0,0))
+//        test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)*t2s_2(0,1))
+//        test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)*t2s_2(0,2))
+//        test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)*t2s_2(0,0))
+//        test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)*t2s_2(0,1))
+//        test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)*t2s_2(0,2))
+//        test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)*t2s_2(0,0))
+//        test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)*t2s_2(0,1))
+//        test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)*t2s_2(0,2))
+//        test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)*t2s_2(1,0))
+//        test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)*t2s_2(1,1))
+//        test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)*t2s_2(1,2))
+//        test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)*t2s_2(1,0))
+//        test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)*t2s_2(1,1))
+//        test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)*t2s_2(1,2))
+//        test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)*t2s_2(1,0))
+//        test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)*t2s_2(1,1))
+//        test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)*t2s_2(1,2))
+//        test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)*t2s_2(2,0))
+//        test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)*t2s_2(2,1))
+//        test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)*t2s_2(2,2))
+//        test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)*t2s_2(2,0))
+//        test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)*t2s_2(2,1))
+//        test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)*t2s_2(2,2))
+//        test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)*t2s_2(2,0))
+//        test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)*t2s_2(2,1))
+//        test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)*t2s_2(2,2)));
+//    cout << endl;
+
+
+//    t4ddg_1(i,j,k,l)=(t4ddg_2(i,j,k,l)&t2s_3(l,j));
+//    test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)*t2s_3(0,0))
+//        test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)*t2s_3(0,1))
+//        test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)*t2s_3(0,2))
+//        test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)*t2s_3(0,0))
+//        test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)*t2s_3(0,1))
+//        test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)*t2s_3(0,2))
+//        test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)*t2s_3(0,0))
+//        test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)*t2s_3(0,1))
+//        test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)*t2s_3(0,2))
+//        test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)*t2s_3(1,0))
+//        test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)*t2s_3(1,1))
+//        test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)*t2s_3(1,2))
+//        test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)*t2s_3(1,0))
+//        test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)*t2s_3(1,1))
+//        test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)*t2s_3(1,2))
+//        test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)*t2s_3(1,0))
+//        test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)*t2s_3(1,1))
+//        test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)*t2s_3(1,2))
+//        test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)*t2s_3(2,0))
+//        test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)*t2s_3(2,1))
+//        test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)*t2s_3(2,2))
+//        test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)*t2s_3(2,0))
+//        test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)*t2s_3(2,1))
+//        test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)*t2s_3(2,2))
+//        test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)*t2s_3(2,0))
+//        test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)*t2s_3(2,1))
+//        test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)*t2s_3(2,2))
+//        test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)*t2s_3(0,0))
+//        test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)*t2s_3(0,1))
+//        test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)*t2s_3(0,2))
+//        test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)*t2s_3(0,0))
+//        test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)*t2s_3(0,1))
+//        test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)*t2s_3(0,2))
+//        test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)*t2s_3(0,0))
+//        test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)*t2s_3(0,1))
+//        test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)*t2s_3(0,2))
+//        test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)*t2s_3(1,0))
+//        test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)*t2s_3(1,1))
+//        test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)*t2s_3(1,2))
+//        test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)*t2s_3(1,0))
+//        test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)*t2s_3(1,1))
+//        test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)*t2s_3(1,2))
+//        test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)*t2s_3(1,0))
+//        test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)*t2s_3(1,1))
+//        test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)*t2s_3(1,2))
+//        test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)*t2s_3(2,0))
+//        test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)*t2s_3(2,1))
+//        test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)*t2s_3(2,2))
+//        test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)*t2s_3(2,0))
+//        test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)*t2s_3(2,1))
+//        test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)*t2s_3(2,2))
+//        test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)*t2s_3(2,0))
+//        test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)*t2s_3(2,1))
+//        test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)*t2s_3(2,2))
+//        test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)*t2s_3(0,0))
+//        test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)*t2s_3(0,1))
+//        test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)*t2s_3(0,2))
+//        test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)*t2s_3(0,0))
+//        test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)*t2s_3(0,1))
+//        test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)*t2s_3(0,2))
+//        test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)*t2s_3(0,0))
+//        test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)*t2s_3(0,1))
+//        test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)*t2s_3(0,2))
+//        test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)*t2s_3(1,0))
+//        test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)*t2s_3(1,1))
+//        test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)*t2s_3(1,2))
+//        test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)*t2s_3(1,0))
+//        test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)*t2s_3(1,1))
+//        test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)*t2s_3(1,2))
+//        test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)*t2s_3(1,0))
+//        test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)*t2s_3(1,1))
+//        test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)*t2s_3(1,2))
+//        test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)*t2s_3(2,0))
+//        test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)*t2s_3(2,1))
+//        test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)*t2s_3(2,2))
+//        test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)*t2s_3(2,0))
+//        test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)*t2s_3(2,1))
+//        test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)*t2s_3(2,2))
+//        test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)*t2s_3(2,0))
+//        test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)*t2s_3(2,1))
+//        test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)*t2s_3(2,2)));
+//    cout << endl;
+
+
+//    t4ddg_1(i,j,k,l)=(t2s_2(l,j)&t4ddg_2(i,j,k,l));
+//    test_for_zero(t4ddg_1(0,0,0,0) - (t4ddg_2(0,0,0,0)*t2s_2(0,0))
+//        test_for_zero(t4ddg_1(0,0,0,1) - (t4ddg_2(0,0,0,1)*t2s_2(0,1))
+//        test_for_zero(t4ddg_1(0,0,0,2) - (t4ddg_2(0,0,0,2)*t2s_2(0,2))
+//        test_for_zero(t4ddg_1(0,0,1,0) - (t4ddg_2(0,0,1,0)*t2s_2(0,0))
+//        test_for_zero(t4ddg_1(0,0,1,1) - (t4ddg_2(0,0,1,1)*t2s_2(0,1))
+//        test_for_zero(t4ddg_1(0,0,1,2) - (t4ddg_2(0,0,1,2)*t2s_2(0,2))
+//        test_for_zero(t4ddg_1(0,0,2,0) - (t4ddg_2(0,0,2,0)*t2s_2(0,0))
+//        test_for_zero(t4ddg_1(0,0,2,1) - (t4ddg_2(0,0,2,1)*t2s_2(0,1))
+//        test_for_zero(t4ddg_1(0,0,2,2) - (t4ddg_2(0,0,2,2)*t2s_2(0,2))
+//        test_for_zero(t4ddg_1(0,1,0,0) - (t4ddg_2(0,1,0,0)*t2s_2(1,0))
+//        test_for_zero(t4ddg_1(0,1,0,1) - (t4ddg_2(0,1,0,1)*t2s_2(1,1))
+//        test_for_zero(t4ddg_1(0,1,0,2) - (t4ddg_2(0,1,0,2)*t2s_2(1,2))
+//        test_for_zero(t4ddg_1(0,1,1,0) - (t4ddg_2(0,1,1,0)*t2s_2(1,0))
+//        test_for_zero(t4ddg_1(0,1,1,1) - (t4ddg_2(0,1,1,1)*t2s_2(1,1))
+//        test_for_zero(t4ddg_1(0,1,1,2) - (t4ddg_2(0,1,1,2)*t2s_2(1,2))
+//        test_for_zero(t4ddg_1(0,1,2,0) - (t4ddg_2(0,1,2,0)*t2s_2(1,0))
+//        test_for_zero(t4ddg_1(0,1,2,1) - (t4ddg_2(0,1,2,1)*t2s_2(1,1))
+//        test_for_zero(t4ddg_1(0,1,2,2) - (t4ddg_2(0,1,2,2)*t2s_2(1,2))
+//        test_for_zero(t4ddg_1(0,2,0,0) - (t4ddg_2(0,2,0,0)*t2s_2(2,0))
+//        test_for_zero(t4ddg_1(0,2,0,1) - (t4ddg_2(0,2,0,1)*t2s_2(2,1))
+//        test_for_zero(t4ddg_1(0,2,0,2) - (t4ddg_2(0,2,0,2)*t2s_2(2,2))
+//        test_for_zero(t4ddg_1(0,2,1,0) - (t4ddg_2(0,2,1,0)*t2s_2(2,0))
+//        test_for_zero(t4ddg_1(0,2,1,1) - (t4ddg_2(0,2,1,1)*t2s_2(2,1))
+//        test_for_zero(t4ddg_1(0,2,1,2) - (t4ddg_2(0,2,1,2)*t2s_2(2,2))
+//        test_for_zero(t4ddg_1(0,2,2,0) - (t4ddg_2(0,2,2,0)*t2s_2(2,0))
+//        test_for_zero(t4ddg_1(0,2,2,1) - (t4ddg_2(0,2,2,1)*t2s_2(2,1))
+//        test_for_zero(t4ddg_1(0,2,2,2) - (t4ddg_2(0,2,2,2)*t2s_2(2,2))
+//        test_for_zero(t4ddg_1(1,0,0,0) - (t4ddg_2(1,0,0,0)*t2s_2(0,0))
+//        test_for_zero(t4ddg_1(1,0,0,1) - (t4ddg_2(1,0,0,1)*t2s_2(0,1))
+//        test_for_zero(t4ddg_1(1,0,0,2) - (t4ddg_2(1,0,0,2)*t2s_2(0,2))
+//        test_for_zero(t4ddg_1(1,0,1,0) - (t4ddg_2(1,0,1,0)*t2s_2(0,0))
+//        test_for_zero(t4ddg_1(1,0,1,1) - (t4ddg_2(1,0,1,1)*t2s_2(0,1))
+//        test_for_zero(t4ddg_1(1,0,1,2) - (t4ddg_2(1,0,1,2)*t2s_2(0,2))
+//        test_for_zero(t4ddg_1(1,0,2,0) - (t4ddg_2(1,0,2,0)*t2s_2(0,0))
+//        test_for_zero(t4ddg_1(1,0,2,1) - (t4ddg_2(1,0,2,1)*t2s_2(0,1))
+//        test_for_zero(t4ddg_1(1,0,2,2) - (t4ddg_2(1,0,2,2)*t2s_2(0,2))
+//        test_for_zero(t4ddg_1(1,1,0,0) - (t4ddg_2(1,1,0,0)*t2s_2(1,0))
+//        test_for_zero(t4ddg_1(1,1,0,1) - (t4ddg_2(1,1,0,1)*t2s_2(1,1))
+//        test_for_zero(t4ddg_1(1,1,0,2) - (t4ddg_2(1,1,0,2)*t2s_2(1,2))
+//        test_for_zero(t4ddg_1(1,1,1,0) - (t4ddg_2(1,1,1,0)*t2s_2(1,0))
+//        test_for_zero(t4ddg_1(1,1,1,1) - (t4ddg_2(1,1,1,1)*t2s_2(1,1))
+//        test_for_zero(t4ddg_1(1,1,1,2) - (t4ddg_2(1,1,1,2)*t2s_2(1,2))
+//        test_for_zero(t4ddg_1(1,1,2,0) - (t4ddg_2(1,1,2,0)*t2s_2(1,0))
+//        test_for_zero(t4ddg_1(1,1,2,1) - (t4ddg_2(1,1,2,1)*t2s_2(1,1))
+//        test_for_zero(t4ddg_1(1,1,2,2) - (t4ddg_2(1,1,2,2)*t2s_2(1,2))
+//        test_for_zero(t4ddg_1(1,2,0,0) - (t4ddg_2(1,2,0,0)*t2s_2(2,0))
+//        test_for_zero(t4ddg_1(1,2,0,1) - (t4ddg_2(1,2,0,1)*t2s_2(2,1))
+//        test_for_zero(t4ddg_1(1,2,0,2) - (t4ddg_2(1,2,0,2)*t2s_2(2,2))
+//        test_for_zero(t4ddg_1(1,2,1,0) - (t4ddg_2(1,2,1,0)*t2s_2(2,0))
+//        test_for_zero(t4ddg_1(1,2,1,1) - (t4ddg_2(1,2,1,1)*t2s_2(2,1))
+//        test_for_zero(t4ddg_1(1,2,1,2) - (t4ddg_2(1,2,1,2)*t2s_2(2,2))
+//        test_for_zero(t4ddg_1(1,2,2,0) - (t4ddg_2(1,2,2,0)*t2s_2(2,0))
+//        test_for_zero(t4ddg_1(1,2,2,1) - (t4ddg_2(1,2,2,1)*t2s_2(2,1))
+//        test_for_zero(t4ddg_1(1,2,2,2) - (t4ddg_2(1,2,2,2)*t2s_2(2,2))
+//        test_for_zero(t4ddg_1(2,0,0,0) - (t4ddg_2(2,0,0,0)*t2s_2(0,0))
+//        test_for_zero(t4ddg_1(2,0,0,1) - (t4ddg_2(2,0,0,1)*t2s_2(0,1))
+//        test_for_zero(t4ddg_1(2,0,0,2) - (t4ddg_2(2,0,0,2)*t2s_2(0,2))
+//        test_for_zero(t4ddg_1(2,0,1,0) - (t4ddg_2(2,0,1,0)*t2s_2(0,0))
+//        test_for_zero(t4ddg_1(2,0,1,1) - (t4ddg_2(2,0,1,1)*t2s_2(0,1))
+//        test_for_zero(t4ddg_1(2,0,1,2) - (t4ddg_2(2,0,1,2)*t2s_2(0,2))
+//        test_for_zero(t4ddg_1(2,0,2,0) - (t4ddg_2(2,0,2,0)*t2s_2(0,0))
+//        test_for_zero(t4ddg_1(2,0,2,1) - (t4ddg_2(2,0,2,1)*t2s_2(0,1))
+//        test_for_zero(t4ddg_1(2,0,2,2) - (t4ddg_2(2,0,2,2)*t2s_2(0,2))
+//        test_for_zero(t4ddg_1(2,1,0,0) - (t4ddg_2(2,1,0,0)*t2s_2(1,0))
+//        test_for_zero(t4ddg_1(2,1,0,1) - (t4ddg_2(2,1,0,1)*t2s_2(1,1))
+//        test_for_zero(t4ddg_1(2,1,0,2) - (t4ddg_2(2,1,0,2)*t2s_2(1,2))
+//        test_for_zero(t4ddg_1(2,1,1,0) - (t4ddg_2(2,1,1,0)*t2s_2(1,0))
+//        test_for_zero(t4ddg_1(2,1,1,1) - (t4ddg_2(2,1,1,1)*t2s_2(1,1))
+//        test_for_zero(t4ddg_1(2,1,1,2) - (t4ddg_2(2,1,1,2)*t2s_2(1,2))
+//        test_for_zero(t4ddg_1(2,1,2,0) - (t4ddg_2(2,1,2,0)*t2s_2(1,0))
+//        test_for_zero(t4ddg_1(2,1,2,1) - (t4ddg_2(2,1,2,1)*t2s_2(1,1))
+//        test_for_zero(t4ddg_1(2,1,2,2) - (t4ddg_2(2,1,2,2)*t2s_2(1,2))
+//        test_for_zero(t4ddg_1(2,2,0,0) - (t4ddg_2(2,2,0,0)*t2s_2(2,0))
+//        test_for_zero(t4ddg_1(2,2,0,1) - (t4ddg_2(2,2,0,1)*t2s_2(2,1))
+//        test_for_zero(t4ddg_1(2,2,0,2) - (t4ddg_2(2,2,0,2)*t2s_2(2,2))
+//        test_for_zero(t4ddg_1(2,2,1,0) - (t4ddg_2(2,2,1,0)*t2s_2(2,0))
+//        test_for_zero(t4ddg_1(2,2,1,1) - (t4ddg_2(2,2,1,1)*t2s_2(2,1))
+//        test_for_zero(t4ddg_1(2,2,1,2) - (t4ddg_2(2,2,1,2)*t2s_2(2,2))
+//        test_for_zero(t4ddg_1(2,2,2,0) - (t4ddg_2(2,2,2,0)*t2s_2(2,0))
+//        test_for_zero(t4ddg_1(2,2,2,1) - (t4ddg_2(2,2,2,1)*t2s_2(2,1))
+//        test_for_zero(t4ddg_1(2,2,2,2) - (t4ddg_2(2,2,2,2)*t2s_2(2,2)));
+
+  cout << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T4ddg/test_T4ddgIV.C
--- a/tests/conformance/T4ddg/test_T4ddgIV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,698 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T4ddgIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-		Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-		Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-		const Tensor2<double,3,3> &t2_3,
-		Tensor2_symmetric<double,3> &t2s_1,
-		const Tensor2_symmetric<double,3> &t2s_2,
-		const Tensor2_symmetric<double,3> &t2s_3,
-		Tensor3_dg<double,3,3> &t3dg_1,
-		const Tensor3_dg<double,3,3> &t3dg_2,
-		const Tensor3_dg<double,3,3> &t3dg_3,
-		Tensor3_christof<double,3,3> &t3ch_1,
-		const Tensor3_christof<double,3,3> &t3ch_2,
-		const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  Tensor4_ddg<double,3,3> t4ddg_1, t4ddg_2, t4ddg_3;
-
-  t4ddg_2(i,j,l,m)=t2s_2(i,j)*t2s_2(l,m);
-  t2s_1(i,k)=(t4ddg_2(i,j,k,l) ^ t2s_2(j,l));
-  test_for_zero(t2s_1(0,0) - (t4ddg_2(0,0,0,0)*t2s_2(0,0)
-			      + t4ddg_2(0,0,0,1)*t2s_2(0,1)
-			      + t4ddg_2(0,0,0,2)*t2s_2(0,2)
-			      + t4ddg_2(0,1,0,0)*t2s_2(1,0)
-			      + t4ddg_2(0,1,0,1)*t2s_2(1,1)
-			      + t4ddg_2(0,1,0,2)*t2s_2(1,2)
-			      + t4ddg_2(0,2,0,0)*t2s_2(2,0)
-			      + t4ddg_2(0,2,0,1)*t2s_2(2,1)
-			      + t4ddg_2(0,2,0,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)^T2s(j,l)(0,0)");
-  test_for_zero(t2s_1(0,1) - (t4ddg_2(0,0,1,0)*t2s_2(0,0)
-			      + t4ddg_2(0,0,1,1)*t2s_2(0,1)
-			      + t4ddg_2(0,0,1,2)*t2s_2(0,2)
-			      + t4ddg_2(0,1,1,0)*t2s_2(1,0)
-			      + t4ddg_2(0,1,1,1)*t2s_2(1,1)
-			      + t4ddg_2(0,1,1,2)*t2s_2(1,2)
-			      + t4ddg_2(0,2,1,0)*t2s_2(2,0)
-			      + t4ddg_2(0,2,1,1)*t2s_2(2,1)
-			      + t4ddg_2(0,2,1,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)^T2s(j,l)(0,1)");
-  test_for_zero(t2s_1(0,2) - (t4ddg_2(0,0,2,0)*t2s_2(0,0)
-			      + t4ddg_2(0,0,2,1)*t2s_2(0,1)
-			      + t4ddg_2(0,0,2,2)*t2s_2(0,2)
-			      + t4ddg_2(0,1,2,0)*t2s_2(1,0)
-			      + t4ddg_2(0,1,2,1)*t2s_2(1,1)
-			      + t4ddg_2(0,1,2,2)*t2s_2(1,2)
-			      + t4ddg_2(0,2,2,0)*t2s_2(2,0)
-			      + t4ddg_2(0,2,2,1)*t2s_2(2,1)
-			      + t4ddg_2(0,2,2,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)^T2s(j,l)(0,2)");
-  test_for_zero(t2s_1(1,0) - (t4ddg_2(1,0,0,0)*t2s_2(0,0)
-			      + t4ddg_2(1,0,0,1)*t2s_2(0,1)
-			      + t4ddg_2(1,0,0,2)*t2s_2(0,2)
-			      + t4ddg_2(1,1,0,0)*t2s_2(1,0)
-			      + t4ddg_2(1,1,0,1)*t2s_2(1,1)
-			      + t4ddg_2(1,1,0,2)*t2s_2(1,2)
-			      + t4ddg_2(1,2,0,0)*t2s_2(2,0)
-			      + t4ddg_2(1,2,0,1)*t2s_2(2,1)
-			      + t4ddg_2(1,2,0,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)^T2s(j,l)(1,0)");
-  test_for_zero(t2s_1(1,1) - (t4ddg_2(1,0,1,0)*t2s_2(0,0)
-			      + t4ddg_2(1,0,1,1)*t2s_2(0,1)
-			      + t4ddg_2(1,0,1,2)*t2s_2(0,2)
-			      + t4ddg_2(1,1,1,0)*t2s_2(1,0)
-			      + t4ddg_2(1,1,1,1)*t2s_2(1,1)
-			      + t4ddg_2(1,1,1,2)*t2s_2(1,2)
-			      + t4ddg_2(1,2,1,0)*t2s_2(2,0)
-			      + t4ddg_2(1,2,1,1)*t2s_2(2,1)
-			      + t4ddg_2(1,2,1,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)^T2s(j,l)(1,1)");
-  test_for_zero(t2s_1(1,2) - (t4ddg_2(1,0,2,0)*t2s_2(0,0)
-			      + t4ddg_2(1,0,2,1)*t2s_2(0,1)
-			      + t4ddg_2(1,0,2,2)*t2s_2(0,2)
-			      + t4ddg_2(1,1,2,0)*t2s_2(1,0)
-			      + t4ddg_2(1,1,2,1)*t2s_2(1,1)
-			      + t4ddg_2(1,1,2,2)*t2s_2(1,2)
-			      + t4ddg_2(1,2,2,0)*t2s_2(2,0)
-			      + t4ddg_2(1,2,2,1)*t2s_2(2,1)
-			      + t4ddg_2(1,2,2,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)^T2s(j,l)(1,2)");
-  test_for_zero(t2s_1(2,0) - (t4ddg_2(2,0,0,0)*t2s_2(0,0)
-			      + t4ddg_2(2,0,0,1)*t2s_2(0,1)
-			      + t4ddg_2(2,0,0,2)*t2s_2(0,2)
-			      + t4ddg_2(2,1,0,0)*t2s_2(1,0)
-			      + t4ddg_2(2,1,0,1)*t2s_2(1,1)
-			      + t4ddg_2(2,1,0,2)*t2s_2(1,2)
-			      + t4ddg_2(2,2,0,0)*t2s_2(2,0)
-			      + t4ddg_2(2,2,0,1)*t2s_2(2,1)
-			      + t4ddg_2(2,2,0,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)^T2s(j,l)(2,0)");
-  test_for_zero(t2s_1(2,1) - (t4ddg_2(2,0,1,0)*t2s_2(0,0)
-			      + t4ddg_2(2,0,1,1)*t2s_2(0,1)
-			      + t4ddg_2(2,0,1,2)*t2s_2(0,2)
-			      + t4ddg_2(2,1,1,0)*t2s_2(1,0)
-			      + t4ddg_2(2,1,1,1)*t2s_2(1,1)
-			      + t4ddg_2(2,1,1,2)*t2s_2(1,2)
-			      + t4ddg_2(2,2,1,0)*t2s_2(2,0)
-			      + t4ddg_2(2,2,1,1)*t2s_2(2,1)
-			      + t4ddg_2(2,2,1,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)^T2s(j,l)(2,1)");
-  test_for_zero(t2s_1(2,2) - (t4ddg_2(2,0,2,0)*t2s_2(0,0)
-			      + t4ddg_2(2,0,2,1)*t2s_2(0,1)
-			      + t4ddg_2(2,0,2,2)*t2s_2(0,2)
-			      + t4ddg_2(2,1,2,0)*t2s_2(1,0)
-			      + t4ddg_2(2,1,2,1)*t2s_2(1,1)
-			      + t4ddg_2(2,1,2,2)*t2s_2(1,2)
-			      + t4ddg_2(2,2,2,0)*t2s_2(2,0)
-			      + t4ddg_2(2,2,2,1)*t2s_2(2,1)
-			      + t4ddg_2(2,2,2,2)*t2s_2(2,2))
-		,"T4ddg(i,j,k,l)^T2s(j,l)(2,2)");
-
-  t2s_1(i,k)=(t2s_3(j,l) ^ t4ddg_2(i,j,k,l));
-  test_for_zero(t2s_1(0,0) - (t4ddg_2(0,0,0,0)*t2s_3(0,0)
-			      + t4ddg_2(0,0,0,1)*t2s_3(0,1)
-			      + t4ddg_2(0,0,0,2)*t2s_3(0,2)
-			      + t4ddg_2(0,1,0,0)*t2s_3(1,0)
-			      + t4ddg_2(0,1,0,1)*t2s_3(1,1)
-			      + t4ddg_2(0,1,0,2)*t2s_3(1,2)
-			      + t4ddg_2(0,2,0,0)*t2s_3(2,0)
-			      + t4ddg_2(0,2,0,1)*t2s_3(2,1)
-			      + t4ddg_2(0,2,0,2)*t2s_3(2,2))
-		,"T2s(j,l)^T4ddg(i,j,k,l)(0,0)");
-  test_for_zero(t2s_1(0,1) - (t4ddg_2(0,0,1,0)*t2s_3(0,0)
-			      + t4ddg_2(0,0,1,1)*t2s_3(0,1)
-			      + t4ddg_2(0,0,1,2)*t2s_3(0,2)
-			      + t4ddg_2(0,1,1,0)*t2s_3(1,0)
-			      + t4ddg_2(0,1,1,1)*t2s_3(1,1)
-			      + t4ddg_2(0,1,1,2)*t2s_3(1,2)
-			      + t4ddg_2(0,2,1,0)*t2s_3(2,0)
-			      + t4ddg_2(0,2,1,1)*t2s_3(2,1)
-			      + t4ddg_2(0,2,1,2)*t2s_3(2,2))
-		,"T2s(j,l)^T4ddg(i,j,k,l)(0,1)");
-  test_for_zero(t2s_1(0,2) - (t4ddg_2(0,0,2,0)*t2s_3(0,0)
-			      + t4ddg_2(0,0,2,1)*t2s_3(0,1)
-			      + t4ddg_2(0,0,2,2)*t2s_3(0,2)
-			      + t4ddg_2(0,1,2,0)*t2s_3(1,0)
-			      + t4ddg_2(0,1,2,1)*t2s_3(1,1)
-			      + t4ddg_2(0,1,2,2)*t2s_3(1,2)
-			      + t4ddg_2(0,2,2,0)*t2s_3(2,0)
-			      + t4ddg_2(0,2,2,1)*t2s_3(2,1)
-			      + t4ddg_2(0,2,2,2)*t2s_3(2,2))
-		,"T2s(j,l)^T4ddg(i,j,k,l)(0,2)");
-  test_for_zero(t2s_1(1,0) - (t4ddg_2(1,0,0,0)*t2s_3(0,0)
-			      + t4ddg_2(1,0,0,1)*t2s_3(0,1)
-			      + t4ddg_2(1,0,0,2)*t2s_3(0,2)
-			      + t4ddg_2(1,1,0,0)*t2s_3(1,0)
-			      + t4ddg_2(1,1,0,1)*t2s_3(1,1)
-			      + t4ddg_2(1,1,0,2)*t2s_3(1,2)
-			      + t4ddg_2(1,2,0,0)*t2s_3(2,0)
-			      + t4ddg_2(1,2,0,1)*t2s_3(2,1)
-			      + t4ddg_2(1,2,0,2)*t2s_3(2,2))
-		,"T2s(j,l)^T4ddg(i,j,k,l)(1,0)");
-  test_for_zero(t2s_1(1,1) - (t4ddg_2(1,0,1,0)*t2s_3(0,0)
-			      + t4ddg_2(1,0,1,1)*t2s_3(0,1)
-			      + t4ddg_2(1,0,1,2)*t2s_3(0,2)
-			      + t4ddg_2(1,1,1,0)*t2s_3(1,0)
-			      + t4ddg_2(1,1,1,1)*t2s_3(1,1)
-			      + t4ddg_2(1,1,1,2)*t2s_3(1,2)
-			      + t4ddg_2(1,2,1,0)*t2s_3(2,0)
-			      + t4ddg_2(1,2,1,1)*t2s_3(2,1)
-			      + t4ddg_2(1,2,1,2)*t2s_3(2,2))
-		,"T2s(j,l)^T4ddg(i,j,k,l)(1,1)");
-  test_for_zero(t2s_1(1,2) - (t4ddg_2(1,0,2,0)*t2s_3(0,0)
-			      + t4ddg_2(1,0,2,1)*t2s_3(0,1)
-			      + t4ddg_2(1,0,2,2)*t2s_3(0,2)
-			      + t4ddg_2(1,1,2,0)*t2s_3(1,0)
-			      + t4ddg_2(1,1,2,1)*t2s_3(1,1)
-			      + t4ddg_2(1,1,2,2)*t2s_3(1,2)
-			      + t4ddg_2(1,2,2,0)*t2s_3(2,0)
-			      + t4ddg_2(1,2,2,1)*t2s_3(2,1)
-			      + t4ddg_2(1,2,2,2)*t2s_3(2,2))
-		,"T2s(j,l)^T4ddg(i,j,k,l)(1,2)");
-  test_for_zero(t2s_1(2,0) - (t4ddg_2(2,0,0,0)*t2s_3(0,0)
-			      + t4ddg_2(2,0,0,1)*t2s_3(0,1)
-			      + t4ddg_2(2,0,0,2)*t2s_3(0,2)
-			      + t4ddg_2(2,1,0,0)*t2s_3(1,0)
-			      + t4ddg_2(2,1,0,1)*t2s_3(1,1)
-			      + t4ddg_2(2,1,0,2)*t2s_3(1,2)
-			      + t4ddg_2(2,2,0,0)*t2s_3(2,0)
-			      + t4ddg_2(2,2,0,1)*t2s_3(2,1)
-			      + t4ddg_2(2,2,0,2)*t2s_3(2,2))
-		,"T2s(j,l)^T4ddg(i,j,k,l)(2,0)");
-  test_for_zero(t2s_1(2,1) - (t4ddg_2(2,0,1,0)*t2s_3(0,0)
-			      + t4ddg_2(2,0,1,1)*t2s_3(0,1)
-			      + t4ddg_2(2,0,1,2)*t2s_3(0,2)
-			      + t4ddg_2(2,1,1,0)*t2s_3(1,0)
-			      + t4ddg_2(2,1,1,1)*t2s_3(1,1)
-			      + t4ddg_2(2,1,1,2)*t2s_3(1,2)
-			      + t4ddg_2(2,2,1,0)*t2s_3(2,0)
-			      + t4ddg_2(2,2,1,1)*t2s_3(2,1)
-			      + t4ddg_2(2,2,1,2)*t2s_3(2,2))
-		,"T2s(j,l)^T4ddg(i,j,k,l)(2,1)");
-  test_for_zero(t2s_1(2,2) - (t4ddg_2(2,0,2,0)*t2s_3(0,0)
-			      + t4ddg_2(2,0,2,1)*t2s_3(0,1)
-			      + t4ddg_2(2,0,2,2)*t2s_3(0,2)
-			      + t4ddg_2(2,1,2,0)*t2s_3(1,0)
-			      + t4ddg_2(2,1,2,1)*t2s_3(1,1)
-			      + t4ddg_2(2,1,2,2)*t2s_3(1,2)
-			      + t4ddg_2(2,2,2,0)*t2s_3(2,0)
-			      + t4ddg_2(2,2,2,1)*t2s_3(2,1)
-			      + t4ddg_2(2,2,2,2)*t2s_3(2,2))
-		,"T2s(j,l)^T4ddg(i,j,k,l)(2,2)");
-
-  t2s_1(i,k)=t4ddg_2(i,k,j,l)*t2_2(j,l);
-  test_for_zero(t2s_1(0,0) - (t4ddg_2(0,0,0,0)*t2_2(0,0)
-			      + t4ddg_2(0,0,0,1)*t2_2(0,1)
-			      + t4ddg_2(0,0,0,2)*t2_2(0,2)
-			      + t4ddg_2(0,0,1,0)*t2_2(1,0)
-			      + t4ddg_2(0,0,1,1)*t2_2(1,1)
-			      + t4ddg_2(0,0,1,2)*t2_2(1,2)
-			      + t4ddg_2(0,0,2,0)*t2_2(2,0)
-			      + t4ddg_2(0,0,2,1)*t2_2(2,1)
-			      + t4ddg_2(0,0,2,2)*t2_2(2,2))
-		,"T4ddg(i,j,k,l)*T2(j,l)(0,0)");
-  test_for_zero(t2s_1(0,1) - (t4ddg_2(0,1,0,0)*t2_2(0,0)
-			      + t4ddg_2(0,1,0,1)*t2_2(0,1)
-			      + t4ddg_2(0,1,0,2)*t2_2(0,2)
-			      + t4ddg_2(0,1,1,0)*t2_2(1,0)
-			      + t4ddg_2(0,1,1,1)*t2_2(1,1)
-			      + t4ddg_2(0,1,1,2)*t2_2(1,2)
-			      + t4ddg_2(0,1,2,0)*t2_2(2,0)
-			      + t4ddg_2(0,1,2,1)*t2_2(2,1)
-			      + t4ddg_2(0,1,2,2)*t2_2(2,2))
-		,"T4ddg(i,j,k,l)*T2(j,l)(0,1)");
-  test_for_zero(t2s_1(0,2) - (t4ddg_2(0,2,0,0)*t2_2(0,0)
-			      + t4ddg_2(0,2,0,1)*t2_2(0,1)
-			      + t4ddg_2(0,2,0,2)*t2_2(0,2)
-			      + t4ddg_2(0,2,1,0)*t2_2(1,0)
-			      + t4ddg_2(0,2,1,1)*t2_2(1,1)
-			      + t4ddg_2(0,2,1,2)*t2_2(1,2)
-			      + t4ddg_2(0,2,2,0)*t2_2(2,0)
-			      + t4ddg_2(0,2,2,1)*t2_2(2,1)
-			      + t4ddg_2(0,2,2,2)*t2_2(2,2))
-		,"T4ddg(i,j,k,l)*T2(j,l)(0,2)");
-  test_for_zero(t2s_1(1,0) - (t4ddg_2(1,0,0,0)*t2_2(0,0)
-			      + t4ddg_2(1,0,0,1)*t2_2(0,1)
-			      + t4ddg_2(1,0,0,2)*t2_2(0,2)
-			      + t4ddg_2(1,0,1,0)*t2_2(1,0)
-			      + t4ddg_2(1,0,1,1)*t2_2(1,1)
-			      + t4ddg_2(1,0,1,2)*t2_2(1,2)
-			      + t4ddg_2(1,0,2,0)*t2_2(2,0)
-			      + t4ddg_2(1,0,2,1)*t2_2(2,1)
-			      + t4ddg_2(1,0,2,2)*t2_2(2,2))
-		,"T4ddg(i,j,k,l)*T2(j,l)(1,0)");
-  test_for_zero(t2s_1(1,1) - (t4ddg_2(1,1,0,0)*t2_2(0,0)
-			      + t4ddg_2(1,1,0,1)*t2_2(0,1)
-			      + t4ddg_2(1,1,0,2)*t2_2(0,2)
-			      + t4ddg_2(1,1,1,0)*t2_2(1,0)
-			      + t4ddg_2(1,1,1,1)*t2_2(1,1)
-			      + t4ddg_2(1,1,1,2)*t2_2(1,2)
-			      + t4ddg_2(1,1,2,0)*t2_2(2,0)
-			      + t4ddg_2(1,1,2,1)*t2_2(2,1)
-			      + t4ddg_2(1,1,2,2)*t2_2(2,2))
-		,"T4ddg(i,j,k,l)*T2(j,l)(1,1)");
-  test_for_zero(t2s_1(1,2) - (t4ddg_2(1,2,0,0)*t2_2(0,0)
-			      + t4ddg_2(1,2,0,1)*t2_2(0,1)
-			      + t4ddg_2(1,2,0,2)*t2_2(0,2)
-			      + t4ddg_2(1,2,1,0)*t2_2(1,0)
-			      + t4ddg_2(1,2,1,1)*t2_2(1,1)
-			      + t4ddg_2(1,2,1,2)*t2_2(1,2)
-			      + t4ddg_2(1,2,2,0)*t2_2(2,0)
-			      + t4ddg_2(1,2,2,1)*t2_2(2,1)
-			      + t4ddg_2(1,2,2,2)*t2_2(2,2))
-		,"T4ddg(i,j,k,l)*T2(j,l)(1,2)");
-  test_for_zero(t2s_1(2,0) - (t4ddg_2(2,0,0,0)*t2_2(0,0)
-			      + t4ddg_2(2,0,0,1)*t2_2(0,1)
-			      + t4ddg_2(2,0,0,2)*t2_2(0,2)
-			      + t4ddg_2(2,0,1,0)*t2_2(1,0)
-			      + t4ddg_2(2,0,1,1)*t2_2(1,1)
-			      + t4ddg_2(2,0,1,2)*t2_2(1,2)
-			      + t4ddg_2(2,0,2,0)*t2_2(2,0)
-			      + t4ddg_2(2,0,2,1)*t2_2(2,1)
-			      + t4ddg_2(2,0,2,2)*t2_2(2,2))
-		,"T4ddg(i,j,k,l)*T2(j,l)(2,0)");
-  test_for_zero(t2s_1(2,1) - (t4ddg_2(2,1,0,0)*t2_2(0,0)
-			      + t4ddg_2(2,1,0,1)*t2_2(0,1)
-			      + t4ddg_2(2,1,0,2)*t2_2(0,2)
-			      + t4ddg_2(2,1,1,0)*t2_2(1,0)
-			      + t4ddg_2(2,1,1,1)*t2_2(1,1)
-			      + t4ddg_2(2,1,1,2)*t2_2(1,2)
-			      + t4ddg_2(2,1,2,0)*t2_2(2,0)
-			      + t4ddg_2(2,1,2,1)*t2_2(2,1)
-			      + t4ddg_2(2,1,2,2)*t2_2(2,2))
-		,"T4ddg(i,j,k,l)*T2(j,l)(2,1)");
-  test_for_zero(t2s_1(2,2) - (t4ddg_2(2,2,0,0)*t2_2(0,0)
-			      + t4ddg_2(2,2,0,1)*t2_2(0,1)
-			      + t4ddg_2(2,2,0,2)*t2_2(0,2)
-			      + t4ddg_2(2,2,1,0)*t2_2(1,0)
-			      + t4ddg_2(2,2,1,1)*t2_2(1,1)
-			      + t4ddg_2(2,2,1,2)*t2_2(1,2)
-			      + t4ddg_2(2,2,2,0)*t2_2(2,0)
-			      + t4ddg_2(2,2,2,1)*t2_2(2,1)
-			      + t4ddg_2(2,2,2,2)*t2_2(2,2))
-		,"T4ddg(i,j,k,l)*T2(j,l)(2,2)");
-
-  t2s_1(i,k)=t2_3(j,l)*t4ddg_2(i,k,j,l);
-  test_for_zero(t2s_1(0,0) - (t4ddg_2(0,0,0,0)*t2_3(0,0)
-			      + t4ddg_2(0,0,0,1)*t2_3(0,1)
-			      + t4ddg_2(0,0,0,2)*t2_3(0,2)
-			      + t4ddg_2(0,0,1,0)*t2_3(1,0)
-			      + t4ddg_2(0,0,1,1)*t2_3(1,1)
-			      + t4ddg_2(0,0,1,2)*t2_3(1,2)
-			      + t4ddg_2(0,0,2,0)*t2_3(2,0)
-			      + t4ddg_2(0,0,2,1)*t2_3(2,1)
-			      + t4ddg_2(0,0,2,2)*t2_3(2,2))
-		,"T2(j,l)*T4ddg(i,j,k,l)(0,0)");
-  test_for_zero(t2s_1(0,1) - (t4ddg_2(0,1,0,0)*t2_3(0,0)
-			      + t4ddg_2(0,1,0,1)*t2_3(0,1)
-			      + t4ddg_2(0,1,0,2)*t2_3(0,2)
-			      + t4ddg_2(0,1,1,0)*t2_3(1,0)
-			      + t4ddg_2(0,1,1,1)*t2_3(1,1)
-			      + t4ddg_2(0,1,1,2)*t2_3(1,2)
-			      + t4ddg_2(0,1,2,0)*t2_3(2,0)
-			      + t4ddg_2(0,1,2,1)*t2_3(2,1)
-			      + t4ddg_2(0,1,2,2)*t2_3(2,2))
-		,"T2(j,l)*T4ddg(i,j,k,l)(0,1)");
-  test_for_zero(t2s_1(0,2) - (t4ddg_2(0,2,0,0)*t2_3(0,0)
-			      + t4ddg_2(0,2,0,1)*t2_3(0,1)
-			      + t4ddg_2(0,2,0,2)*t2_3(0,2)
-			      + t4ddg_2(0,2,1,0)*t2_3(1,0)
-			      + t4ddg_2(0,2,1,1)*t2_3(1,1)
-			      + t4ddg_2(0,2,1,2)*t2_3(1,2)
-			      + t4ddg_2(0,2,2,0)*t2_3(2,0)
-			      + t4ddg_2(0,2,2,1)*t2_3(2,1)
-			      + t4ddg_2(0,2,2,2)*t2_3(2,2))
-		,"T2(j,l)*T4ddg(i,j,k,l)(0,2)");
-  test_for_zero(t2s_1(1,0) - (t4ddg_2(1,0,0,0)*t2_3(0,0)
-			      + t4ddg_2(1,0,0,1)*t2_3(0,1)
-			      + t4ddg_2(1,0,0,2)*t2_3(0,2)
-			      + t4ddg_2(1,0,1,0)*t2_3(1,0)
-			      + t4ddg_2(1,0,1,1)*t2_3(1,1)
-			      + t4ddg_2(1,0,1,2)*t2_3(1,2)
-			      + t4ddg_2(1,0,2,0)*t2_3(2,0)
-			      + t4ddg_2(1,0,2,1)*t2_3(2,1)
-			      + t4ddg_2(1,0,2,2)*t2_3(2,2))
-		,"T2(j,l)*T4ddg(i,j,k,l)(1,0)");
-  test_for_zero(t2s_1(1,1) - (t4ddg_2(1,1,0,0)*t2_3(0,0)
-			      + t4ddg_2(1,1,0,1)*t2_3(0,1)
-			      + t4ddg_2(1,1,0,2)*t2_3(0,2)
-			      + t4ddg_2(1,1,1,0)*t2_3(1,0)
-			      + t4ddg_2(1,1,1,1)*t2_3(1,1)
-			      + t4ddg_2(1,1,1,2)*t2_3(1,2)
-			      + t4ddg_2(1,1,2,0)*t2_3(2,0)
-			      + t4ddg_2(1,1,2,1)*t2_3(2,1)
-			      + t4ddg_2(1,1,2,2)*t2_3(2,2))
-		,"T2(j,l)*T4ddg(i,j,k,l)(1,1)");
-  test_for_zero(t2s_1(1,2) - (t4ddg_2(1,2,0,0)*t2_3(0,0)
-			      + t4ddg_2(1,2,0,1)*t2_3(0,1)
-			      + t4ddg_2(1,2,0,2)*t2_3(0,2)
-			      + t4ddg_2(1,2,1,0)*t2_3(1,0)
-			      + t4ddg_2(1,2,1,1)*t2_3(1,1)
-			      + t4ddg_2(1,2,1,2)*t2_3(1,2)
-			      + t4ddg_2(1,2,2,0)*t2_3(2,0)
-			      + t4ddg_2(1,2,2,1)*t2_3(2,1)
-			      + t4ddg_2(1,2,2,2)*t2_3(2,2))
-		,"T2(j,l)*T4ddg(i,j,k,l)(1,2)");
-  test_for_zero(t2s_1(2,0) - (t4ddg_2(2,0,0,0)*t2_3(0,0)
-			      + t4ddg_2(2,0,0,1)*t2_3(0,1)
-			      + t4ddg_2(2,0,0,2)*t2_3(0,2)
-			      + t4ddg_2(2,0,1,0)*t2_3(1,0)
-			      + t4ddg_2(2,0,1,1)*t2_3(1,1)
-			      + t4ddg_2(2,0,1,2)*t2_3(1,2)
-			      + t4ddg_2(2,0,2,0)*t2_3(2,0)
-			      + t4ddg_2(2,0,2,1)*t2_3(2,1)
-			      + t4ddg_2(2,0,2,2)*t2_3(2,2))
-		,"T2(j,l)*T4ddg(i,j,k,l)(2,0)");
-  test_for_zero(t2s_1(2,1) - (t4ddg_2(2,1,0,0)*t2_3(0,0)
-			      + t4ddg_2(2,1,0,1)*t2_3(0,1)
-			      + t4ddg_2(2,1,0,2)*t2_3(0,2)
-			      + t4ddg_2(2,1,1,0)*t2_3(1,0)
-			      + t4ddg_2(2,1,1,1)*t2_3(1,1)
-			      + t4ddg_2(2,1,1,2)*t2_3(1,2)
-			      + t4ddg_2(2,1,2,0)*t2_3(2,0)
-			      + t4ddg_2(2,1,2,1)*t2_3(2,1)
-			      + t4ddg_2(2,1,2,2)*t2_3(2,2))
-		,"T2(j,l)*T4ddg(i,j,k,l)(2,1)");
-  test_for_zero(t2s_1(2,2) - (t4ddg_2(2,2,0,0)*t2_3(0,0)
-			      + t4ddg_2(2,2,0,1)*t2_3(0,1)
-			      + t4ddg_2(2,2,0,2)*t2_3(0,2)
-			      + t4ddg_2(2,2,1,0)*t2_3(1,0)
-			      + t4ddg_2(2,2,1,1)*t2_3(1,1)
-			      + t4ddg_2(2,2,1,2)*t2_3(1,2)
-			      + t4ddg_2(2,2,2,0)*t2_3(2,0)
-			      + t4ddg_2(2,2,2,1)*t2_3(2,1)
-			      + t4ddg_2(2,2,2,2)*t2_3(2,2))
-		,"T2(j,l)*T4ddg(i,j,k,l)(2,2)");
-
-
-  t2s_1(i,k)=t4ddg_2(i,k,j,l)*t2_2(l,j);
-  test_for_zero(t2s_1(0,0) - (t4ddg_2(0,0,0,0)*t2_2(0,0)
-			      + t4ddg_2(0,0,0,1)*t2_2(0,1)
-			      + t4ddg_2(0,0,0,2)*t2_2(0,2)
-			      + t4ddg_2(0,0,1,0)*t2_2(1,0)
-			      + t4ddg_2(0,0,1,1)*t2_2(1,1)
-			      + t4ddg_2(0,0,1,2)*t2_2(1,2)
-			      + t4ddg_2(0,0,2,0)*t2_2(2,0)
-			      + t4ddg_2(0,0,2,1)*t2_2(2,1)
-			      + t4ddg_2(0,0,2,2)*t2_2(2,2))
-		,"T4ddg(i,j,k,l)*T2(l,j)(0,0)");
-  test_for_zero(t2s_1(0,1) - (t4ddg_2(0,1,0,0)*t2_2(0,0)
-			      + t4ddg_2(0,1,0,1)*t2_2(0,1)
-			      + t4ddg_2(0,1,0,2)*t2_2(0,2)
-			      + t4ddg_2(0,1,1,0)*t2_2(1,0)
-			      + t4ddg_2(0,1,1,1)*t2_2(1,1)
-			      + t4ddg_2(0,1,1,2)*t2_2(1,2)
-			      + t4ddg_2(0,1,2,0)*t2_2(2,0)
-			      + t4ddg_2(0,1,2,1)*t2_2(2,1)
-			      + t4ddg_2(0,1,2,2)*t2_2(2,2))
-		,"T4ddg(i,j,k,l)*T2(l,j)(0,1)");
-  test_for_zero(t2s_1(0,2) - (t4ddg_2(0,2,0,0)*t2_2(0,0)
-			      + t4ddg_2(0,2,0,1)*t2_2(0,1)
-			      + t4ddg_2(0,2,0,2)*t2_2(0,2)
-			      + t4ddg_2(0,2,1,0)*t2_2(1,0)
-			      + t4ddg_2(0,2,1,1)*t2_2(1,1)
-			      + t4ddg_2(0,2,1,2)*t2_2(1,2)
-			      + t4ddg_2(0,2,2,0)*t2_2(2,0)
-			      + t4ddg_2(0,2,2,1)*t2_2(2,1)
-			      + t4ddg_2(0,2,2,2)*t2_2(2,2))
-		,"T4ddg(i,j,k,l)*T2(l,j)(0,2)");
-  test_for_zero(t2s_1(1,0) - (t4ddg_2(1,0,0,0)*t2_2(0,0)
-			      + t4ddg_2(1,0,0,1)*t2_2(0,1)
-			      + t4ddg_2(1,0,0,2)*t2_2(0,2)
-			      + t4ddg_2(1,0,1,0)*t2_2(1,0)
-			      + t4ddg_2(1,0,1,1)*t2_2(1,1)
-			      + t4ddg_2(1,0,1,2)*t2_2(1,2)
-			      + t4ddg_2(1,0,2,0)*t2_2(2,0)
-			      + t4ddg_2(1,0,2,1)*t2_2(2,1)
-			      + t4ddg_2(1,0,2,2)*t2_2(2,2))
-		,"T4ddg(i,j,k,l)*T2(l,j)(1,0)");
-  test_for_zero(t2s_1(1,1) - (t4ddg_2(1,1,0,0)*t2_2(0,0)
-			      + t4ddg_2(1,1,0,1)*t2_2(0,1)
-			      + t4ddg_2(1,1,0,2)*t2_2(0,2)
-			      + t4ddg_2(1,1,1,0)*t2_2(1,0)
-			      + t4ddg_2(1,1,1,1)*t2_2(1,1)
-			      + t4ddg_2(1,1,1,2)*t2_2(1,2)
-			      + t4ddg_2(1,1,2,0)*t2_2(2,0)
-			      + t4ddg_2(1,1,2,1)*t2_2(2,1)
-			      + t4ddg_2(1,1,2,2)*t2_2(2,2))
-		,"T4ddg(i,j,k,l)*T2(l,j)(1,1)");
-  test_for_zero(t2s_1(1,2) - (t4ddg_2(1,2,0,0)*t2_2(0,0)
-			      + t4ddg_2(1,2,0,1)*t2_2(0,1)
-			      + t4ddg_2(1,2,0,2)*t2_2(0,2)
-			      + t4ddg_2(1,2,1,0)*t2_2(1,0)
-			      + t4ddg_2(1,2,1,1)*t2_2(1,1)
-			      + t4ddg_2(1,2,1,2)*t2_2(1,2)
-			      + t4ddg_2(1,2,2,0)*t2_2(2,0)
-			      + t4ddg_2(1,2,2,1)*t2_2(2,1)
-			      + t4ddg_2(1,2,2,2)*t2_2(2,2))
-		,"T4ddg(i,j,k,l)*T2(l,j)(1,2)");
-  test_for_zero(t2s_1(2,0) - (t4ddg_2(2,0,0,0)*t2_2(0,0)
-			      + t4ddg_2(2,0,0,1)*t2_2(0,1)
-			      + t4ddg_2(2,0,0,2)*t2_2(0,2)
-			      + t4ddg_2(2,0,1,0)*t2_2(1,0)
-			      + t4ddg_2(2,0,1,1)*t2_2(1,1)
-			      + t4ddg_2(2,0,1,2)*t2_2(1,2)
-			      + t4ddg_2(2,0,2,0)*t2_2(2,0)
-			      + t4ddg_2(2,0,2,1)*t2_2(2,1)
-			      + t4ddg_2(2,0,2,2)*t2_2(2,2))
-		,"T4ddg(i,j,k,l)*T2(l,j)(2,0)");
-  test_for_zero(t2s_1(2,1) - (t4ddg_2(2,1,0,0)*t2_2(0,0)
-			      + t4ddg_2(2,1,0,1)*t2_2(0,1)
-			      + t4ddg_2(2,1,0,2)*t2_2(0,2)
-			      + t4ddg_2(2,1,1,0)*t2_2(1,0)
-			      + t4ddg_2(2,1,1,1)*t2_2(1,1)
-			      + t4ddg_2(2,1,1,2)*t2_2(1,2)
-			      + t4ddg_2(2,1,2,0)*t2_2(2,0)
-			      + t4ddg_2(2,1,2,1)*t2_2(2,1)
-			      + t4ddg_2(2,1,2,2)*t2_2(2,2))
-		,"T4ddg(i,j,k,l)*T2(l,j)(2,1)");
-  test_for_zero(t2s_1(2,2) - (t4ddg_2(2,2,0,0)*t2_2(0,0)
-			      + t4ddg_2(2,2,0,1)*t2_2(0,1)
-			      + t4ddg_2(2,2,0,2)*t2_2(0,2)
-			      + t4ddg_2(2,2,1,0)*t2_2(1,0)
-			      + t4ddg_2(2,2,1,1)*t2_2(1,1)
-			      + t4ddg_2(2,2,1,2)*t2_2(1,2)
-			      + t4ddg_2(2,2,2,0)*t2_2(2,0)
-			      + t4ddg_2(2,2,2,1)*t2_2(2,1)
-			      + t4ddg_2(2,2,2,2)*t2_2(2,2))
-		,"T4ddg(i,j,k,l)*T2(l,j)(2,2)");
-
-  t2s_1(i,k)=t2_3(l,j)*t4ddg_2(i,k,j,l);
-  test_for_zero(t2s_1(0,0) - (t4ddg_2(0,0,0,0)*t2_3(0,0)
-			      + t4ddg_2(0,0,0,1)*t2_3(0,1)
-			      + t4ddg_2(0,0,0,2)*t2_3(0,2)
-			      + t4ddg_2(0,0,1,0)*t2_3(1,0)
-			      + t4ddg_2(0,0,1,1)*t2_3(1,1)
-			      + t4ddg_2(0,0,1,2)*t2_3(1,2)
-			      + t4ddg_2(0,0,2,0)*t2_3(2,0)
-			      + t4ddg_2(0,0,2,1)*t2_3(2,1)
-			      + t4ddg_2(0,0,2,2)*t2_3(2,2))
-		,"T2(l,j)*T4ddg(i,j,k,l)(0,0)");
-  test_for_zero(t2s_1(0,1) - (t4ddg_2(0,1,0,0)*t2_3(0,0)
-			      + t4ddg_2(0,1,0,1)*t2_3(0,1)
-			      + t4ddg_2(0,1,0,2)*t2_3(0,2)
-			      + t4ddg_2(0,1,1,0)*t2_3(1,0)
-			      + t4ddg_2(0,1,1,1)*t2_3(1,1)
-			      + t4ddg_2(0,1,1,2)*t2_3(1,2)
-			      + t4ddg_2(0,1,2,0)*t2_3(2,0)
-			      + t4ddg_2(0,1,2,1)*t2_3(2,1)
-			      + t4ddg_2(0,1,2,2)*t2_3(2,2))
-		,"T2(l,j)*T4ddg(i,j,k,l)(0,1)");
-  test_for_zero(t2s_1(0,2) - (t4ddg_2(0,2,0,0)*t2_3(0,0)
-			      + t4ddg_2(0,2,0,1)*t2_3(0,1)
-			      + t4ddg_2(0,2,0,2)*t2_3(0,2)
-			      + t4ddg_2(0,2,1,0)*t2_3(1,0)
-			      + t4ddg_2(0,2,1,1)*t2_3(1,1)
-			      + t4ddg_2(0,2,1,2)*t2_3(1,2)
-			      + t4ddg_2(0,2,2,0)*t2_3(2,0)
-			      + t4ddg_2(0,2,2,1)*t2_3(2,1)
-			      + t4ddg_2(0,2,2,2)*t2_3(2,2))
-		,"T2(l,j)*T4ddg(i,j,k,l)(0,2)");
-  test_for_zero(t2s_1(1,0) - (t4ddg_2(1,0,0,0)*t2_3(0,0)
-			      + t4ddg_2(1,0,0,1)*t2_3(0,1)
-			      + t4ddg_2(1,0,0,2)*t2_3(0,2)
-			      + t4ddg_2(1,0,1,0)*t2_3(1,0)
-			      + t4ddg_2(1,0,1,1)*t2_3(1,1)
-			      + t4ddg_2(1,0,1,2)*t2_3(1,2)
-			      + t4ddg_2(1,0,2,0)*t2_3(2,0)
-			      + t4ddg_2(1,0,2,1)*t2_3(2,1)
-			      + t4ddg_2(1,0,2,2)*t2_3(2,2))
-		,"T2(l,j)*T4ddg(i,j,k,l)(1,0)");
-  test_for_zero(t2s_1(1,1) - (t4ddg_2(1,1,0,0)*t2_3(0,0)
-			      + t4ddg_2(1,1,0,1)*t2_3(0,1)
-			      + t4ddg_2(1,1,0,2)*t2_3(0,2)
-			      + t4ddg_2(1,1,1,0)*t2_3(1,0)
-			      + t4ddg_2(1,1,1,1)*t2_3(1,1)
-			      + t4ddg_2(1,1,1,2)*t2_3(1,2)
-			      + t4ddg_2(1,1,2,0)*t2_3(2,0)
-			      + t4ddg_2(1,1,2,1)*t2_3(2,1)
-			      + t4ddg_2(1,1,2,2)*t2_3(2,2))
-		,"T2(l,j)*T4ddg(i,j,k,l)(1,1)");
-  test_for_zero(t2s_1(1,2) - (t4ddg_2(1,2,0,0)*t2_3(0,0)
-			      + t4ddg_2(1,2,0,1)*t2_3(0,1)
-			      + t4ddg_2(1,2,0,2)*t2_3(0,2)
-			      + t4ddg_2(1,2,1,0)*t2_3(1,0)
-			      + t4ddg_2(1,2,1,1)*t2_3(1,1)
-			      + t4ddg_2(1,2,1,2)*t2_3(1,2)
-			      + t4ddg_2(1,2,2,0)*t2_3(2,0)
-			      + t4ddg_2(1,2,2,1)*t2_3(2,1)
-			      + t4ddg_2(1,2,2,2)*t2_3(2,2))
-		,"T2(l,j)*T4ddg(i,j,k,l)(1,2)");
-  test_for_zero(t2s_1(2,0) - (t4ddg_2(2,0,0,0)*t2_3(0,0)
-			      + t4ddg_2(2,0,0,1)*t2_3(0,1)
-			      + t4ddg_2(2,0,0,2)*t2_3(0,2)
-			      + t4ddg_2(2,0,1,0)*t2_3(1,0)
-			      + t4ddg_2(2,0,1,1)*t2_3(1,1)
-			      + t4ddg_2(2,0,1,2)*t2_3(1,2)
-			      + t4ddg_2(2,0,2,0)*t2_3(2,0)
-			      + t4ddg_2(2,0,2,1)*t2_3(2,1)
-			      + t4ddg_2(2,0,2,2)*t2_3(2,2))
-		,"T2(l,j)*T4ddg(i,j,k,l)(2,0)");
-  test_for_zero(t2s_1(2,1) - (t4ddg_2(2,1,0,0)*t2_3(0,0)
-			      + t4ddg_2(2,1,0,1)*t2_3(0,1)
-			      + t4ddg_2(2,1,0,2)*t2_3(0,2)
-			      + t4ddg_2(2,1,1,0)*t2_3(1,0)
-			      + t4ddg_2(2,1,1,1)*t2_3(1,1)
-			      + t4ddg_2(2,1,1,2)*t2_3(1,2)
-			      + t4ddg_2(2,1,2,0)*t2_3(2,0)
-			      + t4ddg_2(2,1,2,1)*t2_3(2,1)
-			      + t4ddg_2(2,1,2,2)*t2_3(2,2))
-		,"T2(l,j)*T4ddg(i,j,k,l)(2,1)");
-  test_for_zero(t2s_1(2,2) - (t4ddg_2(2,2,0,0)*t2_3(0,0)
-			      + t4ddg_2(2,2,0,1)*t2_3(0,1)
-			      + t4ddg_2(2,2,0,2)*t2_3(0,2)
-			      + t4ddg_2(2,2,1,0)*t2_3(1,0)
-			      + t4ddg_2(2,2,1,1)*t2_3(1,1)
-			      + t4ddg_2(2,2,1,2)*t2_3(1,2)
-			      + t4ddg_2(2,2,2,0)*t2_3(2,0)
-			      + t4ddg_2(2,2,2,1)*t2_3(2,1)
-			      + t4ddg_2(2,2,2,2)*t2_3(2,2))
-		,"T2(l,j)*T4ddg(i,j,k,l)(2,2)");
-
-  t3dg_1(i,j,k)=t4ddg_2(i,j,l,k)*t1_2(l);
-  test_for_zero(t3dg_1(0,0,0) - (t4ddg_2(0,0,0,0)*t1_2(0)
-				 + t4ddg_2(0,0,1,0)*t1_2(1)
-				 + t4ddg_2(0,0,2,0)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(0,0,0)");
-  test_for_zero(t3dg_1(0,0,1) - (t4ddg_2(0,0,0,1)*t1_2(0)
-				 + t4ddg_2(0,0,1,1)*t1_2(1)
-				 + t4ddg_2(0,0,2,1)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(0,0,1)");
-  test_for_zero(t3dg_1(0,0,2) - (t4ddg_2(0,0,0,2)*t1_2(0)
-				 + t4ddg_2(0,0,1,2)*t1_2(1)
-				 + t4ddg_2(0,0,2,2)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(0,0,2)");
-  test_for_zero(t3dg_1(0,1,0) - (t4ddg_2(0,1,0,0)*t1_2(0)
-				 + t4ddg_2(0,1,1,0)*t1_2(1)
-				 + t4ddg_2(0,1,2,0)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(0,1,0)");
-  test_for_zero(t3dg_1(0,1,1) - (t4ddg_2(0,1,0,1)*t1_2(0)
-				 + t4ddg_2(0,1,1,1)*t1_2(1)
-				 + t4ddg_2(0,1,2,1)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(0,1,1)");
-  test_for_zero(t3dg_1(0,1,2) - (t4ddg_2(0,1,0,2)*t1_2(0)
-				 + t4ddg_2(0,1,1,2)*t1_2(1)
-				 + t4ddg_2(0,1,2,2)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(0,1,2)");
-  test_for_zero(t3dg_1(0,2,0) - (t4ddg_2(0,2,0,0)*t1_2(0)
-				 + t4ddg_2(0,2,1,0)*t1_2(1)
-				 + t4ddg_2(0,2,2,0)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(0,2,0)");
-  test_for_zero(t3dg_1(0,2,1) - (t4ddg_2(0,2,0,1)*t1_2(0)
-				 + t4ddg_2(0,2,1,1)*t1_2(1)
-				 + t4ddg_2(0,2,2,1)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(0,2,1)");
-  test_for_zero(t3dg_1(0,2,2) - (t4ddg_2(0,2,0,2)*t1_2(0)
-				 + t4ddg_2(0,2,1,2)*t1_2(1)
-				 + t4ddg_2(0,2,2,2)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(0,2,2)");
-  test_for_zero(t3dg_1(1,0,0) - (t4ddg_2(1,0,0,0)*t1_2(0)
-				 + t4ddg_2(1,0,1,0)*t1_2(1)
-				 + t4ddg_2(1,0,2,0)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(1,0,0)");
-  test_for_zero(t3dg_1(1,0,1) - (t4ddg_2(1,0,0,1)*t1_2(0)
-				 + t4ddg_2(1,0,1,1)*t1_2(1)
-				 + t4ddg_2(1,0,2,1)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(1,0,1)");
-  test_for_zero(t3dg_1(1,0,2) - (t4ddg_2(1,0,0,2)*t1_2(0)
-				 + t4ddg_2(1,0,1,2)*t1_2(1)
-				 + t4ddg_2(1,0,2,2)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(1,0,2)");
-  test_for_zero(t3dg_1(1,1,0) - (t4ddg_2(1,1,0,0)*t1_2(0)
-				 + t4ddg_2(1,1,1,0)*t1_2(1)
-				 + t4ddg_2(1,1,2,0)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - (t4ddg_2(1,1,0,1)*t1_2(0)
-				 + t4ddg_2(1,1,1,1)*t1_2(1)
-				 + t4ddg_2(1,1,2,1)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(1,1,1)");
-  test_for_zero(t3dg_1(1,1,2) - (t4ddg_2(1,1,0,2)*t1_2(0)
-				 + t4ddg_2(1,1,1,2)*t1_2(1)
-				 + t4ddg_2(1,1,2,2)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(1,1,2)");
-  test_for_zero(t3dg_1(1,2,0) - (t4ddg_2(1,2,0,0)*t1_2(0)
-				 + t4ddg_2(1,2,1,0)*t1_2(1)
-				 + t4ddg_2(1,2,2,0)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(1,2,0)");
-  test_for_zero(t3dg_1(1,2,1) - (t4ddg_2(1,2,0,1)*t1_2(0)
-				 + t4ddg_2(1,2,1,1)*t1_2(1)
-				 + t4ddg_2(1,2,2,1)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(1,2,1)");
-  test_for_zero(t3dg_1(1,2,2) - (t4ddg_2(1,2,0,2)*t1_2(0)
-				 + t4ddg_2(1,2,1,2)*t1_2(1)
-				 + t4ddg_2(1,2,2,2)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(1,2,2)");
-  test_for_zero(t3dg_1(2,0,0) - (t4ddg_2(2,0,0,0)*t1_2(0)
-				 + t4ddg_2(2,0,1,0)*t1_2(1)
-				 + t4ddg_2(2,0,2,0)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(2,0,0)");
-  test_for_zero(t3dg_1(2,0,1) - (t4ddg_2(2,0,0,1)*t1_2(0)
-				 + t4ddg_2(2,0,1,1)*t1_2(1)
-				 + t4ddg_2(2,0,2,1)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(2,0,1)");
-  test_for_zero(t3dg_1(2,0,2) - (t4ddg_2(2,0,0,2)*t1_2(0)
-				 + t4ddg_2(2,0,1,2)*t1_2(1)
-				 + t4ddg_2(2,0,2,2)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(2,0,2)");
-  test_for_zero(t3dg_1(2,1,0) - (t4ddg_2(2,1,0,0)*t1_2(0)
-				 + t4ddg_2(2,1,1,0)*t1_2(1)
-				 + t4ddg_2(2,1,2,0)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(2,1,0)");
-  test_for_zero(t3dg_1(2,1,1) - (t4ddg_2(2,1,0,1)*t1_2(0)
-				 + t4ddg_2(2,1,1,1)*t1_2(1)
-				 + t4ddg_2(2,1,2,1)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(2,1,1)");
-  test_for_zero(t3dg_1(2,1,2) - (t4ddg_2(2,1,0,2)*t1_2(0)
-				 + t4ddg_2(2,1,1,2)*t1_2(1)
-				 + t4ddg_2(2,1,2,2)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(2,1,2)");
-  test_for_zero(t3dg_1(2,2,0) - (t4ddg_2(2,2,0,0)*t1_2(0)
-				 + t4ddg_2(2,2,1,0)*t1_2(1)
-				 + t4ddg_2(2,2,2,0)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(2,2,0)");
-  test_for_zero(t3dg_1(2,2,1) - (t4ddg_2(2,2,0,1)*t1_2(0)
-				 + t4ddg_2(2,2,1,1)*t1_2(1)
-				 + t4ddg_2(2,2,2,1)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - (t4ddg_2(2,2,0,2)*t1_2(0)
-				 + t4ddg_2(2,2,1,2)*t1_2(1)
-				 + t4ddg_2(2,2,2,2)*t1_2(2))
-		,"T4ddg(i,j,l,k)*T1(l)(2,2,2)");
-  cout << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T4ddg/test_T4ddgIV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T4ddg/test_T4ddgIV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,698 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T4ddgIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+		Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+		Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+		const Tensor2<double,3,3> &t2_3,
+		Tensor2_symmetric<double,3> &t2s_1,
+		const Tensor2_symmetric<double,3> &t2s_2,
+		const Tensor2_symmetric<double,3> &t2s_3,
+		Tensor3_dg<double,3,3> &t3dg_1,
+		const Tensor3_dg<double,3,3> &t3dg_2,
+		const Tensor3_dg<double,3,3> &t3dg_3,
+		Tensor3_christof<double,3,3> &t3ch_1,
+		const Tensor3_christof<double,3,3> &t3ch_2,
+		const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  Tensor4_ddg<double,3,3> t4ddg_1, t4ddg_2, t4ddg_3;
+
+  t4ddg_2(i,j,l,m)=t2s_2(i,j)*t2s_2(l,m);
+  t2s_1(i,k)=(t4ddg_2(i,j,k,l) ^ t2s_2(j,l));
+  test_for_zero(t2s_1(0,0) - (t4ddg_2(0,0,0,0)*t2s_2(0,0)
+			      + t4ddg_2(0,0,0,1)*t2s_2(0,1)
+			      + t4ddg_2(0,0,0,2)*t2s_2(0,2)
+			      + t4ddg_2(0,1,0,0)*t2s_2(1,0)
+			      + t4ddg_2(0,1,0,1)*t2s_2(1,1)
+			      + t4ddg_2(0,1,0,2)*t2s_2(1,2)
+			      + t4ddg_2(0,2,0,0)*t2s_2(2,0)
+			      + t4ddg_2(0,2,0,1)*t2s_2(2,1)
+			      + t4ddg_2(0,2,0,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)^T2s(j,l)(0,0)");
+  test_for_zero(t2s_1(0,1) - (t4ddg_2(0,0,1,0)*t2s_2(0,0)
+			      + t4ddg_2(0,0,1,1)*t2s_2(0,1)
+			      + t4ddg_2(0,0,1,2)*t2s_2(0,2)
+			      + t4ddg_2(0,1,1,0)*t2s_2(1,0)
+			      + t4ddg_2(0,1,1,1)*t2s_2(1,1)
+			      + t4ddg_2(0,1,1,2)*t2s_2(1,2)
+			      + t4ddg_2(0,2,1,0)*t2s_2(2,0)
+			      + t4ddg_2(0,2,1,1)*t2s_2(2,1)
+			      + t4ddg_2(0,2,1,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)^T2s(j,l)(0,1)");
+  test_for_zero(t2s_1(0,2) - (t4ddg_2(0,0,2,0)*t2s_2(0,0)
+			      + t4ddg_2(0,0,2,1)*t2s_2(0,1)
+			      + t4ddg_2(0,0,2,2)*t2s_2(0,2)
+			      + t4ddg_2(0,1,2,0)*t2s_2(1,0)
+			      + t4ddg_2(0,1,2,1)*t2s_2(1,1)
+			      + t4ddg_2(0,1,2,2)*t2s_2(1,2)
+			      + t4ddg_2(0,2,2,0)*t2s_2(2,0)
+			      + t4ddg_2(0,2,2,1)*t2s_2(2,1)
+			      + t4ddg_2(0,2,2,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)^T2s(j,l)(0,2)");
+  test_for_zero(t2s_1(1,0) - (t4ddg_2(1,0,0,0)*t2s_2(0,0)
+			      + t4ddg_2(1,0,0,1)*t2s_2(0,1)
+			      + t4ddg_2(1,0,0,2)*t2s_2(0,2)
+			      + t4ddg_2(1,1,0,0)*t2s_2(1,0)
+			      + t4ddg_2(1,1,0,1)*t2s_2(1,1)
+			      + t4ddg_2(1,1,0,2)*t2s_2(1,2)
+			      + t4ddg_2(1,2,0,0)*t2s_2(2,0)
+			      + t4ddg_2(1,2,0,1)*t2s_2(2,1)
+			      + t4ddg_2(1,2,0,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)^T2s(j,l)(1,0)");
+  test_for_zero(t2s_1(1,1) - (t4ddg_2(1,0,1,0)*t2s_2(0,0)
+			      + t4ddg_2(1,0,1,1)*t2s_2(0,1)
+			      + t4ddg_2(1,0,1,2)*t2s_2(0,2)
+			      + t4ddg_2(1,1,1,0)*t2s_2(1,0)
+			      + t4ddg_2(1,1,1,1)*t2s_2(1,1)
+			      + t4ddg_2(1,1,1,2)*t2s_2(1,2)
+			      + t4ddg_2(1,2,1,0)*t2s_2(2,0)
+			      + t4ddg_2(1,2,1,1)*t2s_2(2,1)
+			      + t4ddg_2(1,2,1,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)^T2s(j,l)(1,1)");
+  test_for_zero(t2s_1(1,2) - (t4ddg_2(1,0,2,0)*t2s_2(0,0)
+			      + t4ddg_2(1,0,2,1)*t2s_2(0,1)
+			      + t4ddg_2(1,0,2,2)*t2s_2(0,2)
+			      + t4ddg_2(1,1,2,0)*t2s_2(1,0)
+			      + t4ddg_2(1,1,2,1)*t2s_2(1,1)
+			      + t4ddg_2(1,1,2,2)*t2s_2(1,2)
+			      + t4ddg_2(1,2,2,0)*t2s_2(2,0)
+			      + t4ddg_2(1,2,2,1)*t2s_2(2,1)
+			      + t4ddg_2(1,2,2,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)^T2s(j,l)(1,2)");
+  test_for_zero(t2s_1(2,0) - (t4ddg_2(2,0,0,0)*t2s_2(0,0)
+			      + t4ddg_2(2,0,0,1)*t2s_2(0,1)
+			      + t4ddg_2(2,0,0,2)*t2s_2(0,2)
+			      + t4ddg_2(2,1,0,0)*t2s_2(1,0)
+			      + t4ddg_2(2,1,0,1)*t2s_2(1,1)
+			      + t4ddg_2(2,1,0,2)*t2s_2(1,2)
+			      + t4ddg_2(2,2,0,0)*t2s_2(2,0)
+			      + t4ddg_2(2,2,0,1)*t2s_2(2,1)
+			      + t4ddg_2(2,2,0,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)^T2s(j,l)(2,0)");
+  test_for_zero(t2s_1(2,1) - (t4ddg_2(2,0,1,0)*t2s_2(0,0)
+			      + t4ddg_2(2,0,1,1)*t2s_2(0,1)
+			      + t4ddg_2(2,0,1,2)*t2s_2(0,2)
+			      + t4ddg_2(2,1,1,0)*t2s_2(1,0)
+			      + t4ddg_2(2,1,1,1)*t2s_2(1,1)
+			      + t4ddg_2(2,1,1,2)*t2s_2(1,2)
+			      + t4ddg_2(2,2,1,0)*t2s_2(2,0)
+			      + t4ddg_2(2,2,1,1)*t2s_2(2,1)
+			      + t4ddg_2(2,2,1,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)^T2s(j,l)(2,1)");
+  test_for_zero(t2s_1(2,2) - (t4ddg_2(2,0,2,0)*t2s_2(0,0)
+			      + t4ddg_2(2,0,2,1)*t2s_2(0,1)
+			      + t4ddg_2(2,0,2,2)*t2s_2(0,2)
+			      + t4ddg_2(2,1,2,0)*t2s_2(1,0)
+			      + t4ddg_2(2,1,2,1)*t2s_2(1,1)
+			      + t4ddg_2(2,1,2,2)*t2s_2(1,2)
+			      + t4ddg_2(2,2,2,0)*t2s_2(2,0)
+			      + t4ddg_2(2,2,2,1)*t2s_2(2,1)
+			      + t4ddg_2(2,2,2,2)*t2s_2(2,2))
+		,"T4ddg(i,j,k,l)^T2s(j,l)(2,2)");
+
+  t2s_1(i,k)=(t2s_3(j,l) ^ t4ddg_2(i,j,k,l));
+  test_for_zero(t2s_1(0,0) - (t4ddg_2(0,0,0,0)*t2s_3(0,0)
+			      + t4ddg_2(0,0,0,1)*t2s_3(0,1)
+			      + t4ddg_2(0,0,0,2)*t2s_3(0,2)
+			      + t4ddg_2(0,1,0,0)*t2s_3(1,0)
+			      + t4ddg_2(0,1,0,1)*t2s_3(1,1)
+			      + t4ddg_2(0,1,0,2)*t2s_3(1,2)
+			      + t4ddg_2(0,2,0,0)*t2s_3(2,0)
+			      + t4ddg_2(0,2,0,1)*t2s_3(2,1)
+			      + t4ddg_2(0,2,0,2)*t2s_3(2,2))
+		,"T2s(j,l)^T4ddg(i,j,k,l)(0,0)");
+  test_for_zero(t2s_1(0,1) - (t4ddg_2(0,0,1,0)*t2s_3(0,0)
+			      + t4ddg_2(0,0,1,1)*t2s_3(0,1)
+			      + t4ddg_2(0,0,1,2)*t2s_3(0,2)
+			      + t4ddg_2(0,1,1,0)*t2s_3(1,0)
+			      + t4ddg_2(0,1,1,1)*t2s_3(1,1)
+			      + t4ddg_2(0,1,1,2)*t2s_3(1,2)
+			      + t4ddg_2(0,2,1,0)*t2s_3(2,0)
+			      + t4ddg_2(0,2,1,1)*t2s_3(2,1)
+			      + t4ddg_2(0,2,1,2)*t2s_3(2,2))
+		,"T2s(j,l)^T4ddg(i,j,k,l)(0,1)");
+  test_for_zero(t2s_1(0,2) - (t4ddg_2(0,0,2,0)*t2s_3(0,0)
+			      + t4ddg_2(0,0,2,1)*t2s_3(0,1)
+			      + t4ddg_2(0,0,2,2)*t2s_3(0,2)
+			      + t4ddg_2(0,1,2,0)*t2s_3(1,0)
+			      + t4ddg_2(0,1,2,1)*t2s_3(1,1)
+			      + t4ddg_2(0,1,2,2)*t2s_3(1,2)
+			      + t4ddg_2(0,2,2,0)*t2s_3(2,0)
+			      + t4ddg_2(0,2,2,1)*t2s_3(2,1)
+			      + t4ddg_2(0,2,2,2)*t2s_3(2,2))
+		,"T2s(j,l)^T4ddg(i,j,k,l)(0,2)");
+  test_for_zero(t2s_1(1,0) - (t4ddg_2(1,0,0,0)*t2s_3(0,0)
+			      + t4ddg_2(1,0,0,1)*t2s_3(0,1)
+			      + t4ddg_2(1,0,0,2)*t2s_3(0,2)
+			      + t4ddg_2(1,1,0,0)*t2s_3(1,0)
+			      + t4ddg_2(1,1,0,1)*t2s_3(1,1)
+			      + t4ddg_2(1,1,0,2)*t2s_3(1,2)
+			      + t4ddg_2(1,2,0,0)*t2s_3(2,0)
+			      + t4ddg_2(1,2,0,1)*t2s_3(2,1)
+			      + t4ddg_2(1,2,0,2)*t2s_3(2,2))
+		,"T2s(j,l)^T4ddg(i,j,k,l)(1,0)");
+  test_for_zero(t2s_1(1,1) - (t4ddg_2(1,0,1,0)*t2s_3(0,0)
+			      + t4ddg_2(1,0,1,1)*t2s_3(0,1)
+			      + t4ddg_2(1,0,1,2)*t2s_3(0,2)
+			      + t4ddg_2(1,1,1,0)*t2s_3(1,0)
+			      + t4ddg_2(1,1,1,1)*t2s_3(1,1)
+			      + t4ddg_2(1,1,1,2)*t2s_3(1,2)
+			      + t4ddg_2(1,2,1,0)*t2s_3(2,0)
+			      + t4ddg_2(1,2,1,1)*t2s_3(2,1)
+			      + t4ddg_2(1,2,1,2)*t2s_3(2,2))
+		,"T2s(j,l)^T4ddg(i,j,k,l)(1,1)");
+  test_for_zero(t2s_1(1,2) - (t4ddg_2(1,0,2,0)*t2s_3(0,0)
+			      + t4ddg_2(1,0,2,1)*t2s_3(0,1)
+			      + t4ddg_2(1,0,2,2)*t2s_3(0,2)
+			      + t4ddg_2(1,1,2,0)*t2s_3(1,0)
+			      + t4ddg_2(1,1,2,1)*t2s_3(1,1)
+			      + t4ddg_2(1,1,2,2)*t2s_3(1,2)
+			      + t4ddg_2(1,2,2,0)*t2s_3(2,0)
+			      + t4ddg_2(1,2,2,1)*t2s_3(2,1)
+			      + t4ddg_2(1,2,2,2)*t2s_3(2,2))
+		,"T2s(j,l)^T4ddg(i,j,k,l)(1,2)");
+  test_for_zero(t2s_1(2,0) - (t4ddg_2(2,0,0,0)*t2s_3(0,0)
+			      + t4ddg_2(2,0,0,1)*t2s_3(0,1)
+			      + t4ddg_2(2,0,0,2)*t2s_3(0,2)
+			      + t4ddg_2(2,1,0,0)*t2s_3(1,0)
+			      + t4ddg_2(2,1,0,1)*t2s_3(1,1)
+			      + t4ddg_2(2,1,0,2)*t2s_3(1,2)
+			      + t4ddg_2(2,2,0,0)*t2s_3(2,0)
+			      + t4ddg_2(2,2,0,1)*t2s_3(2,1)
+			      + t4ddg_2(2,2,0,2)*t2s_3(2,2))
+		,"T2s(j,l)^T4ddg(i,j,k,l)(2,0)");
+  test_for_zero(t2s_1(2,1) - (t4ddg_2(2,0,1,0)*t2s_3(0,0)
+			      + t4ddg_2(2,0,1,1)*t2s_3(0,1)
+			      + t4ddg_2(2,0,1,2)*t2s_3(0,2)
+			      + t4ddg_2(2,1,1,0)*t2s_3(1,0)
+			      + t4ddg_2(2,1,1,1)*t2s_3(1,1)
+			      + t4ddg_2(2,1,1,2)*t2s_3(1,2)
+			      + t4ddg_2(2,2,1,0)*t2s_3(2,0)
+			      + t4ddg_2(2,2,1,1)*t2s_3(2,1)
+			      + t4ddg_2(2,2,1,2)*t2s_3(2,2))
+		,"T2s(j,l)^T4ddg(i,j,k,l)(2,1)");
+  test_for_zero(t2s_1(2,2) - (t4ddg_2(2,0,2,0)*t2s_3(0,0)
+			      + t4ddg_2(2,0,2,1)*t2s_3(0,1)
+			      + t4ddg_2(2,0,2,2)*t2s_3(0,2)
+			      + t4ddg_2(2,1,2,0)*t2s_3(1,0)
+			      + t4ddg_2(2,1,2,1)*t2s_3(1,1)
+			      + t4ddg_2(2,1,2,2)*t2s_3(1,2)
+			      + t4ddg_2(2,2,2,0)*t2s_3(2,0)
+			      + t4ddg_2(2,2,2,1)*t2s_3(2,1)
+			      + t4ddg_2(2,2,2,2)*t2s_3(2,2))
+		,"T2s(j,l)^T4ddg(i,j,k,l)(2,2)");
+
+  t2s_1(i,k)=t4ddg_2(i,k,j,l)*t2_2(j,l);
+  test_for_zero(t2s_1(0,0) - (t4ddg_2(0,0,0,0)*t2_2(0,0)
+			      + t4ddg_2(0,0,0,1)*t2_2(0,1)
+			      + t4ddg_2(0,0,0,2)*t2_2(0,2)
+			      + t4ddg_2(0,0,1,0)*t2_2(1,0)
+			      + t4ddg_2(0,0,1,1)*t2_2(1,1)
+			      + t4ddg_2(0,0,1,2)*t2_2(1,2)
+			      + t4ddg_2(0,0,2,0)*t2_2(2,0)
+			      + t4ddg_2(0,0,2,1)*t2_2(2,1)
+			      + t4ddg_2(0,0,2,2)*t2_2(2,2))
+		,"T4ddg(i,j,k,l)*T2(j,l)(0,0)");
+  test_for_zero(t2s_1(0,1) - (t4ddg_2(0,1,0,0)*t2_2(0,0)
+			      + t4ddg_2(0,1,0,1)*t2_2(0,1)
+			      + t4ddg_2(0,1,0,2)*t2_2(0,2)
+			      + t4ddg_2(0,1,1,0)*t2_2(1,0)
+			      + t4ddg_2(0,1,1,1)*t2_2(1,1)
+			      + t4ddg_2(0,1,1,2)*t2_2(1,2)
+			      + t4ddg_2(0,1,2,0)*t2_2(2,0)
+			      + t4ddg_2(0,1,2,1)*t2_2(2,1)
+			      + t4ddg_2(0,1,2,2)*t2_2(2,2))
+		,"T4ddg(i,j,k,l)*T2(j,l)(0,1)");
+  test_for_zero(t2s_1(0,2) - (t4ddg_2(0,2,0,0)*t2_2(0,0)
+			      + t4ddg_2(0,2,0,1)*t2_2(0,1)
+			      + t4ddg_2(0,2,0,2)*t2_2(0,2)
+			      + t4ddg_2(0,2,1,0)*t2_2(1,0)
+			      + t4ddg_2(0,2,1,1)*t2_2(1,1)
+			      + t4ddg_2(0,2,1,2)*t2_2(1,2)
+			      + t4ddg_2(0,2,2,0)*t2_2(2,0)
+			      + t4ddg_2(0,2,2,1)*t2_2(2,1)
+			      + t4ddg_2(0,2,2,2)*t2_2(2,2))
+		,"T4ddg(i,j,k,l)*T2(j,l)(0,2)");
+  test_for_zero(t2s_1(1,0) - (t4ddg_2(1,0,0,0)*t2_2(0,0)
+			      + t4ddg_2(1,0,0,1)*t2_2(0,1)
+			      + t4ddg_2(1,0,0,2)*t2_2(0,2)
+			      + t4ddg_2(1,0,1,0)*t2_2(1,0)
+			      + t4ddg_2(1,0,1,1)*t2_2(1,1)
+			      + t4ddg_2(1,0,1,2)*t2_2(1,2)
+			      + t4ddg_2(1,0,2,0)*t2_2(2,0)
+			      + t4ddg_2(1,0,2,1)*t2_2(2,1)
+			      + t4ddg_2(1,0,2,2)*t2_2(2,2))
+		,"T4ddg(i,j,k,l)*T2(j,l)(1,0)");
+  test_for_zero(t2s_1(1,1) - (t4ddg_2(1,1,0,0)*t2_2(0,0)
+			      + t4ddg_2(1,1,0,1)*t2_2(0,1)
+			      + t4ddg_2(1,1,0,2)*t2_2(0,2)
+			      + t4ddg_2(1,1,1,0)*t2_2(1,0)
+			      + t4ddg_2(1,1,1,1)*t2_2(1,1)
+			      + t4ddg_2(1,1,1,2)*t2_2(1,2)
+			      + t4ddg_2(1,1,2,0)*t2_2(2,0)
+			      + t4ddg_2(1,1,2,1)*t2_2(2,1)
+			      + t4ddg_2(1,1,2,2)*t2_2(2,2))
+		,"T4ddg(i,j,k,l)*T2(j,l)(1,1)");
+  test_for_zero(t2s_1(1,2) - (t4ddg_2(1,2,0,0)*t2_2(0,0)
+			      + t4ddg_2(1,2,0,1)*t2_2(0,1)
+			      + t4ddg_2(1,2,0,2)*t2_2(0,2)
+			      + t4ddg_2(1,2,1,0)*t2_2(1,0)
+			      + t4ddg_2(1,2,1,1)*t2_2(1,1)
+			      + t4ddg_2(1,2,1,2)*t2_2(1,2)
+			      + t4ddg_2(1,2,2,0)*t2_2(2,0)
+			      + t4ddg_2(1,2,2,1)*t2_2(2,1)
+			      + t4ddg_2(1,2,2,2)*t2_2(2,2))
+		,"T4ddg(i,j,k,l)*T2(j,l)(1,2)");
+  test_for_zero(t2s_1(2,0) - (t4ddg_2(2,0,0,0)*t2_2(0,0)
+			      + t4ddg_2(2,0,0,1)*t2_2(0,1)
+			      + t4ddg_2(2,0,0,2)*t2_2(0,2)
+			      + t4ddg_2(2,0,1,0)*t2_2(1,0)
+			      + t4ddg_2(2,0,1,1)*t2_2(1,1)
+			      + t4ddg_2(2,0,1,2)*t2_2(1,2)
+			      + t4ddg_2(2,0,2,0)*t2_2(2,0)
+			      + t4ddg_2(2,0,2,1)*t2_2(2,1)
+			      + t4ddg_2(2,0,2,2)*t2_2(2,2))
+		,"T4ddg(i,j,k,l)*T2(j,l)(2,0)");
+  test_for_zero(t2s_1(2,1) - (t4ddg_2(2,1,0,0)*t2_2(0,0)
+			      + t4ddg_2(2,1,0,1)*t2_2(0,1)
+			      + t4ddg_2(2,1,0,2)*t2_2(0,2)
+			      + t4ddg_2(2,1,1,0)*t2_2(1,0)
+			      + t4ddg_2(2,1,1,1)*t2_2(1,1)
+			      + t4ddg_2(2,1,1,2)*t2_2(1,2)
+			      + t4ddg_2(2,1,2,0)*t2_2(2,0)
+			      + t4ddg_2(2,1,2,1)*t2_2(2,1)
+			      + t4ddg_2(2,1,2,2)*t2_2(2,2))
+		,"T4ddg(i,j,k,l)*T2(j,l)(2,1)");
+  test_for_zero(t2s_1(2,2) - (t4ddg_2(2,2,0,0)*t2_2(0,0)
+			      + t4ddg_2(2,2,0,1)*t2_2(0,1)
+			      + t4ddg_2(2,2,0,2)*t2_2(0,2)
+			      + t4ddg_2(2,2,1,0)*t2_2(1,0)
+			      + t4ddg_2(2,2,1,1)*t2_2(1,1)
+			      + t4ddg_2(2,2,1,2)*t2_2(1,2)
+			      + t4ddg_2(2,2,2,0)*t2_2(2,0)
+			      + t4ddg_2(2,2,2,1)*t2_2(2,1)
+			      + t4ddg_2(2,2,2,2)*t2_2(2,2))
+		,"T4ddg(i,j,k,l)*T2(j,l)(2,2)");
+
+  t2s_1(i,k)=t2_3(j,l)*t4ddg_2(i,k,j,l);
+  test_for_zero(t2s_1(0,0) - (t4ddg_2(0,0,0,0)*t2_3(0,0)
+			      + t4ddg_2(0,0,0,1)*t2_3(0,1)
+			      + t4ddg_2(0,0,0,2)*t2_3(0,2)
+			      + t4ddg_2(0,0,1,0)*t2_3(1,0)
+			      + t4ddg_2(0,0,1,1)*t2_3(1,1)
+			      + t4ddg_2(0,0,1,2)*t2_3(1,2)
+			      + t4ddg_2(0,0,2,0)*t2_3(2,0)
+			      + t4ddg_2(0,0,2,1)*t2_3(2,1)
+			      + t4ddg_2(0,0,2,2)*t2_3(2,2))
+		,"T2(j,l)*T4ddg(i,j,k,l)(0,0)");
+  test_for_zero(t2s_1(0,1) - (t4ddg_2(0,1,0,0)*t2_3(0,0)
+			      + t4ddg_2(0,1,0,1)*t2_3(0,1)
+			      + t4ddg_2(0,1,0,2)*t2_3(0,2)
+			      + t4ddg_2(0,1,1,0)*t2_3(1,0)
+			      + t4ddg_2(0,1,1,1)*t2_3(1,1)
+			      + t4ddg_2(0,1,1,2)*t2_3(1,2)
+			      + t4ddg_2(0,1,2,0)*t2_3(2,0)
+			      + t4ddg_2(0,1,2,1)*t2_3(2,1)
+			      + t4ddg_2(0,1,2,2)*t2_3(2,2))
+		,"T2(j,l)*T4ddg(i,j,k,l)(0,1)");
+  test_for_zero(t2s_1(0,2) - (t4ddg_2(0,2,0,0)*t2_3(0,0)
+			      + t4ddg_2(0,2,0,1)*t2_3(0,1)
+			      + t4ddg_2(0,2,0,2)*t2_3(0,2)
+			      + t4ddg_2(0,2,1,0)*t2_3(1,0)
+			      + t4ddg_2(0,2,1,1)*t2_3(1,1)
+			      + t4ddg_2(0,2,1,2)*t2_3(1,2)
+			      + t4ddg_2(0,2,2,0)*t2_3(2,0)
+			      + t4ddg_2(0,2,2,1)*t2_3(2,1)
+			      + t4ddg_2(0,2,2,2)*t2_3(2,2))
+		,"T2(j,l)*T4ddg(i,j,k,l)(0,2)");
+  test_for_zero(t2s_1(1,0) - (t4ddg_2(1,0,0,0)*t2_3(0,0)
+			      + t4ddg_2(1,0,0,1)*t2_3(0,1)
+			      + t4ddg_2(1,0,0,2)*t2_3(0,2)
+			      + t4ddg_2(1,0,1,0)*t2_3(1,0)
+			      + t4ddg_2(1,0,1,1)*t2_3(1,1)
+			      + t4ddg_2(1,0,1,2)*t2_3(1,2)
+			      + t4ddg_2(1,0,2,0)*t2_3(2,0)
+			      + t4ddg_2(1,0,2,1)*t2_3(2,1)
+			      + t4ddg_2(1,0,2,2)*t2_3(2,2))
+		,"T2(j,l)*T4ddg(i,j,k,l)(1,0)");
+  test_for_zero(t2s_1(1,1) - (t4ddg_2(1,1,0,0)*t2_3(0,0)
+			      + t4ddg_2(1,1,0,1)*t2_3(0,1)
+			      + t4ddg_2(1,1,0,2)*t2_3(0,2)
+			      + t4ddg_2(1,1,1,0)*t2_3(1,0)
+			      + t4ddg_2(1,1,1,1)*t2_3(1,1)
+			      + t4ddg_2(1,1,1,2)*t2_3(1,2)
+			      + t4ddg_2(1,1,2,0)*t2_3(2,0)
+			      + t4ddg_2(1,1,2,1)*t2_3(2,1)
+			      + t4ddg_2(1,1,2,2)*t2_3(2,2))
+		,"T2(j,l)*T4ddg(i,j,k,l)(1,1)");
+  test_for_zero(t2s_1(1,2) - (t4ddg_2(1,2,0,0)*t2_3(0,0)
+			      + t4ddg_2(1,2,0,1)*t2_3(0,1)
+			      + t4ddg_2(1,2,0,2)*t2_3(0,2)
+			      + t4ddg_2(1,2,1,0)*t2_3(1,0)
+			      + t4ddg_2(1,2,1,1)*t2_3(1,1)
+			      + t4ddg_2(1,2,1,2)*t2_3(1,2)
+			      + t4ddg_2(1,2,2,0)*t2_3(2,0)
+			      + t4ddg_2(1,2,2,1)*t2_3(2,1)
+			      + t4ddg_2(1,2,2,2)*t2_3(2,2))
+		,"T2(j,l)*T4ddg(i,j,k,l)(1,2)");
+  test_for_zero(t2s_1(2,0) - (t4ddg_2(2,0,0,0)*t2_3(0,0)
+			      + t4ddg_2(2,0,0,1)*t2_3(0,1)
+			      + t4ddg_2(2,0,0,2)*t2_3(0,2)
+			      + t4ddg_2(2,0,1,0)*t2_3(1,0)
+			      + t4ddg_2(2,0,1,1)*t2_3(1,1)
+			      + t4ddg_2(2,0,1,2)*t2_3(1,2)
+			      + t4ddg_2(2,0,2,0)*t2_3(2,0)
+			      + t4ddg_2(2,0,2,1)*t2_3(2,1)
+			      + t4ddg_2(2,0,2,2)*t2_3(2,2))
+		,"T2(j,l)*T4ddg(i,j,k,l)(2,0)");
+  test_for_zero(t2s_1(2,1) - (t4ddg_2(2,1,0,0)*t2_3(0,0)
+			      + t4ddg_2(2,1,0,1)*t2_3(0,1)
+			      + t4ddg_2(2,1,0,2)*t2_3(0,2)
+			      + t4ddg_2(2,1,1,0)*t2_3(1,0)
+			      + t4ddg_2(2,1,1,1)*t2_3(1,1)
+			      + t4ddg_2(2,1,1,2)*t2_3(1,2)
+			      + t4ddg_2(2,1,2,0)*t2_3(2,0)
+			      + t4ddg_2(2,1,2,1)*t2_3(2,1)
+			      + t4ddg_2(2,1,2,2)*t2_3(2,2))
+		,"T2(j,l)*T4ddg(i,j,k,l)(2,1)");
+  test_for_zero(t2s_1(2,2) - (t4ddg_2(2,2,0,0)*t2_3(0,0)
+			      + t4ddg_2(2,2,0,1)*t2_3(0,1)
+			      + t4ddg_2(2,2,0,2)*t2_3(0,2)
+			      + t4ddg_2(2,2,1,0)*t2_3(1,0)
+			      + t4ddg_2(2,2,1,1)*t2_3(1,1)
+			      + t4ddg_2(2,2,1,2)*t2_3(1,2)
+			      + t4ddg_2(2,2,2,0)*t2_3(2,0)
+			      + t4ddg_2(2,2,2,1)*t2_3(2,1)
+			      + t4ddg_2(2,2,2,2)*t2_3(2,2))
+		,"T2(j,l)*T4ddg(i,j,k,l)(2,2)");
+
+
+  t2s_1(i,k)=t4ddg_2(i,k,j,l)*t2_2(l,j);
+  test_for_zero(t2s_1(0,0) - (t4ddg_2(0,0,0,0)*t2_2(0,0)
+			      + t4ddg_2(0,0,0,1)*t2_2(0,1)
+			      + t4ddg_2(0,0,0,2)*t2_2(0,2)
+			      + t4ddg_2(0,0,1,0)*t2_2(1,0)
+			      + t4ddg_2(0,0,1,1)*t2_2(1,1)
+			      + t4ddg_2(0,0,1,2)*t2_2(1,2)
+			      + t4ddg_2(0,0,2,0)*t2_2(2,0)
+			      + t4ddg_2(0,0,2,1)*t2_2(2,1)
+			      + t4ddg_2(0,0,2,2)*t2_2(2,2))
+		,"T4ddg(i,j,k,l)*T2(l,j)(0,0)");
+  test_for_zero(t2s_1(0,1) - (t4ddg_2(0,1,0,0)*t2_2(0,0)
+			      + t4ddg_2(0,1,0,1)*t2_2(0,1)
+			      + t4ddg_2(0,1,0,2)*t2_2(0,2)
+			      + t4ddg_2(0,1,1,0)*t2_2(1,0)
+			      + t4ddg_2(0,1,1,1)*t2_2(1,1)
+			      + t4ddg_2(0,1,1,2)*t2_2(1,2)
+			      + t4ddg_2(0,1,2,0)*t2_2(2,0)
+			      + t4ddg_2(0,1,2,1)*t2_2(2,1)
+			      + t4ddg_2(0,1,2,2)*t2_2(2,2))
+		,"T4ddg(i,j,k,l)*T2(l,j)(0,1)");
+  test_for_zero(t2s_1(0,2) - (t4ddg_2(0,2,0,0)*t2_2(0,0)
+			      + t4ddg_2(0,2,0,1)*t2_2(0,1)
+			      + t4ddg_2(0,2,0,2)*t2_2(0,2)
+			      + t4ddg_2(0,2,1,0)*t2_2(1,0)
+			      + t4ddg_2(0,2,1,1)*t2_2(1,1)
+			      + t4ddg_2(0,2,1,2)*t2_2(1,2)
+			      + t4ddg_2(0,2,2,0)*t2_2(2,0)
+			      + t4ddg_2(0,2,2,1)*t2_2(2,1)
+			      + t4ddg_2(0,2,2,2)*t2_2(2,2))
+		,"T4ddg(i,j,k,l)*T2(l,j)(0,2)");
+  test_for_zero(t2s_1(1,0) - (t4ddg_2(1,0,0,0)*t2_2(0,0)
+			      + t4ddg_2(1,0,0,1)*t2_2(0,1)
+			      + t4ddg_2(1,0,0,2)*t2_2(0,2)
+			      + t4ddg_2(1,0,1,0)*t2_2(1,0)
+			      + t4ddg_2(1,0,1,1)*t2_2(1,1)
+			      + t4ddg_2(1,0,1,2)*t2_2(1,2)
+			      + t4ddg_2(1,0,2,0)*t2_2(2,0)
+			      + t4ddg_2(1,0,2,1)*t2_2(2,1)
+			      + t4ddg_2(1,0,2,2)*t2_2(2,2))
+		,"T4ddg(i,j,k,l)*T2(l,j)(1,0)");
+  test_for_zero(t2s_1(1,1) - (t4ddg_2(1,1,0,0)*t2_2(0,0)
+			      + t4ddg_2(1,1,0,1)*t2_2(0,1)
+			      + t4ddg_2(1,1,0,2)*t2_2(0,2)
+			      + t4ddg_2(1,1,1,0)*t2_2(1,0)
+			      + t4ddg_2(1,1,1,1)*t2_2(1,1)
+			      + t4ddg_2(1,1,1,2)*t2_2(1,2)
+			      + t4ddg_2(1,1,2,0)*t2_2(2,0)
+			      + t4ddg_2(1,1,2,1)*t2_2(2,1)
+			      + t4ddg_2(1,1,2,2)*t2_2(2,2))
+		,"T4ddg(i,j,k,l)*T2(l,j)(1,1)");
+  test_for_zero(t2s_1(1,2) - (t4ddg_2(1,2,0,0)*t2_2(0,0)
+			      + t4ddg_2(1,2,0,1)*t2_2(0,1)
+			      + t4ddg_2(1,2,0,2)*t2_2(0,2)
+			      + t4ddg_2(1,2,1,0)*t2_2(1,0)
+			      + t4ddg_2(1,2,1,1)*t2_2(1,1)
+			      + t4ddg_2(1,2,1,2)*t2_2(1,2)
+			      + t4ddg_2(1,2,2,0)*t2_2(2,0)
+			      + t4ddg_2(1,2,2,1)*t2_2(2,1)
+			      + t4ddg_2(1,2,2,2)*t2_2(2,2))
+		,"T4ddg(i,j,k,l)*T2(l,j)(1,2)");
+  test_for_zero(t2s_1(2,0) - (t4ddg_2(2,0,0,0)*t2_2(0,0)
+			      + t4ddg_2(2,0,0,1)*t2_2(0,1)
+			      + t4ddg_2(2,0,0,2)*t2_2(0,2)
+			      + t4ddg_2(2,0,1,0)*t2_2(1,0)
+			      + t4ddg_2(2,0,1,1)*t2_2(1,1)
+			      + t4ddg_2(2,0,1,2)*t2_2(1,2)
+			      + t4ddg_2(2,0,2,0)*t2_2(2,0)
+			      + t4ddg_2(2,0,2,1)*t2_2(2,1)
+			      + t4ddg_2(2,0,2,2)*t2_2(2,2))
+		,"T4ddg(i,j,k,l)*T2(l,j)(2,0)");
+  test_for_zero(t2s_1(2,1) - (t4ddg_2(2,1,0,0)*t2_2(0,0)
+			      + t4ddg_2(2,1,0,1)*t2_2(0,1)
+			      + t4ddg_2(2,1,0,2)*t2_2(0,2)
+			      + t4ddg_2(2,1,1,0)*t2_2(1,0)
+			      + t4ddg_2(2,1,1,1)*t2_2(1,1)
+			      + t4ddg_2(2,1,1,2)*t2_2(1,2)
+			      + t4ddg_2(2,1,2,0)*t2_2(2,0)
+			      + t4ddg_2(2,1,2,1)*t2_2(2,1)
+			      + t4ddg_2(2,1,2,2)*t2_2(2,2))
+		,"T4ddg(i,j,k,l)*T2(l,j)(2,1)");
+  test_for_zero(t2s_1(2,2) - (t4ddg_2(2,2,0,0)*t2_2(0,0)
+			      + t4ddg_2(2,2,0,1)*t2_2(0,1)
+			      + t4ddg_2(2,2,0,2)*t2_2(0,2)
+			      + t4ddg_2(2,2,1,0)*t2_2(1,0)
+			      + t4ddg_2(2,2,1,1)*t2_2(1,1)
+			      + t4ddg_2(2,2,1,2)*t2_2(1,2)
+			      + t4ddg_2(2,2,2,0)*t2_2(2,0)
+			      + t4ddg_2(2,2,2,1)*t2_2(2,1)
+			      + t4ddg_2(2,2,2,2)*t2_2(2,2))
+		,"T4ddg(i,j,k,l)*T2(l,j)(2,2)");
+
+  t2s_1(i,k)=t2_3(l,j)*t4ddg_2(i,k,j,l);
+  test_for_zero(t2s_1(0,0) - (t4ddg_2(0,0,0,0)*t2_3(0,0)
+			      + t4ddg_2(0,0,0,1)*t2_3(0,1)
+			      + t4ddg_2(0,0,0,2)*t2_3(0,2)
+			      + t4ddg_2(0,0,1,0)*t2_3(1,0)
+			      + t4ddg_2(0,0,1,1)*t2_3(1,1)
+			      + t4ddg_2(0,0,1,2)*t2_3(1,2)
+			      + t4ddg_2(0,0,2,0)*t2_3(2,0)
+			      + t4ddg_2(0,0,2,1)*t2_3(2,1)
+			      + t4ddg_2(0,0,2,2)*t2_3(2,2))
+		,"T2(l,j)*T4ddg(i,j,k,l)(0,0)");
+  test_for_zero(t2s_1(0,1) - (t4ddg_2(0,1,0,0)*t2_3(0,0)
+			      + t4ddg_2(0,1,0,1)*t2_3(0,1)
+			      + t4ddg_2(0,1,0,2)*t2_3(0,2)
+			      + t4ddg_2(0,1,1,0)*t2_3(1,0)
+			      + t4ddg_2(0,1,1,1)*t2_3(1,1)
+			      + t4ddg_2(0,1,1,2)*t2_3(1,2)
+			      + t4ddg_2(0,1,2,0)*t2_3(2,0)
+			      + t4ddg_2(0,1,2,1)*t2_3(2,1)
+			      + t4ddg_2(0,1,2,2)*t2_3(2,2))
+		,"T2(l,j)*T4ddg(i,j,k,l)(0,1)");
+  test_for_zero(t2s_1(0,2) - (t4ddg_2(0,2,0,0)*t2_3(0,0)
+			      + t4ddg_2(0,2,0,1)*t2_3(0,1)
+			      + t4ddg_2(0,2,0,2)*t2_3(0,2)
+			      + t4ddg_2(0,2,1,0)*t2_3(1,0)
+			      + t4ddg_2(0,2,1,1)*t2_3(1,1)
+			      + t4ddg_2(0,2,1,2)*t2_3(1,2)
+			      + t4ddg_2(0,2,2,0)*t2_3(2,0)
+			      + t4ddg_2(0,2,2,1)*t2_3(2,1)
+			      + t4ddg_2(0,2,2,2)*t2_3(2,2))
+		,"T2(l,j)*T4ddg(i,j,k,l)(0,2)");
+  test_for_zero(t2s_1(1,0) - (t4ddg_2(1,0,0,0)*t2_3(0,0)
+			      + t4ddg_2(1,0,0,1)*t2_3(0,1)
+			      + t4ddg_2(1,0,0,2)*t2_3(0,2)
+			      + t4ddg_2(1,0,1,0)*t2_3(1,0)
+			      + t4ddg_2(1,0,1,1)*t2_3(1,1)
+			      + t4ddg_2(1,0,1,2)*t2_3(1,2)
+			      + t4ddg_2(1,0,2,0)*t2_3(2,0)
+			      + t4ddg_2(1,0,2,1)*t2_3(2,1)
+			      + t4ddg_2(1,0,2,2)*t2_3(2,2))
+		,"T2(l,j)*T4ddg(i,j,k,l)(1,0)");
+  test_for_zero(t2s_1(1,1) - (t4ddg_2(1,1,0,0)*t2_3(0,0)
+			      + t4ddg_2(1,1,0,1)*t2_3(0,1)
+			      + t4ddg_2(1,1,0,2)*t2_3(0,2)
+			      + t4ddg_2(1,1,1,0)*t2_3(1,0)
+			      + t4ddg_2(1,1,1,1)*t2_3(1,1)
+			      + t4ddg_2(1,1,1,2)*t2_3(1,2)
+			      + t4ddg_2(1,1,2,0)*t2_3(2,0)
+			      + t4ddg_2(1,1,2,1)*t2_3(2,1)
+			      + t4ddg_2(1,1,2,2)*t2_3(2,2))
+		,"T2(l,j)*T4ddg(i,j,k,l)(1,1)");
+  test_for_zero(t2s_1(1,2) - (t4ddg_2(1,2,0,0)*t2_3(0,0)
+			      + t4ddg_2(1,2,0,1)*t2_3(0,1)
+			      + t4ddg_2(1,2,0,2)*t2_3(0,2)
+			      + t4ddg_2(1,2,1,0)*t2_3(1,0)
+			      + t4ddg_2(1,2,1,1)*t2_3(1,1)
+			      + t4ddg_2(1,2,1,2)*t2_3(1,2)
+			      + t4ddg_2(1,2,2,0)*t2_3(2,0)
+			      + t4ddg_2(1,2,2,1)*t2_3(2,1)
+			      + t4ddg_2(1,2,2,2)*t2_3(2,2))
+		,"T2(l,j)*T4ddg(i,j,k,l)(1,2)");
+  test_for_zero(t2s_1(2,0) - (t4ddg_2(2,0,0,0)*t2_3(0,0)
+			      + t4ddg_2(2,0,0,1)*t2_3(0,1)
+			      + t4ddg_2(2,0,0,2)*t2_3(0,2)
+			      + t4ddg_2(2,0,1,0)*t2_3(1,0)
+			      + t4ddg_2(2,0,1,1)*t2_3(1,1)
+			      + t4ddg_2(2,0,1,2)*t2_3(1,2)
+			      + t4ddg_2(2,0,2,0)*t2_3(2,0)
+			      + t4ddg_2(2,0,2,1)*t2_3(2,1)
+			      + t4ddg_2(2,0,2,2)*t2_3(2,2))
+		,"T2(l,j)*T4ddg(i,j,k,l)(2,0)");
+  test_for_zero(t2s_1(2,1) - (t4ddg_2(2,1,0,0)*t2_3(0,0)
+			      + t4ddg_2(2,1,0,1)*t2_3(0,1)
+			      + t4ddg_2(2,1,0,2)*t2_3(0,2)
+			      + t4ddg_2(2,1,1,0)*t2_3(1,0)
+			      + t4ddg_2(2,1,1,1)*t2_3(1,1)
+			      + t4ddg_2(2,1,1,2)*t2_3(1,2)
+			      + t4ddg_2(2,1,2,0)*t2_3(2,0)
+			      + t4ddg_2(2,1,2,1)*t2_3(2,1)
+			      + t4ddg_2(2,1,2,2)*t2_3(2,2))
+		,"T2(l,j)*T4ddg(i,j,k,l)(2,1)");
+  test_for_zero(t2s_1(2,2) - (t4ddg_2(2,2,0,0)*t2_3(0,0)
+			      + t4ddg_2(2,2,0,1)*t2_3(0,1)
+			      + t4ddg_2(2,2,0,2)*t2_3(0,2)
+			      + t4ddg_2(2,2,1,0)*t2_3(1,0)
+			      + t4ddg_2(2,2,1,1)*t2_3(1,1)
+			      + t4ddg_2(2,2,1,2)*t2_3(1,2)
+			      + t4ddg_2(2,2,2,0)*t2_3(2,0)
+			      + t4ddg_2(2,2,2,1)*t2_3(2,1)
+			      + t4ddg_2(2,2,2,2)*t2_3(2,2))
+		,"T2(l,j)*T4ddg(i,j,k,l)(2,2)");
+
+  t3dg_1(i,j,k)=t4ddg_2(i,j,l,k)*t1_2(l);
+  test_for_zero(t3dg_1(0,0,0) - (t4ddg_2(0,0,0,0)*t1_2(0)
+				 + t4ddg_2(0,0,1,0)*t1_2(1)
+				 + t4ddg_2(0,0,2,0)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(0,0,0)");
+  test_for_zero(t3dg_1(0,0,1) - (t4ddg_2(0,0,0,1)*t1_2(0)
+				 + t4ddg_2(0,0,1,1)*t1_2(1)
+				 + t4ddg_2(0,0,2,1)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(0,0,1)");
+  test_for_zero(t3dg_1(0,0,2) - (t4ddg_2(0,0,0,2)*t1_2(0)
+				 + t4ddg_2(0,0,1,2)*t1_2(1)
+				 + t4ddg_2(0,0,2,2)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(0,0,2)");
+  test_for_zero(t3dg_1(0,1,0) - (t4ddg_2(0,1,0,0)*t1_2(0)
+				 + t4ddg_2(0,1,1,0)*t1_2(1)
+				 + t4ddg_2(0,1,2,0)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(0,1,0)");
+  test_for_zero(t3dg_1(0,1,1) - (t4ddg_2(0,1,0,1)*t1_2(0)
+				 + t4ddg_2(0,1,1,1)*t1_2(1)
+				 + t4ddg_2(0,1,2,1)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(0,1,1)");
+  test_for_zero(t3dg_1(0,1,2) - (t4ddg_2(0,1,0,2)*t1_2(0)
+				 + t4ddg_2(0,1,1,2)*t1_2(1)
+				 + t4ddg_2(0,1,2,2)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(0,1,2)");
+  test_for_zero(t3dg_1(0,2,0) - (t4ddg_2(0,2,0,0)*t1_2(0)
+				 + t4ddg_2(0,2,1,0)*t1_2(1)
+				 + t4ddg_2(0,2,2,0)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(0,2,0)");
+  test_for_zero(t3dg_1(0,2,1) - (t4ddg_2(0,2,0,1)*t1_2(0)
+				 + t4ddg_2(0,2,1,1)*t1_2(1)
+				 + t4ddg_2(0,2,2,1)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(0,2,1)");
+  test_for_zero(t3dg_1(0,2,2) - (t4ddg_2(0,2,0,2)*t1_2(0)
+				 + t4ddg_2(0,2,1,2)*t1_2(1)
+				 + t4ddg_2(0,2,2,2)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(0,2,2)");
+  test_for_zero(t3dg_1(1,0,0) - (t4ddg_2(1,0,0,0)*t1_2(0)
+				 + t4ddg_2(1,0,1,0)*t1_2(1)
+				 + t4ddg_2(1,0,2,0)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(1,0,0)");
+  test_for_zero(t3dg_1(1,0,1) - (t4ddg_2(1,0,0,1)*t1_2(0)
+				 + t4ddg_2(1,0,1,1)*t1_2(1)
+				 + t4ddg_2(1,0,2,1)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(1,0,1)");
+  test_for_zero(t3dg_1(1,0,2) - (t4ddg_2(1,0,0,2)*t1_2(0)
+				 + t4ddg_2(1,0,1,2)*t1_2(1)
+				 + t4ddg_2(1,0,2,2)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(1,0,2)");
+  test_for_zero(t3dg_1(1,1,0) - (t4ddg_2(1,1,0,0)*t1_2(0)
+				 + t4ddg_2(1,1,1,0)*t1_2(1)
+				 + t4ddg_2(1,1,2,0)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - (t4ddg_2(1,1,0,1)*t1_2(0)
+				 + t4ddg_2(1,1,1,1)*t1_2(1)
+				 + t4ddg_2(1,1,2,1)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(1,1,1)");
+  test_for_zero(t3dg_1(1,1,2) - (t4ddg_2(1,1,0,2)*t1_2(0)
+				 + t4ddg_2(1,1,1,2)*t1_2(1)
+				 + t4ddg_2(1,1,2,2)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(1,1,2)");
+  test_for_zero(t3dg_1(1,2,0) - (t4ddg_2(1,2,0,0)*t1_2(0)
+				 + t4ddg_2(1,2,1,0)*t1_2(1)
+				 + t4ddg_2(1,2,2,0)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(1,2,0)");
+  test_for_zero(t3dg_1(1,2,1) - (t4ddg_2(1,2,0,1)*t1_2(0)
+				 + t4ddg_2(1,2,1,1)*t1_2(1)
+				 + t4ddg_2(1,2,2,1)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(1,2,1)");
+  test_for_zero(t3dg_1(1,2,2) - (t4ddg_2(1,2,0,2)*t1_2(0)
+				 + t4ddg_2(1,2,1,2)*t1_2(1)
+				 + t4ddg_2(1,2,2,2)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(1,2,2)");
+  test_for_zero(t3dg_1(2,0,0) - (t4ddg_2(2,0,0,0)*t1_2(0)
+				 + t4ddg_2(2,0,1,0)*t1_2(1)
+				 + t4ddg_2(2,0,2,0)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(2,0,0)");
+  test_for_zero(t3dg_1(2,0,1) - (t4ddg_2(2,0,0,1)*t1_2(0)
+				 + t4ddg_2(2,0,1,1)*t1_2(1)
+				 + t4ddg_2(2,0,2,1)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(2,0,1)");
+  test_for_zero(t3dg_1(2,0,2) - (t4ddg_2(2,0,0,2)*t1_2(0)
+				 + t4ddg_2(2,0,1,2)*t1_2(1)
+				 + t4ddg_2(2,0,2,2)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(2,0,2)");
+  test_for_zero(t3dg_1(2,1,0) - (t4ddg_2(2,1,0,0)*t1_2(0)
+				 + t4ddg_2(2,1,1,0)*t1_2(1)
+				 + t4ddg_2(2,1,2,0)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(2,1,0)");
+  test_for_zero(t3dg_1(2,1,1) - (t4ddg_2(2,1,0,1)*t1_2(0)
+				 + t4ddg_2(2,1,1,1)*t1_2(1)
+				 + t4ddg_2(2,1,2,1)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(2,1,1)");
+  test_for_zero(t3dg_1(2,1,2) - (t4ddg_2(2,1,0,2)*t1_2(0)
+				 + t4ddg_2(2,1,1,2)*t1_2(1)
+				 + t4ddg_2(2,1,2,2)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(2,1,2)");
+  test_for_zero(t3dg_1(2,2,0) - (t4ddg_2(2,2,0,0)*t1_2(0)
+				 + t4ddg_2(2,2,1,0)*t1_2(1)
+				 + t4ddg_2(2,2,2,0)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(2,2,0)");
+  test_for_zero(t3dg_1(2,2,1) - (t4ddg_2(2,2,0,1)*t1_2(0)
+				 + t4ddg_2(2,2,1,1)*t1_2(1)
+				 + t4ddg_2(2,2,2,1)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - (t4ddg_2(2,2,0,2)*t1_2(0)
+				 + t4ddg_2(2,2,1,2)*t1_2(1)
+				 + t4ddg_2(2,2,2,2)*t1_2(2))
+		,"T4ddg(i,j,l,k)*T1(l)(2,2,2)");
+  cout << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T4ddg/test_T4ddgV.C
--- a/tests/conformance/T4ddg/test_T4ddgV.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1808 +0,0 @@
-#include <iostream>
-#include "../../../FTensor.h"
-#include "../test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T4ddgV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-		Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-		Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-		const Tensor2<double,3,3> &t2_3,
-		Tensor2_symmetric<double,3> &t2s_1,
-		const Tensor2_symmetric<double,3> &t2s_2,
-		const Tensor2_symmetric<double,3> &t2s_3,
-		Tensor3_dg<double,3,3> &t3dg_1,
-		const Tensor3_dg<double,3,3> &t3dg_2,
-		const Tensor3_dg<double,3,3> &t3dg_3,
-		Tensor3_christof<double,3,3> &t3ch_1,
-		const Tensor3_christof<double,3,3> &t3ch_2,
-		const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  Tensor4_ddg<double,3,3> t4ddg_1, t4ddg_2, t4ddg_3;
-
-  /* T4_ddg(1,1,i,j)=T2s(i,j) */
-
-  Tensor1<double,3> t1_3;
-  t1_3(i)=t1_1(j)*t2_1(i,j);
-
-  t4ddg_1(N0,N0,i,j)=(t1_1(i)^t1_1(j));
-  t4ddg_1(N0,N1,i,j)=t2s_1(i,j);
-  t4ddg_1(N0,N2,i,j)=(t1_3(i)^t1_3(j));
-  t4ddg_1(N1,N1,i,j)=t2s_2(i,j);
-  t4ddg_1(N1,N2,i,j)=(t1_2(i)^t1_2(j));
-  t4ddg_1(N2,N2,i,j)=t2s_3(i,j);
-
-  test_for_zero(t4ddg_1(0,0,0,0) - (t1_1(0)*t1_1(0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,0,0,0)");
-  test_for_zero(t4ddg_1(0,0,0,1) - (t1_1(0)*t1_1(1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,0,0,1)");
-  test_for_zero(t4ddg_1(0,0,0,2) - (t1_1(0)*t1_1(2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,0,0,2)");
-  test_for_zero(t4ddg_1(0,0,1,0) - (t1_1(1)*t1_1(0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,0,1,0)");
-  test_for_zero(t4ddg_1(0,0,1,1) - (t1_1(1)*t1_1(1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,0,1,1)");
-  test_for_zero(t4ddg_1(0,0,1,2) - (t1_1(1)*t1_1(2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,0,1,2)");
-  test_for_zero(t4ddg_1(0,0,2,0) - (t1_1(2)*t1_1(0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,0,2,0)");
-  test_for_zero(t4ddg_1(0,0,2,1) - (t1_1(2)*t1_1(1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,0,2,1)");
-  test_for_zero(t4ddg_1(0,0,2,2) - (t1_1(2)*t1_1(2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,0,2,2)");
-  test_for_zero(t4ddg_1(0,1,0,0) - (t2s_1(0,0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,1,0,0)");
-  test_for_zero(t4ddg_1(0,1,0,1) - (t2s_1(0,1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,1,0,1)");
-  test_for_zero(t4ddg_1(0,1,0,2) - (t2s_1(0,2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,1,0,2)");
-  test_for_zero(t4ddg_1(0,1,1,0) - (t2s_1(1,0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,1,1,0)");
-  test_for_zero(t4ddg_1(0,1,1,1) - (t2s_1(1,1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,1,1,1)");
-  test_for_zero(t4ddg_1(0,1,1,2) - (t2s_1(1,2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,1,1,2)");
-  test_for_zero(t4ddg_1(0,1,2,0) - (t2s_1(2,0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,1,2,0)");
-  test_for_zero(t4ddg_1(0,1,2,1) - (t2s_1(2,1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,1,2,1)");
-  test_for_zero(t4ddg_1(0,1,2,2) - (t2s_1(2,2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,1,2,2)");
-  test_for_zero((t4ddg_1(0,2,0,0) - (t1_3(0)*t1_3(0)))/t4ddg_1(0,2,0,0)
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,2,0,0)");
-  test_for_zero((t4ddg_1(0,2,0,1) - (t1_3(0)*t1_3(1)))/t4ddg_1(0,2,0,1)
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,2,0,1)");
-  test_for_zero((t4ddg_1(0,2,0,2) - (t1_3(0)*t1_3(2)))/t4ddg_1(0,2,0,2)
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,2,0,2)");
-  test_for_zero((t4ddg_1(0,2,1,0) - (t1_3(1)*t1_3(0)))/t4ddg_1(0,2,1,0)
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,2,1,0)");
-  test_for_zero((t4ddg_1(0,2,1,1) - (t1_3(1)*t1_3(1)))/t4ddg_1(0,2,1,1)
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,2,1,1)");
-  test_for_zero((t4ddg_1(0,2,1,2) - (t1_3(1)*t1_3(2)))/t4ddg_1(0,2,1,2)
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,2,1,2)");
-  test_for_zero((t4ddg_1(0,2,2,0) - (t1_3(2)*t1_3(0)))/t4ddg_1(0,2,2,0)
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,2,2,0)");
-  test_for_zero((t4ddg_1(0,2,2,1) - (t1_3(2)*t1_3(1)))/t4ddg_1(0,2,2,1)
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,2,2,1)");
-  test_for_zero((t4ddg_1(0,2,2,2) - (t1_3(2)*t1_3(2)))/t4ddg_1(0,2,2,2)
-		,"T4ddg(N,N,i,j)=T2s(i,j)(0,2,2,2)");
-  test_for_zero(t4ddg_1(1,0,0,0) - (t2s_1(0,0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,0,0,0)");
-  test_for_zero(t4ddg_1(1,0,0,1) - (t2s_1(0,1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,0,0,1)");
-  test_for_zero(t4ddg_1(1,0,0,2) - (t2s_1(0,2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,0,0,2)");
-  test_for_zero(t4ddg_1(1,0,1,0) - (t2s_1(1,0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,0,1,0)");
-  test_for_zero(t4ddg_1(1,0,1,1) - (t2s_1(1,1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,0,1,1)");
-  test_for_zero(t4ddg_1(1,0,1,2) - (t2s_1(1,2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,0,1,2)");
-  test_for_zero(t4ddg_1(1,0,2,0) - (t2s_1(2,0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,0,2,0)");
-  test_for_zero(t4ddg_1(1,0,2,1) - (t2s_1(2,1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,0,2,1)");
-  test_for_zero(t4ddg_1(1,0,2,2) - (t2s_1(2,2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,0,2,2)");
-  test_for_zero(t4ddg_1(1,1,0,0) - (t2s_2(0,0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,1,0,0)");
-  test_for_zero(t4ddg_1(1,1,0,1) - (t2s_2(0,1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,1,0,1)");
-  test_for_zero(t4ddg_1(1,1,0,2) - (t2s_2(0,2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,1,0,2)");
-  test_for_zero(t4ddg_1(1,1,1,0) - (t2s_2(1,0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,1) - (t2s_2(1,1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,1,1,1)");
-  test_for_zero(t4ddg_1(1,1,1,2) - (t2s_2(1,2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,1,1,2)");
-  test_for_zero(t4ddg_1(1,1,2,0) - (t2s_2(2,0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,1,2,0)");
-  test_for_zero(t4ddg_1(1,1,2,1) - (t2s_2(2,1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,1,2,1)");
-  test_for_zero(t4ddg_1(1,1,2,2) - (t2s_2(2,2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,1,2,2)");
-  test_for_zero(t4ddg_1(1,2,0,0) - (t1_2(0)*t1_2(0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,2,0,0)");
-  test_for_zero(t4ddg_1(1,2,0,1) - (t1_2(0)*t1_2(1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,2,0,1)");
-  test_for_zero(t4ddg_1(1,2,0,2) - (t1_2(0)*t1_2(2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,2,0,2)");
-  test_for_zero(t4ddg_1(1,2,1,0) - (t1_2(1)*t1_2(0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,2,1,0)");
-  test_for_zero(t4ddg_1(1,2,1,1) - (t1_2(1)*t1_2(1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,2,1,1)");
-  test_for_zero(t4ddg_1(1,2,1,2) - (t1_2(1)*t1_2(2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,2,1,2)");
-  test_for_zero(t4ddg_1(1,2,2,0) - (t1_2(2)*t1_2(0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,2,2,0)");
-  test_for_zero(t4ddg_1(1,2,2,1) - (t1_2(2)*t1_2(1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,2,2,1)");
-  test_for_zero(t4ddg_1(1,2,2,2) - (t1_2(2)*t1_2(2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(1,2,2,2)");
-  test_for_zero((t4ddg_1(2,0,0,0) - (t1_3(0)*t1_3(0)))/t4ddg_1(2,0,0,0)
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,0,0,0)");
-  test_for_zero((t4ddg_1(2,0,0,1) - (t1_3(0)*t1_3(1)))/t4ddg_1(2,0,0,1)
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,0,0,1)");
-  test_for_zero((t4ddg_1(2,0,0,2) - (t1_3(0)*t1_3(2)))/t4ddg_1(2,0,0,2)
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,0,0,2)");
-  test_for_zero((t4ddg_1(2,0,1,0) - (t1_3(1)*t1_3(0)))/t4ddg_1(2,0,1,0)
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,0,1,0)");
-  test_for_zero((t4ddg_1(2,0,1,1) - (t1_3(1)*t1_3(1)))/t4ddg_1(2,0,1,1)
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,0,1,1)");
-  test_for_zero((t4ddg_1(2,0,1,2) - (t1_3(1)*t1_3(2)))/t4ddg_1(2,0,1,2)
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,0,1,2)");
-  test_for_zero((t4ddg_1(2,0,2,0) - (t1_3(2)*t1_3(0)))/t4ddg_1(2,0,2,0)
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,0,2,0)");
-  test_for_zero((t4ddg_1(2,0,2,1) - (t1_3(2)*t1_3(1)))/t4ddg_1(2,0,2,1)
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,0,2,1)");
-  test_for_zero((t4ddg_1(2,0,2,2) - (t1_3(2)*t1_3(2)))/t4ddg_1(2,0,2,2)
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,0,2,2)");
-  test_for_zero(t4ddg_1(2,1,0,0) - (t1_2(0)*t1_2(0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,1,0,0)");
-  test_for_zero(t4ddg_1(2,1,0,1) - (t1_2(0)*t1_2(1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,1,0,1)");
-  test_for_zero(t4ddg_1(2,1,0,2) - (t1_2(0)*t1_2(2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,1,0,2)");
-  test_for_zero(t4ddg_1(2,1,1,0) - (t1_2(1)*t1_2(0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,1,1,0)");
-  test_for_zero(t4ddg_1(2,1,1,1) - (t1_2(1)*t1_2(1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,1,1,1)");
-  test_for_zero(t4ddg_1(2,1,1,2) - (t1_2(1)*t1_2(2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,1,1,2)");
-  test_for_zero(t4ddg_1(2,1,2,0) - (t1_2(2)*t1_2(0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,1,2,0)");
-  test_for_zero(t4ddg_1(2,1,2,1) - (t1_2(2)*t1_2(1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,1,2,1)");
-  test_for_zero(t4ddg_1(2,1,2,2) - (t1_2(2)*t1_2(2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,1,2,2)");
-  test_for_zero(t4ddg_1(2,2,0,0) - (t2s_3(0,0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,2,0,0)");
-  test_for_zero(t4ddg_1(2,2,0,1) - (t2s_3(0,1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,2,0,1)");
-  test_for_zero(t4ddg_1(2,2,0,2) - (t2s_3(0,2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,2,0,2)");
-  test_for_zero(t4ddg_1(2,2,1,0) - (t2s_3(1,0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,2,1,0)");
-  test_for_zero(t4ddg_1(2,2,1,1) - (t2s_3(1,1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,2,1,1)");
-  test_for_zero(t4ddg_1(2,2,1,2) - (t2s_3(1,2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,2,1,2)");
-  test_for_zero(t4ddg_1(2,2,2,0) - (t2s_3(2,0))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,2,2,0)");
-  test_for_zero(t4ddg_1(2,2,2,1) - (t2s_3(2,1))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,2) - (t2s_3(2,2))
-		,"T4ddg(N,N,i,j)=T2s(i,j)(2,2,2,2)");
-
-  t4ddg_2(i,j,k,l)=13*t4ddg_1(i,j,k,l);
-  test_for_zero(t4ddg_2(0,0,0,0) - 13*(t1_1(0)*t1_1(0))
-		,"T*T4ddg(0,0,0,0)");
-  test_for_zero(t4ddg_2(0,0,0,1) - 13*(t1_1(0)*t1_1(1))
-		,"T*T4ddg(0,0,0,1)");
-  test_for_zero(t4ddg_2(0,0,0,2) - 13*(t1_1(0)*t1_1(2))
-		,"T*T4ddg(0,0,0,2)");
-  test_for_zero(t4ddg_2(0,0,1,0) - 13*(t1_1(1)*t1_1(0))
-		,"T*T4ddg(0,0,1,0)");
-  test_for_zero(t4ddg_2(0,0,1,1) - 13*(t1_1(1)*t1_1(1))
-		,"T*T4ddg(0,0,1,1)");
-  test_for_zero(t4ddg_2(0,0,1,2) - 13*(t1_1(1)*t1_1(2))
-		,"T*T4ddg(0,0,1,2)");
-  test_for_zero(t4ddg_2(0,0,2,0) - 13*(t1_1(2)*t1_1(0))
-		,"T*T4ddg(0,0,2,0)");
-  test_for_zero(t4ddg_2(0,0,2,1) - 13*(t1_1(2)*t1_1(1))
-		,"T*T4ddg(0,0,2,1)");
-  test_for_zero(t4ddg_2(0,0,2,2) - 13*(t1_1(2)*t1_1(2))
-		,"T*T4ddg(0,0,2,2)");
-  test_for_zero(t4ddg_2(0,1,0,0) - 13*(t2s_1(0,0))
-		,"T*T4ddg(0,1,0,0)");
-  test_for_zero(t4ddg_2(0,1,0,1) - 13*(t2s_1(0,1))
-		,"T*T4ddg(0,1,0,1)");
-  test_for_zero(t4ddg_2(0,1,0,2) - 13*(t2s_1(0,2))
-		,"T*T4ddg(0,1,0,2)");
-  test_for_zero(t4ddg_2(0,1,1,0) - 13*(t2s_1(1,0))
-		,"T*T4ddg(0,1,1,0)");
-  test_for_zero(t4ddg_2(0,1,1,1) - 13*(t2s_1(1,1))
-		,"T*T4ddg(0,1,1,1)");
-  test_for_zero(t4ddg_2(0,1,1,2) - 13*(t2s_1(1,2))
-		,"T*T4ddg(0,1,1,2)");
-  test_for_zero(t4ddg_2(0,1,2,0) - 13*(t2s_1(2,0))
-		,"T*T4ddg(0,1,2,0)");
-  test_for_zero(t4ddg_2(0,1,2,1) - 13*(t2s_1(2,1))
-		,"T*T4ddg(0,1,2,1)");
-  test_for_zero(t4ddg_2(0,1,2,2) - 13*(t2s_1(2,2))
-		,"T*T4ddg(0,1,2,2)");
-  test_for_zero((t4ddg_2(0,2,0,0) - 13*(t1_3(0)*t1_3(0)))/t4ddg_2(0,2,0,0)
-		,"T*T4ddg(0,2,0,0)");
-  test_for_zero((t4ddg_2(0,2,0,1) - 13*(t1_3(0)*t1_3(1)))/t4ddg_2(0,2,0,1)
-		,"T*T4ddg(0,2,0,1)");
-  test_for_zero((t4ddg_2(0,2,0,2) - 13*(t1_3(0)*t1_3(2)))/t4ddg_2(0,2,0,2)
-		,"T*T4ddg(0,2,0,2)");
-  test_for_zero((t4ddg_2(0,2,1,0) - 13*(t1_3(1)*t1_3(0)))/t4ddg_2(0,2,1,0)
-		,"T*T4ddg(0,2,1,0)");
-  test_for_zero((t4ddg_2(0,2,1,1) - 13*(t1_3(1)*t1_3(1)))/t4ddg_2(0,2,1,1)
-		,"T*T4ddg(0,2,1,1)");
-  test_for_zero((t4ddg_2(0,2,1,2) - 13*(t1_3(1)*t1_3(2)))/t4ddg_2(0,2,1,2)
-		,"T*T4ddg(0,2,1,2)");
-  test_for_zero((t4ddg_2(0,2,2,0) - 13*(t1_3(2)*t1_3(0)))/t4ddg_2(0,2,2,0)
-		,"T*T4ddg(0,2,2,0)");
-  test_for_zero((t4ddg_2(0,2,2,1) - 13*(t1_3(2)*t1_3(1)))/t4ddg_2(0,2,2,1)
-		,"T*T4ddg(0,2,2,1)");
-  test_for_zero((t4ddg_2(0,2,2,2) - 13*(t1_3(2)*t1_3(2)))/t4ddg_2(0,2,2,2)
-		,"T*T4ddg(0,2,2,2)");
-  test_for_zero(t4ddg_2(1,0,0,0) - 13*(t2s_1(0,0))
-		,"T*T4ddg(1,0,0,0)");
-  test_for_zero(t4ddg_2(1,0,0,1) - 13*(t2s_1(0,1))
-		,"T*T4ddg(1,0,0,1)");
-  test_for_zero(t4ddg_2(1,0,0,2) - 13*(t2s_1(0,2))
-		,"T*T4ddg(1,0,0,2)");
-  test_for_zero(t4ddg_2(1,0,1,0) - 13*(t2s_1(1,0))
-		,"T*T4ddg(1,0,1,0)");
-  test_for_zero(t4ddg_2(1,0,1,1) - 13*(t2s_1(1,1))
-		,"T*T4ddg(1,0,1,1)");
-  test_for_zero(t4ddg_2(1,0,1,2) - 13*(t2s_1(1,2))
-		,"T*T4ddg(1,0,1,2)");
-  test_for_zero(t4ddg_2(1,0,2,0) - 13*(t2s_1(2,0))
-		,"T*T4ddg(1,0,2,0)");
-  test_for_zero(t4ddg_2(1,0,2,1) - 13*(t2s_1(2,1))
-		,"T*T4ddg(1,0,2,1)");
-  test_for_zero(t4ddg_2(1,0,2,2) - 13*(t2s_1(2,2))
-		,"T*T4ddg(1,0,2,2)");
-  test_for_zero(t4ddg_2(1,1,0,0) - 13*(t2s_2(0,0))
-		,"T*T4ddg(1,1,0,0)");
-  test_for_zero(t4ddg_2(1,1,0,1) - 13*(t2s_2(0,1))
-		,"T*T4ddg(1,1,0,1)");
-  test_for_zero(t4ddg_2(1,1,0,2) - 13*(t2s_2(0,2))
-		,"T*T4ddg(1,1,0,2)");
-  test_for_zero(t4ddg_2(1,1,1,0) - 13*(t2s_2(1,0))
-		,"T*T4ddg(1,1,1,0)");
-  test_for_zero(t4ddg_2(1,1,1,1) - 13*(t2s_2(1,1))
-		,"T*T4ddg(1,1,1,1)");
-  test_for_zero(t4ddg_2(1,1,1,2) - 13*(t2s_2(1,2))
-		,"T*T4ddg(1,1,1,2)");
-  test_for_zero(t4ddg_2(1,1,2,0) - 13*(t2s_2(2,0))
-		,"T*T4ddg(1,1,2,0)");
-  test_for_zero(t4ddg_2(1,1,2,1) - 13*(t2s_2(2,1))
-		,"T*T4ddg(1,1,2,1)");
-  test_for_zero(t4ddg_2(1,1,2,2) - 13*(t2s_2(2,2))
-		,"T*T4ddg(1,1,2,2)");
-  test_for_zero(t4ddg_2(1,2,0,0) - 13*(t1_2(0)*t1_2(0))
-		,"T*T4ddg(1,2,0,0)");
-  test_for_zero(t4ddg_2(1,2,0,1) - 13*(t1_2(0)*t1_2(1))
-		,"T*T4ddg(1,2,0,1)");
-  test_for_zero(t4ddg_2(1,2,0,2) - 13*(t1_2(0)*t1_2(2))
-		,"T*T4ddg(1,2,0,2)");
-  test_for_zero(t4ddg_2(1,2,1,0) - 13*(t1_2(1)*t1_2(0))
-		,"T*T4ddg(1,2,1,0)");
-  test_for_zero(t4ddg_2(1,2,1,1) - 13*(t1_2(1)*t1_2(1))
-		,"T*T4ddg(1,2,1,1)");
-  test_for_zero(t4ddg_2(1,2,1,2) - 13*(t1_2(1)*t1_2(2))
-		,"T*T4ddg(1,2,1,2)");
-  test_for_zero(t4ddg_2(1,2,2,0) - 13*(t1_2(2)*t1_2(0))
-		,"T*T4ddg(1,2,2,0)");
-  test_for_zero(t4ddg_2(1,2,2,1) - 13*(t1_2(2)*t1_2(1))
-		,"T*T4ddg(1,2,2,1)");
-  test_for_zero(t4ddg_2(1,2,2,2) - 13*(t1_2(2)*t1_2(2))
-		,"T*T4ddg(1,2,2,2)");
-  test_for_zero((t4ddg_2(2,0,0,0) - 13*(t1_3(0)*t1_3(0)))/t4ddg_2(2,0,0,0)
-		,"T*T4ddg(2,0,0,0)");
-  test_for_zero((t4ddg_2(2,0,0,1) - 13*(t1_3(0)*t1_3(1)))/t4ddg_2(2,0,0,1)
-		,"T*T4ddg(2,0,0,1)");
-  test_for_zero((t4ddg_2(2,0,0,2) - 13*(t1_3(0)*t1_3(2)))/t4ddg_2(2,0,0,2)
-		,"T*T4ddg(2,0,0,2)");
-  test_for_zero((t4ddg_2(2,0,1,0) - 13*(t1_3(1)*t1_3(0)))/t4ddg_2(2,0,1,0)
-		,"T*T4ddg(2,0,1,0)");
-  test_for_zero((t4ddg_2(2,0,1,1) - 13*(t1_3(1)*t1_3(1)))/t4ddg_2(2,0,1,1)
-		,"T*T4ddg(2,0,1,1)");
-  test_for_zero((t4ddg_2(2,0,1,2) - 13*(t1_3(1)*t1_3(2)))/t4ddg_2(2,0,1,2)
-		,"T*T4ddg(2,0,1,2)");
-  test_for_zero((t4ddg_2(2,0,2,0) - 13*(t1_3(2)*t1_3(0)))/t4ddg_2(2,0,2,0)
-		,"T*T4ddg(2,0,2,0)");
-  test_for_zero((t4ddg_2(2,0,2,1) - 13*(t1_3(2)*t1_3(1)))/t4ddg_2(2,0,2,1)
-		,"T*T4ddg(2,0,2,1)");
-  test_for_zero((t4ddg_2(2,0,2,2) - 13*(t1_3(2)*t1_3(2)))/t4ddg_2(2,0,2,2)
-		,"T*T4ddg(2,0,2,2)");
-  test_for_zero(t4ddg_2(2,1,0,0) - 13*(t1_2(0)*t1_2(0))
-		,"T*T4ddg(2,1,0,0)");
-  test_for_zero(t4ddg_2(2,1,0,1) - 13*(t1_2(0)*t1_2(1))
-		,"T*T4ddg(2,1,0,1)");
-  test_for_zero(t4ddg_2(2,1,0,2) - 13*(t1_2(0)*t1_2(2))
-		,"T*T4ddg(2,1,0,2)");
-  test_for_zero(t4ddg_2(2,1,1,0) - 13*(t1_2(1)*t1_2(0))
-		,"T*T4ddg(2,1,1,0)");
-  test_for_zero(t4ddg_2(2,1,1,1) - 13*(t1_2(1)*t1_2(1))
-		,"T*T4ddg(2,1,1,1)");
-  test_for_zero(t4ddg_2(2,1,1,2) - 13*(t1_2(1)*t1_2(2))
-		,"T*T4ddg(2,1,1,2)");
-  test_for_zero(t4ddg_2(2,1,2,0) - 13*(t1_2(2)*t1_2(0))
-		,"T*T4ddg(2,1,2,0)");
-  test_for_zero(t4ddg_2(2,1,2,1) - 13*(t1_2(2)*t1_2(1))
-		,"T*T4ddg(2,1,2,1)");
-  test_for_zero(t4ddg_2(2,1,2,2) - 13*(t1_2(2)*t1_2(2))
-		,"T*T4ddg(2,1,2,2)");
-  test_for_zero(t4ddg_2(2,2,0,0) - 13*(t2s_3(0,0))
-		,"T*T4ddg(2,2,0,0)");
-  test_for_zero(t4ddg_2(2,2,0,1) - 13*(t2s_3(0,1))
-		,"T*T4ddg(2,2,0,1)");
-  test_for_zero(t4ddg_2(2,2,0,2) - 13*(t2s_3(0,2))
-		,"T*T4ddg(2,2,0,2)");
-  test_for_zero(t4ddg_2(2,2,1,0) - 13*(t2s_3(1,0))
-		,"T*T4ddg(2,2,1,0)");
-  test_for_zero(t4ddg_2(2,2,1,1) - 13*(t2s_3(1,1))
-		,"T*T4ddg(2,2,1,1)");
-  test_for_zero(t4ddg_2(2,2,1,2) - 13*(t2s_3(1,2))
-		,"T*T4ddg(2,2,1,2)");
-  test_for_zero(t4ddg_2(2,2,2,0) - 13*(t2s_3(2,0))
-		,"T*T4ddg(2,2,2,0)");
-  test_for_zero(t4ddg_2(2,2,2,1) - 13*(t2s_3(2,1))
-		,"T*T4ddg(2,2,2,1)");
-  test_for_zero(t4ddg_2(2,2,2,2) - 13*(t2s_3(2,2))
-		,"T*T4ddg(2,2,2,2)");
-
-
-  t4ddg_2(i,j,k,l)=t4ddg_1(i,j,k,l)*7;
-  test_for_zero(t4ddg_2(0,0,0,0) - 7*(t1_1(0)*t1_1(0))
-		,"T4ddg*T(0,0,0,0)");
-  test_for_zero(t4ddg_2(0,0,0,1) - 7*(t1_1(0)*t1_1(1))
-		,"T4ddg*T(0,0,0,1)");
-  test_for_zero(t4ddg_2(0,0,0,2) - 7*(t1_1(0)*t1_1(2))
-		,"T4ddg*T(0,0,0,2)");
-  test_for_zero(t4ddg_2(0,0,1,0) - 7*(t1_1(1)*t1_1(0))
-		,"T4ddg*T(0,0,1,0)");
-  test_for_zero(t4ddg_2(0,0,1,1) - 7*(t1_1(1)*t1_1(1))
-		,"T4ddg*T(0,0,1,1)");
-  test_for_zero(t4ddg_2(0,0,1,2) - 7*(t1_1(1)*t1_1(2))
-		,"T4ddg*T(0,0,1,2)");
-  test_for_zero(t4ddg_2(0,0,2,0) - 7*(t1_1(2)*t1_1(0))
-		,"T4ddg*T(0,0,2,0)");
-  test_for_zero(t4ddg_2(0,0,2,1) - 7*(t1_1(2)*t1_1(1))
-		,"T4ddg*T(0,0,2,1)");
-  test_for_zero(t4ddg_2(0,0,2,2) - 7*(t1_1(2)*t1_1(2))
-		,"T4ddg*T(0,0,2,2)");
-  test_for_zero(t4ddg_2(0,1,0,0) - 7*(t2s_1(0,0))
-		,"T4ddg*T(0,1,0,0)");
-  test_for_zero(t4ddg_2(0,1,0,1) - 7*(t2s_1(0,1))
-		,"T4ddg*T(0,1,0,1)");
-  test_for_zero(t4ddg_2(0,1,0,2) - 7*(t2s_1(0,2))
-		,"T4ddg*T(0,1,0,2)");
-  test_for_zero(t4ddg_2(0,1,1,0) - 7*(t2s_1(1,0))
-		,"T4ddg*T(0,1,1,0)");
-  test_for_zero(t4ddg_2(0,1,1,1) - 7*(t2s_1(1,1))
-		,"T4ddg*T(0,1,1,1)");
-  test_for_zero(t4ddg_2(0,1,1,2) - 7*(t2s_1(1,2))
-		,"T4ddg*T(0,1,1,2)");
-  test_for_zero(t4ddg_2(0,1,2,0) - 7*(t2s_1(2,0))
-		,"T4ddg*T(0,1,2,0)");
-  test_for_zero(t4ddg_2(0,1,2,1) - 7*(t2s_1(2,1))
-		,"T4ddg*T(0,1,2,1)");
-  test_for_zero(t4ddg_2(0,1,2,2) - 7*(t2s_1(2,2))
-		,"T4ddg*T(0,1,2,2)");
-  test_for_zero((t4ddg_2(0,2,0,0) - 7*(t1_3(0)*t1_3(0)))/t4ddg_2(0,2,0,0)
-		,"T4ddg*T(0,2,0,0)");
-  test_for_zero((t4ddg_2(0,2,0,1) - 7*(t1_3(0)*t1_3(1)))/t4ddg_2(0,2,0,1)
-		,"T4ddg*T(0,2,0,1)");
-  test_for_zero((t4ddg_2(0,2,0,2) - 7*(t1_3(0)*t1_3(2)))/t4ddg_2(0,2,0,2)
-		,"T4ddg*T(0,2,0,2)");
-  test_for_zero((t4ddg_2(0,2,1,0) - 7*(t1_3(1)*t1_3(0)))/t4ddg_2(0,2,1,0)
-		,"T4ddg*T(0,2,1,0)");
-  test_for_zero((t4ddg_2(0,2,1,1) - 7*(t1_3(1)*t1_3(1)))/t4ddg_2(0,2,1,1)
-		,"T4ddg*T(0,2,1,1)");
-  test_for_zero((t4ddg_2(0,2,1,2) - 7*(t1_3(1)*t1_3(2)))/t4ddg_2(0,2,1,2)
-		,"T4ddg*T(0,2,1,2)");
-  test_for_zero((t4ddg_2(0,2,2,0) - 7*(t1_3(2)*t1_3(0)))/t4ddg_2(0,2,2,0)
-		,"T4ddg*T(0,2,2,0)");
-  test_for_zero((t4ddg_2(0,2,2,1) - 7*(t1_3(2)*t1_3(1)))/t4ddg_2(0,2,2,1)
-		,"T4ddg*T(0,2,2,1)");
-  test_for_zero((t4ddg_2(0,2,2,2) - 7*(t1_3(2)*t1_3(2)))/t4ddg_2(0,2,2,2)
-		,"T4ddg*T(0,2,2,2)");
-  test_for_zero(t4ddg_2(1,0,0,0) - 7*(t2s_1(0,0))
-		,"T4ddg*T(1,0,0,0)");
-  test_for_zero(t4ddg_2(1,0,0,1) - 7*(t2s_1(0,1))
-		,"T4ddg*T(1,0,0,1)");
-  test_for_zero(t4ddg_2(1,0,0,2) - 7*(t2s_1(0,2))
-		,"T4ddg*T(1,0,0,2)");
-  test_for_zero(t4ddg_2(1,0,1,0) - 7*(t2s_1(1,0))
-		,"T4ddg*T(1,0,1,0)");
-  test_for_zero(t4ddg_2(1,0,1,1) - 7*(t2s_1(1,1))
-		,"T4ddg*T(1,0,1,1)");
-  test_for_zero(t4ddg_2(1,0,1,2) - 7*(t2s_1(1,2))
-		,"T4ddg*T(1,0,1,2)");
-  test_for_zero(t4ddg_2(1,0,2,0) - 7*(t2s_1(2,0))
-		,"T4ddg*T(1,0,2,0)");
-  test_for_zero(t4ddg_2(1,0,2,1) - 7*(t2s_1(2,1))
-		,"T4ddg*T(1,0,2,1)");
-  test_for_zero(t4ddg_2(1,0,2,2) - 7*(t2s_1(2,2))
-		,"T4ddg*T(1,0,2,2)");
-  test_for_zero(t4ddg_2(1,1,0,0) - 7*(t2s_2(0,0))
-		,"T4ddg*T(1,1,0,0)");
-  test_for_zero(t4ddg_2(1,1,0,1) - 7*(t2s_2(0,1))
-		,"T4ddg*T(1,1,0,1)");
-  test_for_zero(t4ddg_2(1,1,0,2) - 7*(t2s_2(0,2))
-		,"T4ddg*T(1,1,0,2)");
-  test_for_zero(t4ddg_2(1,1,1,0) - 7*(t2s_2(1,0))
-		,"T4ddg*T(1,1,1,0)");
-  test_for_zero(t4ddg_2(1,1,1,1) - 7*(t2s_2(1,1))
-		,"T4ddg*T(1,1,1,1)");
-  test_for_zero(t4ddg_2(1,1,1,2) - 7*(t2s_2(1,2))
-		,"T4ddg*T(1,1,1,2)");
-  test_for_zero(t4ddg_2(1,1,2,0) - 7*(t2s_2(2,0))
-		,"T4ddg*T(1,1,2,0)");
-  test_for_zero(t4ddg_2(1,1,2,1) - 7*(t2s_2(2,1))
-		,"T4ddg*T(1,1,2,1)");
-  test_for_zero(t4ddg_2(1,1,2,2) - 7*(t2s_2(2,2))
-		,"T4ddg*T(1,1,2,2)");
-  test_for_zero(t4ddg_2(1,2,0,0) - 7*(t1_2(0)*t1_2(0))
-		,"T4ddg*T(1,2,0,0)");
-  test_for_zero(t4ddg_2(1,2,0,1) - 7*(t1_2(0)*t1_2(1))
-		,"T4ddg*T(1,2,0,1)");
-  test_for_zero(t4ddg_2(1,2,0,2) - 7*(t1_2(0)*t1_2(2))
-		,"T4ddg*T(1,2,0,2)");
-  test_for_zero(t4ddg_2(1,2,1,0) - 7*(t1_2(1)*t1_2(0))
-		,"T4ddg*T(1,2,1,0)");
-  test_for_zero(t4ddg_2(1,2,1,1) - 7*(t1_2(1)*t1_2(1))
-		,"T4ddg*T(1,2,1,1)");
-  test_for_zero(t4ddg_2(1,2,1,2) - 7*(t1_2(1)*t1_2(2))
-		,"T4ddg*T(1,2,1,2)");
-  test_for_zero(t4ddg_2(1,2,2,0) - 7*(t1_2(2)*t1_2(0))
-		,"T4ddg*T(1,2,2,0)");
-  test_for_zero(t4ddg_2(1,2,2,1) - 7*(t1_2(2)*t1_2(1))
-		,"T4ddg*T(1,2,2,1)");
-  test_for_zero(t4ddg_2(1,2,2,2) - 7*(t1_2(2)*t1_2(2))
-		,"T4ddg*T(1,2,2,2)");
-  test_for_zero((t4ddg_2(2,0,0,0) - 7*(t1_3(0)*t1_3(0)))/t4ddg_2(2,0,0,0)
-		,"T4ddg*T(2,0,0,0)");
-  test_for_zero((t4ddg_2(2,0,0,1) - 7*(t1_3(0)*t1_3(1)))/t4ddg_2(2,0,0,1)
-		,"T4ddg*T(2,0,0,1)");
-  test_for_zero((t4ddg_2(2,0,0,2) - 7*(t1_3(0)*t1_3(2)))/t4ddg_2(2,0,0,2)
-		,"T4ddg*T(2,0,0,2)");
-  test_for_zero((t4ddg_2(2,0,1,0) - 7*(t1_3(1)*t1_3(0)))/t4ddg_2(2,0,1,0)
-		,"T4ddg*T(2,0,1,0)");
-  test_for_zero((t4ddg_2(2,0,1,1) - 7*(t1_3(1)*t1_3(1)))/t4ddg_2(2,0,1,1)
-		,"T4ddg*T(2,0,1,1)");
-  test_for_zero((t4ddg_2(2,0,1,2) - 7*(t1_3(1)*t1_3(2)))/t4ddg_2(2,0,1,2)
-		,"T4ddg*T(2,0,1,2)");
-  test_for_zero((t4ddg_2(2,0,2,0) - 7*(t1_3(2)*t1_3(0)))/t4ddg_2(2,0,2,0)
-		,"T4ddg*T(2,0,2,0)");
-  test_for_zero((t4ddg_2(2,0,2,1) - 7*(t1_3(2)*t1_3(1)))/t4ddg_2(2,0,2,1)
-		,"T4ddg*T(2,0,2,1)");
-  test_for_zero((t4ddg_2(2,0,2,2) - 7*(t1_3(2)*t1_3(2)))/t4ddg_2(2,0,2,2)
-		,"T4ddg*T(2,0,2,2)");
-  test_for_zero(t4ddg_2(2,1,0,0) - 7*(t1_2(0)*t1_2(0))
-		,"T4ddg*T(2,1,0,0)");
-  test_for_zero(t4ddg_2(2,1,0,1) - 7*(t1_2(0)*t1_2(1))
-		,"T4ddg*T(2,1,0,1)");
-  test_for_zero(t4ddg_2(2,1,0,2) - 7*(t1_2(0)*t1_2(2))
-		,"T4ddg*T(2,1,0,2)");
-  test_for_zero(t4ddg_2(2,1,1,0) - 7*(t1_2(1)*t1_2(0))
-		,"T4ddg*T(2,1,1,0)");
-  test_for_zero(t4ddg_2(2,1,1,1) - 7*(t1_2(1)*t1_2(1))
-		,"T4ddg*T(2,1,1,1)");
-  test_for_zero(t4ddg_2(2,1,1,2) - 7*(t1_2(1)*t1_2(2))
-		,"T4ddg*T(2,1,1,2)");
-  test_for_zero(t4ddg_2(2,1,2,0) - 7*(t1_2(2)*t1_2(0))
-		,"T4ddg*T(2,1,2,0)");
-  test_for_zero(t4ddg_2(2,1,2,1) - 7*(t1_2(2)*t1_2(1))
-		,"T4ddg*T(2,1,2,1)");
-  test_for_zero(t4ddg_2(2,1,2,2) - 7*(t1_2(2)*t1_2(2))
-		,"T4ddg*T(2,1,2,2)");
-  test_for_zero(t4ddg_2(2,2,0,0) - 7*(t2s_3(0,0))
-		,"T4ddg*T(2,2,0,0)");
-  test_for_zero(t4ddg_2(2,2,0,1) - 7*(t2s_3(0,1))
-		,"T4ddg*T(2,2,0,1)");
-  test_for_zero(t4ddg_2(2,2,0,2) - 7*(t2s_3(0,2))
-		,"T4ddg*T(2,2,0,2)");
-  test_for_zero(t4ddg_2(2,2,1,0) - 7*(t2s_3(1,0))
-		,"T4ddg*T(2,2,1,0)");
-  test_for_zero(t4ddg_2(2,2,1,1) - 7*(t2s_3(1,1))
-		,"T4ddg*T(2,2,1,1)");
-  test_for_zero(t4ddg_2(2,2,1,2) - 7*(t2s_3(1,2))
-		,"T4ddg*T(2,2,1,2)");
-  test_for_zero(t4ddg_2(2,2,2,0) - 7*(t2s_3(2,0))
-		,"T4ddg*T(2,2,2,0)");
-  test_for_zero(t4ddg_2(2,2,2,1) - 7*(t2s_3(2,1))
-		,"T4ddg*T(2,2,2,1)");
-  test_for_zero(t4ddg_2(2,2,2,2) - 7*(t2s_3(2,2))
-		,"T4ddg*T(2,2,2,2)");
-
-  t4ddg_1(N0,i,j,k)=t3dg_1(j,k,i);
-
-  test_for_zero(t4ddg_1(0,0,0,0) - (t3dg_1(0,0,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,0,0,0)");
-  test_for_zero(t4ddg_1(0,0,0,1) - (t3dg_1(0,1,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,0,0,1)");
-  test_for_zero(t4ddg_1(0,0,0,2) - (t3dg_1(0,2,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,0,0,2)");
-  test_for_zero(t4ddg_1(0,0,1,0) - (t3dg_1(1,0,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,0,1,0)");
-  test_for_zero(t4ddg_1(0,0,1,1) - (t3dg_1(1,1,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,0,1,1)");
-  test_for_zero(t4ddg_1(0,0,1,2) - (t3dg_1(1,2,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,0,1,2)");
-  test_for_zero(t4ddg_1(0,0,2,0) - (t3dg_1(2,0,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,0,2,0)");
-  test_for_zero(t4ddg_1(0,0,2,1) - (t3dg_1(2,1,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,0,2,1)");
-  test_for_zero(t4ddg_1(0,0,2,2) - (t3dg_1(2,2,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,0,2,2)");
-  test_for_zero(t4ddg_1(0,1,0,0) - (t3dg_1(0,0,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,1,0,0)");
-  test_for_zero(t4ddg_1(0,1,0,1) - (t3dg_1(0,1,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,1,0,1)");
-  test_for_zero(t4ddg_1(0,1,0,2) - (t3dg_1(0,2,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,1,0,2)");
-  test_for_zero(t4ddg_1(0,1,1,0) - (t3dg_1(1,0,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,1,1,0)");
-  test_for_zero(t4ddg_1(0,1,1,1) - (t3dg_1(1,1,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,1,1,1)");
-  test_for_zero(t4ddg_1(0,1,1,2) - (t3dg_1(1,2,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,1,1,2)");
-  test_for_zero(t4ddg_1(0,1,2,0) - (t3dg_1(2,0,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,1,2,0)");
-  test_for_zero(t4ddg_1(0,1,2,1) - (t3dg_1(2,1,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,1,2,1)");
-  test_for_zero(t4ddg_1(0,1,2,2) - (t3dg_1(2,2,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,1,2,2)");
-  test_for_zero(t4ddg_1(0,2,0,0) - (t3dg_1(0,0,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,2,0,0)");
-  test_for_zero(t4ddg_1(0,2,0,1) - (t3dg_1(0,1,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,2,0,1)");
-  test_for_zero(t4ddg_1(0,2,0,2) - (t3dg_1(0,2,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,2,0,2)");
-  test_for_zero(t4ddg_1(0,2,1,0) - (t3dg_1(1,0,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,2,1,0)");
-  test_for_zero(t4ddg_1(0,2,1,1) - (t3dg_1(1,1,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,2,1,1)");
-  test_for_zero(t4ddg_1(0,2,1,2) - (t3dg_1(1,2,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,2,1,2)");
-  test_for_zero(t4ddg_1(0,2,2,0) - (t3dg_1(2,0,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,2,2,0)");
-  test_for_zero(t4ddg_1(0,2,2,1) - (t3dg_1(2,1,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,2,2,1)");
-  test_for_zero(t4ddg_1(0,2,2,2) - (t3dg_1(2,2,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,2,2,2)");
-
-  t4ddg_1(N1,i,j,k)=t3dg_2(j,k,i);
-
-  test_for_zero(t4ddg_1(1,0,0,0) - (t3dg_2(0,0,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,0,0,0)");
-  test_for_zero(t4ddg_1(1,0,0,1) - (t3dg_2(0,1,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,0,0,1)");
-  test_for_zero(t4ddg_1(1,0,0,2) - (t3dg_2(0,2,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,0,0,2)");
-  test_for_zero(t4ddg_1(1,0,1,0) - (t3dg_2(1,0,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,0,1,0)");
-  test_for_zero(t4ddg_1(1,0,1,1) - (t3dg_2(1,1,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,0,1,1)");
-  test_for_zero(t4ddg_1(1,0,1,2) - (t3dg_2(1,2,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,0,1,2)");
-  test_for_zero(t4ddg_1(1,0,2,0) - (t3dg_2(2,0,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,0,2,0)");
-  test_for_zero(t4ddg_1(1,0,2,1) - (t3dg_2(2,1,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,0,2,1)");
-  test_for_zero(t4ddg_1(1,0,2,2) - (t3dg_2(2,2,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,0,2,2)");
-  test_for_zero(t4ddg_1(1,1,0,0) - (t3dg_2(0,0,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,1,0,0)");
-  test_for_zero(t4ddg_1(1,1,0,1) - (t3dg_2(0,1,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,1,0,1)");
-  test_for_zero(t4ddg_1(1,1,0,2) - (t3dg_2(0,2,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,1,0,2)");
-  test_for_zero(t4ddg_1(1,1,1,0) - (t3dg_2(1,0,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,1) - (t3dg_2(1,1,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,1,1,1)");
-  test_for_zero(t4ddg_1(1,1,1,2) - (t3dg_2(1,2,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,1,1,2)");
-  test_for_zero(t4ddg_1(1,1,2,0) - (t3dg_2(2,0,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,1,2,0)");
-  test_for_zero(t4ddg_1(1,1,2,1) - (t3dg_2(2,1,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,1,2,1)");
-  test_for_zero(t4ddg_1(1,1,2,2) - (t3dg_2(2,2,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,1,2,2)");
-  test_for_zero(t4ddg_1(1,2,0,0) - (t3dg_2(0,0,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,2,0,0)");
-  test_for_zero(t4ddg_1(1,2,0,1) - (t3dg_2(0,1,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,2,0,1)");
-  test_for_zero(t4ddg_1(1,2,0,2) - (t3dg_2(0,2,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,2,0,2)");
-  test_for_zero(t4ddg_1(1,2,1,0) - (t3dg_2(1,0,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,2,1,0)");
-  test_for_zero(t4ddg_1(1,2,1,1) - (t3dg_2(1,1,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,2,1,1)");
-  test_for_zero(t4ddg_1(1,2,1,2) - (t3dg_2(1,2,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,2,1,2)");
-  test_for_zero(t4ddg_1(1,2,2,0) - (t3dg_2(2,0,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,2,2,0)");
-  test_for_zero(t4ddg_1(1,2,2,1) - (t3dg_2(2,1,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,2,2,1)");
-  test_for_zero(t4ddg_1(1,2,2,2) - (t3dg_2(2,2,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,2,2,2)");
-
-  t4ddg_1(N2,i,j,k)=t3dg_3(j,k,i);
-
-  test_for_zero(t4ddg_1(2,0,0,0) - (t3dg_3(0,0,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,0,0,0)");
-  test_for_zero(t4ddg_1(2,0,0,1) - (t3dg_3(0,1,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,0,0,1)");
-  test_for_zero(t4ddg_1(2,0,0,2) - (t3dg_3(0,2,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,0,0,2)");
-  test_for_zero(t4ddg_1(2,0,1,0) - (t3dg_3(1,0,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,0,1,0)");
-  test_for_zero(t4ddg_1(2,0,1,1) - (t3dg_3(1,1,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,0,1,1)");
-  test_for_zero(t4ddg_1(2,0,1,2) - (t3dg_3(1,2,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,0,1,2)");
-  test_for_zero(t4ddg_1(2,0,2,0) - (t3dg_3(2,0,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,0,2,0)");
-  test_for_zero(t4ddg_1(2,0,2,1) - (t3dg_3(2,1,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,0,2,1)");
-  test_for_zero(t4ddg_1(2,0,2,2) - (t3dg_3(2,2,0))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,0,2,2)");
-  test_for_zero(t4ddg_1(2,1,0,0) - (t3dg_3(0,0,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,1,0,0)");
-  test_for_zero(t4ddg_1(2,1,0,1) - (t3dg_3(0,1,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,1,0,1)");
-  test_for_zero(t4ddg_1(2,1,0,2) - (t3dg_3(0,2,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,1,0,2)");
-  test_for_zero(t4ddg_1(2,1,1,0) - (t3dg_3(1,0,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,1,1,0)");
-  test_for_zero(t4ddg_1(2,1,1,1) - (t3dg_3(1,1,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,1,1,1)");
-  test_for_zero(t4ddg_1(2,1,1,2) - (t3dg_3(1,2,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,1,1,2)");
-  test_for_zero(t4ddg_1(2,1,2,0) - (t3dg_3(2,0,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,1,2,0)");
-  test_for_zero(t4ddg_1(2,1,2,1) - (t3dg_3(2,1,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,1,2,1)");
-  test_for_zero(t4ddg_1(2,1,2,2) - (t3dg_3(2,2,1))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,1,2,2)");
-  test_for_zero(t4ddg_1(2,2,0,0) - (t3dg_3(0,0,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,2,0,0)");
-  test_for_zero(t4ddg_1(2,2,0,1) - (t3dg_3(0,1,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,2,0,1)");
-  test_for_zero(t4ddg_1(2,2,0,2) - (t3dg_3(0,2,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,2,0,2)");
-  test_for_zero(t4ddg_1(2,2,1,0) - (t3dg_3(1,0,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,2,1,0)");
-  test_for_zero(t4ddg_1(2,2,1,1) - (t3dg_3(1,1,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,2,1,1)");
-  test_for_zero(t4ddg_1(2,2,1,2) - (t3dg_3(1,2,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,2,1,2)");
-  test_for_zero(t4ddg_1(2,2,2,0) - (t3dg_3(2,0,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,2,2,0)");
-  test_for_zero(t4ddg_1(2,2,2,1) - (t3dg_3(2,1,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,2) - (t3dg_3(2,2,2))
-		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,2,2,2)");
-
-  t2s_1(i,j)=t4ddg_1(0,0,i,j);
-  test_for_zero(t4ddg_1(0,0,0,0) - (t2s_1(0,0))
-		,"T4ddg(Num,Num,i,j)(0,0,0,0)");
-  test_for_zero(t4ddg_1(0,0,0,1) - (t2s_1(0,1))
-		,"T4ddg(Num,Num,i,j)(0,0,0,1)");
-  test_for_zero(t4ddg_1(0,0,0,2) - (t2s_1(0,2))
-		,"T4ddg(Num,Num,i,j)(0,0,0,2)");
-  test_for_zero(t4ddg_1(0,0,1,0) - (t2s_1(1,0))
-		,"T4ddg(Num,Num,i,j)(0,0,1,0)");
-  test_for_zero(t4ddg_1(0,0,1,1) - (t2s_1(1,1))
-		,"T4ddg(Num,Num,i,j)(0,0,1,1)");
-  test_for_zero(t4ddg_1(0,0,1,2) - (t2s_1(1,2))
-		,"T4ddg(Num,Num,i,j)(0,0,1,2)");
-  test_for_zero(t4ddg_1(0,0,2,0) - (t2s_1(2,0))
-		,"T4ddg(Num,Num,i,j)(0,0,2,0)");
-  test_for_zero(t4ddg_1(0,0,2,1) - (t2s_1(2,1))
-		,"T4ddg(Num,Num,i,j)(0,0,2,1)");
-  test_for_zero(t4ddg_1(0,0,2,2) - (t2s_1(2,2))
-		,"T4ddg(Num,Num,i,j)(0,0,2,2)");
-
-  t2s_1(i,j)=t4ddg_1(0,1,i,j);
-  test_for_zero(t4ddg_1(0,1,0,0) - (t2s_1(0,0))
-		,"T4ddg(Num,Num,i,j)(0,1,0,0)");
-  test_for_zero(t4ddg_1(0,1,0,1) - (t2s_1(0,1))
-		,"T4ddg(Num,Num,i,j)(0,1,0,1)");
-  test_for_zero(t4ddg_1(0,1,0,2) - (t2s_1(0,2))
-		,"T4ddg(Num,Num,i,j)(0,1,0,2)");
-  test_for_zero(t4ddg_1(0,1,1,0) - (t2s_1(1,0))
-		,"T4ddg(Num,Num,i,j)(0,1,1,0)");
-  test_for_zero(t4ddg_1(0,1,1,1) - (t2s_1(1,1))
-		,"T4ddg(Num,Num,i,j)(0,1,1,1)");
-  test_for_zero(t4ddg_1(0,1,1,2) - (t2s_1(1,2))
-		,"T4ddg(Num,Num,i,j)(0,1,1,2)");
-  test_for_zero(t4ddg_1(0,1,2,0) - (t2s_1(2,0))
-		,"T4ddg(Num,Num,i,j)(0,1,2,0)");
-  test_for_zero(t4ddg_1(0,1,2,1) - (t2s_1(2,1))
-		,"T4ddg(Num,Num,i,j)(0,1,2,1)");
-  test_for_zero(t4ddg_1(0,1,2,2) - (t2s_1(2,2))
-		,"T4ddg(Num,Num,i,j)(0,1,2,2)");
-
-  t2s_1(i,j)=t4ddg_1(0,2,i,j);
-  test_for_zero(t4ddg_1(0,2,0,0) - (t2s_1(0,0))
-		,"T4ddg(Num,Num,i,j)(0,2,0,0)");
-  test_for_zero(t4ddg_1(0,2,0,1) - (t2s_1(0,1))
-		,"T4ddg(Num,Num,i,j)(0,2,0,1)");
-  test_for_zero(t4ddg_1(0,2,0,2) - (t2s_1(0,2))
-		,"T4ddg(Num,Num,i,j)(0,2,0,2)");
-  test_for_zero(t4ddg_1(0,2,1,0) - (t2s_1(1,0))
-		,"T4ddg(Num,Num,i,j)(0,2,1,0)");
-  test_for_zero(t4ddg_1(0,2,1,1) - (t2s_1(1,1))
-		,"T4ddg(Num,Num,i,j)(0,2,1,1)");
-  test_for_zero(t4ddg_1(0,2,1,2) - (t2s_1(1,2))
-		,"T4ddg(Num,Num,i,j)(0,2,1,2)");
-  test_for_zero(t4ddg_1(0,2,2,0) - (t2s_1(2,0))
-		,"T4ddg(Num,Num,i,j)(0,2,2,0)");
-  test_for_zero(t4ddg_1(0,2,2,1) - (t2s_1(2,1))
-		,"T4ddg(Num,Num,i,j)(0,2,2,1)");
-  test_for_zero(t4ddg_1(0,2,2,2) - (t2s_1(2,2))
-		,"T4ddg(Num,Num,i,j)(0,2,2,2)");
-
-  t2s_1(i,j)=t4ddg_1(1,0,i,j);
-  test_for_zero(t4ddg_1(1,0,0,0) - (t2s_1(0,0))
-		,"T4ddg(Num,Num,i,j)(1,0,0,0)");
-  test_for_zero(t4ddg_1(1,0,0,1) - (t2s_1(0,1))
-		,"T4ddg(Num,Num,i,j)(1,0,0,1)");
-  test_for_zero(t4ddg_1(1,0,0,2) - (t2s_1(0,2))
-		,"T4ddg(Num,Num,i,j)(1,0,0,2)");
-  test_for_zero(t4ddg_1(1,0,1,0) - (t2s_1(1,0))
-		,"T4ddg(Num,Num,i,j)(1,0,1,0)");
-  test_for_zero(t4ddg_1(1,0,1,1) - (t2s_1(1,1))
-		,"T4ddg(Num,Num,i,j)(1,0,1,1)");
-  test_for_zero(t4ddg_1(1,0,1,2) - (t2s_1(1,2))
-		,"T4ddg(Num,Num,i,j)(1,0,1,2)");
-  test_for_zero(t4ddg_1(1,0,2,0) - (t2s_1(2,0))
-		,"T4ddg(Num,Num,i,j)(1,0,2,0)");
-  test_for_zero(t4ddg_1(1,0,2,1) - (t2s_1(2,1))
-		,"T4ddg(Num,Num,i,j)(1,0,2,1)");
-  test_for_zero(t4ddg_1(1,0,2,2) - (t2s_1(2,2))
-		,"T4ddg(Num,Num,i,j)(1,0,2,2)");
-
-  t2s_1(i,j)=t4ddg_1(1,1,i,j);
-  test_for_zero(t4ddg_1(1,1,0,0) - (t2s_1(0,0))
-		,"T4ddg(Num,Num,i,j)(1,1,0,0)");
-  test_for_zero(t4ddg_1(1,1,0,1) - (t2s_1(0,1))
-		,"T4ddg(Num,Num,i,j)(1,1,0,1)");
-  test_for_zero(t4ddg_1(1,1,0,2) - (t2s_1(0,2))
-		,"T4ddg(Num,Num,i,j)(1,1,0,2)");
-  test_for_zero(t4ddg_1(1,1,1,0) - (t2s_1(1,0))
-		,"T4ddg(Num,Num,i,j)(1,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,1) - (t2s_1(1,1))
-		,"T4ddg(Num,Num,i,j)(1,1,1,1)");
-  test_for_zero(t4ddg_1(1,1,1,2) - (t2s_1(1,2))
-		,"T4ddg(Num,Num,i,j)(1,1,1,2)");
-  test_for_zero(t4ddg_1(1,1,2,0) - (t2s_1(2,0))
-		,"T4ddg(Num,Num,i,j)(1,1,2,0)");
-  test_for_zero(t4ddg_1(1,1,2,1) - (t2s_1(2,1))
-		,"T4ddg(Num,Num,i,j)(1,1,2,1)");
-  test_for_zero(t4ddg_1(1,1,2,2) - (t2s_1(2,2))
-		,"T4ddg(Num,Num,i,j)(1,1,2,2)");
-
-  t2s_1(i,j)=t4ddg_1(1,2,i,j);
-  test_for_zero(t4ddg_1(1,2,0,0) - (t2s_1(0,0))
-		,"T4ddg(Num,Num,i,j)(1,2,0,0)");
-  test_for_zero(t4ddg_1(1,2,0,1) - (t2s_1(0,1))
-		,"T4ddg(Num,Num,i,j)(1,2,0,1)");
-  test_for_zero(t4ddg_1(1,2,0,2) - (t2s_1(0,2))
-		,"T4ddg(Num,Num,i,j)(1,2,0,2)");
-  test_for_zero(t4ddg_1(1,2,1,0) - (t2s_1(1,0))
-		,"T4ddg(Num,Num,i,j)(1,2,1,0)");
-  test_for_zero(t4ddg_1(1,2,1,1) - (t2s_1(1,1))
-		,"T4ddg(Num,Num,i,j)(1,2,1,1)");
-  test_for_zero(t4ddg_1(1,2,1,2) - (t2s_1(1,2))
-		,"T4ddg(Num,Num,i,j)(1,2,1,2)");
-  test_for_zero(t4ddg_1(1,2,2,0) - (t2s_1(2,0))
-		,"T4ddg(Num,Num,i,j)(1,2,2,0)");
-  test_for_zero(t4ddg_1(1,2,2,1) - (t2s_1(2,1))
-		,"T4ddg(Num,Num,i,j)(1,2,2,1)");
-  test_for_zero(t4ddg_1(1,2,2,2) - (t2s_1(2,2))
-		,"T4ddg(Num,Num,i,j)(1,2,2,2)");
-
-  t2s_1(i,j)=t4ddg_1(2,0,i,j);
-  test_for_zero(t4ddg_1(2,0,0,0) - (t2s_1(0,0))
-		,"T4ddg(Num,Num,i,j)(2,0,0,0)");
-  test_for_zero(t4ddg_1(2,0,0,1) - (t2s_1(0,1))
-		,"T4ddg(Num,Num,i,j)(2,0,0,1)");
-  test_for_zero(t4ddg_1(2,0,0,2) - (t2s_1(0,2))
-		,"T4ddg(Num,Num,i,j)(2,0,0,2)");
-  test_for_zero(t4ddg_1(2,0,1,0) - (t2s_1(1,0))
-		,"T4ddg(Num,Num,i,j)(2,0,1,0)");
-  test_for_zero(t4ddg_1(2,0,1,1) - (t2s_1(1,1))
-		,"T4ddg(Num,Num,i,j)(2,0,1,1)");
-  test_for_zero(t4ddg_1(2,0,1,2) - (t2s_1(1,2))
-		,"T4ddg(Num,Num,i,j)(2,0,1,2)");
-  test_for_zero(t4ddg_1(2,0,2,0) - (t2s_1(2,0))
-		,"T4ddg(Num,Num,i,j)(2,0,2,0)");
-  test_for_zero(t4ddg_1(2,0,2,1) - (t2s_1(2,1))
-		,"T4ddg(Num,Num,i,j)(2,0,2,1)");
-  test_for_zero(t4ddg_1(2,0,2,2) - (t2s_1(2,2))
-		,"T4ddg(Num,Num,i,j)(2,0,2,2)");
-
-  t2s_1(i,j)=t4ddg_1(2,1,i,j);
-  test_for_zero(t4ddg_1(2,1,0,0) - (t2s_1(0,0))
-		,"T4ddg(Num,Num,i,j)(2,1,0,0)");
-  test_for_zero(t4ddg_1(2,1,0,1) - (t2s_1(0,1))
-		,"T4ddg(Num,Num,i,j)(2,1,0,1)");
-  test_for_zero(t4ddg_1(2,1,0,2) - (t2s_1(0,2))
-		,"T4ddg(Num,Num,i,j)(2,1,0,2)");
-  test_for_zero(t4ddg_1(2,1,1,0) - (t2s_1(1,0))
-		,"T4ddg(Num,Num,i,j)(2,1,1,0)");
-  test_for_zero(t4ddg_1(2,1,1,1) - (t2s_1(1,1))
-		,"T4ddg(Num,Num,i,j)(2,1,1,1)");
-  test_for_zero(t4ddg_1(2,1,1,2) - (t2s_1(1,2))
-		,"T4ddg(Num,Num,i,j)(2,1,1,2)");
-  test_for_zero(t4ddg_1(2,1,2,0) - (t2s_1(2,0))
-		,"T4ddg(Num,Num,i,j)(2,1,2,0)");
-  test_for_zero(t4ddg_1(2,1,2,1) - (t2s_1(2,1))
-		,"T4ddg(Num,Num,i,j)(2,1,2,1)");
-  test_for_zero(t4ddg_1(2,1,2,2) - (t2s_1(2,2))
-		,"T4ddg(Num,Num,i,j)(2,1,2,2)");
-
-  t2s_1(i,j)=t4ddg_1(2,2,i,j);
-  test_for_zero(t4ddg_1(2,2,0,0) - (t2s_1(0,0))
-		,"T4ddg(Num,Num,i,j)(2,2,0,0)");
-  test_for_zero(t4ddg_1(2,2,0,1) - (t2s_1(0,1))
-		,"T4ddg(Num,Num,i,j)(2,2,0,1)");
-  test_for_zero(t4ddg_1(2,2,0,2) - (t2s_1(0,2))
-		,"T4ddg(Num,Num,i,j)(2,2,0,2)");
-  test_for_zero(t4ddg_1(2,2,1,0) - (t2s_1(1,0))
-		,"T4ddg(Num,Num,i,j)(2,2,1,0)");
-  test_for_zero(t4ddg_1(2,2,1,1) - (t2s_1(1,1))
-		,"T4ddg(Num,Num,i,j)(2,2,1,1)");
-  test_for_zero(t4ddg_1(2,2,1,2) - (t2s_1(1,2))
-		,"T4ddg(Num,Num,i,j)(2,2,1,2)");
-  test_for_zero(t4ddg_1(2,2,2,0) - (t2s_1(2,0))
-		,"T4ddg(Num,Num,i,j)(2,2,2,0)");
-  test_for_zero(t4ddg_1(2,2,2,1) - (t2s_1(2,1))
-		,"T4ddg(Num,Num,i,j)(2,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,2) - (t2s_1(2,2))
-		,"T4ddg(Num,Num,i,j)(2,2,2,2)");
-
-
-
-
-
-  t2s_1(i,j)=t4ddg_1(i,j,0,0);
-  test_for_zero(t4ddg_1(0,0,0,0) - (t2s_1(0,0))
-		,"T4ddg(i,j,Num,Num)(0,0,0,0)");
-  test_for_zero(t4ddg_1(0,1,0,0) - (t2s_1(0,1))
-		,"T4ddg(i,j,Num,Num)(0,0,0,1)");
-  test_for_zero(t4ddg_1(0,2,0,0) - (t2s_1(0,2))
-		,"T4ddg(i,j,Num,Num)(0,0,0,2)");
-  test_for_zero(t4ddg_1(1,0,0,0) - (t2s_1(1,0))
-		,"T4ddg(i,j,Num,Num)(0,0,1,0)");
-  test_for_zero(t4ddg_1(1,1,0,0) - (t2s_1(1,1))
-		,"T4ddg(i,j,Num,Num)(0,0,1,1)");
-  test_for_zero(t4ddg_1(1,2,0,0) - (t2s_1(1,2))
-		,"T4ddg(i,j,Num,Num)(0,0,1,2)");
-  test_for_zero(t4ddg_1(2,0,0,0) - (t2s_1(2,0))
-		,"T4ddg(i,j,Num,Num)(0,0,2,0)");
-  test_for_zero(t4ddg_1(2,1,0,0) - (t2s_1(2,1))
-		,"T4ddg(i,j,Num,Num)(0,0,2,1)");
-  test_for_zero(t4ddg_1(2,2,0,0) - (t2s_1(2,2))
-		,"T4ddg(i,j,Num,Num)(0,0,2,2)");
-
-  t2s_1(i,j)=t4ddg_1(i,j,0,1);
-  test_for_zero(t4ddg_1(0,0,0,1) - (t2s_1(0,0))
-		,"T4ddg(i,j,Num,Num)(0,1,0,0)");
-  test_for_zero(t4ddg_1(0,1,0,1) - (t2s_1(0,1))
-		,"T4ddg(i,j,Num,Num)(0,1,0,1)");
-  test_for_zero(t4ddg_1(0,2,0,1) - (t2s_1(0,2))
-		,"T4ddg(i,j,Num,Num)(0,1,0,2)");
-  test_for_zero(t4ddg_1(1,0,0,1) - (t2s_1(1,0))
-		,"T4ddg(i,j,Num,Num)(0,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,0,1) - (t2s_1(1,1))
-		,"T4ddg(i,j,Num,Num)(0,1,1,1)");
-  test_for_zero(t4ddg_1(1,2,0,1) - (t2s_1(1,2))
-		,"T4ddg(i,j,Num,Num)(0,1,1,2)");
-  test_for_zero(t4ddg_1(2,0,0,1) - (t2s_1(2,0))
-		,"T4ddg(i,j,Num,Num)(0,1,2,0)");
-  test_for_zero(t4ddg_1(2,1,0,1) - (t2s_1(2,1))
-		,"T4ddg(i,j,Num,Num)(0,1,2,1)");
-  test_for_zero(t4ddg_1(2,2,0,1) - (t2s_1(2,2))
-		,"T4ddg(i,j,Num,Num)(0,1,2,2)");
-
-  t2s_1(i,j)=t4ddg_1(i,j,0,2);
-  test_for_zero(t4ddg_1(0,0,0,2) - (t2s_1(0,0))
-		,"T4ddg(i,j,Num,Num)(0,2,0,0)");
-  test_for_zero(t4ddg_1(0,1,0,2) - (t2s_1(0,1))
-		,"T4ddg(i,j,Num,Num)(0,2,0,1)");
-  test_for_zero(t4ddg_1(0,2,0,2) - (t2s_1(0,2))
-		,"T4ddg(i,j,Num,Num)(0,2,0,2)");
-  test_for_zero(t4ddg_1(1,0,0,2) - (t2s_1(1,0))
-		,"T4ddg(i,j,Num,Num)(0,2,1,0)");
-  test_for_zero(t4ddg_1(1,1,0,2) - (t2s_1(1,1))
-		,"T4ddg(i,j,Num,Num)(0,2,1,1)");
-  test_for_zero(t4ddg_1(1,2,0,2) - (t2s_1(1,2))
-		,"T4ddg(i,j,Num,Num)(0,2,1,2)");
-  test_for_zero(t4ddg_1(2,0,0,2) - (t2s_1(2,0))
-		,"T4ddg(i,j,Num,Num)(0,2,2,0)");
-  test_for_zero(t4ddg_1(2,1,0,2) - (t2s_1(2,1))
-		,"T4ddg(i,j,Num,Num)(0,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,0,2) - (t2s_1(2,2))
-		,"T4ddg(i,j,Num,Num)(0,2,2,2)");
-
-  t2s_1(i,j)=t4ddg_1(i,j,1,0);
-  test_for_zero(t4ddg_1(0,0,1,0) - (t2s_1(0,0))
-		,"T4ddg(i,j,Num,Num)(1,0,0,0)");
-  test_for_zero(t4ddg_1(0,1,1,0) - (t2s_1(0,1))
-		,"T4ddg(i,j,Num,Num)(1,0,0,1)");
-  test_for_zero(t4ddg_1(0,2,1,0) - (t2s_1(0,2))
-		,"T4ddg(i,j,Num,Num)(1,0,0,2)");
-  test_for_zero(t4ddg_1(1,0,1,0) - (t2s_1(1,0))
-		,"T4ddg(i,j,Num,Num)(1,0,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,0) - (t2s_1(1,1))
-		,"T4ddg(i,j,Num,Num)(1,0,1,1)");
-  test_for_zero(t4ddg_1(1,2,1,0) - (t2s_1(1,2))
-		,"T4ddg(i,j,Num,Num)(1,0,1,2)");
-  test_for_zero(t4ddg_1(2,0,1,0) - (t2s_1(2,0))
-		,"T4ddg(i,j,Num,Num)(1,0,2,0)");
-  test_for_zero(t4ddg_1(2,1,1,0) - (t2s_1(2,1))
-		,"T4ddg(i,j,Num,Num)(1,0,2,1)");
-  test_for_zero(t4ddg_1(2,2,1,0) - (t2s_1(2,2))
-		,"T4ddg(i,j,Num,Num)(1,0,2,2)");
-
-  t2s_1(i,j)=t4ddg_1(i,j,1,1);
-  test_for_zero(t4ddg_1(0,0,1,1) - (t2s_1(0,0))
-		,"T4ddg(i,j,Num,Num)(1,1,0,0)");
-  test_for_zero(t4ddg_1(0,1,1,1) - (t2s_1(0,1))
-		,"T4ddg(i,j,Num,Num)(1,1,0,1)");
-  test_for_zero(t4ddg_1(0,2,1,1) - (t2s_1(0,2))
-		,"T4ddg(i,j,Num,Num)(1,1,0,2)");
-  test_for_zero(t4ddg_1(1,0,1,1) - (t2s_1(1,0))
-		,"T4ddg(i,j,Num,Num)(1,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,1) - (t2s_1(1,1))
-		,"T4ddg(i,j,Num,Num)(1,1,1,1)");
-  test_for_zero(t4ddg_1(1,2,1,1) - (t2s_1(1,2))
-		,"T4ddg(i,j,Num,Num)(1,1,1,2)");
-  test_for_zero(t4ddg_1(2,0,1,1) - (t2s_1(2,0))
-		,"T4ddg(i,j,Num,Num)(1,1,2,0)");
-  test_for_zero(t4ddg_1(2,1,1,1) - (t2s_1(2,1))
-		,"T4ddg(i,j,Num,Num)(1,1,2,1)");
-  test_for_zero(t4ddg_1(2,2,1,1) - (t2s_1(2,2))
-		,"T4ddg(i,j,Num,Num)(1,1,2,2)");
-
-  t2s_1(i,j)=t4ddg_1(i,j,1,2);
-  test_for_zero(t4ddg_1(0,0,1,2) - (t2s_1(0,0))
-		,"T4ddg(i,j,Num,Num)(1,2,0,0)");
-  test_for_zero(t4ddg_1(0,1,1,2) - (t2s_1(0,1))
-		,"T4ddg(i,j,Num,Num)(1,2,0,1)");
-  test_for_zero(t4ddg_1(0,2,1,2) - (t2s_1(0,2))
-		,"T4ddg(i,j,Num,Num)(1,2,0,2)");
-  test_for_zero(t4ddg_1(1,0,1,2) - (t2s_1(1,0))
-		,"T4ddg(i,j,Num,Num)(1,2,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,2) - (t2s_1(1,1))
-		,"T4ddg(i,j,Num,Num)(1,2,1,1)");
-  test_for_zero(t4ddg_1(1,2,1,2) - (t2s_1(1,2))
-		,"T4ddg(i,j,Num,Num)(1,2,1,2)");
-  test_for_zero(t4ddg_1(2,0,1,2) - (t2s_1(2,0))
-		,"T4ddg(i,j,Num,Num)(1,2,2,0)");
-  test_for_zero(t4ddg_1(2,1,1,2) - (t2s_1(2,1))
-		,"T4ddg(i,j,Num,Num)(1,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,1,2) - (t2s_1(2,2))
-		,"T4ddg(i,j,Num,Num)(1,2,2,2)");
-
-  t2s_1(i,j)=t4ddg_1(i,j,2,0);
-  test_for_zero(t4ddg_1(0,0,2,0) - (t2s_1(0,0))
-		,"T4ddg(i,j,Num,Num)(2,0,0,0)");
-  test_for_zero(t4ddg_1(0,1,2,0) - (t2s_1(0,1))
-		,"T4ddg(i,j,Num,Num)(2,0,0,1)");
-  test_for_zero(t4ddg_1(0,2,2,0) - (t2s_1(0,2))
-		,"T4ddg(i,j,Num,Num)(2,0,0,2)");
-  test_for_zero(t4ddg_1(1,0,2,0) - (t2s_1(1,0))
-		,"T4ddg(i,j,Num,Num)(2,0,1,0)");
-  test_for_zero(t4ddg_1(1,1,2,0) - (t2s_1(1,1))
-		,"T4ddg(i,j,Num,Num)(2,0,1,1)");
-  test_for_zero(t4ddg_1(1,2,2,0) - (t2s_1(1,2))
-		,"T4ddg(i,j,Num,Num)(2,0,1,2)");
-  test_for_zero(t4ddg_1(2,0,2,0) - (t2s_1(2,0))
-		,"T4ddg(i,j,Num,Num)(2,0,2,0)");
-  test_for_zero(t4ddg_1(2,1,2,0) - (t2s_1(2,1))
-		,"T4ddg(i,j,Num,Num)(2,0,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,0) - (t2s_1(2,2))
-		,"T4ddg(i,j,Num,Num)(2,0,2,2)");
-
-  t2s_1(i,j)=t4ddg_1(i,j,2,1);
-  test_for_zero(t4ddg_1(0,0,2,1) - (t2s_1(0,0))
-		,"T4ddg(i,j,Num,Num)(2,1,0,0)");
-  test_for_zero(t4ddg_1(0,1,2,1) - (t2s_1(0,1))
-		,"T4ddg(i,j,Num,Num)(2,1,0,1)");
-  test_for_zero(t4ddg_1(0,2,2,1) - (t2s_1(0,2))
-		,"T4ddg(i,j,Num,Num)(2,1,0,2)");
-  test_for_zero(t4ddg_1(1,0,2,1) - (t2s_1(1,0))
-		,"T4ddg(i,j,Num,Num)(2,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,2,1) - (t2s_1(1,1))
-		,"T4ddg(i,j,Num,Num)(2,1,1,1)");
-  test_for_zero(t4ddg_1(1,2,2,1) - (t2s_1(1,2))
-		,"T4ddg(i,j,Num,Num)(2,1,1,2)");
-  test_for_zero(t4ddg_1(2,0,2,1) - (t2s_1(2,0))
-		,"T4ddg(i,j,Num,Num)(2,1,2,0)");
-  test_for_zero(t4ddg_1(2,1,2,1) - (t2s_1(2,1))
-		,"T4ddg(i,j,Num,Num)(2,1,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,1) - (t2s_1(2,2))
-		,"T4ddg(i,j,Num,Num)(2,1,2,2)");
-
-  t2s_1(i,j)=t4ddg_1(i,j,2,2);
-  test_for_zero(t4ddg_1(0,0,2,2) - (t2s_1(0,0))
-		,"T4ddg(i,j,Num,Num)(2,2,0,0)");
-  test_for_zero(t4ddg_1(0,1,2,2) - (t2s_1(0,1))
-		,"T4ddg(i,j,Num,Num)(2,2,0,1)");
-  test_for_zero(t4ddg_1(0,2,2,2) - (t2s_1(0,2))
-		,"T4ddg(i,j,Num,Num)(2,2,0,2)");
-  test_for_zero(t4ddg_1(1,0,2,2) - (t2s_1(1,0))
-		,"T4ddg(i,j,Num,Num)(2,2,1,0)");
-  test_for_zero(t4ddg_1(1,1,2,2) - (t2s_1(1,1))
-		,"T4ddg(i,j,Num,Num)(2,2,1,1)");
-  test_for_zero(t4ddg_1(1,2,2,2) - (t2s_1(1,2))
-		,"T4ddg(i,j,Num,Num)(2,2,1,2)");
-  test_for_zero(t4ddg_1(2,0,2,2) - (t2s_1(2,0))
-		,"T4ddg(i,j,Num,Num)(2,2,2,0)");
-  test_for_zero(t4ddg_1(2,1,2,2) - (t2s_1(2,1))
-		,"T4ddg(i,j,Num,Num)(2,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,2) - (t2s_1(2,2))
-		,"T4ddg(i,j,Num,Num)(2,2,2,2)");
-
-
-
-  t2_1(i,j)=t4ddg_1(0,i,0,j);
-  test_for_zero(t4ddg_1(0,0,0,0) - (t2_1(0,0))
-		,"T4ddg(Num,i,Num,j)(0,0,0,0)");
-  test_for_zero(t4ddg_1(0,0,0,1) - (t2_1(0,1))
-		,"T4ddg(Num,i,Num,j)(0,0,0,1)");
-  test_for_zero(t4ddg_1(0,0,0,2) - (t2_1(0,2))
-		,"T4ddg(Num,i,Num,j)(0,0,0,2)");
-  test_for_zero(t4ddg_1(0,1,0,0) - (t2_1(1,0))
-		,"T4ddg(Num,i,Num,j)(0,0,1,0)");
-  test_for_zero(t4ddg_1(0,1,0,1) - (t2_1(1,1))
-		,"T4ddg(Num,i,Num,j)(0,0,1,1)");
-  test_for_zero(t4ddg_1(0,1,0,2) - (t2_1(1,2))
-		,"T4ddg(Num,i,Num,j)(0,0,1,2)");
-  test_for_zero(t4ddg_1(0,2,0,0) - (t2_1(2,0))
-		,"T4ddg(Num,i,Num,j)(0,0,2,0)");
-  test_for_zero(t4ddg_1(0,2,0,1) - (t2_1(2,1))
-		,"T4ddg(Num,i,Num,j)(0,0,2,1)");
-  test_for_zero(t4ddg_1(0,2,0,2) - (t2_1(2,2))
-		,"T4ddg(Num,i,Num,j)(0,0,2,2)");
-
-  t2_1(i,j)=t4ddg_1(0,i,1,j);
-  test_for_zero(t4ddg_1(0,0,1,0) - (t2_1(0,0))
-		,"T4ddg(Num,i,Num,j)(0,1,0,0)");
-  test_for_zero(t4ddg_1(0,0,1,1) - (t2_1(0,1))
-		,"T4ddg(Num,i,Num,j)(0,1,0,1)");
-  test_for_zero(t4ddg_1(0,0,1,2) - (t2_1(0,2))
-		,"T4ddg(Num,i,Num,j)(0,1,0,2)");
-  test_for_zero(t4ddg_1(0,1,1,0) - (t2_1(1,0))
-		,"T4ddg(Num,i,Num,j)(0,1,1,0)");
-  test_for_zero(t4ddg_1(0,1,1,1) - (t2_1(1,1))
-		,"T4ddg(Num,i,Num,j)(0,1,1,1)");
-  test_for_zero(t4ddg_1(0,1,1,2) - (t2_1(1,2))
-		,"T4ddg(Num,i,Num,j)(0,1,1,2)");
-  test_for_zero(t4ddg_1(0,2,1,0) - (t2_1(2,0))
-		,"T4ddg(Num,i,Num,j)(0,1,2,0)");
-  test_for_zero(t4ddg_1(0,2,1,1) - (t2_1(2,1))
-		,"T4ddg(Num,i,Num,j)(0,1,2,1)");
-  test_for_zero(t4ddg_1(0,2,1,2) - (t2_1(2,2))
-		,"T4ddg(Num,i,Num,j)(0,1,2,2)");
-
-  t2_1(i,j)=t4ddg_1(0,i,2,j);
-  test_for_zero(t4ddg_1(0,0,2,0) - (t2_1(0,0))
-		,"T4ddg(Num,i,Num,j)(0,2,0,0)");
-  test_for_zero(t4ddg_1(0,0,2,1) - (t2_1(0,1))
-		,"T4ddg(Num,i,Num,j)(0,2,0,1)");
-  test_for_zero(t4ddg_1(0,0,2,2) - (t2_1(0,2))
-		,"T4ddg(Num,i,Num,j)(0,2,0,2)");
-  test_for_zero(t4ddg_1(0,1,2,0) - (t2_1(1,0))
-		,"T4ddg(Num,i,Num,j)(0,2,1,0)");
-  test_for_zero(t4ddg_1(0,1,2,1) - (t2_1(1,1))
-		,"T4ddg(Num,i,Num,j)(0,2,1,1)");
-  test_for_zero(t4ddg_1(0,1,2,2) - (t2_1(1,2))
-		,"T4ddg(Num,i,Num,j)(0,2,1,2)");
-  test_for_zero(t4ddg_1(0,2,2,0) - (t2_1(2,0))
-		,"T4ddg(Num,i,Num,j)(0,2,2,0)");
-  test_for_zero(t4ddg_1(0,2,2,1) - (t2_1(2,1))
-		,"T4ddg(Num,i,Num,j)(0,2,2,1)");
-  test_for_zero(t4ddg_1(0,2,2,2) - (t2_1(2,2))
-		,"T4ddg(Num,i,Num,j)(0,2,2,2)");
-
-  t2_1(i,j)=t4ddg_1(1,i,0,j);
-  test_for_zero(t4ddg_1(1,0,0,0) - (t2_1(0,0))
-		,"T4ddg(Num,i,Num,j)(1,0,0,0)");
-  test_for_zero(t4ddg_1(1,0,0,1) - (t2_1(0,1))
-		,"T4ddg(Num,i,Num,j)(1,0,0,1)");
-  test_for_zero(t4ddg_1(1,0,0,2) - (t2_1(0,2))
-		,"T4ddg(Num,i,Num,j)(1,0,0,2)");
-  test_for_zero(t4ddg_1(1,1,0,0) - (t2_1(1,0))
-		,"T4ddg(Num,i,Num,j)(1,0,1,0)");
-  test_for_zero(t4ddg_1(1,1,0,1) - (t2_1(1,1))
-		,"T4ddg(Num,i,Num,j)(1,0,1,1)");
-  test_for_zero(t4ddg_1(1,1,0,2) - (t2_1(1,2))
-		,"T4ddg(Num,i,Num,j)(1,0,1,2)");
-  test_for_zero(t4ddg_1(1,2,0,0) - (t2_1(2,0))
-		,"T4ddg(Num,i,Num,j)(1,0,2,0)");
-  test_for_zero(t4ddg_1(1,2,0,1) - (t2_1(2,1))
-		,"T4ddg(Num,i,Num,j)(1,0,2,1)");
-  test_for_zero(t4ddg_1(1,2,0,2) - (t2_1(2,2))
-		,"T4ddg(Num,i,Num,j)(1,0,2,2)");
-
-  t2_1(i,j)=t4ddg_1(1,i,1,j);
-  test_for_zero(t4ddg_1(1,0,1,0) - (t2_1(0,0))
-		,"T4ddg(Num,i,Num,j)(1,1,0,0)");
-  test_for_zero(t4ddg_1(1,0,1,1) - (t2_1(0,1))
-		,"T4ddg(Num,i,Num,j)(1,1,0,1)");
-  test_for_zero(t4ddg_1(1,0,1,2) - (t2_1(0,2))
-		,"T4ddg(Num,i,Num,j)(1,1,0,2)");
-  test_for_zero(t4ddg_1(1,1,1,0) - (t2_1(1,0))
-		,"T4ddg(Num,i,Num,j)(1,1,1,0)");
-  test_for_zero(t4ddg_1(1,1,1,1) - (t2_1(1,1))
-		,"T4ddg(Num,i,Num,j)(1,1,1,1)");
-  test_for_zero(t4ddg_1(1,1,1,2) - (t2_1(1,2))
-		,"T4ddg(Num,i,Num,j)(1,1,1,2)");
-  test_for_zero(t4ddg_1(1,2,1,0) - (t2_1(2,0))
-		,"T4ddg(Num,i,Num,j)(1,1,2,0)");
-  test_for_zero(t4ddg_1(1,2,1,1) - (t2_1(2,1))
-		,"T4ddg(Num,i,Num,j)(1,1,2,1)");
-  test_for_zero(t4ddg_1(1,2,1,2) - (t2_1(2,2))
-		,"T4ddg(Num,i,Num,j)(1,1,2,2)");
-
-  t2_1(i,j)=t4ddg_1(1,i,2,j);
-  test_for_zero(t4ddg_1(1,0,2,0) - (t2_1(0,0))
-		,"T4ddg(Num,i,Num,j)(1,2,0,0)");
-  test_for_zero(t4ddg_1(1,0,2,1) - (t2_1(0,1))
-		,"T4ddg(Num,i,Num,j)(1,2,0,1)");
-  test_for_zero(t4ddg_1(1,0,2,2) - (t2_1(0,2))
-		,"T4ddg(Num,i,Num,j)(1,2,0,2)");
-  test_for_zero(t4ddg_1(1,1,2,0) - (t2_1(1,0))
-		,"T4ddg(Num,i,Num,j)(1,2,1,0)");
-  test_for_zero(t4ddg_1(1,1,2,1) - (t2_1(1,1))
-		,"T4ddg(Num,i,Num,j)(1,2,1,1)");
-  test_for_zero(t4ddg_1(1,1,2,2) - (t2_1(1,2))
-		,"T4ddg(Num,i,Num,j)(1,2,1,2)");
-  test_for_zero(t4ddg_1(1,2,2,0) - (t2_1(2,0))
-		,"T4ddg(Num,i,Num,j)(1,2,2,0)");
-  test_for_zero(t4ddg_1(1,2,2,1) - (t2_1(2,1))
-		,"T4ddg(Num,i,Num,j)(1,2,2,1)");
-  test_for_zero(t4ddg_1(1,2,2,2) - (t2_1(2,2))
-		,"T4ddg(Num,i,Num,j)(1,2,2,2)");
-
-  t2_1(i,j)=t4ddg_1(2,i,0,j);
-  test_for_zero(t4ddg_1(2,0,0,0) - (t2_1(0,0))
-		,"T4ddg(Num,i,Num,j)(2,0,0,0)");
-  test_for_zero(t4ddg_1(2,0,0,1) - (t2_1(0,1))
-		,"T4ddg(Num,i,Num,j)(2,0,0,1)");
-  test_for_zero(t4ddg_1(2,0,0,2) - (t2_1(0,2))
-		,"T4ddg(Num,i,Num,j)(2,0,0,2)");
-  test_for_zero(t4ddg_1(2,1,0,0) - (t2_1(1,0))
-		,"T4ddg(Num,i,Num,j)(2,0,1,0)");
-  test_for_zero(t4ddg_1(2,1,0,1) - (t2_1(1,1))
-		,"T4ddg(Num,i,Num,j)(2,0,1,1)");
-  test_for_zero(t4ddg_1(2,1,0,2) - (t2_1(1,2))
-		,"T4ddg(Num,i,Num,j)(2,0,1,2)");
-  test_for_zero(t4ddg_1(2,2,0,0) - (t2_1(2,0))
-		,"T4ddg(Num,i,Num,j)(2,0,2,0)");
-  test_for_zero(t4ddg_1(2,2,0,1) - (t2_1(2,1))
-		,"T4ddg(Num,i,Num,j)(2,0,2,1)");
-  test_for_zero(t4ddg_1(2,2,0,2) - (t2_1(2,2))
-		,"T4ddg(Num,i,Num,j)(2,0,2,2)");
-
-  t2_1(i,j)=t4ddg_1(2,i,1,j);
-  test_for_zero(t4ddg_1(2,0,1,0) - (t2_1(0,0))
-		,"T4ddg(Num,i,Num,j)(2,1,0,0)");
-  test_for_zero(t4ddg_1(2,0,1,1) - (t2_1(0,1))
-		,"T4ddg(Num,i,Num,j)(2,1,0,1)");
-  test_for_zero(t4ddg_1(2,0,1,2) - (t2_1(0,2))
-		,"T4ddg(Num,i,Num,j)(2,1,0,2)");
-  test_for_zero(t4ddg_1(2,1,1,0) - (t2_1(1,0))
-		,"T4ddg(Num,i,Num,j)(2,1,1,0)");
-  test_for_zero(t4ddg_1(2,1,1,1) - (t2_1(1,1))
-		,"T4ddg(Num,i,Num,j)(2,1,1,1)");
-  test_for_zero(t4ddg_1(2,1,1,2) - (t2_1(1,2))
-		,"T4ddg(Num,i,Num,j)(2,1,1,2)");
-  test_for_zero(t4ddg_1(2,2,1,0) - (t2_1(2,0))
-		,"T4ddg(Num,i,Num,j)(2,1,2,0)");
-  test_for_zero(t4ddg_1(2,2,1,1) - (t2_1(2,1))
-		,"T4ddg(Num,i,Num,j)(2,1,2,1)");
-  test_for_zero(t4ddg_1(2,2,1,2) - (t2_1(2,2))
-		,"T4ddg(Num,i,Num,j)(2,1,2,2)");
-
-  t2_1(i,j)=t4ddg_1(2,i,2,j);
-  test_for_zero(t4ddg_1(2,0,2,0) - (t2_1(0,0))
-		,"T4ddg(Num,i,Num,j)(2,2,0,0)");
-  test_for_zero(t4ddg_1(2,0,2,1) - (t2_1(0,1))
-		,"T4ddg(Num,i,Num,j)(2,2,0,1)");
-  test_for_zero(t4ddg_1(2,0,2,2) - (t2_1(0,2))
-		,"T4ddg(Num,i,Num,j)(2,2,0,2)");
-  test_for_zero(t4ddg_1(2,1,2,0) - (t2_1(1,0))
-		,"T4ddg(Num,i,Num,j)(2,2,1,0)");
-  test_for_zero(t4ddg_1(2,1,2,1) - (t2_1(1,1))
-		,"T4ddg(Num,i,Num,j)(2,2,1,1)");
-  test_for_zero(t4ddg_1(2,1,2,2) - (t2_1(1,2))
-		,"T4ddg(Num,i,Num,j)(2,2,1,2)");
-  test_for_zero(t4ddg_1(2,2,2,0) - (t2_1(2,0))
-		,"T4ddg(Num,i,Num,j)(2,2,2,0)");
-  test_for_zero(t4ddg_1(2,2,2,1) - (t2_1(2,1))
-		,"T4ddg(Num,i,Num,j)(2,2,2,1)");
-  test_for_zero(t4ddg_1(2,2,2,2) - (t2_1(2,2))
-		,"T4ddg(Num,i,Num,j)(2,2,2,2)");
-
-  t3dg_1(j,k,i)=t4ddg_1(0,i,j,k);
-  test_for_zero(t3dg_1(0,0,0) - t4ddg_1(0,0,0,0)
-		,"T4ddg(Num,i,j,k)(0,0,0,0)");
-  test_for_zero(t3dg_1(0,1,0) - t4ddg_1(0,0,0,1)
-		,"T4ddg(Num,i,j,k)(0,0,0,1)");
-  test_for_zero(t3dg_1(0,2,0) - t4ddg_1(0,0,0,2)
-		,"T4ddg(Num,i,j,k)(0,0,0,2)");
-  test_for_zero(t3dg_1(1,0,0) - t4ddg_1(0,0,1,0)
-		,"T4ddg(Num,i,j,k)(0,0,1,0)");
-  test_for_zero(t3dg_1(1,1,0) - t4ddg_1(0,0,1,1)
-		,"T4ddg(Num,i,j,k)(0,0,1,1)");
-  test_for_zero(t3dg_1(1,2,0) - t4ddg_1(0,0,1,2)
-		,"T4ddg(Num,i,j,k)(0,0,1,2)");
-  test_for_zero(t3dg_1(2,0,0) - t4ddg_1(0,0,2,0)
-		,"T4ddg(Num,i,j,k)(0,0,2,0)");
-  test_for_zero(t3dg_1(2,1,0) - t4ddg_1(0,0,2,1)
-		,"T4ddg(Num,i,j,k)(0,0,2,1)");
-  test_for_zero(t3dg_1(2,2,0) - t4ddg_1(0,0,2,2)
-		,"T4ddg(Num,i,j,k)(0,0,2,2)");
-  test_for_zero(t3dg_1(0,0,1) - t4ddg_1(0,1,0,0)
-		,"T4ddg(Num,i,j,k)(0,1,0,0)");
-  test_for_zero(t3dg_1(0,1,1) - t4ddg_1(0,1,0,1)
-		,"T4ddg(Num,i,j,k)(0,1,0,1)");
-  test_for_zero(t3dg_1(0,2,1) - t4ddg_1(0,1,0,2)
-		,"T4ddg(Num,i,j,k)(0,1,0,2)");
-  test_for_zero(t3dg_1(1,0,1) - t4ddg_1(0,1,1,0)
-		,"T4ddg(Num,i,j,k)(0,1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - t4ddg_1(0,1,1,1)
-		,"T4ddg(Num,i,j,k)(0,1,1,1)");
-  test_for_zero(t3dg_1(1,2,1) - t4ddg_1(0,1,1,2)
-		,"T4ddg(Num,i,j,k)(0,1,1,2)");
-  test_for_zero(t3dg_1(2,0,1) - t4ddg_1(0,1,2,0)
-		,"T4ddg(Num,i,j,k)(0,1,2,0)");
-  test_for_zero(t3dg_1(2,1,1) - t4ddg_1(0,1,2,1)
-		,"T4ddg(Num,i,j,k)(0,1,2,1)");
-  test_for_zero(t3dg_1(2,2,1) - t4ddg_1(0,1,2,2)
-		,"T4ddg(Num,i,j,k)(0,1,2,2)");
-  test_for_zero(t3dg_1(0,0,2) - t4ddg_1(0,2,0,0)
-		,"T4ddg(Num,i,j,k)(0,2,0,0)");
-  test_for_zero(t3dg_1(0,1,2) - t4ddg_1(0,2,0,1)
-		,"T4ddg(Num,i,j,k)(0,2,0,1)");
-  test_for_zero(t3dg_1(0,2,2) - t4ddg_1(0,2,0,2)
-		,"T4ddg(Num,i,j,k)(0,2,0,2)");
-  test_for_zero(t3dg_1(1,0,2) - t4ddg_1(0,2,1,0)
-		,"T4ddg(Num,i,j,k)(0,2,1,0)");
-  test_for_zero(t3dg_1(1,1,2) - t4ddg_1(0,2,1,1)
-		,"T4ddg(Num,i,j,k)(0,2,1,1)");
-  test_for_zero(t3dg_1(1,2,2) - t4ddg_1(0,2,1,2)
-		,"T4ddg(Num,i,j,k)(0,2,1,2)");
-  test_for_zero(t3dg_1(2,0,2) - t4ddg_1(0,2,2,0)
-		,"T4ddg(Num,i,j,k)(0,2,2,0)");
-  test_for_zero(t3dg_1(2,1,2) - t4ddg_1(0,2,2,1)
-		,"T4ddg(Num,i,j,k)(0,2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - t4ddg_1(0,2,2,2)
-		,"T4ddg(Num,i,j,k)(0,2,2,2)");
-
-  t3dg_1(j,k,i)=t4ddg_1(1,i,j,k);
-  test_for_zero(t3dg_1(0,0,0) - t4ddg_1(1,0,0,0)
-		,"T4ddg(Num,i,j,k)(1,0,0,0)");
-  test_for_zero(t3dg_1(0,1,0) - t4ddg_1(1,0,0,1)
-		,"T4ddg(Num,i,j,k)(1,0,0,1)");
-  test_for_zero(t3dg_1(0,2,0) - t4ddg_1(1,0,0,2)
-		,"T4ddg(Num,i,j,k)(1,0,0,2)");
-  test_for_zero(t3dg_1(1,0,0) - t4ddg_1(1,0,1,0)
-		,"T4ddg(Num,i,j,k)(1,0,1,0)");
-  test_for_zero(t3dg_1(1,1,0) - t4ddg_1(1,0,1,1)
-		,"T4ddg(Num,i,j,k)(1,0,1,1)");
-  test_for_zero(t3dg_1(1,2,0) - t4ddg_1(1,0,1,2)
-		,"T4ddg(Num,i,j,k)(1,0,1,2)");
-  test_for_zero(t3dg_1(2,0,0) - t4ddg_1(1,0,2,0)
-		,"T4ddg(Num,i,j,k)(1,0,2,0)");
-  test_for_zero(t3dg_1(2,1,0) - t4ddg_1(1,0,2,1)
-		,"T4ddg(Num,i,j,k)(1,0,2,1)");
-  test_for_zero(t3dg_1(2,2,0) - t4ddg_1(1,0,2,2)
-		,"T4ddg(Num,i,j,k)(1,0,2,2)");
-  test_for_zero(t3dg_1(0,0,1) - t4ddg_1(1,1,0,0)
-		,"T4ddg(Num,i,j,k)(1,1,0,0)");
-  test_for_zero(t3dg_1(0,1,1) - t4ddg_1(1,1,0,1)
-		,"T4ddg(Num,i,j,k)(1,1,0,1)");
-  test_for_zero(t3dg_1(0,2,1) - t4ddg_1(1,1,0,2)
-		,"T4ddg(Num,i,j,k)(1,1,0,2)");
-  test_for_zero(t3dg_1(1,0,1) - t4ddg_1(1,1,1,0)
-		,"T4ddg(Num,i,j,k)(1,1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - t4ddg_1(1,1,1,1)
-		,"T4ddg(Num,i,j,k)(1,1,1,1)");
-  test_for_zero(t3dg_1(1,2,1) - t4ddg_1(1,1,1,2)
-		,"T4ddg(Num,i,j,k)(1,1,1,2)");
-  test_for_zero(t3dg_1(2,0,1) - t4ddg_1(1,1,2,0)
-		,"T4ddg(Num,i,j,k)(1,1,2,0)");
-  test_for_zero(t3dg_1(2,1,1) - t4ddg_1(1,1,2,1)
-		,"T4ddg(Num,i,j,k)(1,1,2,1)");
-  test_for_zero(t3dg_1(2,2,1) - t4ddg_1(1,1,2,2)
-		,"T4ddg(Num,i,j,k)(1,1,2,2)");
-  test_for_zero(t3dg_1(0,0,2) - t4ddg_1(1,2,0,0)
-		,"T4ddg(Num,i,j,k)(1,2,0,0)");
-  test_for_zero(t3dg_1(0,1,2) - t4ddg_1(1,2,0,1)
-		,"T4ddg(Num,i,j,k)(1,2,0,1)");
-  test_for_zero(t3dg_1(0,2,2) - t4ddg_1(1,2,0,2)
-		,"T4ddg(Num,i,j,k)(1,2,0,2)");
-  test_for_zero(t3dg_1(1,0,2) - t4ddg_1(1,2,1,0)
-		,"T4ddg(Num,i,j,k)(1,2,1,0)");
-  test_for_zero(t3dg_1(1,1,2) - t4ddg_1(1,2,1,1)
-		,"T4ddg(Num,i,j,k)(1,2,1,1)");
-  test_for_zero(t3dg_1(1,2,2) - t4ddg_1(1,2,1,2)
-		,"T4ddg(Num,i,j,k)(1,2,1,2)");
-  test_for_zero(t3dg_1(2,0,2) - t4ddg_1(1,2,2,0)
-		,"T4ddg(Num,i,j,k)(1,2,2,0)");
-  test_for_zero(t3dg_1(2,1,2) - t4ddg_1(1,2,2,1)
-		,"T4ddg(Num,i,j,k)(1,2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - t4ddg_1(1,2,2,2)
-		,"T4ddg(Num,i,j,k)(1,2,2,2)");
-
-  t3dg_1(j,k,i)=t4ddg_1(2,i,j,k);
-  test_for_zero(t3dg_1(0,0,0) - t4ddg_1(2,0,0,0)
-		,"T4ddg(Num,i,j,k)(2,0,0,0)");
-  test_for_zero(t3dg_1(0,1,0) - t4ddg_1(2,0,0,1)
-		,"T4ddg(Num,i,j,k)(2,0,0,1)");
-  test_for_zero(t3dg_1(0,2,0) - t4ddg_1(2,0,0,2)
-		,"T4ddg(Num,i,j,k)(2,0,0,2)");
-  test_for_zero(t3dg_1(1,0,0) - t4ddg_1(2,0,1,0)
-		,"T4ddg(Num,i,j,k)(2,0,1,0)");
-  test_for_zero(t3dg_1(1,1,0) - t4ddg_1(2,0,1,1)
-		,"T4ddg(Num,i,j,k)(2,0,1,1)");
-  test_for_zero(t3dg_1(1,2,0) - t4ddg_1(2,0,1,2)
-		,"T4ddg(Num,i,j,k)(2,0,1,2)");
-  test_for_zero(t3dg_1(2,0,0) - t4ddg_1(2,0,2,0)
-		,"T4ddg(Num,i,j,k)(2,0,2,0)");
-  test_for_zero(t3dg_1(2,1,0) - t4ddg_1(2,0,2,1)
-		,"T4ddg(Num,i,j,k)(2,0,2,1)");
-  test_for_zero(t3dg_1(2,2,0) - t4ddg_1(2,0,2,2)
-		,"T4ddg(Num,i,j,k)(2,0,2,2)");
-  test_for_zero(t3dg_1(0,0,1) - t4ddg_1(2,1,0,0)
-		,"T4ddg(Num,i,j,k)(2,1,0,0)");
-  test_for_zero(t3dg_1(0,1,1) - t4ddg_1(2,1,0,1)
-		,"T4ddg(Num,i,j,k)(2,1,0,1)");
-  test_for_zero(t3dg_1(0,2,1) - t4ddg_1(2,1,0,2)
-		,"T4ddg(Num,i,j,k)(2,1,0,2)");
-  test_for_zero(t3dg_1(1,0,1) - t4ddg_1(2,1,1,0)
-		,"T4ddg(Num,i,j,k)(2,1,1,0)");
-  test_for_zero(t3dg_1(1,1,1) - t4ddg_1(2,1,1,1)
-		,"T4ddg(Num,i,j,k)(2,1,1,1)");
-  test_for_zero(t3dg_1(1,2,1) - t4ddg_1(2,1,1,2)
-		,"T4ddg(Num,i,j,k)(2,1,1,2)");
-  test_for_zero(t3dg_1(2,0,1) - t4ddg_1(2,1,2,0)
-		,"T4ddg(Num,i,j,k)(2,1,2,0)");
-  test_for_zero(t3dg_1(2,1,1) - t4ddg_1(2,1,2,1)
-		,"T4ddg(Num,i,j,k)(2,1,2,1)");
-  test_for_zero(t3dg_1(2,2,1) - t4ddg_1(2,1,2,2)
-		,"T4ddg(Num,i,j,k)(2,1,2,2)");
-  test_for_zero(t3dg_1(0,0,2) - t4ddg_1(2,2,0,0)
-		,"T4ddg(Num,i,j,k)(2,2,0,0)");
-  test_for_zero(t3dg_1(0,1,2) - t4ddg_1(2,2,0,1)
-		,"T4ddg(Num,i,j,k)(2,2,0,1)");
-  test_for_zero(t3dg_1(0,2,2) - t4ddg_1(2,2,0,2)
-		,"T4ddg(Num,i,j,k)(2,2,0,2)");
-  test_for_zero(t3dg_1(1,0,2) - t4ddg_1(2,2,1,0)
-		,"T4ddg(Num,i,j,k)(2,2,1,0)");
-  test_for_zero(t3dg_1(1,1,2) - t4ddg_1(2,2,1,1)
-		,"T4ddg(Num,i,j,k)(2,2,1,1)");
-  test_for_zero(t3dg_1(1,2,2) - t4ddg_1(2,2,1,2)
-		,"T4ddg(Num,i,j,k)(2,2,1,2)");
-  test_for_zero(t3dg_1(2,0,2) - t4ddg_1(2,2,2,0)
-		,"T4ddg(Num,i,j,k)(2,2,2,0)");
-  test_for_zero(t3dg_1(2,1,2) - t4ddg_1(2,2,2,1)
-		,"T4ddg(Num,i,j,k)(2,2,2,1)");
-  test_for_zero(t3dg_1(2,2,2) - t4ddg_1(2,2,2,2)
-		,"T4ddg(Num,i,j,k)(2,2,2,2)");
-
-  /* Only one index int the first slot*/
-
-  t1_1(i)=t4ddg_1(i,0,0,0);
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,0)
-		,"T4ddg(i,Num,Num,Num)(0,0,0,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,0)
-		,"T4ddg(i,Num,Num,Num)(0,0,0,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,0)
-		,"T4ddg(i,Num,Num,Num)(0,0,0,2)");
-  t1_1(i)=t4ddg_1(i,0,0,1);
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,1)
-		,"T4ddg(i,Num,Num,Num)(0,0,1,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,1)
-		,"T4ddg(i,Num,Num,Num)(0,0,1,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,1)
-		,"T4ddg(i,Num,Num,Num)(0,0,1,2)");
-  t1_1(i)=t4ddg_1(i,0,0,2);
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,2)
-		,"T4ddg(i,Num,Num,Num)(0,0,2,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,2)
-		,"T4ddg(i,Num,Num,Num)(0,0,2,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,2)
-		,"T4ddg(i,Num,Num,Num)(0,0,2,2)");
-  t1_1(i)=t4ddg_1(i,0,1,0);
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,0)
-		,"T4ddg(i,Num,Num,Num)(0,1,0,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,0)
-		,"T4ddg(i,Num,Num,Num)(0,1,0,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,0)
-		,"T4ddg(i,Num,Num,Num)(0,1,0,2)");
-  t1_1(i)=t4ddg_1(i,0,1,1);
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,1)
-		,"T4ddg(i,Num,Num,Num)(0,1,1,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,1)
-		,"T4ddg(i,Num,Num,Num)(0,1,1,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,1)
-		,"T4ddg(i,Num,Num,Num)(0,1,1,2)");
-  t1_1(i)=t4ddg_1(i,0,1,2);
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,2)
-		,"T4ddg(i,Num,Num,Num)(0,1,2,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,2)
-		,"T4ddg(i,Num,Num,Num)(0,1,2,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,2)
-		,"T4ddg(i,Num,Num,Num)(0,1,2,2)");
-  t1_1(i)=t4ddg_1(i,0,2,0);
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,0)
-		,"T4ddg(i,Num,Num,Num)(0,2,0,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,0)
-		,"T4ddg(i,Num,Num,Num)(0,2,0,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,0)
-		,"T4ddg(i,Num,Num,Num)(0,2,0,2)");
-  t1_1(i)=t4ddg_1(i,0,2,1);
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,1)
-		,"T4ddg(i,Num,Num,Num)(0,2,1,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,1)
-		,"T4ddg(i,Num,Num,Num)(0,2,1,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,1)
-		,"T4ddg(i,Num,Num,Num)(0,2,1,2)");
-  t1_1(i)=t4ddg_1(i,0,2,2);
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,2)
-		,"T4ddg(i,Num,Num,Num)(0,2,2,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,2)
-		,"T4ddg(i,Num,Num,Num)(0,2,2,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,2)
-		,"T4ddg(i,Num,Num,Num)(0,2,2,2)");
-  t1_1(i)=t4ddg_1(i,1,0,0);
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,0,0)
-		,"T4ddg(i,Num,Num,Num)(1,0,0,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,0,0)
-		,"T4ddg(i,Num,Num,Num)(1,0,0,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,0,0)
-		,"T4ddg(i,Num,Num,Num)(1,0,0,2)");
-  t1_1(i)=t4ddg_1(i,1,0,1);
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,0,1)
-		,"T4ddg(i,Num,Num,Num)(1,0,1,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,0,1)
-		,"T4ddg(i,Num,Num,Num)(1,0,1,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,0,1)
-		,"T4ddg(i,Num,Num,Num)(1,0,1,2)");
-  t1_1(i)=t4ddg_1(i,1,0,2);
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,0,2)
-		,"T4ddg(i,Num,Num,Num)(1,0,2,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,0,2)
-		,"T4ddg(i,Num,Num,Num)(1,0,2,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,0,2)
-		,"T4ddg(i,Num,Num,Num)(1,0,2,2)");
-  t1_1(i)=t4ddg_1(i,1,1,0);
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,1,0)
-		,"T4ddg(i,Num,Num,Num)(1,1,0,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,1,0)
-		,"T4ddg(i,Num,Num,Num)(1,1,0,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,1,0)
-		,"T4ddg(i,Num,Num,Num)(1,1,0,2)");
-  t1_1(i)=t4ddg_1(i,1,1,1);
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,1,1)
-		,"T4ddg(i,Num,Num,Num)(1,1,1,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,1,1)
-		,"T4ddg(i,Num,Num,Num)(1,1,1,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,1,1)
-		,"T4ddg(i,Num,Num,Num)(1,1,1,2)");
-  t1_1(i)=t4ddg_1(i,1,1,2);
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,1,2)
-		,"T4ddg(i,Num,Num,Num)(1,1,2,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,1,2)
-		,"T4ddg(i,Num,Num,Num)(1,1,2,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,1,2)
-		,"T4ddg(i,Num,Num,Num)(1,1,2,2)");
-  t1_1(i)=t4ddg_1(i,1,2,0);
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,2,0)
-		,"T4ddg(i,Num,Num,Num)(1,2,0,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,2,0)
-		,"T4ddg(i,Num,Num,Num)(1,2,0,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,2,0)
-		,"T4ddg(i,Num,Num,Num)(1,2,0,2)");
-  t1_1(i)=t4ddg_1(i,1,2,1);
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,2,1)
-		,"T4ddg(i,Num,Num,Num)(1,2,1,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,2,1)
-		,"T4ddg(i,Num,Num,Num)(1,2,1,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,2,1)
-		,"T4ddg(i,Num,Num,Num)(1,2,1,2)");
-  t1_1(i)=t4ddg_1(i,1,2,2);
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,2,2)
-		,"T4ddg(i,Num,Num,Num)(1,2,2,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,2,2)
-		,"T4ddg(i,Num,Num,Num)(1,2,2,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,1,2,2)
-		,"T4ddg(i,Num,Num,Num)(1,2,2,2)");
-  t1_1(i)=t4ddg_1(i,2,0,0);
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,0,0)
-		,"T4ddg(i,Num,Num,Num)(2,0,0,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,0,0)
-		,"T4ddg(i,Num,Num,Num)(2,0,0,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,0,0)
-		,"T4ddg(i,Num,Num,Num)(2,0,0,2)");
-  t1_1(i)=t4ddg_1(i,2,0,1);
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,0,1)
-		,"T4ddg(i,Num,Num,Num)(2,0,1,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,0,1)
-		,"T4ddg(i,Num,Num,Num)(2,0,1,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,0,1)
-		,"T4ddg(i,Num,Num,Num)(2,0,1,2)");
-  t1_1(i)=t4ddg_1(i,2,0,2);
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,0,2)
-		,"T4ddg(i,Num,Num,Num)(2,0,2,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,0,2)
-		,"T4ddg(i,Num,Num,Num)(2,0,2,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,0,2)
-		,"T4ddg(i,Num,Num,Num)(2,0,2,2)");
-  t1_1(i)=t4ddg_1(i,2,1,0);
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,1,0)
-		,"T4ddg(i,Num,Num,Num)(2,1,0,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,1,0)
-		,"T4ddg(i,Num,Num,Num)(2,1,0,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,1,0)
-		,"T4ddg(i,Num,Num,Num)(2,1,0,2)");
-  t1_1(i)=t4ddg_1(i,2,1,1);
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,1,1)
-		,"T4ddg(i,Num,Num,Num)(2,1,1,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,1,1)
-		,"T4ddg(i,Num,Num,Num)(2,1,1,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,1,1)
-		,"T4ddg(i,Num,Num,Num)(2,1,1,2)");
-  t1_1(i)=t4ddg_1(i,2,1,2);
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,1,2)
-		,"T4ddg(i,Num,Num,Num)(2,1,2,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,1,2)
-		,"T4ddg(i,Num,Num,Num)(2,1,2,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,1,2)
-		,"T4ddg(i,Num,Num,Num)(2,1,2,2)");
-  t1_1(i)=t4ddg_1(i,2,2,0);
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,2,0)
-		,"T4ddg(i,Num,Num,Num)(2,2,0,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,2,0)
-		,"T4ddg(i,Num,Num,Num)(2,2,0,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,2,0)
-		,"T4ddg(i,Num,Num,Num)(2,2,0,2)");
-  t1_1(i)=t4ddg_1(i,2,2,1);
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,2,1)
-		,"T4ddg(i,Num,Num,Num)(2,2,1,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,2,1)
-		,"T4ddg(i,Num,Num,Num)(2,2,1,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,2,1)
-		,"T4ddg(i,Num,Num,Num)(2,2,1,2)");
-  t1_1(i)=t4ddg_1(i,2,2,2);
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,2,2)
-		,"T4ddg(i,Num,Num,Num)(2,2,2,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,2,2)
-		,"T4ddg(i,Num,Num,Num)(2,2,2,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,2,2,2)
-		,"T4ddg(i,Num,Num,Num)(2,2,2,2)");
-
-  /* Only one index in the second slot */
-
-  t1_1(i)=t4ddg_1(0,i,0,0);
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,0)
-		,"T4ddg(Num,i,Num,Num)(0,0,0,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,0)
-		,"T4ddg(Num,i,Num,Num)(0,0,0,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,0)
-		,"T4ddg(Num,i,Num,Num)(0,0,0,2)");
-  t1_1(i)=t4ddg_1(0,i,0,1);
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,1)
-		,"T4ddg(Num,i,Num,Num)(0,0,1,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,1)
-		,"T4ddg(Num,i,Num,Num)(0,0,1,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,1)
-		,"T4ddg(Num,i,Num,Num)(0,0,1,2)");
-  t1_1(i)=t4ddg_1(0,i,0,2);
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,2)
-		,"T4ddg(Num,i,Num,Num)(0,0,2,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,2)
-		,"T4ddg(Num,i,Num,Num)(0,0,2,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,2)
-		,"T4ddg(Num,i,Num,Num)(0,0,2,2)");
-  t1_1(i)=t4ddg_1(0,i,1,0);
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,0)
-		,"T4ddg(Num,i,Num,Num)(0,1,0,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,0)
-		,"T4ddg(Num,i,Num,Num)(0,1,0,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,0)
-		,"T4ddg(Num,i,Num,Num)(0,1,0,2)");
-  t1_1(i)=t4ddg_1(0,i,1,1);
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,1)
-		,"T4ddg(Num,i,Num,Num)(0,1,1,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,1)
-		,"T4ddg(Num,i,Num,Num)(0,1,1,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,1)
-		,"T4ddg(Num,i,Num,Num)(0,1,1,2)");
-  t1_1(i)=t4ddg_1(0,i,1,2);
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,2)
-		,"T4ddg(Num,i,Num,Num)(0,1,2,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,2)
-		,"T4ddg(Num,i,Num,Num)(0,1,2,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,2)
-		,"T4ddg(Num,i,Num,Num)(0,1,2,2)");
-  t1_1(i)=t4ddg_1(0,i,2,0);
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,0)
-		,"T4ddg(Num,i,Num,Num)(0,2,0,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,0)
-		,"T4ddg(Num,i,Num,Num)(0,2,0,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,0)
-		,"T4ddg(Num,i,Num,Num)(0,2,0,2)");
-  t1_1(i)=t4ddg_1(0,i,2,1);
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,1)
-		,"T4ddg(Num,i,Num,Num)(0,2,1,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,1)
-		,"T4ddg(Num,i,Num,Num)(0,2,1,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,1)
-		,"T4ddg(Num,i,Num,Num)(0,2,1,2)");
-  t1_1(i)=t4ddg_1(0,i,2,2);
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,2)
-		,"T4ddg(Num,i,Num,Num)(0,2,2,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,2)
-		,"T4ddg(Num,i,Num,Num)(0,2,2,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,2)
-		,"T4ddg(Num,i,Num,Num)(0,2,2,2)");
-  t1_1(i)=t4ddg_1(1,i,0,0);
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,0,0)
-		,"T4ddg(Num,i,Num,Num)(1,0,0,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,0,0)
-		,"T4ddg(Num,i,Num,Num)(1,0,0,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,0,0)
-		,"T4ddg(Num,i,Num,Num)(1,0,0,2)");
-  t1_1(i)=t4ddg_1(1,i,0,1);
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,0,1)
-		,"T4ddg(Num,i,Num,Num)(1,0,1,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,0,1)
-		,"T4ddg(Num,i,Num,Num)(1,0,1,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,0,1)
-		,"T4ddg(Num,i,Num,Num)(1,0,1,2)");
-  t1_1(i)=t4ddg_1(1,i,0,2);
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,0,2)
-		,"T4ddg(Num,i,Num,Num)(1,0,2,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,0,2)
-		,"T4ddg(Num,i,Num,Num)(1,0,2,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,0,2)
-		,"T4ddg(Num,i,Num,Num)(1,0,2,2)");
-  t1_1(i)=t4ddg_1(1,i,1,0);
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,1,0)
-		,"T4ddg(Num,i,Num,Num)(1,1,0,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,1,0)
-		,"T4ddg(Num,i,Num,Num)(1,1,0,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,1,0)
-		,"T4ddg(Num,i,Num,Num)(1,1,0,2)");
-  t1_1(i)=t4ddg_1(1,i,1,1);
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,1,1)
-		,"T4ddg(Num,i,Num,Num)(1,1,1,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,1,1)
-		,"T4ddg(Num,i,Num,Num)(1,1,1,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,1,1)
-		,"T4ddg(Num,i,Num,Num)(1,1,1,2)");
-  t1_1(i)=t4ddg_1(1,i,1,2);
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,1,2)
-		,"T4ddg(Num,i,Num,Num)(1,1,2,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,1,2)
-		,"T4ddg(Num,i,Num,Num)(1,1,2,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,1,2)
-		,"T4ddg(Num,i,Num,Num)(1,1,2,2)");
-  t1_1(i)=t4ddg_1(1,i,2,0);
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,2,0)
-		,"T4ddg(Num,i,Num,Num)(1,2,0,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,2,0)
-		,"T4ddg(Num,i,Num,Num)(1,2,0,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,2,0)
-		,"T4ddg(Num,i,Num,Num)(1,2,0,2)");
-  t1_1(i)=t4ddg_1(1,i,2,1);
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,2,1)
-		,"T4ddg(Num,i,Num,Num)(1,2,1,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,2,1)
-		,"T4ddg(Num,i,Num,Num)(1,2,1,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,2,1)
-		,"T4ddg(Num,i,Num,Num)(1,2,1,2)");
-  t1_1(i)=t4ddg_1(1,i,2,2);
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,2,2)
-		,"T4ddg(Num,i,Num,Num)(1,2,2,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,2,2)
-		,"T4ddg(Num,i,Num,Num)(1,2,2,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(1,0,2,2)
-		,"T4ddg(Num,i,Num,Num)(1,2,2,2)");
-  t1_1(i)=t4ddg_1(2,i,0,0);
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,0,0)
-		,"T4ddg(Num,i,Num,Num)(2,0,0,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,0,0)
-		,"T4ddg(Num,i,Num,Num)(2,0,0,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,0,0)
-		,"T4ddg(Num,i,Num,Num)(2,0,0,2)");
-  t1_1(i)=t4ddg_1(2,i,0,1);
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,0,1)
-		,"T4ddg(Num,i,Num,Num)(2,0,1,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,0,1)
-		,"T4ddg(Num,i,Num,Num)(2,0,1,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,0,1)
-		,"T4ddg(Num,i,Num,Num)(2,0,1,2)");
-  t1_1(i)=t4ddg_1(2,i,0,2);
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,0,2)
-		,"T4ddg(Num,i,Num,Num)(2,0,2,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,0,2)
-		,"T4ddg(Num,i,Num,Num)(2,0,2,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,0,2)
-		,"T4ddg(Num,i,Num,Num)(2,0,2,2)");
-  t1_1(i)=t4ddg_1(2,i,1,0);
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,1,0)
-		,"T4ddg(Num,i,Num,Num)(2,1,0,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,1,0)
-		,"T4ddg(Num,i,Num,Num)(2,1,0,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,1,0)
-		,"T4ddg(Num,i,Num,Num)(2,1,0,2)");
-  t1_1(i)=t4ddg_1(2,i,1,1);
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,1,1)
-		,"T4ddg(Num,i,Num,Num)(2,1,1,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,1,1)
-		,"T4ddg(Num,i,Num,Num)(2,1,1,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,1,1)
-		,"T4ddg(Num,i,Num,Num)(2,1,1,2)");
-  t1_1(i)=t4ddg_1(2,i,1,2);
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,1,2)
-		,"T4ddg(Num,i,Num,Num)(2,1,2,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,1,2)
-		,"T4ddg(Num,i,Num,Num)(2,1,2,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,1,2)
-		,"T4ddg(Num,i,Num,Num)(2,1,2,2)");
-  t1_1(i)=t4ddg_1(2,i,2,0);
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,2,0)
-		,"T4ddg(Num,i,Num,Num)(2,2,0,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,2,0)
-		,"T4ddg(Num,i,Num,Num)(2,2,0,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,2,0)
-		,"T4ddg(Num,i,Num,Num)(2,2,0,2)");
-  t1_1(i)=t4ddg_1(2,i,2,1);
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,2,1)
-		,"T4ddg(Num,i,Num,Num)(2,2,1,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,2,1)
-		,"T4ddg(Num,i,Num,Num)(2,2,1,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,2,1)
-		,"T4ddg(Num,i,Num,Num)(2,2,1,2)");
-  t1_1(i)=t4ddg_1(2,i,2,2);
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,2,2)
-		,"T4ddg(Num,i,Num,Num)(2,2,2,0)");
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,2,2)
-		,"T4ddg(Num,i,Num,Num)(2,2,2,1)");
-  test_for_zero(t1_1(0) - t4ddg_1(2,0,2,2)
-		,"T4ddg(Num,i,Num,Num)(2,2,2,2)");
-
-  cout << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/T4ddg/test_T4ddgV.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/T4ddg/test_T4ddgV.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,1808 @@
+#include <iostream>
+#include "../../../FTensor.hpp"
+#include "../test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T4ddgV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+		Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+		Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+		const Tensor2<double,3,3> &t2_3,
+		Tensor2_symmetric<double,3> &t2s_1,
+		const Tensor2_symmetric<double,3> &t2s_2,
+		const Tensor2_symmetric<double,3> &t2s_3,
+		Tensor3_dg<double,3,3> &t3dg_1,
+		const Tensor3_dg<double,3,3> &t3dg_2,
+		const Tensor3_dg<double,3,3> &t3dg_3,
+		Tensor3_christof<double,3,3> &t3ch_1,
+		const Tensor3_christof<double,3,3> &t3ch_2,
+		const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  Tensor4_ddg<double,3,3> t4ddg_1, t4ddg_2, t4ddg_3;
+
+  /* T4_ddg(1,1,i,j)=T2s(i,j) */
+
+  Tensor1<double,3> t1_3;
+  t1_3(i)=t1_1(j)*t2_1(i,j);
+
+  t4ddg_1(N0,N0,i,j)=(t1_1(i)^t1_1(j));
+  t4ddg_1(N0,N1,i,j)=t2s_1(i,j);
+  t4ddg_1(N0,N2,i,j)=(t1_3(i)^t1_3(j));
+  t4ddg_1(N1,N1,i,j)=t2s_2(i,j);
+  t4ddg_1(N1,N2,i,j)=(t1_2(i)^t1_2(j));
+  t4ddg_1(N2,N2,i,j)=t2s_3(i,j);
+
+  test_for_zero(t4ddg_1(0,0,0,0) - (t1_1(0)*t1_1(0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,0,0,0)");
+  test_for_zero(t4ddg_1(0,0,0,1) - (t1_1(0)*t1_1(1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,0,0,1)");
+  test_for_zero(t4ddg_1(0,0,0,2) - (t1_1(0)*t1_1(2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,0,0,2)");
+  test_for_zero(t4ddg_1(0,0,1,0) - (t1_1(1)*t1_1(0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,0,1,0)");
+  test_for_zero(t4ddg_1(0,0,1,1) - (t1_1(1)*t1_1(1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,0,1,1)");
+  test_for_zero(t4ddg_1(0,0,1,2) - (t1_1(1)*t1_1(2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,0,1,2)");
+  test_for_zero(t4ddg_1(0,0,2,0) - (t1_1(2)*t1_1(0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,0,2,0)");
+  test_for_zero(t4ddg_1(0,0,2,1) - (t1_1(2)*t1_1(1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,0,2,1)");
+  test_for_zero(t4ddg_1(0,0,2,2) - (t1_1(2)*t1_1(2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,0,2,2)");
+  test_for_zero(t4ddg_1(0,1,0,0) - (t2s_1(0,0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,1,0,0)");
+  test_for_zero(t4ddg_1(0,1,0,1) - (t2s_1(0,1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,1,0,1)");
+  test_for_zero(t4ddg_1(0,1,0,2) - (t2s_1(0,2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,1,0,2)");
+  test_for_zero(t4ddg_1(0,1,1,0) - (t2s_1(1,0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,1,1,0)");
+  test_for_zero(t4ddg_1(0,1,1,1) - (t2s_1(1,1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,1,1,1)");
+  test_for_zero(t4ddg_1(0,1,1,2) - (t2s_1(1,2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,1,1,2)");
+  test_for_zero(t4ddg_1(0,1,2,0) - (t2s_1(2,0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,1,2,0)");
+  test_for_zero(t4ddg_1(0,1,2,1) - (t2s_1(2,1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,1,2,1)");
+  test_for_zero(t4ddg_1(0,1,2,2) - (t2s_1(2,2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,1,2,2)");
+  test_for_zero((t4ddg_1(0,2,0,0) - (t1_3(0)*t1_3(0)))/t4ddg_1(0,2,0,0)
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,2,0,0)");
+  test_for_zero((t4ddg_1(0,2,0,1) - (t1_3(0)*t1_3(1)))/t4ddg_1(0,2,0,1)
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,2,0,1)");
+  test_for_zero((t4ddg_1(0,2,0,2) - (t1_3(0)*t1_3(2)))/t4ddg_1(0,2,0,2)
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,2,0,2)");
+  test_for_zero((t4ddg_1(0,2,1,0) - (t1_3(1)*t1_3(0)))/t4ddg_1(0,2,1,0)
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,2,1,0)");
+  test_for_zero((t4ddg_1(0,2,1,1) - (t1_3(1)*t1_3(1)))/t4ddg_1(0,2,1,1)
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,2,1,1)");
+  test_for_zero((t4ddg_1(0,2,1,2) - (t1_3(1)*t1_3(2)))/t4ddg_1(0,2,1,2)
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,2,1,2)");
+  test_for_zero((t4ddg_1(0,2,2,0) - (t1_3(2)*t1_3(0)))/t4ddg_1(0,2,2,0)
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,2,2,0)");
+  test_for_zero((t4ddg_1(0,2,2,1) - (t1_3(2)*t1_3(1)))/t4ddg_1(0,2,2,1)
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,2,2,1)");
+  test_for_zero((t4ddg_1(0,2,2,2) - (t1_3(2)*t1_3(2)))/t4ddg_1(0,2,2,2)
+		,"T4ddg(N,N,i,j)=T2s(i,j)(0,2,2,2)");
+  test_for_zero(t4ddg_1(1,0,0,0) - (t2s_1(0,0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,0,0,0)");
+  test_for_zero(t4ddg_1(1,0,0,1) - (t2s_1(0,1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,0,0,1)");
+  test_for_zero(t4ddg_1(1,0,0,2) - (t2s_1(0,2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,0,0,2)");
+  test_for_zero(t4ddg_1(1,0,1,0) - (t2s_1(1,0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,0,1,0)");
+  test_for_zero(t4ddg_1(1,0,1,1) - (t2s_1(1,1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,0,1,1)");
+  test_for_zero(t4ddg_1(1,0,1,2) - (t2s_1(1,2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,0,1,2)");
+  test_for_zero(t4ddg_1(1,0,2,0) - (t2s_1(2,0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,0,2,0)");
+  test_for_zero(t4ddg_1(1,0,2,1) - (t2s_1(2,1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,0,2,1)");
+  test_for_zero(t4ddg_1(1,0,2,2) - (t2s_1(2,2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,0,2,2)");
+  test_for_zero(t4ddg_1(1,1,0,0) - (t2s_2(0,0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,1,0,0)");
+  test_for_zero(t4ddg_1(1,1,0,1) - (t2s_2(0,1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,1,0,1)");
+  test_for_zero(t4ddg_1(1,1,0,2) - (t2s_2(0,2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,1,0,2)");
+  test_for_zero(t4ddg_1(1,1,1,0) - (t2s_2(1,0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,1) - (t2s_2(1,1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,1,1,1)");
+  test_for_zero(t4ddg_1(1,1,1,2) - (t2s_2(1,2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,1,1,2)");
+  test_for_zero(t4ddg_1(1,1,2,0) - (t2s_2(2,0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,1,2,0)");
+  test_for_zero(t4ddg_1(1,1,2,1) - (t2s_2(2,1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,1,2,1)");
+  test_for_zero(t4ddg_1(1,1,2,2) - (t2s_2(2,2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,1,2,2)");
+  test_for_zero(t4ddg_1(1,2,0,0) - (t1_2(0)*t1_2(0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,2,0,0)");
+  test_for_zero(t4ddg_1(1,2,0,1) - (t1_2(0)*t1_2(1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,2,0,1)");
+  test_for_zero(t4ddg_1(1,2,0,2) - (t1_2(0)*t1_2(2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,2,0,2)");
+  test_for_zero(t4ddg_1(1,2,1,0) - (t1_2(1)*t1_2(0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,2,1,0)");
+  test_for_zero(t4ddg_1(1,2,1,1) - (t1_2(1)*t1_2(1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,2,1,1)");
+  test_for_zero(t4ddg_1(1,2,1,2) - (t1_2(1)*t1_2(2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,2,1,2)");
+  test_for_zero(t4ddg_1(1,2,2,0) - (t1_2(2)*t1_2(0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,2,2,0)");
+  test_for_zero(t4ddg_1(1,2,2,1) - (t1_2(2)*t1_2(1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,2,2,1)");
+  test_for_zero(t4ddg_1(1,2,2,2) - (t1_2(2)*t1_2(2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(1,2,2,2)");
+  test_for_zero((t4ddg_1(2,0,0,0) - (t1_3(0)*t1_3(0)))/t4ddg_1(2,0,0,0)
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,0,0,0)");
+  test_for_zero((t4ddg_1(2,0,0,1) - (t1_3(0)*t1_3(1)))/t4ddg_1(2,0,0,1)
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,0,0,1)");
+  test_for_zero((t4ddg_1(2,0,0,2) - (t1_3(0)*t1_3(2)))/t4ddg_1(2,0,0,2)
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,0,0,2)");
+  test_for_zero((t4ddg_1(2,0,1,0) - (t1_3(1)*t1_3(0)))/t4ddg_1(2,0,1,0)
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,0,1,0)");
+  test_for_zero((t4ddg_1(2,0,1,1) - (t1_3(1)*t1_3(1)))/t4ddg_1(2,0,1,1)
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,0,1,1)");
+  test_for_zero((t4ddg_1(2,0,1,2) - (t1_3(1)*t1_3(2)))/t4ddg_1(2,0,1,2)
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,0,1,2)");
+  test_for_zero((t4ddg_1(2,0,2,0) - (t1_3(2)*t1_3(0)))/t4ddg_1(2,0,2,0)
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,0,2,0)");
+  test_for_zero((t4ddg_1(2,0,2,1) - (t1_3(2)*t1_3(1)))/t4ddg_1(2,0,2,1)
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,0,2,1)");
+  test_for_zero((t4ddg_1(2,0,2,2) - (t1_3(2)*t1_3(2)))/t4ddg_1(2,0,2,2)
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,0,2,2)");
+  test_for_zero(t4ddg_1(2,1,0,0) - (t1_2(0)*t1_2(0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,1,0,0)");
+  test_for_zero(t4ddg_1(2,1,0,1) - (t1_2(0)*t1_2(1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,1,0,1)");
+  test_for_zero(t4ddg_1(2,1,0,2) - (t1_2(0)*t1_2(2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,1,0,2)");
+  test_for_zero(t4ddg_1(2,1,1,0) - (t1_2(1)*t1_2(0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,1,1,0)");
+  test_for_zero(t4ddg_1(2,1,1,1) - (t1_2(1)*t1_2(1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,1,1,1)");
+  test_for_zero(t4ddg_1(2,1,1,2) - (t1_2(1)*t1_2(2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,1,1,2)");
+  test_for_zero(t4ddg_1(2,1,2,0) - (t1_2(2)*t1_2(0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,1,2,0)");
+  test_for_zero(t4ddg_1(2,1,2,1) - (t1_2(2)*t1_2(1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,1,2,1)");
+  test_for_zero(t4ddg_1(2,1,2,2) - (t1_2(2)*t1_2(2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,1,2,2)");
+  test_for_zero(t4ddg_1(2,2,0,0) - (t2s_3(0,0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,2,0,0)");
+  test_for_zero(t4ddg_1(2,2,0,1) - (t2s_3(0,1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,2,0,1)");
+  test_for_zero(t4ddg_1(2,2,0,2) - (t2s_3(0,2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,2,0,2)");
+  test_for_zero(t4ddg_1(2,2,1,0) - (t2s_3(1,0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,2,1,0)");
+  test_for_zero(t4ddg_1(2,2,1,1) - (t2s_3(1,1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,2,1,1)");
+  test_for_zero(t4ddg_1(2,2,1,2) - (t2s_3(1,2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,2,1,2)");
+  test_for_zero(t4ddg_1(2,2,2,0) - (t2s_3(2,0))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,2,2,0)");
+  test_for_zero(t4ddg_1(2,2,2,1) - (t2s_3(2,1))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,2) - (t2s_3(2,2))
+		,"T4ddg(N,N,i,j)=T2s(i,j)(2,2,2,2)");
+
+  t4ddg_2(i,j,k,l)=13*t4ddg_1(i,j,k,l);
+  test_for_zero(t4ddg_2(0,0,0,0) - 13*(t1_1(0)*t1_1(0))
+		,"T*T4ddg(0,0,0,0)");
+  test_for_zero(t4ddg_2(0,0,0,1) - 13*(t1_1(0)*t1_1(1))
+		,"T*T4ddg(0,0,0,1)");
+  test_for_zero(t4ddg_2(0,0,0,2) - 13*(t1_1(0)*t1_1(2))
+		,"T*T4ddg(0,0,0,2)");
+  test_for_zero(t4ddg_2(0,0,1,0) - 13*(t1_1(1)*t1_1(0))
+		,"T*T4ddg(0,0,1,0)");
+  test_for_zero(t4ddg_2(0,0,1,1) - 13*(t1_1(1)*t1_1(1))
+		,"T*T4ddg(0,0,1,1)");
+  test_for_zero(t4ddg_2(0,0,1,2) - 13*(t1_1(1)*t1_1(2))
+		,"T*T4ddg(0,0,1,2)");
+  test_for_zero(t4ddg_2(0,0,2,0) - 13*(t1_1(2)*t1_1(0))
+		,"T*T4ddg(0,0,2,0)");
+  test_for_zero(t4ddg_2(0,0,2,1) - 13*(t1_1(2)*t1_1(1))
+		,"T*T4ddg(0,0,2,1)");
+  test_for_zero(t4ddg_2(0,0,2,2) - 13*(t1_1(2)*t1_1(2))
+		,"T*T4ddg(0,0,2,2)");
+  test_for_zero(t4ddg_2(0,1,0,0) - 13*(t2s_1(0,0))
+		,"T*T4ddg(0,1,0,0)");
+  test_for_zero(t4ddg_2(0,1,0,1) - 13*(t2s_1(0,1))
+		,"T*T4ddg(0,1,0,1)");
+  test_for_zero(t4ddg_2(0,1,0,2) - 13*(t2s_1(0,2))
+		,"T*T4ddg(0,1,0,2)");
+  test_for_zero(t4ddg_2(0,1,1,0) - 13*(t2s_1(1,0))
+		,"T*T4ddg(0,1,1,0)");
+  test_for_zero(t4ddg_2(0,1,1,1) - 13*(t2s_1(1,1))
+		,"T*T4ddg(0,1,1,1)");
+  test_for_zero(t4ddg_2(0,1,1,2) - 13*(t2s_1(1,2))
+		,"T*T4ddg(0,1,1,2)");
+  test_for_zero(t4ddg_2(0,1,2,0) - 13*(t2s_1(2,0))
+		,"T*T4ddg(0,1,2,0)");
+  test_for_zero(t4ddg_2(0,1,2,1) - 13*(t2s_1(2,1))
+		,"T*T4ddg(0,1,2,1)");
+  test_for_zero(t4ddg_2(0,1,2,2) - 13*(t2s_1(2,2))
+		,"T*T4ddg(0,1,2,2)");
+  test_for_zero((t4ddg_2(0,2,0,0) - 13*(t1_3(0)*t1_3(0)))/t4ddg_2(0,2,0,0)
+		,"T*T4ddg(0,2,0,0)");
+  test_for_zero((t4ddg_2(0,2,0,1) - 13*(t1_3(0)*t1_3(1)))/t4ddg_2(0,2,0,1)
+		,"T*T4ddg(0,2,0,1)");
+  test_for_zero((t4ddg_2(0,2,0,2) - 13*(t1_3(0)*t1_3(2)))/t4ddg_2(0,2,0,2)
+		,"T*T4ddg(0,2,0,2)");
+  test_for_zero((t4ddg_2(0,2,1,0) - 13*(t1_3(1)*t1_3(0)))/t4ddg_2(0,2,1,0)
+		,"T*T4ddg(0,2,1,0)");
+  test_for_zero((t4ddg_2(0,2,1,1) - 13*(t1_3(1)*t1_3(1)))/t4ddg_2(0,2,1,1)
+		,"T*T4ddg(0,2,1,1)");
+  test_for_zero((t4ddg_2(0,2,1,2) - 13*(t1_3(1)*t1_3(2)))/t4ddg_2(0,2,1,2)
+		,"T*T4ddg(0,2,1,2)");
+  test_for_zero((t4ddg_2(0,2,2,0) - 13*(t1_3(2)*t1_3(0)))/t4ddg_2(0,2,2,0)
+		,"T*T4ddg(0,2,2,0)");
+  test_for_zero((t4ddg_2(0,2,2,1) - 13*(t1_3(2)*t1_3(1)))/t4ddg_2(0,2,2,1)
+		,"T*T4ddg(0,2,2,1)");
+  test_for_zero((t4ddg_2(0,2,2,2) - 13*(t1_3(2)*t1_3(2)))/t4ddg_2(0,2,2,2)
+		,"T*T4ddg(0,2,2,2)");
+  test_for_zero(t4ddg_2(1,0,0,0) - 13*(t2s_1(0,0))
+		,"T*T4ddg(1,0,0,0)");
+  test_for_zero(t4ddg_2(1,0,0,1) - 13*(t2s_1(0,1))
+		,"T*T4ddg(1,0,0,1)");
+  test_for_zero(t4ddg_2(1,0,0,2) - 13*(t2s_1(0,2))
+		,"T*T4ddg(1,0,0,2)");
+  test_for_zero(t4ddg_2(1,0,1,0) - 13*(t2s_1(1,0))
+		,"T*T4ddg(1,0,1,0)");
+  test_for_zero(t4ddg_2(1,0,1,1) - 13*(t2s_1(1,1))
+		,"T*T4ddg(1,0,1,1)");
+  test_for_zero(t4ddg_2(1,0,1,2) - 13*(t2s_1(1,2))
+		,"T*T4ddg(1,0,1,2)");
+  test_for_zero(t4ddg_2(1,0,2,0) - 13*(t2s_1(2,0))
+		,"T*T4ddg(1,0,2,0)");
+  test_for_zero(t4ddg_2(1,0,2,1) - 13*(t2s_1(2,1))
+		,"T*T4ddg(1,0,2,1)");
+  test_for_zero(t4ddg_2(1,0,2,2) - 13*(t2s_1(2,2))
+		,"T*T4ddg(1,0,2,2)");
+  test_for_zero(t4ddg_2(1,1,0,0) - 13*(t2s_2(0,0))
+		,"T*T4ddg(1,1,0,0)");
+  test_for_zero(t4ddg_2(1,1,0,1) - 13*(t2s_2(0,1))
+		,"T*T4ddg(1,1,0,1)");
+  test_for_zero(t4ddg_2(1,1,0,2) - 13*(t2s_2(0,2))
+		,"T*T4ddg(1,1,0,2)");
+  test_for_zero(t4ddg_2(1,1,1,0) - 13*(t2s_2(1,0))
+		,"T*T4ddg(1,1,1,0)");
+  test_for_zero(t4ddg_2(1,1,1,1) - 13*(t2s_2(1,1))
+		,"T*T4ddg(1,1,1,1)");
+  test_for_zero(t4ddg_2(1,1,1,2) - 13*(t2s_2(1,2))
+		,"T*T4ddg(1,1,1,2)");
+  test_for_zero(t4ddg_2(1,1,2,0) - 13*(t2s_2(2,0))
+		,"T*T4ddg(1,1,2,0)");
+  test_for_zero(t4ddg_2(1,1,2,1) - 13*(t2s_2(2,1))
+		,"T*T4ddg(1,1,2,1)");
+  test_for_zero(t4ddg_2(1,1,2,2) - 13*(t2s_2(2,2))
+		,"T*T4ddg(1,1,2,2)");
+  test_for_zero(t4ddg_2(1,2,0,0) - 13*(t1_2(0)*t1_2(0))
+		,"T*T4ddg(1,2,0,0)");
+  test_for_zero(t4ddg_2(1,2,0,1) - 13*(t1_2(0)*t1_2(1))
+		,"T*T4ddg(1,2,0,1)");
+  test_for_zero(t4ddg_2(1,2,0,2) - 13*(t1_2(0)*t1_2(2))
+		,"T*T4ddg(1,2,0,2)");
+  test_for_zero(t4ddg_2(1,2,1,0) - 13*(t1_2(1)*t1_2(0))
+		,"T*T4ddg(1,2,1,0)");
+  test_for_zero(t4ddg_2(1,2,1,1) - 13*(t1_2(1)*t1_2(1))
+		,"T*T4ddg(1,2,1,1)");
+  test_for_zero(t4ddg_2(1,2,1,2) - 13*(t1_2(1)*t1_2(2))
+		,"T*T4ddg(1,2,1,2)");
+  test_for_zero(t4ddg_2(1,2,2,0) - 13*(t1_2(2)*t1_2(0))
+		,"T*T4ddg(1,2,2,0)");
+  test_for_zero(t4ddg_2(1,2,2,1) - 13*(t1_2(2)*t1_2(1))
+		,"T*T4ddg(1,2,2,1)");
+  test_for_zero(t4ddg_2(1,2,2,2) - 13*(t1_2(2)*t1_2(2))
+		,"T*T4ddg(1,2,2,2)");
+  test_for_zero((t4ddg_2(2,0,0,0) - 13*(t1_3(0)*t1_3(0)))/t4ddg_2(2,0,0,0)
+		,"T*T4ddg(2,0,0,0)");
+  test_for_zero((t4ddg_2(2,0,0,1) - 13*(t1_3(0)*t1_3(1)))/t4ddg_2(2,0,0,1)
+		,"T*T4ddg(2,0,0,1)");
+  test_for_zero((t4ddg_2(2,0,0,2) - 13*(t1_3(0)*t1_3(2)))/t4ddg_2(2,0,0,2)
+		,"T*T4ddg(2,0,0,2)");
+  test_for_zero((t4ddg_2(2,0,1,0) - 13*(t1_3(1)*t1_3(0)))/t4ddg_2(2,0,1,0)
+		,"T*T4ddg(2,0,1,0)");
+  test_for_zero((t4ddg_2(2,0,1,1) - 13*(t1_3(1)*t1_3(1)))/t4ddg_2(2,0,1,1)
+		,"T*T4ddg(2,0,1,1)");
+  test_for_zero((t4ddg_2(2,0,1,2) - 13*(t1_3(1)*t1_3(2)))/t4ddg_2(2,0,1,2)
+		,"T*T4ddg(2,0,1,2)");
+  test_for_zero((t4ddg_2(2,0,2,0) - 13*(t1_3(2)*t1_3(0)))/t4ddg_2(2,0,2,0)
+		,"T*T4ddg(2,0,2,0)");
+  test_for_zero((t4ddg_2(2,0,2,1) - 13*(t1_3(2)*t1_3(1)))/t4ddg_2(2,0,2,1)
+		,"T*T4ddg(2,0,2,1)");
+  test_for_zero((t4ddg_2(2,0,2,2) - 13*(t1_3(2)*t1_3(2)))/t4ddg_2(2,0,2,2)
+		,"T*T4ddg(2,0,2,2)");
+  test_for_zero(t4ddg_2(2,1,0,0) - 13*(t1_2(0)*t1_2(0))
+		,"T*T4ddg(2,1,0,0)");
+  test_for_zero(t4ddg_2(2,1,0,1) - 13*(t1_2(0)*t1_2(1))
+		,"T*T4ddg(2,1,0,1)");
+  test_for_zero(t4ddg_2(2,1,0,2) - 13*(t1_2(0)*t1_2(2))
+		,"T*T4ddg(2,1,0,2)");
+  test_for_zero(t4ddg_2(2,1,1,0) - 13*(t1_2(1)*t1_2(0))
+		,"T*T4ddg(2,1,1,0)");
+  test_for_zero(t4ddg_2(2,1,1,1) - 13*(t1_2(1)*t1_2(1))
+		,"T*T4ddg(2,1,1,1)");
+  test_for_zero(t4ddg_2(2,1,1,2) - 13*(t1_2(1)*t1_2(2))
+		,"T*T4ddg(2,1,1,2)");
+  test_for_zero(t4ddg_2(2,1,2,0) - 13*(t1_2(2)*t1_2(0))
+		,"T*T4ddg(2,1,2,0)");
+  test_for_zero(t4ddg_2(2,1,2,1) - 13*(t1_2(2)*t1_2(1))
+		,"T*T4ddg(2,1,2,1)");
+  test_for_zero(t4ddg_2(2,1,2,2) - 13*(t1_2(2)*t1_2(2))
+		,"T*T4ddg(2,1,2,2)");
+  test_for_zero(t4ddg_2(2,2,0,0) - 13*(t2s_3(0,0))
+		,"T*T4ddg(2,2,0,0)");
+  test_for_zero(t4ddg_2(2,2,0,1) - 13*(t2s_3(0,1))
+		,"T*T4ddg(2,2,0,1)");
+  test_for_zero(t4ddg_2(2,2,0,2) - 13*(t2s_3(0,2))
+		,"T*T4ddg(2,2,0,2)");
+  test_for_zero(t4ddg_2(2,2,1,0) - 13*(t2s_3(1,0))
+		,"T*T4ddg(2,2,1,0)");
+  test_for_zero(t4ddg_2(2,2,1,1) - 13*(t2s_3(1,1))
+		,"T*T4ddg(2,2,1,1)");
+  test_for_zero(t4ddg_2(2,2,1,2) - 13*(t2s_3(1,2))
+		,"T*T4ddg(2,2,1,2)");
+  test_for_zero(t4ddg_2(2,2,2,0) - 13*(t2s_3(2,0))
+		,"T*T4ddg(2,2,2,0)");
+  test_for_zero(t4ddg_2(2,2,2,1) - 13*(t2s_3(2,1))
+		,"T*T4ddg(2,2,2,1)");
+  test_for_zero(t4ddg_2(2,2,2,2) - 13*(t2s_3(2,2))
+		,"T*T4ddg(2,2,2,2)");
+
+
+  t4ddg_2(i,j,k,l)=t4ddg_1(i,j,k,l)*7;
+  test_for_zero(t4ddg_2(0,0,0,0) - 7*(t1_1(0)*t1_1(0))
+		,"T4ddg*T(0,0,0,0)");
+  test_for_zero(t4ddg_2(0,0,0,1) - 7*(t1_1(0)*t1_1(1))
+		,"T4ddg*T(0,0,0,1)");
+  test_for_zero(t4ddg_2(0,0,0,2) - 7*(t1_1(0)*t1_1(2))
+		,"T4ddg*T(0,0,0,2)");
+  test_for_zero(t4ddg_2(0,0,1,0) - 7*(t1_1(1)*t1_1(0))
+		,"T4ddg*T(0,0,1,0)");
+  test_for_zero(t4ddg_2(0,0,1,1) - 7*(t1_1(1)*t1_1(1))
+		,"T4ddg*T(0,0,1,1)");
+  test_for_zero(t4ddg_2(0,0,1,2) - 7*(t1_1(1)*t1_1(2))
+		,"T4ddg*T(0,0,1,2)");
+  test_for_zero(t4ddg_2(0,0,2,0) - 7*(t1_1(2)*t1_1(0))
+		,"T4ddg*T(0,0,2,0)");
+  test_for_zero(t4ddg_2(0,0,2,1) - 7*(t1_1(2)*t1_1(1))
+		,"T4ddg*T(0,0,2,1)");
+  test_for_zero(t4ddg_2(0,0,2,2) - 7*(t1_1(2)*t1_1(2))
+		,"T4ddg*T(0,0,2,2)");
+  test_for_zero(t4ddg_2(0,1,0,0) - 7*(t2s_1(0,0))
+		,"T4ddg*T(0,1,0,0)");
+  test_for_zero(t4ddg_2(0,1,0,1) - 7*(t2s_1(0,1))
+		,"T4ddg*T(0,1,0,1)");
+  test_for_zero(t4ddg_2(0,1,0,2) - 7*(t2s_1(0,2))
+		,"T4ddg*T(0,1,0,2)");
+  test_for_zero(t4ddg_2(0,1,1,0) - 7*(t2s_1(1,0))
+		,"T4ddg*T(0,1,1,0)");
+  test_for_zero(t4ddg_2(0,1,1,1) - 7*(t2s_1(1,1))
+		,"T4ddg*T(0,1,1,1)");
+  test_for_zero(t4ddg_2(0,1,1,2) - 7*(t2s_1(1,2))
+		,"T4ddg*T(0,1,1,2)");
+  test_for_zero(t4ddg_2(0,1,2,0) - 7*(t2s_1(2,0))
+		,"T4ddg*T(0,1,2,0)");
+  test_for_zero(t4ddg_2(0,1,2,1) - 7*(t2s_1(2,1))
+		,"T4ddg*T(0,1,2,1)");
+  test_for_zero(t4ddg_2(0,1,2,2) - 7*(t2s_1(2,2))
+		,"T4ddg*T(0,1,2,2)");
+  test_for_zero((t4ddg_2(0,2,0,0) - 7*(t1_3(0)*t1_3(0)))/t4ddg_2(0,2,0,0)
+		,"T4ddg*T(0,2,0,0)");
+  test_for_zero((t4ddg_2(0,2,0,1) - 7*(t1_3(0)*t1_3(1)))/t4ddg_2(0,2,0,1)
+		,"T4ddg*T(0,2,0,1)");
+  test_for_zero((t4ddg_2(0,2,0,2) - 7*(t1_3(0)*t1_3(2)))/t4ddg_2(0,2,0,2)
+		,"T4ddg*T(0,2,0,2)");
+  test_for_zero((t4ddg_2(0,2,1,0) - 7*(t1_3(1)*t1_3(0)))/t4ddg_2(0,2,1,0)
+		,"T4ddg*T(0,2,1,0)");
+  test_for_zero((t4ddg_2(0,2,1,1) - 7*(t1_3(1)*t1_3(1)))/t4ddg_2(0,2,1,1)
+		,"T4ddg*T(0,2,1,1)");
+  test_for_zero((t4ddg_2(0,2,1,2) - 7*(t1_3(1)*t1_3(2)))/t4ddg_2(0,2,1,2)
+		,"T4ddg*T(0,2,1,2)");
+  test_for_zero((t4ddg_2(0,2,2,0) - 7*(t1_3(2)*t1_3(0)))/t4ddg_2(0,2,2,0)
+		,"T4ddg*T(0,2,2,0)");
+  test_for_zero((t4ddg_2(0,2,2,1) - 7*(t1_3(2)*t1_3(1)))/t4ddg_2(0,2,2,1)
+		,"T4ddg*T(0,2,2,1)");
+  test_for_zero((t4ddg_2(0,2,2,2) - 7*(t1_3(2)*t1_3(2)))/t4ddg_2(0,2,2,2)
+		,"T4ddg*T(0,2,2,2)");
+  test_for_zero(t4ddg_2(1,0,0,0) - 7*(t2s_1(0,0))
+		,"T4ddg*T(1,0,0,0)");
+  test_for_zero(t4ddg_2(1,0,0,1) - 7*(t2s_1(0,1))
+		,"T4ddg*T(1,0,0,1)");
+  test_for_zero(t4ddg_2(1,0,0,2) - 7*(t2s_1(0,2))
+		,"T4ddg*T(1,0,0,2)");
+  test_for_zero(t4ddg_2(1,0,1,0) - 7*(t2s_1(1,0))
+		,"T4ddg*T(1,0,1,0)");
+  test_for_zero(t4ddg_2(1,0,1,1) - 7*(t2s_1(1,1))
+		,"T4ddg*T(1,0,1,1)");
+  test_for_zero(t4ddg_2(1,0,1,2) - 7*(t2s_1(1,2))
+		,"T4ddg*T(1,0,1,2)");
+  test_for_zero(t4ddg_2(1,0,2,0) - 7*(t2s_1(2,0))
+		,"T4ddg*T(1,0,2,0)");
+  test_for_zero(t4ddg_2(1,0,2,1) - 7*(t2s_1(2,1))
+		,"T4ddg*T(1,0,2,1)");
+  test_for_zero(t4ddg_2(1,0,2,2) - 7*(t2s_1(2,2))
+		,"T4ddg*T(1,0,2,2)");
+  test_for_zero(t4ddg_2(1,1,0,0) - 7*(t2s_2(0,0))
+		,"T4ddg*T(1,1,0,0)");
+  test_for_zero(t4ddg_2(1,1,0,1) - 7*(t2s_2(0,1))
+		,"T4ddg*T(1,1,0,1)");
+  test_for_zero(t4ddg_2(1,1,0,2) - 7*(t2s_2(0,2))
+		,"T4ddg*T(1,1,0,2)");
+  test_for_zero(t4ddg_2(1,1,1,0) - 7*(t2s_2(1,0))
+		,"T4ddg*T(1,1,1,0)");
+  test_for_zero(t4ddg_2(1,1,1,1) - 7*(t2s_2(1,1))
+		,"T4ddg*T(1,1,1,1)");
+  test_for_zero(t4ddg_2(1,1,1,2) - 7*(t2s_2(1,2))
+		,"T4ddg*T(1,1,1,2)");
+  test_for_zero(t4ddg_2(1,1,2,0) - 7*(t2s_2(2,0))
+		,"T4ddg*T(1,1,2,0)");
+  test_for_zero(t4ddg_2(1,1,2,1) - 7*(t2s_2(2,1))
+		,"T4ddg*T(1,1,2,1)");
+  test_for_zero(t4ddg_2(1,1,2,2) - 7*(t2s_2(2,2))
+		,"T4ddg*T(1,1,2,2)");
+  test_for_zero(t4ddg_2(1,2,0,0) - 7*(t1_2(0)*t1_2(0))
+		,"T4ddg*T(1,2,0,0)");
+  test_for_zero(t4ddg_2(1,2,0,1) - 7*(t1_2(0)*t1_2(1))
+		,"T4ddg*T(1,2,0,1)");
+  test_for_zero(t4ddg_2(1,2,0,2) - 7*(t1_2(0)*t1_2(2))
+		,"T4ddg*T(1,2,0,2)");
+  test_for_zero(t4ddg_2(1,2,1,0) - 7*(t1_2(1)*t1_2(0))
+		,"T4ddg*T(1,2,1,0)");
+  test_for_zero(t4ddg_2(1,2,1,1) - 7*(t1_2(1)*t1_2(1))
+		,"T4ddg*T(1,2,1,1)");
+  test_for_zero(t4ddg_2(1,2,1,2) - 7*(t1_2(1)*t1_2(2))
+		,"T4ddg*T(1,2,1,2)");
+  test_for_zero(t4ddg_2(1,2,2,0) - 7*(t1_2(2)*t1_2(0))
+		,"T4ddg*T(1,2,2,0)");
+  test_for_zero(t4ddg_2(1,2,2,1) - 7*(t1_2(2)*t1_2(1))
+		,"T4ddg*T(1,2,2,1)");
+  test_for_zero(t4ddg_2(1,2,2,2) - 7*(t1_2(2)*t1_2(2))
+		,"T4ddg*T(1,2,2,2)");
+  test_for_zero((t4ddg_2(2,0,0,0) - 7*(t1_3(0)*t1_3(0)))/t4ddg_2(2,0,0,0)
+		,"T4ddg*T(2,0,0,0)");
+  test_for_zero((t4ddg_2(2,0,0,1) - 7*(t1_3(0)*t1_3(1)))/t4ddg_2(2,0,0,1)
+		,"T4ddg*T(2,0,0,1)");
+  test_for_zero((t4ddg_2(2,0,0,2) - 7*(t1_3(0)*t1_3(2)))/t4ddg_2(2,0,0,2)
+		,"T4ddg*T(2,0,0,2)");
+  test_for_zero((t4ddg_2(2,0,1,0) - 7*(t1_3(1)*t1_3(0)))/t4ddg_2(2,0,1,0)
+		,"T4ddg*T(2,0,1,0)");
+  test_for_zero((t4ddg_2(2,0,1,1) - 7*(t1_3(1)*t1_3(1)))/t4ddg_2(2,0,1,1)
+		,"T4ddg*T(2,0,1,1)");
+  test_for_zero((t4ddg_2(2,0,1,2) - 7*(t1_3(1)*t1_3(2)))/t4ddg_2(2,0,1,2)
+		,"T4ddg*T(2,0,1,2)");
+  test_for_zero((t4ddg_2(2,0,2,0) - 7*(t1_3(2)*t1_3(0)))/t4ddg_2(2,0,2,0)
+		,"T4ddg*T(2,0,2,0)");
+  test_for_zero((t4ddg_2(2,0,2,1) - 7*(t1_3(2)*t1_3(1)))/t4ddg_2(2,0,2,1)
+		,"T4ddg*T(2,0,2,1)");
+  test_for_zero((t4ddg_2(2,0,2,2) - 7*(t1_3(2)*t1_3(2)))/t4ddg_2(2,0,2,2)
+		,"T4ddg*T(2,0,2,2)");
+  test_for_zero(t4ddg_2(2,1,0,0) - 7*(t1_2(0)*t1_2(0))
+		,"T4ddg*T(2,1,0,0)");
+  test_for_zero(t4ddg_2(2,1,0,1) - 7*(t1_2(0)*t1_2(1))
+		,"T4ddg*T(2,1,0,1)");
+  test_for_zero(t4ddg_2(2,1,0,2) - 7*(t1_2(0)*t1_2(2))
+		,"T4ddg*T(2,1,0,2)");
+  test_for_zero(t4ddg_2(2,1,1,0) - 7*(t1_2(1)*t1_2(0))
+		,"T4ddg*T(2,1,1,0)");
+  test_for_zero(t4ddg_2(2,1,1,1) - 7*(t1_2(1)*t1_2(1))
+		,"T4ddg*T(2,1,1,1)");
+  test_for_zero(t4ddg_2(2,1,1,2) - 7*(t1_2(1)*t1_2(2))
+		,"T4ddg*T(2,1,1,2)");
+  test_for_zero(t4ddg_2(2,1,2,0) - 7*(t1_2(2)*t1_2(0))
+		,"T4ddg*T(2,1,2,0)");
+  test_for_zero(t4ddg_2(2,1,2,1) - 7*(t1_2(2)*t1_2(1))
+		,"T4ddg*T(2,1,2,1)");
+  test_for_zero(t4ddg_2(2,1,2,2) - 7*(t1_2(2)*t1_2(2))
+		,"T4ddg*T(2,1,2,2)");
+  test_for_zero(t4ddg_2(2,2,0,0) - 7*(t2s_3(0,0))
+		,"T4ddg*T(2,2,0,0)");
+  test_for_zero(t4ddg_2(2,2,0,1) - 7*(t2s_3(0,1))
+		,"T4ddg*T(2,2,0,1)");
+  test_for_zero(t4ddg_2(2,2,0,2) - 7*(t2s_3(0,2))
+		,"T4ddg*T(2,2,0,2)");
+  test_for_zero(t4ddg_2(2,2,1,0) - 7*(t2s_3(1,0))
+		,"T4ddg*T(2,2,1,0)");
+  test_for_zero(t4ddg_2(2,2,1,1) - 7*(t2s_3(1,1))
+		,"T4ddg*T(2,2,1,1)");
+  test_for_zero(t4ddg_2(2,2,1,2) - 7*(t2s_3(1,2))
+		,"T4ddg*T(2,2,1,2)");
+  test_for_zero(t4ddg_2(2,2,2,0) - 7*(t2s_3(2,0))
+		,"T4ddg*T(2,2,2,0)");
+  test_for_zero(t4ddg_2(2,2,2,1) - 7*(t2s_3(2,1))
+		,"T4ddg*T(2,2,2,1)");
+  test_for_zero(t4ddg_2(2,2,2,2) - 7*(t2s_3(2,2))
+		,"T4ddg*T(2,2,2,2)");
+
+  t4ddg_1(N0,i,j,k)=t3dg_1(j,k,i);
+
+  test_for_zero(t4ddg_1(0,0,0,0) - (t3dg_1(0,0,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,0,0,0)");
+  test_for_zero(t4ddg_1(0,0,0,1) - (t3dg_1(0,1,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,0,0,1)");
+  test_for_zero(t4ddg_1(0,0,0,2) - (t3dg_1(0,2,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,0,0,2)");
+  test_for_zero(t4ddg_1(0,0,1,0) - (t3dg_1(1,0,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,0,1,0)");
+  test_for_zero(t4ddg_1(0,0,1,1) - (t3dg_1(1,1,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,0,1,1)");
+  test_for_zero(t4ddg_1(0,0,1,2) - (t3dg_1(1,2,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,0,1,2)");
+  test_for_zero(t4ddg_1(0,0,2,0) - (t3dg_1(2,0,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,0,2,0)");
+  test_for_zero(t4ddg_1(0,0,2,1) - (t3dg_1(2,1,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,0,2,1)");
+  test_for_zero(t4ddg_1(0,0,2,2) - (t3dg_1(2,2,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,0,2,2)");
+  test_for_zero(t4ddg_1(0,1,0,0) - (t3dg_1(0,0,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,1,0,0)");
+  test_for_zero(t4ddg_1(0,1,0,1) - (t3dg_1(0,1,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,1,0,1)");
+  test_for_zero(t4ddg_1(0,1,0,2) - (t3dg_1(0,2,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,1,0,2)");
+  test_for_zero(t4ddg_1(0,1,1,0) - (t3dg_1(1,0,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,1,1,0)");
+  test_for_zero(t4ddg_1(0,1,1,1) - (t3dg_1(1,1,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,1,1,1)");
+  test_for_zero(t4ddg_1(0,1,1,2) - (t3dg_1(1,2,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,1,1,2)");
+  test_for_zero(t4ddg_1(0,1,2,0) - (t3dg_1(2,0,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,1,2,0)");
+  test_for_zero(t4ddg_1(0,1,2,1) - (t3dg_1(2,1,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,1,2,1)");
+  test_for_zero(t4ddg_1(0,1,2,2) - (t3dg_1(2,2,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,1,2,2)");
+  test_for_zero(t4ddg_1(0,2,0,0) - (t3dg_1(0,0,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,2,0,0)");
+  test_for_zero(t4ddg_1(0,2,0,1) - (t3dg_1(0,1,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,2,0,1)");
+  test_for_zero(t4ddg_1(0,2,0,2) - (t3dg_1(0,2,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,2,0,2)");
+  test_for_zero(t4ddg_1(0,2,1,0) - (t3dg_1(1,0,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,2,1,0)");
+  test_for_zero(t4ddg_1(0,2,1,1) - (t3dg_1(1,1,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,2,1,1)");
+  test_for_zero(t4ddg_1(0,2,1,2) - (t3dg_1(1,2,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,2,1,2)");
+  test_for_zero(t4ddg_1(0,2,2,0) - (t3dg_1(2,0,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,2,2,0)");
+  test_for_zero(t4ddg_1(0,2,2,1) - (t3dg_1(2,1,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,2,2,1)");
+  test_for_zero(t4ddg_1(0,2,2,2) - (t3dg_1(2,2,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(0,2,2,2)");
+
+  t4ddg_1(N1,i,j,k)=t3dg_2(j,k,i);
+
+  test_for_zero(t4ddg_1(1,0,0,0) - (t3dg_2(0,0,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,0,0,0)");
+  test_for_zero(t4ddg_1(1,0,0,1) - (t3dg_2(0,1,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,0,0,1)");
+  test_for_zero(t4ddg_1(1,0,0,2) - (t3dg_2(0,2,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,0,0,2)");
+  test_for_zero(t4ddg_1(1,0,1,0) - (t3dg_2(1,0,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,0,1,0)");
+  test_for_zero(t4ddg_1(1,0,1,1) - (t3dg_2(1,1,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,0,1,1)");
+  test_for_zero(t4ddg_1(1,0,1,2) - (t3dg_2(1,2,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,0,1,2)");
+  test_for_zero(t4ddg_1(1,0,2,0) - (t3dg_2(2,0,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,0,2,0)");
+  test_for_zero(t4ddg_1(1,0,2,1) - (t3dg_2(2,1,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,0,2,1)");
+  test_for_zero(t4ddg_1(1,0,2,2) - (t3dg_2(2,2,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,0,2,2)");
+  test_for_zero(t4ddg_1(1,1,0,0) - (t3dg_2(0,0,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,1,0,0)");
+  test_for_zero(t4ddg_1(1,1,0,1) - (t3dg_2(0,1,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,1,0,1)");
+  test_for_zero(t4ddg_1(1,1,0,2) - (t3dg_2(0,2,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,1,0,2)");
+  test_for_zero(t4ddg_1(1,1,1,0) - (t3dg_2(1,0,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,1) - (t3dg_2(1,1,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,1,1,1)");
+  test_for_zero(t4ddg_1(1,1,1,2) - (t3dg_2(1,2,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,1,1,2)");
+  test_for_zero(t4ddg_1(1,1,2,0) - (t3dg_2(2,0,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,1,2,0)");
+  test_for_zero(t4ddg_1(1,1,2,1) - (t3dg_2(2,1,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,1,2,1)");
+  test_for_zero(t4ddg_1(1,1,2,2) - (t3dg_2(2,2,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,1,2,2)");
+  test_for_zero(t4ddg_1(1,2,0,0) - (t3dg_2(0,0,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,2,0,0)");
+  test_for_zero(t4ddg_1(1,2,0,1) - (t3dg_2(0,1,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,2,0,1)");
+  test_for_zero(t4ddg_1(1,2,0,2) - (t3dg_2(0,2,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,2,0,2)");
+  test_for_zero(t4ddg_1(1,2,1,0) - (t3dg_2(1,0,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,2,1,0)");
+  test_for_zero(t4ddg_1(1,2,1,1) - (t3dg_2(1,1,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,2,1,1)");
+  test_for_zero(t4ddg_1(1,2,1,2) - (t3dg_2(1,2,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,2,1,2)");
+  test_for_zero(t4ddg_1(1,2,2,0) - (t3dg_2(2,0,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,2,2,0)");
+  test_for_zero(t4ddg_1(1,2,2,1) - (t3dg_2(2,1,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,2,2,1)");
+  test_for_zero(t4ddg_1(1,2,2,2) - (t3dg_2(2,2,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(1,2,2,2)");
+
+  t4ddg_1(N2,i,j,k)=t3dg_3(j,k,i);
+
+  test_for_zero(t4ddg_1(2,0,0,0) - (t3dg_3(0,0,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,0,0,0)");
+  test_for_zero(t4ddg_1(2,0,0,1) - (t3dg_3(0,1,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,0,0,1)");
+  test_for_zero(t4ddg_1(2,0,0,2) - (t3dg_3(0,2,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,0,0,2)");
+  test_for_zero(t4ddg_1(2,0,1,0) - (t3dg_3(1,0,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,0,1,0)");
+  test_for_zero(t4ddg_1(2,0,1,1) - (t3dg_3(1,1,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,0,1,1)");
+  test_for_zero(t4ddg_1(2,0,1,2) - (t3dg_3(1,2,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,0,1,2)");
+  test_for_zero(t4ddg_1(2,0,2,0) - (t3dg_3(2,0,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,0,2,0)");
+  test_for_zero(t4ddg_1(2,0,2,1) - (t3dg_3(2,1,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,0,2,1)");
+  test_for_zero(t4ddg_1(2,0,2,2) - (t3dg_3(2,2,0))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,0,2,2)");
+  test_for_zero(t4ddg_1(2,1,0,0) - (t3dg_3(0,0,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,1,0,0)");
+  test_for_zero(t4ddg_1(2,1,0,1) - (t3dg_3(0,1,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,1,0,1)");
+  test_for_zero(t4ddg_1(2,1,0,2) - (t3dg_3(0,2,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,1,0,2)");
+  test_for_zero(t4ddg_1(2,1,1,0) - (t3dg_3(1,0,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,1,1,0)");
+  test_for_zero(t4ddg_1(2,1,1,1) - (t3dg_3(1,1,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,1,1,1)");
+  test_for_zero(t4ddg_1(2,1,1,2) - (t3dg_3(1,2,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,1,1,2)");
+  test_for_zero(t4ddg_1(2,1,2,0) - (t3dg_3(2,0,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,1,2,0)");
+  test_for_zero(t4ddg_1(2,1,2,1) - (t3dg_3(2,1,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,1,2,1)");
+  test_for_zero(t4ddg_1(2,1,2,2) - (t3dg_3(2,2,1))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,1,2,2)");
+  test_for_zero(t4ddg_1(2,2,0,0) - (t3dg_3(0,0,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,2,0,0)");
+  test_for_zero(t4ddg_1(2,2,0,1) - (t3dg_3(0,1,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,2,0,1)");
+  test_for_zero(t4ddg_1(2,2,0,2) - (t3dg_3(0,2,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,2,0,2)");
+  test_for_zero(t4ddg_1(2,2,1,0) - (t3dg_3(1,0,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,2,1,0)");
+  test_for_zero(t4ddg_1(2,2,1,1) - (t3dg_3(1,1,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,2,1,1)");
+  test_for_zero(t4ddg_1(2,2,1,2) - (t3dg_3(1,2,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,2,1,2)");
+  test_for_zero(t4ddg_1(2,2,2,0) - (t3dg_3(2,0,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,2,2,0)");
+  test_for_zero(t4ddg_1(2,2,2,1) - (t3dg_3(2,1,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,2) - (t3dg_3(2,2,2))
+		,"T4ddg(N,i,j,k)=T3dg(j,k,i)(2,2,2,2)");
+
+  t2s_1(i,j)=t4ddg_1(0,0,i,j);
+  test_for_zero(t4ddg_1(0,0,0,0) - (t2s_1(0,0))
+		,"T4ddg(Num,Num,i,j)(0,0,0,0)");
+  test_for_zero(t4ddg_1(0,0,0,1) - (t2s_1(0,1))
+		,"T4ddg(Num,Num,i,j)(0,0,0,1)");
+  test_for_zero(t4ddg_1(0,0,0,2) - (t2s_1(0,2))
+		,"T4ddg(Num,Num,i,j)(0,0,0,2)");
+  test_for_zero(t4ddg_1(0,0,1,0) - (t2s_1(1,0))
+		,"T4ddg(Num,Num,i,j)(0,0,1,0)");
+  test_for_zero(t4ddg_1(0,0,1,1) - (t2s_1(1,1))
+		,"T4ddg(Num,Num,i,j)(0,0,1,1)");
+  test_for_zero(t4ddg_1(0,0,1,2) - (t2s_1(1,2))
+		,"T4ddg(Num,Num,i,j)(0,0,1,2)");
+  test_for_zero(t4ddg_1(0,0,2,0) - (t2s_1(2,0))
+		,"T4ddg(Num,Num,i,j)(0,0,2,0)");
+  test_for_zero(t4ddg_1(0,0,2,1) - (t2s_1(2,1))
+		,"T4ddg(Num,Num,i,j)(0,0,2,1)");
+  test_for_zero(t4ddg_1(0,0,2,2) - (t2s_1(2,2))
+		,"T4ddg(Num,Num,i,j)(0,0,2,2)");
+
+  t2s_1(i,j)=t4ddg_1(0,1,i,j);
+  test_for_zero(t4ddg_1(0,1,0,0) - (t2s_1(0,0))
+		,"T4ddg(Num,Num,i,j)(0,1,0,0)");
+  test_for_zero(t4ddg_1(0,1,0,1) - (t2s_1(0,1))
+		,"T4ddg(Num,Num,i,j)(0,1,0,1)");
+  test_for_zero(t4ddg_1(0,1,0,2) - (t2s_1(0,2))
+		,"T4ddg(Num,Num,i,j)(0,1,0,2)");
+  test_for_zero(t4ddg_1(0,1,1,0) - (t2s_1(1,0))
+		,"T4ddg(Num,Num,i,j)(0,1,1,0)");
+  test_for_zero(t4ddg_1(0,1,1,1) - (t2s_1(1,1))
+		,"T4ddg(Num,Num,i,j)(0,1,1,1)");
+  test_for_zero(t4ddg_1(0,1,1,2) - (t2s_1(1,2))
+		,"T4ddg(Num,Num,i,j)(0,1,1,2)");
+  test_for_zero(t4ddg_1(0,1,2,0) - (t2s_1(2,0))
+		,"T4ddg(Num,Num,i,j)(0,1,2,0)");
+  test_for_zero(t4ddg_1(0,1,2,1) - (t2s_1(2,1))
+		,"T4ddg(Num,Num,i,j)(0,1,2,1)");
+  test_for_zero(t4ddg_1(0,1,2,2) - (t2s_1(2,2))
+		,"T4ddg(Num,Num,i,j)(0,1,2,2)");
+
+  t2s_1(i,j)=t4ddg_1(0,2,i,j);
+  test_for_zero(t4ddg_1(0,2,0,0) - (t2s_1(0,0))
+		,"T4ddg(Num,Num,i,j)(0,2,0,0)");
+  test_for_zero(t4ddg_1(0,2,0,1) - (t2s_1(0,1))
+		,"T4ddg(Num,Num,i,j)(0,2,0,1)");
+  test_for_zero(t4ddg_1(0,2,0,2) - (t2s_1(0,2))
+		,"T4ddg(Num,Num,i,j)(0,2,0,2)");
+  test_for_zero(t4ddg_1(0,2,1,0) - (t2s_1(1,0))
+		,"T4ddg(Num,Num,i,j)(0,2,1,0)");
+  test_for_zero(t4ddg_1(0,2,1,1) - (t2s_1(1,1))
+		,"T4ddg(Num,Num,i,j)(0,2,1,1)");
+  test_for_zero(t4ddg_1(0,2,1,2) - (t2s_1(1,2))
+		,"T4ddg(Num,Num,i,j)(0,2,1,2)");
+  test_for_zero(t4ddg_1(0,2,2,0) - (t2s_1(2,0))
+		,"T4ddg(Num,Num,i,j)(0,2,2,0)");
+  test_for_zero(t4ddg_1(0,2,2,1) - (t2s_1(2,1))
+		,"T4ddg(Num,Num,i,j)(0,2,2,1)");
+  test_for_zero(t4ddg_1(0,2,2,2) - (t2s_1(2,2))
+		,"T4ddg(Num,Num,i,j)(0,2,2,2)");
+
+  t2s_1(i,j)=t4ddg_1(1,0,i,j);
+  test_for_zero(t4ddg_1(1,0,0,0) - (t2s_1(0,0))
+		,"T4ddg(Num,Num,i,j)(1,0,0,0)");
+  test_for_zero(t4ddg_1(1,0,0,1) - (t2s_1(0,1))
+		,"T4ddg(Num,Num,i,j)(1,0,0,1)");
+  test_for_zero(t4ddg_1(1,0,0,2) - (t2s_1(0,2))
+		,"T4ddg(Num,Num,i,j)(1,0,0,2)");
+  test_for_zero(t4ddg_1(1,0,1,0) - (t2s_1(1,0))
+		,"T4ddg(Num,Num,i,j)(1,0,1,0)");
+  test_for_zero(t4ddg_1(1,0,1,1) - (t2s_1(1,1))
+		,"T4ddg(Num,Num,i,j)(1,0,1,1)");
+  test_for_zero(t4ddg_1(1,0,1,2) - (t2s_1(1,2))
+		,"T4ddg(Num,Num,i,j)(1,0,1,2)");
+  test_for_zero(t4ddg_1(1,0,2,0) - (t2s_1(2,0))
+		,"T4ddg(Num,Num,i,j)(1,0,2,0)");
+  test_for_zero(t4ddg_1(1,0,2,1) - (t2s_1(2,1))
+		,"T4ddg(Num,Num,i,j)(1,0,2,1)");
+  test_for_zero(t4ddg_1(1,0,2,2) - (t2s_1(2,2))
+		,"T4ddg(Num,Num,i,j)(1,0,2,2)");
+
+  t2s_1(i,j)=t4ddg_1(1,1,i,j);
+  test_for_zero(t4ddg_1(1,1,0,0) - (t2s_1(0,0))
+		,"T4ddg(Num,Num,i,j)(1,1,0,0)");
+  test_for_zero(t4ddg_1(1,1,0,1) - (t2s_1(0,1))
+		,"T4ddg(Num,Num,i,j)(1,1,0,1)");
+  test_for_zero(t4ddg_1(1,1,0,2) - (t2s_1(0,2))
+		,"T4ddg(Num,Num,i,j)(1,1,0,2)");
+  test_for_zero(t4ddg_1(1,1,1,0) - (t2s_1(1,0))
+		,"T4ddg(Num,Num,i,j)(1,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,1) - (t2s_1(1,1))
+		,"T4ddg(Num,Num,i,j)(1,1,1,1)");
+  test_for_zero(t4ddg_1(1,1,1,2) - (t2s_1(1,2))
+		,"T4ddg(Num,Num,i,j)(1,1,1,2)");
+  test_for_zero(t4ddg_1(1,1,2,0) - (t2s_1(2,0))
+		,"T4ddg(Num,Num,i,j)(1,1,2,0)");
+  test_for_zero(t4ddg_1(1,1,2,1) - (t2s_1(2,1))
+		,"T4ddg(Num,Num,i,j)(1,1,2,1)");
+  test_for_zero(t4ddg_1(1,1,2,2) - (t2s_1(2,2))
+		,"T4ddg(Num,Num,i,j)(1,1,2,2)");
+
+  t2s_1(i,j)=t4ddg_1(1,2,i,j);
+  test_for_zero(t4ddg_1(1,2,0,0) - (t2s_1(0,0))
+		,"T4ddg(Num,Num,i,j)(1,2,0,0)");
+  test_for_zero(t4ddg_1(1,2,0,1) - (t2s_1(0,1))
+		,"T4ddg(Num,Num,i,j)(1,2,0,1)");
+  test_for_zero(t4ddg_1(1,2,0,2) - (t2s_1(0,2))
+		,"T4ddg(Num,Num,i,j)(1,2,0,2)");
+  test_for_zero(t4ddg_1(1,2,1,0) - (t2s_1(1,0))
+		,"T4ddg(Num,Num,i,j)(1,2,1,0)");
+  test_for_zero(t4ddg_1(1,2,1,1) - (t2s_1(1,1))
+		,"T4ddg(Num,Num,i,j)(1,2,1,1)");
+  test_for_zero(t4ddg_1(1,2,1,2) - (t2s_1(1,2))
+		,"T4ddg(Num,Num,i,j)(1,2,1,2)");
+  test_for_zero(t4ddg_1(1,2,2,0) - (t2s_1(2,0))
+		,"T4ddg(Num,Num,i,j)(1,2,2,0)");
+  test_for_zero(t4ddg_1(1,2,2,1) - (t2s_1(2,1))
+		,"T4ddg(Num,Num,i,j)(1,2,2,1)");
+  test_for_zero(t4ddg_1(1,2,2,2) - (t2s_1(2,2))
+		,"T4ddg(Num,Num,i,j)(1,2,2,2)");
+
+  t2s_1(i,j)=t4ddg_1(2,0,i,j);
+  test_for_zero(t4ddg_1(2,0,0,0) - (t2s_1(0,0))
+		,"T4ddg(Num,Num,i,j)(2,0,0,0)");
+  test_for_zero(t4ddg_1(2,0,0,1) - (t2s_1(0,1))
+		,"T4ddg(Num,Num,i,j)(2,0,0,1)");
+  test_for_zero(t4ddg_1(2,0,0,2) - (t2s_1(0,2))
+		,"T4ddg(Num,Num,i,j)(2,0,0,2)");
+  test_for_zero(t4ddg_1(2,0,1,0) - (t2s_1(1,0))
+		,"T4ddg(Num,Num,i,j)(2,0,1,0)");
+  test_for_zero(t4ddg_1(2,0,1,1) - (t2s_1(1,1))
+		,"T4ddg(Num,Num,i,j)(2,0,1,1)");
+  test_for_zero(t4ddg_1(2,0,1,2) - (t2s_1(1,2))
+		,"T4ddg(Num,Num,i,j)(2,0,1,2)");
+  test_for_zero(t4ddg_1(2,0,2,0) - (t2s_1(2,0))
+		,"T4ddg(Num,Num,i,j)(2,0,2,0)");
+  test_for_zero(t4ddg_1(2,0,2,1) - (t2s_1(2,1))
+		,"T4ddg(Num,Num,i,j)(2,0,2,1)");
+  test_for_zero(t4ddg_1(2,0,2,2) - (t2s_1(2,2))
+		,"T4ddg(Num,Num,i,j)(2,0,2,2)");
+
+  t2s_1(i,j)=t4ddg_1(2,1,i,j);
+  test_for_zero(t4ddg_1(2,1,0,0) - (t2s_1(0,0))
+		,"T4ddg(Num,Num,i,j)(2,1,0,0)");
+  test_for_zero(t4ddg_1(2,1,0,1) - (t2s_1(0,1))
+		,"T4ddg(Num,Num,i,j)(2,1,0,1)");
+  test_for_zero(t4ddg_1(2,1,0,2) - (t2s_1(0,2))
+		,"T4ddg(Num,Num,i,j)(2,1,0,2)");
+  test_for_zero(t4ddg_1(2,1,1,0) - (t2s_1(1,0))
+		,"T4ddg(Num,Num,i,j)(2,1,1,0)");
+  test_for_zero(t4ddg_1(2,1,1,1) - (t2s_1(1,1))
+		,"T4ddg(Num,Num,i,j)(2,1,1,1)");
+  test_for_zero(t4ddg_1(2,1,1,2) - (t2s_1(1,2))
+		,"T4ddg(Num,Num,i,j)(2,1,1,2)");
+  test_for_zero(t4ddg_1(2,1,2,0) - (t2s_1(2,0))
+		,"T4ddg(Num,Num,i,j)(2,1,2,0)");
+  test_for_zero(t4ddg_1(2,1,2,1) - (t2s_1(2,1))
+		,"T4ddg(Num,Num,i,j)(2,1,2,1)");
+  test_for_zero(t4ddg_1(2,1,2,2) - (t2s_1(2,2))
+		,"T4ddg(Num,Num,i,j)(2,1,2,2)");
+
+  t2s_1(i,j)=t4ddg_1(2,2,i,j);
+  test_for_zero(t4ddg_1(2,2,0,0) - (t2s_1(0,0))
+		,"T4ddg(Num,Num,i,j)(2,2,0,0)");
+  test_for_zero(t4ddg_1(2,2,0,1) - (t2s_1(0,1))
+		,"T4ddg(Num,Num,i,j)(2,2,0,1)");
+  test_for_zero(t4ddg_1(2,2,0,2) - (t2s_1(0,2))
+		,"T4ddg(Num,Num,i,j)(2,2,0,2)");
+  test_for_zero(t4ddg_1(2,2,1,0) - (t2s_1(1,0))
+		,"T4ddg(Num,Num,i,j)(2,2,1,0)");
+  test_for_zero(t4ddg_1(2,2,1,1) - (t2s_1(1,1))
+		,"T4ddg(Num,Num,i,j)(2,2,1,1)");
+  test_for_zero(t4ddg_1(2,2,1,2) - (t2s_1(1,2))
+		,"T4ddg(Num,Num,i,j)(2,2,1,2)");
+  test_for_zero(t4ddg_1(2,2,2,0) - (t2s_1(2,0))
+		,"T4ddg(Num,Num,i,j)(2,2,2,0)");
+  test_for_zero(t4ddg_1(2,2,2,1) - (t2s_1(2,1))
+		,"T4ddg(Num,Num,i,j)(2,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,2) - (t2s_1(2,2))
+		,"T4ddg(Num,Num,i,j)(2,2,2,2)");
+
+
+
+
+
+  t2s_1(i,j)=t4ddg_1(i,j,0,0);
+  test_for_zero(t4ddg_1(0,0,0,0) - (t2s_1(0,0))
+		,"T4ddg(i,j,Num,Num)(0,0,0,0)");
+  test_for_zero(t4ddg_1(0,1,0,0) - (t2s_1(0,1))
+		,"T4ddg(i,j,Num,Num)(0,0,0,1)");
+  test_for_zero(t4ddg_1(0,2,0,0) - (t2s_1(0,2))
+		,"T4ddg(i,j,Num,Num)(0,0,0,2)");
+  test_for_zero(t4ddg_1(1,0,0,0) - (t2s_1(1,0))
+		,"T4ddg(i,j,Num,Num)(0,0,1,0)");
+  test_for_zero(t4ddg_1(1,1,0,0) - (t2s_1(1,1))
+		,"T4ddg(i,j,Num,Num)(0,0,1,1)");
+  test_for_zero(t4ddg_1(1,2,0,0) - (t2s_1(1,2))
+		,"T4ddg(i,j,Num,Num)(0,0,1,2)");
+  test_for_zero(t4ddg_1(2,0,0,0) - (t2s_1(2,0))
+		,"T4ddg(i,j,Num,Num)(0,0,2,0)");
+  test_for_zero(t4ddg_1(2,1,0,0) - (t2s_1(2,1))
+		,"T4ddg(i,j,Num,Num)(0,0,2,1)");
+  test_for_zero(t4ddg_1(2,2,0,0) - (t2s_1(2,2))
+		,"T4ddg(i,j,Num,Num)(0,0,2,2)");
+
+  t2s_1(i,j)=t4ddg_1(i,j,0,1);
+  test_for_zero(t4ddg_1(0,0,0,1) - (t2s_1(0,0))
+		,"T4ddg(i,j,Num,Num)(0,1,0,0)");
+  test_for_zero(t4ddg_1(0,1,0,1) - (t2s_1(0,1))
+		,"T4ddg(i,j,Num,Num)(0,1,0,1)");
+  test_for_zero(t4ddg_1(0,2,0,1) - (t2s_1(0,2))
+		,"T4ddg(i,j,Num,Num)(0,1,0,2)");
+  test_for_zero(t4ddg_1(1,0,0,1) - (t2s_1(1,0))
+		,"T4ddg(i,j,Num,Num)(0,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,0,1) - (t2s_1(1,1))
+		,"T4ddg(i,j,Num,Num)(0,1,1,1)");
+  test_for_zero(t4ddg_1(1,2,0,1) - (t2s_1(1,2))
+		,"T4ddg(i,j,Num,Num)(0,1,1,2)");
+  test_for_zero(t4ddg_1(2,0,0,1) - (t2s_1(2,0))
+		,"T4ddg(i,j,Num,Num)(0,1,2,0)");
+  test_for_zero(t4ddg_1(2,1,0,1) - (t2s_1(2,1))
+		,"T4ddg(i,j,Num,Num)(0,1,2,1)");
+  test_for_zero(t4ddg_1(2,2,0,1) - (t2s_1(2,2))
+		,"T4ddg(i,j,Num,Num)(0,1,2,2)");
+
+  t2s_1(i,j)=t4ddg_1(i,j,0,2);
+  test_for_zero(t4ddg_1(0,0,0,2) - (t2s_1(0,0))
+		,"T4ddg(i,j,Num,Num)(0,2,0,0)");
+  test_for_zero(t4ddg_1(0,1,0,2) - (t2s_1(0,1))
+		,"T4ddg(i,j,Num,Num)(0,2,0,1)");
+  test_for_zero(t4ddg_1(0,2,0,2) - (t2s_1(0,2))
+		,"T4ddg(i,j,Num,Num)(0,2,0,2)");
+  test_for_zero(t4ddg_1(1,0,0,2) - (t2s_1(1,0))
+		,"T4ddg(i,j,Num,Num)(0,2,1,0)");
+  test_for_zero(t4ddg_1(1,1,0,2) - (t2s_1(1,1))
+		,"T4ddg(i,j,Num,Num)(0,2,1,1)");
+  test_for_zero(t4ddg_1(1,2,0,2) - (t2s_1(1,2))
+		,"T4ddg(i,j,Num,Num)(0,2,1,2)");
+  test_for_zero(t4ddg_1(2,0,0,2) - (t2s_1(2,0))
+		,"T4ddg(i,j,Num,Num)(0,2,2,0)");
+  test_for_zero(t4ddg_1(2,1,0,2) - (t2s_1(2,1))
+		,"T4ddg(i,j,Num,Num)(0,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,0,2) - (t2s_1(2,2))
+		,"T4ddg(i,j,Num,Num)(0,2,2,2)");
+
+  t2s_1(i,j)=t4ddg_1(i,j,1,0);
+  test_for_zero(t4ddg_1(0,0,1,0) - (t2s_1(0,0))
+		,"T4ddg(i,j,Num,Num)(1,0,0,0)");
+  test_for_zero(t4ddg_1(0,1,1,0) - (t2s_1(0,1))
+		,"T4ddg(i,j,Num,Num)(1,0,0,1)");
+  test_for_zero(t4ddg_1(0,2,1,0) - (t2s_1(0,2))
+		,"T4ddg(i,j,Num,Num)(1,0,0,2)");
+  test_for_zero(t4ddg_1(1,0,1,0) - (t2s_1(1,0))
+		,"T4ddg(i,j,Num,Num)(1,0,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,0) - (t2s_1(1,1))
+		,"T4ddg(i,j,Num,Num)(1,0,1,1)");
+  test_for_zero(t4ddg_1(1,2,1,0) - (t2s_1(1,2))
+		,"T4ddg(i,j,Num,Num)(1,0,1,2)");
+  test_for_zero(t4ddg_1(2,0,1,0) - (t2s_1(2,0))
+		,"T4ddg(i,j,Num,Num)(1,0,2,0)");
+  test_for_zero(t4ddg_1(2,1,1,0) - (t2s_1(2,1))
+		,"T4ddg(i,j,Num,Num)(1,0,2,1)");
+  test_for_zero(t4ddg_1(2,2,1,0) - (t2s_1(2,2))
+		,"T4ddg(i,j,Num,Num)(1,0,2,2)");
+
+  t2s_1(i,j)=t4ddg_1(i,j,1,1);
+  test_for_zero(t4ddg_1(0,0,1,1) - (t2s_1(0,0))
+		,"T4ddg(i,j,Num,Num)(1,1,0,0)");
+  test_for_zero(t4ddg_1(0,1,1,1) - (t2s_1(0,1))
+		,"T4ddg(i,j,Num,Num)(1,1,0,1)");
+  test_for_zero(t4ddg_1(0,2,1,1) - (t2s_1(0,2))
+		,"T4ddg(i,j,Num,Num)(1,1,0,2)");
+  test_for_zero(t4ddg_1(1,0,1,1) - (t2s_1(1,0))
+		,"T4ddg(i,j,Num,Num)(1,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,1) - (t2s_1(1,1))
+		,"T4ddg(i,j,Num,Num)(1,1,1,1)");
+  test_for_zero(t4ddg_1(1,2,1,1) - (t2s_1(1,2))
+		,"T4ddg(i,j,Num,Num)(1,1,1,2)");
+  test_for_zero(t4ddg_1(2,0,1,1) - (t2s_1(2,0))
+		,"T4ddg(i,j,Num,Num)(1,1,2,0)");
+  test_for_zero(t4ddg_1(2,1,1,1) - (t2s_1(2,1))
+		,"T4ddg(i,j,Num,Num)(1,1,2,1)");
+  test_for_zero(t4ddg_1(2,2,1,1) - (t2s_1(2,2))
+		,"T4ddg(i,j,Num,Num)(1,1,2,2)");
+
+  t2s_1(i,j)=t4ddg_1(i,j,1,2);
+  test_for_zero(t4ddg_1(0,0,1,2) - (t2s_1(0,0))
+		,"T4ddg(i,j,Num,Num)(1,2,0,0)");
+  test_for_zero(t4ddg_1(0,1,1,2) - (t2s_1(0,1))
+		,"T4ddg(i,j,Num,Num)(1,2,0,1)");
+  test_for_zero(t4ddg_1(0,2,1,2) - (t2s_1(0,2))
+		,"T4ddg(i,j,Num,Num)(1,2,0,2)");
+  test_for_zero(t4ddg_1(1,0,1,2) - (t2s_1(1,0))
+		,"T4ddg(i,j,Num,Num)(1,2,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,2) - (t2s_1(1,1))
+		,"T4ddg(i,j,Num,Num)(1,2,1,1)");
+  test_for_zero(t4ddg_1(1,2,1,2) - (t2s_1(1,2))
+		,"T4ddg(i,j,Num,Num)(1,2,1,2)");
+  test_for_zero(t4ddg_1(2,0,1,2) - (t2s_1(2,0))
+		,"T4ddg(i,j,Num,Num)(1,2,2,0)");
+  test_for_zero(t4ddg_1(2,1,1,2) - (t2s_1(2,1))
+		,"T4ddg(i,j,Num,Num)(1,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,1,2) - (t2s_1(2,2))
+		,"T4ddg(i,j,Num,Num)(1,2,2,2)");
+
+  t2s_1(i,j)=t4ddg_1(i,j,2,0);
+  test_for_zero(t4ddg_1(0,0,2,0) - (t2s_1(0,0))
+		,"T4ddg(i,j,Num,Num)(2,0,0,0)");
+  test_for_zero(t4ddg_1(0,1,2,0) - (t2s_1(0,1))
+		,"T4ddg(i,j,Num,Num)(2,0,0,1)");
+  test_for_zero(t4ddg_1(0,2,2,0) - (t2s_1(0,2))
+		,"T4ddg(i,j,Num,Num)(2,0,0,2)");
+  test_for_zero(t4ddg_1(1,0,2,0) - (t2s_1(1,0))
+		,"T4ddg(i,j,Num,Num)(2,0,1,0)");
+  test_for_zero(t4ddg_1(1,1,2,0) - (t2s_1(1,1))
+		,"T4ddg(i,j,Num,Num)(2,0,1,1)");
+  test_for_zero(t4ddg_1(1,2,2,0) - (t2s_1(1,2))
+		,"T4ddg(i,j,Num,Num)(2,0,1,2)");
+  test_for_zero(t4ddg_1(2,0,2,0) - (t2s_1(2,0))
+		,"T4ddg(i,j,Num,Num)(2,0,2,0)");
+  test_for_zero(t4ddg_1(2,1,2,0) - (t2s_1(2,1))
+		,"T4ddg(i,j,Num,Num)(2,0,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,0) - (t2s_1(2,2))
+		,"T4ddg(i,j,Num,Num)(2,0,2,2)");
+
+  t2s_1(i,j)=t4ddg_1(i,j,2,1);
+  test_for_zero(t4ddg_1(0,0,2,1) - (t2s_1(0,0))
+		,"T4ddg(i,j,Num,Num)(2,1,0,0)");
+  test_for_zero(t4ddg_1(0,1,2,1) - (t2s_1(0,1))
+		,"T4ddg(i,j,Num,Num)(2,1,0,1)");
+  test_for_zero(t4ddg_1(0,2,2,1) - (t2s_1(0,2))
+		,"T4ddg(i,j,Num,Num)(2,1,0,2)");
+  test_for_zero(t4ddg_1(1,0,2,1) - (t2s_1(1,0))
+		,"T4ddg(i,j,Num,Num)(2,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,2,1) - (t2s_1(1,1))
+		,"T4ddg(i,j,Num,Num)(2,1,1,1)");
+  test_for_zero(t4ddg_1(1,2,2,1) - (t2s_1(1,2))
+		,"T4ddg(i,j,Num,Num)(2,1,1,2)");
+  test_for_zero(t4ddg_1(2,0,2,1) - (t2s_1(2,0))
+		,"T4ddg(i,j,Num,Num)(2,1,2,0)");
+  test_for_zero(t4ddg_1(2,1,2,1) - (t2s_1(2,1))
+		,"T4ddg(i,j,Num,Num)(2,1,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,1) - (t2s_1(2,2))
+		,"T4ddg(i,j,Num,Num)(2,1,2,2)");
+
+  t2s_1(i,j)=t4ddg_1(i,j,2,2);
+  test_for_zero(t4ddg_1(0,0,2,2) - (t2s_1(0,0))
+		,"T4ddg(i,j,Num,Num)(2,2,0,0)");
+  test_for_zero(t4ddg_1(0,1,2,2) - (t2s_1(0,1))
+		,"T4ddg(i,j,Num,Num)(2,2,0,1)");
+  test_for_zero(t4ddg_1(0,2,2,2) - (t2s_1(0,2))
+		,"T4ddg(i,j,Num,Num)(2,2,0,2)");
+  test_for_zero(t4ddg_1(1,0,2,2) - (t2s_1(1,0))
+		,"T4ddg(i,j,Num,Num)(2,2,1,0)");
+  test_for_zero(t4ddg_1(1,1,2,2) - (t2s_1(1,1))
+		,"T4ddg(i,j,Num,Num)(2,2,1,1)");
+  test_for_zero(t4ddg_1(1,2,2,2) - (t2s_1(1,2))
+		,"T4ddg(i,j,Num,Num)(2,2,1,2)");
+  test_for_zero(t4ddg_1(2,0,2,2) - (t2s_1(2,0))
+		,"T4ddg(i,j,Num,Num)(2,2,2,0)");
+  test_for_zero(t4ddg_1(2,1,2,2) - (t2s_1(2,1))
+		,"T4ddg(i,j,Num,Num)(2,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,2) - (t2s_1(2,2))
+		,"T4ddg(i,j,Num,Num)(2,2,2,2)");
+
+
+
+  t2_1(i,j)=t4ddg_1(0,i,0,j);
+  test_for_zero(t4ddg_1(0,0,0,0) - (t2_1(0,0))
+		,"T4ddg(Num,i,Num,j)(0,0,0,0)");
+  test_for_zero(t4ddg_1(0,0,0,1) - (t2_1(0,1))
+		,"T4ddg(Num,i,Num,j)(0,0,0,1)");
+  test_for_zero(t4ddg_1(0,0,0,2) - (t2_1(0,2))
+		,"T4ddg(Num,i,Num,j)(0,0,0,2)");
+  test_for_zero(t4ddg_1(0,1,0,0) - (t2_1(1,0))
+		,"T4ddg(Num,i,Num,j)(0,0,1,0)");
+  test_for_zero(t4ddg_1(0,1,0,1) - (t2_1(1,1))
+		,"T4ddg(Num,i,Num,j)(0,0,1,1)");
+  test_for_zero(t4ddg_1(0,1,0,2) - (t2_1(1,2))
+		,"T4ddg(Num,i,Num,j)(0,0,1,2)");
+  test_for_zero(t4ddg_1(0,2,0,0) - (t2_1(2,0))
+		,"T4ddg(Num,i,Num,j)(0,0,2,0)");
+  test_for_zero(t4ddg_1(0,2,0,1) - (t2_1(2,1))
+		,"T4ddg(Num,i,Num,j)(0,0,2,1)");
+  test_for_zero(t4ddg_1(0,2,0,2) - (t2_1(2,2))
+		,"T4ddg(Num,i,Num,j)(0,0,2,2)");
+
+  t2_1(i,j)=t4ddg_1(0,i,1,j);
+  test_for_zero(t4ddg_1(0,0,1,0) - (t2_1(0,0))
+		,"T4ddg(Num,i,Num,j)(0,1,0,0)");
+  test_for_zero(t4ddg_1(0,0,1,1) - (t2_1(0,1))
+		,"T4ddg(Num,i,Num,j)(0,1,0,1)");
+  test_for_zero(t4ddg_1(0,0,1,2) - (t2_1(0,2))
+		,"T4ddg(Num,i,Num,j)(0,1,0,2)");
+  test_for_zero(t4ddg_1(0,1,1,0) - (t2_1(1,0))
+		,"T4ddg(Num,i,Num,j)(0,1,1,0)");
+  test_for_zero(t4ddg_1(0,1,1,1) - (t2_1(1,1))
+		,"T4ddg(Num,i,Num,j)(0,1,1,1)");
+  test_for_zero(t4ddg_1(0,1,1,2) - (t2_1(1,2))
+		,"T4ddg(Num,i,Num,j)(0,1,1,2)");
+  test_for_zero(t4ddg_1(0,2,1,0) - (t2_1(2,0))
+		,"T4ddg(Num,i,Num,j)(0,1,2,0)");
+  test_for_zero(t4ddg_1(0,2,1,1) - (t2_1(2,1))
+		,"T4ddg(Num,i,Num,j)(0,1,2,1)");
+  test_for_zero(t4ddg_1(0,2,1,2) - (t2_1(2,2))
+		,"T4ddg(Num,i,Num,j)(0,1,2,2)");
+
+  t2_1(i,j)=t4ddg_1(0,i,2,j);
+  test_for_zero(t4ddg_1(0,0,2,0) - (t2_1(0,0))
+		,"T4ddg(Num,i,Num,j)(0,2,0,0)");
+  test_for_zero(t4ddg_1(0,0,2,1) - (t2_1(0,1))
+		,"T4ddg(Num,i,Num,j)(0,2,0,1)");
+  test_for_zero(t4ddg_1(0,0,2,2) - (t2_1(0,2))
+		,"T4ddg(Num,i,Num,j)(0,2,0,2)");
+  test_for_zero(t4ddg_1(0,1,2,0) - (t2_1(1,0))
+		,"T4ddg(Num,i,Num,j)(0,2,1,0)");
+  test_for_zero(t4ddg_1(0,1,2,1) - (t2_1(1,1))
+		,"T4ddg(Num,i,Num,j)(0,2,1,1)");
+  test_for_zero(t4ddg_1(0,1,2,2) - (t2_1(1,2))
+		,"T4ddg(Num,i,Num,j)(0,2,1,2)");
+  test_for_zero(t4ddg_1(0,2,2,0) - (t2_1(2,0))
+		,"T4ddg(Num,i,Num,j)(0,2,2,0)");
+  test_for_zero(t4ddg_1(0,2,2,1) - (t2_1(2,1))
+		,"T4ddg(Num,i,Num,j)(0,2,2,1)");
+  test_for_zero(t4ddg_1(0,2,2,2) - (t2_1(2,2))
+		,"T4ddg(Num,i,Num,j)(0,2,2,2)");
+
+  t2_1(i,j)=t4ddg_1(1,i,0,j);
+  test_for_zero(t4ddg_1(1,0,0,0) - (t2_1(0,0))
+		,"T4ddg(Num,i,Num,j)(1,0,0,0)");
+  test_for_zero(t4ddg_1(1,0,0,1) - (t2_1(0,1))
+		,"T4ddg(Num,i,Num,j)(1,0,0,1)");
+  test_for_zero(t4ddg_1(1,0,0,2) - (t2_1(0,2))
+		,"T4ddg(Num,i,Num,j)(1,0,0,2)");
+  test_for_zero(t4ddg_1(1,1,0,0) - (t2_1(1,0))
+		,"T4ddg(Num,i,Num,j)(1,0,1,0)");
+  test_for_zero(t4ddg_1(1,1,0,1) - (t2_1(1,1))
+		,"T4ddg(Num,i,Num,j)(1,0,1,1)");
+  test_for_zero(t4ddg_1(1,1,0,2) - (t2_1(1,2))
+		,"T4ddg(Num,i,Num,j)(1,0,1,2)");
+  test_for_zero(t4ddg_1(1,2,0,0) - (t2_1(2,0))
+		,"T4ddg(Num,i,Num,j)(1,0,2,0)");
+  test_for_zero(t4ddg_1(1,2,0,1) - (t2_1(2,1))
+		,"T4ddg(Num,i,Num,j)(1,0,2,1)");
+  test_for_zero(t4ddg_1(1,2,0,2) - (t2_1(2,2))
+		,"T4ddg(Num,i,Num,j)(1,0,2,2)");
+
+  t2_1(i,j)=t4ddg_1(1,i,1,j);
+  test_for_zero(t4ddg_1(1,0,1,0) - (t2_1(0,0))
+		,"T4ddg(Num,i,Num,j)(1,1,0,0)");
+  test_for_zero(t4ddg_1(1,0,1,1) - (t2_1(0,1))
+		,"T4ddg(Num,i,Num,j)(1,1,0,1)");
+  test_for_zero(t4ddg_1(1,0,1,2) - (t2_1(0,2))
+		,"T4ddg(Num,i,Num,j)(1,1,0,2)");
+  test_for_zero(t4ddg_1(1,1,1,0) - (t2_1(1,0))
+		,"T4ddg(Num,i,Num,j)(1,1,1,0)");
+  test_for_zero(t4ddg_1(1,1,1,1) - (t2_1(1,1))
+		,"T4ddg(Num,i,Num,j)(1,1,1,1)");
+  test_for_zero(t4ddg_1(1,1,1,2) - (t2_1(1,2))
+		,"T4ddg(Num,i,Num,j)(1,1,1,2)");
+  test_for_zero(t4ddg_1(1,2,1,0) - (t2_1(2,0))
+		,"T4ddg(Num,i,Num,j)(1,1,2,0)");
+  test_for_zero(t4ddg_1(1,2,1,1) - (t2_1(2,1))
+		,"T4ddg(Num,i,Num,j)(1,1,2,1)");
+  test_for_zero(t4ddg_1(1,2,1,2) - (t2_1(2,2))
+		,"T4ddg(Num,i,Num,j)(1,1,2,2)");
+
+  t2_1(i,j)=t4ddg_1(1,i,2,j);
+  test_for_zero(t4ddg_1(1,0,2,0) - (t2_1(0,0))
+		,"T4ddg(Num,i,Num,j)(1,2,0,0)");
+  test_for_zero(t4ddg_1(1,0,2,1) - (t2_1(0,1))
+		,"T4ddg(Num,i,Num,j)(1,2,0,1)");
+  test_for_zero(t4ddg_1(1,0,2,2) - (t2_1(0,2))
+		,"T4ddg(Num,i,Num,j)(1,2,0,2)");
+  test_for_zero(t4ddg_1(1,1,2,0) - (t2_1(1,0))
+		,"T4ddg(Num,i,Num,j)(1,2,1,0)");
+  test_for_zero(t4ddg_1(1,1,2,1) - (t2_1(1,1))
+		,"T4ddg(Num,i,Num,j)(1,2,1,1)");
+  test_for_zero(t4ddg_1(1,1,2,2) - (t2_1(1,2))
+		,"T4ddg(Num,i,Num,j)(1,2,1,2)");
+  test_for_zero(t4ddg_1(1,2,2,0) - (t2_1(2,0))
+		,"T4ddg(Num,i,Num,j)(1,2,2,0)");
+  test_for_zero(t4ddg_1(1,2,2,1) - (t2_1(2,1))
+		,"T4ddg(Num,i,Num,j)(1,2,2,1)");
+  test_for_zero(t4ddg_1(1,2,2,2) - (t2_1(2,2))
+		,"T4ddg(Num,i,Num,j)(1,2,2,2)");
+
+  t2_1(i,j)=t4ddg_1(2,i,0,j);
+  test_for_zero(t4ddg_1(2,0,0,0) - (t2_1(0,0))
+		,"T4ddg(Num,i,Num,j)(2,0,0,0)");
+  test_for_zero(t4ddg_1(2,0,0,1) - (t2_1(0,1))
+		,"T4ddg(Num,i,Num,j)(2,0,0,1)");
+  test_for_zero(t4ddg_1(2,0,0,2) - (t2_1(0,2))
+		,"T4ddg(Num,i,Num,j)(2,0,0,2)");
+  test_for_zero(t4ddg_1(2,1,0,0) - (t2_1(1,0))
+		,"T4ddg(Num,i,Num,j)(2,0,1,0)");
+  test_for_zero(t4ddg_1(2,1,0,1) - (t2_1(1,1))
+		,"T4ddg(Num,i,Num,j)(2,0,1,1)");
+  test_for_zero(t4ddg_1(2,1,0,2) - (t2_1(1,2))
+		,"T4ddg(Num,i,Num,j)(2,0,1,2)");
+  test_for_zero(t4ddg_1(2,2,0,0) - (t2_1(2,0))
+		,"T4ddg(Num,i,Num,j)(2,0,2,0)");
+  test_for_zero(t4ddg_1(2,2,0,1) - (t2_1(2,1))
+		,"T4ddg(Num,i,Num,j)(2,0,2,1)");
+  test_for_zero(t4ddg_1(2,2,0,2) - (t2_1(2,2))
+		,"T4ddg(Num,i,Num,j)(2,0,2,2)");
+
+  t2_1(i,j)=t4ddg_1(2,i,1,j);
+  test_for_zero(t4ddg_1(2,0,1,0) - (t2_1(0,0))
+		,"T4ddg(Num,i,Num,j)(2,1,0,0)");
+  test_for_zero(t4ddg_1(2,0,1,1) - (t2_1(0,1))
+		,"T4ddg(Num,i,Num,j)(2,1,0,1)");
+  test_for_zero(t4ddg_1(2,0,1,2) - (t2_1(0,2))
+		,"T4ddg(Num,i,Num,j)(2,1,0,2)");
+  test_for_zero(t4ddg_1(2,1,1,0) - (t2_1(1,0))
+		,"T4ddg(Num,i,Num,j)(2,1,1,0)");
+  test_for_zero(t4ddg_1(2,1,1,1) - (t2_1(1,1))
+		,"T4ddg(Num,i,Num,j)(2,1,1,1)");
+  test_for_zero(t4ddg_1(2,1,1,2) - (t2_1(1,2))
+		,"T4ddg(Num,i,Num,j)(2,1,1,2)");
+  test_for_zero(t4ddg_1(2,2,1,0) - (t2_1(2,0))
+		,"T4ddg(Num,i,Num,j)(2,1,2,0)");
+  test_for_zero(t4ddg_1(2,2,1,1) - (t2_1(2,1))
+		,"T4ddg(Num,i,Num,j)(2,1,2,1)");
+  test_for_zero(t4ddg_1(2,2,1,2) - (t2_1(2,2))
+		,"T4ddg(Num,i,Num,j)(2,1,2,2)");
+
+  t2_1(i,j)=t4ddg_1(2,i,2,j);
+  test_for_zero(t4ddg_1(2,0,2,0) - (t2_1(0,0))
+		,"T4ddg(Num,i,Num,j)(2,2,0,0)");
+  test_for_zero(t4ddg_1(2,0,2,1) - (t2_1(0,1))
+		,"T4ddg(Num,i,Num,j)(2,2,0,1)");
+  test_for_zero(t4ddg_1(2,0,2,2) - (t2_1(0,2))
+		,"T4ddg(Num,i,Num,j)(2,2,0,2)");
+  test_for_zero(t4ddg_1(2,1,2,0) - (t2_1(1,0))
+		,"T4ddg(Num,i,Num,j)(2,2,1,0)");
+  test_for_zero(t4ddg_1(2,1,2,1) - (t2_1(1,1))
+		,"T4ddg(Num,i,Num,j)(2,2,1,1)");
+  test_for_zero(t4ddg_1(2,1,2,2) - (t2_1(1,2))
+		,"T4ddg(Num,i,Num,j)(2,2,1,2)");
+  test_for_zero(t4ddg_1(2,2,2,0) - (t2_1(2,0))
+		,"T4ddg(Num,i,Num,j)(2,2,2,0)");
+  test_for_zero(t4ddg_1(2,2,2,1) - (t2_1(2,1))
+		,"T4ddg(Num,i,Num,j)(2,2,2,1)");
+  test_for_zero(t4ddg_1(2,2,2,2) - (t2_1(2,2))
+		,"T4ddg(Num,i,Num,j)(2,2,2,2)");
+
+  t3dg_1(j,k,i)=t4ddg_1(0,i,j,k);
+  test_for_zero(t3dg_1(0,0,0) - t4ddg_1(0,0,0,0)
+		,"T4ddg(Num,i,j,k)(0,0,0,0)");
+  test_for_zero(t3dg_1(0,1,0) - t4ddg_1(0,0,0,1)
+		,"T4ddg(Num,i,j,k)(0,0,0,1)");
+  test_for_zero(t3dg_1(0,2,0) - t4ddg_1(0,0,0,2)
+		,"T4ddg(Num,i,j,k)(0,0,0,2)");
+  test_for_zero(t3dg_1(1,0,0) - t4ddg_1(0,0,1,0)
+		,"T4ddg(Num,i,j,k)(0,0,1,0)");
+  test_for_zero(t3dg_1(1,1,0) - t4ddg_1(0,0,1,1)
+		,"T4ddg(Num,i,j,k)(0,0,1,1)");
+  test_for_zero(t3dg_1(1,2,0) - t4ddg_1(0,0,1,2)
+		,"T4ddg(Num,i,j,k)(0,0,1,2)");
+  test_for_zero(t3dg_1(2,0,0) - t4ddg_1(0,0,2,0)
+		,"T4ddg(Num,i,j,k)(0,0,2,0)");
+  test_for_zero(t3dg_1(2,1,0) - t4ddg_1(0,0,2,1)
+		,"T4ddg(Num,i,j,k)(0,0,2,1)");
+  test_for_zero(t3dg_1(2,2,0) - t4ddg_1(0,0,2,2)
+		,"T4ddg(Num,i,j,k)(0,0,2,2)");
+  test_for_zero(t3dg_1(0,0,1) - t4ddg_1(0,1,0,0)
+		,"T4ddg(Num,i,j,k)(0,1,0,0)");
+  test_for_zero(t3dg_1(0,1,1) - t4ddg_1(0,1,0,1)
+		,"T4ddg(Num,i,j,k)(0,1,0,1)");
+  test_for_zero(t3dg_1(0,2,1) - t4ddg_1(0,1,0,2)
+		,"T4ddg(Num,i,j,k)(0,1,0,2)");
+  test_for_zero(t3dg_1(1,0,1) - t4ddg_1(0,1,1,0)
+		,"T4ddg(Num,i,j,k)(0,1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - t4ddg_1(0,1,1,1)
+		,"T4ddg(Num,i,j,k)(0,1,1,1)");
+  test_for_zero(t3dg_1(1,2,1) - t4ddg_1(0,1,1,2)
+		,"T4ddg(Num,i,j,k)(0,1,1,2)");
+  test_for_zero(t3dg_1(2,0,1) - t4ddg_1(0,1,2,0)
+		,"T4ddg(Num,i,j,k)(0,1,2,0)");
+  test_for_zero(t3dg_1(2,1,1) - t4ddg_1(0,1,2,1)
+		,"T4ddg(Num,i,j,k)(0,1,2,1)");
+  test_for_zero(t3dg_1(2,2,1) - t4ddg_1(0,1,2,2)
+		,"T4ddg(Num,i,j,k)(0,1,2,2)");
+  test_for_zero(t3dg_1(0,0,2) - t4ddg_1(0,2,0,0)
+		,"T4ddg(Num,i,j,k)(0,2,0,0)");
+  test_for_zero(t3dg_1(0,1,2) - t4ddg_1(0,2,0,1)
+		,"T4ddg(Num,i,j,k)(0,2,0,1)");
+  test_for_zero(t3dg_1(0,2,2) - t4ddg_1(0,2,0,2)
+		,"T4ddg(Num,i,j,k)(0,2,0,2)");
+  test_for_zero(t3dg_1(1,0,2) - t4ddg_1(0,2,1,0)
+		,"T4ddg(Num,i,j,k)(0,2,1,0)");
+  test_for_zero(t3dg_1(1,1,2) - t4ddg_1(0,2,1,1)
+		,"T4ddg(Num,i,j,k)(0,2,1,1)");
+  test_for_zero(t3dg_1(1,2,2) - t4ddg_1(0,2,1,2)
+		,"T4ddg(Num,i,j,k)(0,2,1,2)");
+  test_for_zero(t3dg_1(2,0,2) - t4ddg_1(0,2,2,0)
+		,"T4ddg(Num,i,j,k)(0,2,2,0)");
+  test_for_zero(t3dg_1(2,1,2) - t4ddg_1(0,2,2,1)
+		,"T4ddg(Num,i,j,k)(0,2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - t4ddg_1(0,2,2,2)
+		,"T4ddg(Num,i,j,k)(0,2,2,2)");
+
+  t3dg_1(j,k,i)=t4ddg_1(1,i,j,k);
+  test_for_zero(t3dg_1(0,0,0) - t4ddg_1(1,0,0,0)
+		,"T4ddg(Num,i,j,k)(1,0,0,0)");
+  test_for_zero(t3dg_1(0,1,0) - t4ddg_1(1,0,0,1)
+		,"T4ddg(Num,i,j,k)(1,0,0,1)");
+  test_for_zero(t3dg_1(0,2,0) - t4ddg_1(1,0,0,2)
+		,"T4ddg(Num,i,j,k)(1,0,0,2)");
+  test_for_zero(t3dg_1(1,0,0) - t4ddg_1(1,0,1,0)
+		,"T4ddg(Num,i,j,k)(1,0,1,0)");
+  test_for_zero(t3dg_1(1,1,0) - t4ddg_1(1,0,1,1)
+		,"T4ddg(Num,i,j,k)(1,0,1,1)");
+  test_for_zero(t3dg_1(1,2,0) - t4ddg_1(1,0,1,2)
+		,"T4ddg(Num,i,j,k)(1,0,1,2)");
+  test_for_zero(t3dg_1(2,0,0) - t4ddg_1(1,0,2,0)
+		,"T4ddg(Num,i,j,k)(1,0,2,0)");
+  test_for_zero(t3dg_1(2,1,0) - t4ddg_1(1,0,2,1)
+		,"T4ddg(Num,i,j,k)(1,0,2,1)");
+  test_for_zero(t3dg_1(2,2,0) - t4ddg_1(1,0,2,2)
+		,"T4ddg(Num,i,j,k)(1,0,2,2)");
+  test_for_zero(t3dg_1(0,0,1) - t4ddg_1(1,1,0,0)
+		,"T4ddg(Num,i,j,k)(1,1,0,0)");
+  test_for_zero(t3dg_1(0,1,1) - t4ddg_1(1,1,0,1)
+		,"T4ddg(Num,i,j,k)(1,1,0,1)");
+  test_for_zero(t3dg_1(0,2,1) - t4ddg_1(1,1,0,2)
+		,"T4ddg(Num,i,j,k)(1,1,0,2)");
+  test_for_zero(t3dg_1(1,0,1) - t4ddg_1(1,1,1,0)
+		,"T4ddg(Num,i,j,k)(1,1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - t4ddg_1(1,1,1,1)
+		,"T4ddg(Num,i,j,k)(1,1,1,1)");
+  test_for_zero(t3dg_1(1,2,1) - t4ddg_1(1,1,1,2)
+		,"T4ddg(Num,i,j,k)(1,1,1,2)");
+  test_for_zero(t3dg_1(2,0,1) - t4ddg_1(1,1,2,0)
+		,"T4ddg(Num,i,j,k)(1,1,2,0)");
+  test_for_zero(t3dg_1(2,1,1) - t4ddg_1(1,1,2,1)
+		,"T4ddg(Num,i,j,k)(1,1,2,1)");
+  test_for_zero(t3dg_1(2,2,1) - t4ddg_1(1,1,2,2)
+		,"T4ddg(Num,i,j,k)(1,1,2,2)");
+  test_for_zero(t3dg_1(0,0,2) - t4ddg_1(1,2,0,0)
+		,"T4ddg(Num,i,j,k)(1,2,0,0)");
+  test_for_zero(t3dg_1(0,1,2) - t4ddg_1(1,2,0,1)
+		,"T4ddg(Num,i,j,k)(1,2,0,1)");
+  test_for_zero(t3dg_1(0,2,2) - t4ddg_1(1,2,0,2)
+		,"T4ddg(Num,i,j,k)(1,2,0,2)");
+  test_for_zero(t3dg_1(1,0,2) - t4ddg_1(1,2,1,0)
+		,"T4ddg(Num,i,j,k)(1,2,1,0)");
+  test_for_zero(t3dg_1(1,1,2) - t4ddg_1(1,2,1,1)
+		,"T4ddg(Num,i,j,k)(1,2,1,1)");
+  test_for_zero(t3dg_1(1,2,2) - t4ddg_1(1,2,1,2)
+		,"T4ddg(Num,i,j,k)(1,2,1,2)");
+  test_for_zero(t3dg_1(2,0,2) - t4ddg_1(1,2,2,0)
+		,"T4ddg(Num,i,j,k)(1,2,2,0)");
+  test_for_zero(t3dg_1(2,1,2) - t4ddg_1(1,2,2,1)
+		,"T4ddg(Num,i,j,k)(1,2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - t4ddg_1(1,2,2,2)
+		,"T4ddg(Num,i,j,k)(1,2,2,2)");
+
+  t3dg_1(j,k,i)=t4ddg_1(2,i,j,k);
+  test_for_zero(t3dg_1(0,0,0) - t4ddg_1(2,0,0,0)
+		,"T4ddg(Num,i,j,k)(2,0,0,0)");
+  test_for_zero(t3dg_1(0,1,0) - t4ddg_1(2,0,0,1)
+		,"T4ddg(Num,i,j,k)(2,0,0,1)");
+  test_for_zero(t3dg_1(0,2,0) - t4ddg_1(2,0,0,2)
+		,"T4ddg(Num,i,j,k)(2,0,0,2)");
+  test_for_zero(t3dg_1(1,0,0) - t4ddg_1(2,0,1,0)
+		,"T4ddg(Num,i,j,k)(2,0,1,0)");
+  test_for_zero(t3dg_1(1,1,0) - t4ddg_1(2,0,1,1)
+		,"T4ddg(Num,i,j,k)(2,0,1,1)");
+  test_for_zero(t3dg_1(1,2,0) - t4ddg_1(2,0,1,2)
+		,"T4ddg(Num,i,j,k)(2,0,1,2)");
+  test_for_zero(t3dg_1(2,0,0) - t4ddg_1(2,0,2,0)
+		,"T4ddg(Num,i,j,k)(2,0,2,0)");
+  test_for_zero(t3dg_1(2,1,0) - t4ddg_1(2,0,2,1)
+		,"T4ddg(Num,i,j,k)(2,0,2,1)");
+  test_for_zero(t3dg_1(2,2,0) - t4ddg_1(2,0,2,2)
+		,"T4ddg(Num,i,j,k)(2,0,2,2)");
+  test_for_zero(t3dg_1(0,0,1) - t4ddg_1(2,1,0,0)
+		,"T4ddg(Num,i,j,k)(2,1,0,0)");
+  test_for_zero(t3dg_1(0,1,1) - t4ddg_1(2,1,0,1)
+		,"T4ddg(Num,i,j,k)(2,1,0,1)");
+  test_for_zero(t3dg_1(0,2,1) - t4ddg_1(2,1,0,2)
+		,"T4ddg(Num,i,j,k)(2,1,0,2)");
+  test_for_zero(t3dg_1(1,0,1) - t4ddg_1(2,1,1,0)
+		,"T4ddg(Num,i,j,k)(2,1,1,0)");
+  test_for_zero(t3dg_1(1,1,1) - t4ddg_1(2,1,1,1)
+		,"T4ddg(Num,i,j,k)(2,1,1,1)");
+  test_for_zero(t3dg_1(1,2,1) - t4ddg_1(2,1,1,2)
+		,"T4ddg(Num,i,j,k)(2,1,1,2)");
+  test_for_zero(t3dg_1(2,0,1) - t4ddg_1(2,1,2,0)
+		,"T4ddg(Num,i,j,k)(2,1,2,0)");
+  test_for_zero(t3dg_1(2,1,1) - t4ddg_1(2,1,2,1)
+		,"T4ddg(Num,i,j,k)(2,1,2,1)");
+  test_for_zero(t3dg_1(2,2,1) - t4ddg_1(2,1,2,2)
+		,"T4ddg(Num,i,j,k)(2,1,2,2)");
+  test_for_zero(t3dg_1(0,0,2) - t4ddg_1(2,2,0,0)
+		,"T4ddg(Num,i,j,k)(2,2,0,0)");
+  test_for_zero(t3dg_1(0,1,2) - t4ddg_1(2,2,0,1)
+		,"T4ddg(Num,i,j,k)(2,2,0,1)");
+  test_for_zero(t3dg_1(0,2,2) - t4ddg_1(2,2,0,2)
+		,"T4ddg(Num,i,j,k)(2,2,0,2)");
+  test_for_zero(t3dg_1(1,0,2) - t4ddg_1(2,2,1,0)
+		,"T4ddg(Num,i,j,k)(2,2,1,0)");
+  test_for_zero(t3dg_1(1,1,2) - t4ddg_1(2,2,1,1)
+		,"T4ddg(Num,i,j,k)(2,2,1,1)");
+  test_for_zero(t3dg_1(1,2,2) - t4ddg_1(2,2,1,2)
+		,"T4ddg(Num,i,j,k)(2,2,1,2)");
+  test_for_zero(t3dg_1(2,0,2) - t4ddg_1(2,2,2,0)
+		,"T4ddg(Num,i,j,k)(2,2,2,0)");
+  test_for_zero(t3dg_1(2,1,2) - t4ddg_1(2,2,2,1)
+		,"T4ddg(Num,i,j,k)(2,2,2,1)");
+  test_for_zero(t3dg_1(2,2,2) - t4ddg_1(2,2,2,2)
+		,"T4ddg(Num,i,j,k)(2,2,2,2)");
+
+  /* Only one index int the first slot*/
+
+  t1_1(i)=t4ddg_1(i,0,0,0);
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,0)
+		,"T4ddg(i,Num,Num,Num)(0,0,0,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,0)
+		,"T4ddg(i,Num,Num,Num)(0,0,0,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,0)
+		,"T4ddg(i,Num,Num,Num)(0,0,0,2)");
+  t1_1(i)=t4ddg_1(i,0,0,1);
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,1)
+		,"T4ddg(i,Num,Num,Num)(0,0,1,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,1)
+		,"T4ddg(i,Num,Num,Num)(0,0,1,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,1)
+		,"T4ddg(i,Num,Num,Num)(0,0,1,2)");
+  t1_1(i)=t4ddg_1(i,0,0,2);
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,2)
+		,"T4ddg(i,Num,Num,Num)(0,0,2,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,2)
+		,"T4ddg(i,Num,Num,Num)(0,0,2,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,2)
+		,"T4ddg(i,Num,Num,Num)(0,0,2,2)");
+  t1_1(i)=t4ddg_1(i,0,1,0);
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,0)
+		,"T4ddg(i,Num,Num,Num)(0,1,0,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,0)
+		,"T4ddg(i,Num,Num,Num)(0,1,0,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,0)
+		,"T4ddg(i,Num,Num,Num)(0,1,0,2)");
+  t1_1(i)=t4ddg_1(i,0,1,1);
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,1)
+		,"T4ddg(i,Num,Num,Num)(0,1,1,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,1)
+		,"T4ddg(i,Num,Num,Num)(0,1,1,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,1)
+		,"T4ddg(i,Num,Num,Num)(0,1,1,2)");
+  t1_1(i)=t4ddg_1(i,0,1,2);
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,2)
+		,"T4ddg(i,Num,Num,Num)(0,1,2,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,2)
+		,"T4ddg(i,Num,Num,Num)(0,1,2,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,2)
+		,"T4ddg(i,Num,Num,Num)(0,1,2,2)");
+  t1_1(i)=t4ddg_1(i,0,2,0);
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,0)
+		,"T4ddg(i,Num,Num,Num)(0,2,0,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,0)
+		,"T4ddg(i,Num,Num,Num)(0,2,0,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,0)
+		,"T4ddg(i,Num,Num,Num)(0,2,0,2)");
+  t1_1(i)=t4ddg_1(i,0,2,1);
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,1)
+		,"T4ddg(i,Num,Num,Num)(0,2,1,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,1)
+		,"T4ddg(i,Num,Num,Num)(0,2,1,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,1)
+		,"T4ddg(i,Num,Num,Num)(0,2,1,2)");
+  t1_1(i)=t4ddg_1(i,0,2,2);
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,2)
+		,"T4ddg(i,Num,Num,Num)(0,2,2,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,2)
+		,"T4ddg(i,Num,Num,Num)(0,2,2,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,2)
+		,"T4ddg(i,Num,Num,Num)(0,2,2,2)");
+  t1_1(i)=t4ddg_1(i,1,0,0);
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,0,0)
+		,"T4ddg(i,Num,Num,Num)(1,0,0,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,0,0)
+		,"T4ddg(i,Num,Num,Num)(1,0,0,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,0,0)
+		,"T4ddg(i,Num,Num,Num)(1,0,0,2)");
+  t1_1(i)=t4ddg_1(i,1,0,1);
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,0,1)
+		,"T4ddg(i,Num,Num,Num)(1,0,1,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,0,1)
+		,"T4ddg(i,Num,Num,Num)(1,0,1,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,0,1)
+		,"T4ddg(i,Num,Num,Num)(1,0,1,2)");
+  t1_1(i)=t4ddg_1(i,1,0,2);
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,0,2)
+		,"T4ddg(i,Num,Num,Num)(1,0,2,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,0,2)
+		,"T4ddg(i,Num,Num,Num)(1,0,2,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,0,2)
+		,"T4ddg(i,Num,Num,Num)(1,0,2,2)");
+  t1_1(i)=t4ddg_1(i,1,1,0);
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,1,0)
+		,"T4ddg(i,Num,Num,Num)(1,1,0,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,1,0)
+		,"T4ddg(i,Num,Num,Num)(1,1,0,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,1,0)
+		,"T4ddg(i,Num,Num,Num)(1,1,0,2)");
+  t1_1(i)=t4ddg_1(i,1,1,1);
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,1,1)
+		,"T4ddg(i,Num,Num,Num)(1,1,1,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,1,1)
+		,"T4ddg(i,Num,Num,Num)(1,1,1,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,1,1)
+		,"T4ddg(i,Num,Num,Num)(1,1,1,2)");
+  t1_1(i)=t4ddg_1(i,1,1,2);
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,1,2)
+		,"T4ddg(i,Num,Num,Num)(1,1,2,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,1,2)
+		,"T4ddg(i,Num,Num,Num)(1,1,2,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,1,2)
+		,"T4ddg(i,Num,Num,Num)(1,1,2,2)");
+  t1_1(i)=t4ddg_1(i,1,2,0);
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,2,0)
+		,"T4ddg(i,Num,Num,Num)(1,2,0,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,2,0)
+		,"T4ddg(i,Num,Num,Num)(1,2,0,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,2,0)
+		,"T4ddg(i,Num,Num,Num)(1,2,0,2)");
+  t1_1(i)=t4ddg_1(i,1,2,1);
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,2,1)
+		,"T4ddg(i,Num,Num,Num)(1,2,1,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,2,1)
+		,"T4ddg(i,Num,Num,Num)(1,2,1,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,2,1)
+		,"T4ddg(i,Num,Num,Num)(1,2,1,2)");
+  t1_1(i)=t4ddg_1(i,1,2,2);
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,2,2)
+		,"T4ddg(i,Num,Num,Num)(1,2,2,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,2,2)
+		,"T4ddg(i,Num,Num,Num)(1,2,2,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,1,2,2)
+		,"T4ddg(i,Num,Num,Num)(1,2,2,2)");
+  t1_1(i)=t4ddg_1(i,2,0,0);
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,0,0)
+		,"T4ddg(i,Num,Num,Num)(2,0,0,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,0,0)
+		,"T4ddg(i,Num,Num,Num)(2,0,0,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,0,0)
+		,"T4ddg(i,Num,Num,Num)(2,0,0,2)");
+  t1_1(i)=t4ddg_1(i,2,0,1);
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,0,1)
+		,"T4ddg(i,Num,Num,Num)(2,0,1,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,0,1)
+		,"T4ddg(i,Num,Num,Num)(2,0,1,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,0,1)
+		,"T4ddg(i,Num,Num,Num)(2,0,1,2)");
+  t1_1(i)=t4ddg_1(i,2,0,2);
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,0,2)
+		,"T4ddg(i,Num,Num,Num)(2,0,2,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,0,2)
+		,"T4ddg(i,Num,Num,Num)(2,0,2,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,0,2)
+		,"T4ddg(i,Num,Num,Num)(2,0,2,2)");
+  t1_1(i)=t4ddg_1(i,2,1,0);
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,1,0)
+		,"T4ddg(i,Num,Num,Num)(2,1,0,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,1,0)
+		,"T4ddg(i,Num,Num,Num)(2,1,0,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,1,0)
+		,"T4ddg(i,Num,Num,Num)(2,1,0,2)");
+  t1_1(i)=t4ddg_1(i,2,1,1);
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,1,1)
+		,"T4ddg(i,Num,Num,Num)(2,1,1,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,1,1)
+		,"T4ddg(i,Num,Num,Num)(2,1,1,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,1,1)
+		,"T4ddg(i,Num,Num,Num)(2,1,1,2)");
+  t1_1(i)=t4ddg_1(i,2,1,2);
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,1,2)
+		,"T4ddg(i,Num,Num,Num)(2,1,2,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,1,2)
+		,"T4ddg(i,Num,Num,Num)(2,1,2,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,1,2)
+		,"T4ddg(i,Num,Num,Num)(2,1,2,2)");
+  t1_1(i)=t4ddg_1(i,2,2,0);
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,2,0)
+		,"T4ddg(i,Num,Num,Num)(2,2,0,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,2,0)
+		,"T4ddg(i,Num,Num,Num)(2,2,0,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,2,0)
+		,"T4ddg(i,Num,Num,Num)(2,2,0,2)");
+  t1_1(i)=t4ddg_1(i,2,2,1);
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,2,1)
+		,"T4ddg(i,Num,Num,Num)(2,2,1,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,2,1)
+		,"T4ddg(i,Num,Num,Num)(2,2,1,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,2,1)
+		,"T4ddg(i,Num,Num,Num)(2,2,1,2)");
+  t1_1(i)=t4ddg_1(i,2,2,2);
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,2,2)
+		,"T4ddg(i,Num,Num,Num)(2,2,2,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,2,2)
+		,"T4ddg(i,Num,Num,Num)(2,2,2,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,2,2,2)
+		,"T4ddg(i,Num,Num,Num)(2,2,2,2)");
+
+  /* Only one index in the second slot */
+
+  t1_1(i)=t4ddg_1(0,i,0,0);
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,0)
+		,"T4ddg(Num,i,Num,Num)(0,0,0,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,0)
+		,"T4ddg(Num,i,Num,Num)(0,0,0,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,0)
+		,"T4ddg(Num,i,Num,Num)(0,0,0,2)");
+  t1_1(i)=t4ddg_1(0,i,0,1);
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,1)
+		,"T4ddg(Num,i,Num,Num)(0,0,1,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,1)
+		,"T4ddg(Num,i,Num,Num)(0,0,1,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,1)
+		,"T4ddg(Num,i,Num,Num)(0,0,1,2)");
+  t1_1(i)=t4ddg_1(0,i,0,2);
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,2)
+		,"T4ddg(Num,i,Num,Num)(0,0,2,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,2)
+		,"T4ddg(Num,i,Num,Num)(0,0,2,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,0,2)
+		,"T4ddg(Num,i,Num,Num)(0,0,2,2)");
+  t1_1(i)=t4ddg_1(0,i,1,0);
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,0)
+		,"T4ddg(Num,i,Num,Num)(0,1,0,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,0)
+		,"T4ddg(Num,i,Num,Num)(0,1,0,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,0)
+		,"T4ddg(Num,i,Num,Num)(0,1,0,2)");
+  t1_1(i)=t4ddg_1(0,i,1,1);
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,1)
+		,"T4ddg(Num,i,Num,Num)(0,1,1,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,1)
+		,"T4ddg(Num,i,Num,Num)(0,1,1,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,1)
+		,"T4ddg(Num,i,Num,Num)(0,1,1,2)");
+  t1_1(i)=t4ddg_1(0,i,1,2);
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,2)
+		,"T4ddg(Num,i,Num,Num)(0,1,2,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,2)
+		,"T4ddg(Num,i,Num,Num)(0,1,2,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,1,2)
+		,"T4ddg(Num,i,Num,Num)(0,1,2,2)");
+  t1_1(i)=t4ddg_1(0,i,2,0);
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,0)
+		,"T4ddg(Num,i,Num,Num)(0,2,0,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,0)
+		,"T4ddg(Num,i,Num,Num)(0,2,0,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,0)
+		,"T4ddg(Num,i,Num,Num)(0,2,0,2)");
+  t1_1(i)=t4ddg_1(0,i,2,1);
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,1)
+		,"T4ddg(Num,i,Num,Num)(0,2,1,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,1)
+		,"T4ddg(Num,i,Num,Num)(0,2,1,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,1)
+		,"T4ddg(Num,i,Num,Num)(0,2,1,2)");
+  t1_1(i)=t4ddg_1(0,i,2,2);
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,2)
+		,"T4ddg(Num,i,Num,Num)(0,2,2,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,2)
+		,"T4ddg(Num,i,Num,Num)(0,2,2,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(0,0,2,2)
+		,"T4ddg(Num,i,Num,Num)(0,2,2,2)");
+  t1_1(i)=t4ddg_1(1,i,0,0);
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,0,0)
+		,"T4ddg(Num,i,Num,Num)(1,0,0,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,0,0)
+		,"T4ddg(Num,i,Num,Num)(1,0,0,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,0,0)
+		,"T4ddg(Num,i,Num,Num)(1,0,0,2)");
+  t1_1(i)=t4ddg_1(1,i,0,1);
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,0,1)
+		,"T4ddg(Num,i,Num,Num)(1,0,1,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,0,1)
+		,"T4ddg(Num,i,Num,Num)(1,0,1,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,0,1)
+		,"T4ddg(Num,i,Num,Num)(1,0,1,2)");
+  t1_1(i)=t4ddg_1(1,i,0,2);
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,0,2)
+		,"T4ddg(Num,i,Num,Num)(1,0,2,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,0,2)
+		,"T4ddg(Num,i,Num,Num)(1,0,2,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,0,2)
+		,"T4ddg(Num,i,Num,Num)(1,0,2,2)");
+  t1_1(i)=t4ddg_1(1,i,1,0);
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,1,0)
+		,"T4ddg(Num,i,Num,Num)(1,1,0,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,1,0)
+		,"T4ddg(Num,i,Num,Num)(1,1,0,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,1,0)
+		,"T4ddg(Num,i,Num,Num)(1,1,0,2)");
+  t1_1(i)=t4ddg_1(1,i,1,1);
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,1,1)
+		,"T4ddg(Num,i,Num,Num)(1,1,1,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,1,1)
+		,"T4ddg(Num,i,Num,Num)(1,1,1,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,1,1)
+		,"T4ddg(Num,i,Num,Num)(1,1,1,2)");
+  t1_1(i)=t4ddg_1(1,i,1,2);
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,1,2)
+		,"T4ddg(Num,i,Num,Num)(1,1,2,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,1,2)
+		,"T4ddg(Num,i,Num,Num)(1,1,2,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,1,2)
+		,"T4ddg(Num,i,Num,Num)(1,1,2,2)");
+  t1_1(i)=t4ddg_1(1,i,2,0);
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,2,0)
+		,"T4ddg(Num,i,Num,Num)(1,2,0,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,2,0)
+		,"T4ddg(Num,i,Num,Num)(1,2,0,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,2,0)
+		,"T4ddg(Num,i,Num,Num)(1,2,0,2)");
+  t1_1(i)=t4ddg_1(1,i,2,1);
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,2,1)
+		,"T4ddg(Num,i,Num,Num)(1,2,1,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,2,1)
+		,"T4ddg(Num,i,Num,Num)(1,2,1,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,2,1)
+		,"T4ddg(Num,i,Num,Num)(1,2,1,2)");
+  t1_1(i)=t4ddg_1(1,i,2,2);
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,2,2)
+		,"T4ddg(Num,i,Num,Num)(1,2,2,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,2,2)
+		,"T4ddg(Num,i,Num,Num)(1,2,2,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(1,0,2,2)
+		,"T4ddg(Num,i,Num,Num)(1,2,2,2)");
+  t1_1(i)=t4ddg_1(2,i,0,0);
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,0,0)
+		,"T4ddg(Num,i,Num,Num)(2,0,0,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,0,0)
+		,"T4ddg(Num,i,Num,Num)(2,0,0,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,0,0)
+		,"T4ddg(Num,i,Num,Num)(2,0,0,2)");
+  t1_1(i)=t4ddg_1(2,i,0,1);
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,0,1)
+		,"T4ddg(Num,i,Num,Num)(2,0,1,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,0,1)
+		,"T4ddg(Num,i,Num,Num)(2,0,1,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,0,1)
+		,"T4ddg(Num,i,Num,Num)(2,0,1,2)");
+  t1_1(i)=t4ddg_1(2,i,0,2);
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,0,2)
+		,"T4ddg(Num,i,Num,Num)(2,0,2,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,0,2)
+		,"T4ddg(Num,i,Num,Num)(2,0,2,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,0,2)
+		,"T4ddg(Num,i,Num,Num)(2,0,2,2)");
+  t1_1(i)=t4ddg_1(2,i,1,0);
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,1,0)
+		,"T4ddg(Num,i,Num,Num)(2,1,0,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,1,0)
+		,"T4ddg(Num,i,Num,Num)(2,1,0,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,1,0)
+		,"T4ddg(Num,i,Num,Num)(2,1,0,2)");
+  t1_1(i)=t4ddg_1(2,i,1,1);
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,1,1)
+		,"T4ddg(Num,i,Num,Num)(2,1,1,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,1,1)
+		,"T4ddg(Num,i,Num,Num)(2,1,1,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,1,1)
+		,"T4ddg(Num,i,Num,Num)(2,1,1,2)");
+  t1_1(i)=t4ddg_1(2,i,1,2);
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,1,2)
+		,"T4ddg(Num,i,Num,Num)(2,1,2,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,1,2)
+		,"T4ddg(Num,i,Num,Num)(2,1,2,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,1,2)
+		,"T4ddg(Num,i,Num,Num)(2,1,2,2)");
+  t1_1(i)=t4ddg_1(2,i,2,0);
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,2,0)
+		,"T4ddg(Num,i,Num,Num)(2,2,0,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,2,0)
+		,"T4ddg(Num,i,Num,Num)(2,2,0,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,2,0)
+		,"T4ddg(Num,i,Num,Num)(2,2,0,2)");
+  t1_1(i)=t4ddg_1(2,i,2,1);
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,2,1)
+		,"T4ddg(Num,i,Num,Num)(2,2,1,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,2,1)
+		,"T4ddg(Num,i,Num,Num)(2,2,1,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,2,1)
+		,"T4ddg(Num,i,Num,Num)(2,2,1,2)");
+  t1_1(i)=t4ddg_1(2,i,2,2);
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,2,2)
+		,"T4ddg(Num,i,Num,Num)(2,2,2,0)");
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,2,2)
+		,"T4ddg(Num,i,Num,Num)(2,2,2,1)");
+  test_for_zero(t1_1(0) - t4ddg_1(2,0,2,2)
+		,"T4ddg(Num,i,Num,Num)(2,2,2,2)");
+
+  cout << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T0.C
--- a/tests/conformance/test_T0.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-#include <iostream>
-#include "../../FTensor.h"
-#include "test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T0(const int &T, Tensor0<double*> &t0_1,
-	     const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor0 test cases. */
-
-  t0_1=T+t0_2;
-  test_for_zero(t0_1-T-t0_2,"T+T0");
-  t0_1+=10+t0_2;
-  test_for_zero(t0_1-(10+T+2*t0_2),"T0+=T");
-  t0_1-=5+3*t0_2;
-  test_for_zero(t0_1-(5+T-t0_2),"T0-=T");
-  t0_1*=2+t0_2;
-  test_for_zero(t0_1-(5+T-t0_2)*(2+t0_2),"T0*=T");
-  t0_1/=7.0+t0_2;
-  test_for_zero(t0_1-(5+T-t0_2)*(2+t0_2)/(7.0+t0_2),"T0/=T");
-  cout << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T0.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/test_T0.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,40 @@
+#include <iostream>
+#include "../../FTensor.hpp"
+#include "test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T0(const int &T, Tensor0<double*> &t0_1,
+	     const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor0 test cases. */
+
+  t0_1=T+t0_2;
+  test_for_zero(t0_1-T-t0_2,"T+T0");
+  t0_1+=10+t0_2;
+  test_for_zero(t0_1-(10+T+2*t0_2),"T0+=T");
+  t0_1-=5+3*t0_2;
+  test_for_zero(t0_1-(5+T-t0_2),"T0-=T");
+  t0_1*=2+t0_2;
+  test_for_zero(t0_1-(5+T-t0_2)*(2+t0_2),"T0*=T");
+  t0_1/=7.0+t0_2;
+  test_for_zero(t0_1-(5+T-t0_2)*(2+t0_2)/(7.0+t0_2),"T0/=T");
+  cout << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T0.h
--- a/tests/conformance/test_T0.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-extern void test_T0(const int &T, Tensor0<double*> &t0_1,
-		    const Tensor0<double*> &t0_2,
-		    Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-		    Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-		    const Tensor2<double,3,3> &t2_3,
-		    Tensor2_symmetric<double,3> &t2s_1,
-		    const Tensor2_symmetric<double,3> &t2s_2,
-		    const Tensor2_symmetric<double,3> &t2s_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T0.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/test_T0.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,8 @@
+extern void test_T0(const int &T, Tensor0<double*> &t0_1,
+		    const Tensor0<double*> &t0_2,
+		    Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+		    Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+		    const Tensor2<double,3,3> &t2_3,
+		    Tensor2_symmetric<double,3> &t2s_1,
+		    const Tensor2_symmetric<double,3> &t2s_2,
+		    const Tensor2_symmetric<double,3> &t2s_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T1.C
--- a/tests/conformance/test_T1.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-#include <iostream>
-#include "../../FTensor.h"
-#include "test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T1(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor1 test cases. */
-
-  t1_1(i)=2*t1_2(i);
-  test_for_zero(t1_1(0)-2*t1_2(0),"T*T1(0)");
-  test_for_zero(t1_1(1)-2*t1_2(1),"T*T1(1)");
-  test_for_zero(t1_1(2)-2*t1_2(2),"T*T1(2)");
-  t1_1(i)+=3*t1_2(i);
-  test_for_zero(t1_1(0)-5*t1_2(0),"T1+=T1(0)");
-  test_for_zero(t1_1(1)-5*t1_2(1),"T1+=T1(1)");
-  test_for_zero(t1_1(2)-5*t1_2(2),"T1+=T1(2)");
-  t1_1(i)-=t1_2(i)/2;
-  test_for_zero(t1_1(0)-4.5*t1_2(0),"T1-=T1(0)");
-  test_for_zero(t1_1(1)-4.5*t1_2(1),"T1-=T1(1)");
-  test_for_zero(t1_1(2)-4.5*t1_2(2),"T1-=T1(2)");
-  t1_1(i)*=3;
-  test_for_zero(t1_1(0)-13.5*t1_2(0),"T1(0)*=T");
-  test_for_zero(t1_1(1)-13.5*t1_2(1),"T1(1)*=T");
-  test_for_zero(t1_1(2)-13.5*t1_2(2),"T1(2)*=T");
-  t1_1(i)/=4.5;
-  test_for_zero(t1_1(0)-3*t1_2(0),"T1(0)/=T");
-  test_for_zero(t1_1(1)-3*t1_2(1),"T1(1)/=T");
-  test_for_zero(t1_1(2)-3*t1_2(2),"T1(2)/=T");
-  t1_1(i)+=10;
-  test_for_zero(t1_1(0)-3*t1_2(0)-10,"T1(0)+=T");
-  test_for_zero(t1_1(1)-3*t1_2(1)-10,"T1(1)+=T");
-  test_for_zero(t1_1(2)-3*t1_2(2)-10,"T1(2)+=T");
-  t1_1(i)-=7;
-  test_for_zero(t1_1(0)-3*t1_2(0)-3,"T1(0)-=T");
-  test_for_zero(t1_1(1)-3*t1_2(1)-3,"T1(1)-=T");
-  test_for_zero(t1_1(2)-3*t1_2(2)-3,"T1(2)-=T");
-  t1_1(i)=t1_2(i)+t1_1(i);
-  test_for_zero(t1_1(0)-4*t1_2(0)-3,"T1+T1(0)");
-  test_for_zero(t1_1(1)-4*t1_2(1)-3,"T1+T1(1)");
-  test_for_zero(t1_1(2)-4*t1_2(2)-3,"T1+T1(2)");
-  t1_1(i)=-t1_2(i)-t1_1(i);
-  test_for_zero(t1_1(0)+5*t1_2(0)+3,"-T1-T1(0)");
-  test_for_zero(t1_1(1)+5*t1_2(1)+3,"-T1-T1(1)");
-  test_for_zero(t1_1(2)+5*t1_2(2)+3,"-T1-T1(2)");
-  t1_1(i)=t1_2(i)+10;
-  test_for_zero(t1_1(0)-t1_2(0)-10,"T1(0)+T");
-  test_for_zero(t1_1(1)-t1_2(1)-10,"T1(1)+T");
-  test_for_zero(t1_1(2)-t1_2(2)-10,"T1(2)+T");
-  t1_1(i)=t1_2(i)-10;
-  test_for_zero(t1_1(0)-t1_2(0)+10,"T1(0)-T");
-  test_for_zero(t1_1(1)-t1_2(1)+10,"T1(1)-T");
-  test_for_zero(t1_1(2)-t1_2(2)+10,"T1(2)-T");
-  test_for_zero(t1_1(i)*t1_2(i)-(t1_2(0)*(t1_2(0)-10) + t1_2(1)*(t1_2(1)-10)
-				 + t1_2(2)*(t1_2(2)-10)),"T1(i)*T1(i)");
-  t1_1(i)=10-t1_2(i);
-  test_for_zero(t1_1(0)+t1_2(0)-10,"T-T1(0)");
-  test_for_zero(t1_1(1)+t1_2(1)-10,"T-T1(1)");
-  test_for_zero(t1_1(2)+t1_2(2)-10,"T-T1(2)");
-  t1_1(i)=t1_2(i);
-  test_for_zero(t1_1(0)-t1_2(0),"T1=T1(0)");
-  test_for_zero(t1_1(1)-t1_2(1),"T1=T1(1)");
-  test_for_zero(t1_1(2)-t1_2(2),"T1=T1(2)");
-  t1_1(i)=10;
-  test_for_zero(t1_1(0)-10,"T1(0)=T");
-  test_for_zero(t1_1(1)-10,"T1(1)=T");
-  test_for_zero(t1_1(2)-10,"T1(2)=T");
-  
-  t1_1(i)=(t1_1(i)&t1_2(i));
-  test_for_zero(t1_1(0)-10*t1_2(0),"T1&T1(0)");
-  test_for_zero(t1_1(1)-10*t1_2(1),"T1&T1(1)");
-  test_for_zero(t1_1(2)-10*t1_2(2),"T1&T1(2)");
-
-  cout << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T1.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/test_T1.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,93 @@
+#include <iostream>
+#include "../../FTensor.hpp"
+#include "test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T1(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor1 test cases. */
+
+  t1_1(i)=2*t1_2(i);
+  test_for_zero(t1_1(0)-2*t1_2(0),"T*T1(0)");
+  test_for_zero(t1_1(1)-2*t1_2(1),"T*T1(1)");
+  test_for_zero(t1_1(2)-2*t1_2(2),"T*T1(2)");
+  t1_1(i)+=3*t1_2(i);
+  test_for_zero(t1_1(0)-5*t1_2(0),"T1+=T1(0)");
+  test_for_zero(t1_1(1)-5*t1_2(1),"T1+=T1(1)");
+  test_for_zero(t1_1(2)-5*t1_2(2),"T1+=T1(2)");
+  t1_1(i)-=t1_2(i)/2;
+  test_for_zero(t1_1(0)-4.5*t1_2(0),"T1-=T1(0)");
+  test_for_zero(t1_1(1)-4.5*t1_2(1),"T1-=T1(1)");
+  test_for_zero(t1_1(2)-4.5*t1_2(2),"T1-=T1(2)");
+  t1_1(i)*=3;
+  test_for_zero(t1_1(0)-13.5*t1_2(0),"T1(0)*=T");
+  test_for_zero(t1_1(1)-13.5*t1_2(1),"T1(1)*=T");
+  test_for_zero(t1_1(2)-13.5*t1_2(2),"T1(2)*=T");
+  t1_1(i)/=4.5;
+  test_for_zero(t1_1(0)-3*t1_2(0),"T1(0)/=T");
+  test_for_zero(t1_1(1)-3*t1_2(1),"T1(1)/=T");
+  test_for_zero(t1_1(2)-3*t1_2(2),"T1(2)/=T");
+  t1_1(i)+=10;
+  test_for_zero(t1_1(0)-3*t1_2(0)-10,"T1(0)+=T");
+  test_for_zero(t1_1(1)-3*t1_2(1)-10,"T1(1)+=T");
+  test_for_zero(t1_1(2)-3*t1_2(2)-10,"T1(2)+=T");
+  t1_1(i)-=7;
+  test_for_zero(t1_1(0)-3*t1_2(0)-3,"T1(0)-=T");
+  test_for_zero(t1_1(1)-3*t1_2(1)-3,"T1(1)-=T");
+  test_for_zero(t1_1(2)-3*t1_2(2)-3,"T1(2)-=T");
+  t1_1(i)=t1_2(i)+t1_1(i);
+  test_for_zero(t1_1(0)-4*t1_2(0)-3,"T1+T1(0)");
+  test_for_zero(t1_1(1)-4*t1_2(1)-3,"T1+T1(1)");
+  test_for_zero(t1_1(2)-4*t1_2(2)-3,"T1+T1(2)");
+  t1_1(i)=-t1_2(i)-t1_1(i);
+  test_for_zero(t1_1(0)+5*t1_2(0)+3,"-T1-T1(0)");
+  test_for_zero(t1_1(1)+5*t1_2(1)+3,"-T1-T1(1)");
+  test_for_zero(t1_1(2)+5*t1_2(2)+3,"-T1-T1(2)");
+  t1_1(i)=t1_2(i)+10;
+  test_for_zero(t1_1(0)-t1_2(0)-10,"T1(0)+T");
+  test_for_zero(t1_1(1)-t1_2(1)-10,"T1(1)+T");
+  test_for_zero(t1_1(2)-t1_2(2)-10,"T1(2)+T");
+  t1_1(i)=t1_2(i)-10;
+  test_for_zero(t1_1(0)-t1_2(0)+10,"T1(0)-T");
+  test_for_zero(t1_1(1)-t1_2(1)+10,"T1(1)-T");
+  test_for_zero(t1_1(2)-t1_2(2)+10,"T1(2)-T");
+  test_for_zero(t1_1(i)*t1_2(i)-(t1_2(0)*(t1_2(0)-10) + t1_2(1)*(t1_2(1)-10)
+				 + t1_2(2)*(t1_2(2)-10)),"T1(i)*T1(i)");
+  t1_1(i)=10-t1_2(i);
+  test_for_zero(t1_1(0)+t1_2(0)-10,"T-T1(0)");
+  test_for_zero(t1_1(1)+t1_2(1)-10,"T-T1(1)");
+  test_for_zero(t1_1(2)+t1_2(2)-10,"T-T1(2)");
+  t1_1(i)=t1_2(i);
+  test_for_zero(t1_1(0)-t1_2(0),"T1=T1(0)");
+  test_for_zero(t1_1(1)-t1_2(1),"T1=T1(1)");
+  test_for_zero(t1_1(2)-t1_2(2),"T1=T1(2)");
+  t1_1(i)=10;
+  test_for_zero(t1_1(0)-10,"T1(0)=T");
+  test_for_zero(t1_1(1)-10,"T1(1)=T");
+  test_for_zero(t1_1(2)-10,"T1(2)=T");
+  
+  t1_1(i)=(t1_1(i)&t1_2(i));
+  test_for_zero(t1_1(0)-10*t1_2(0),"T1&T1(0)");
+  test_for_zero(t1_1(1)-10*t1_2(1),"T1&T1(1)");
+  test_for_zero(t1_1(2)-10*t1_2(2),"T1&T1(2)");
+
+  cout << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T1.h
--- a/tests/conformance/test_T1.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-extern void test_T1(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T1.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/test_T1.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,7 @@
+extern void test_T1(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T2.h
--- a/tests/conformance/test_T2.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-extern void test_T2(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	     const Tensor2<double,3,3> &t2_3,
-	     Tensor2_symmetric<double,3> &t2s_1,
-	     const Tensor2_symmetric<double,3> &t2s_2,
-	     const Tensor2_symmetric<double,3> &t2s_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T2.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/test_T2.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,7 @@
+extern void test_T2(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	     Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	     Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	     const Tensor2<double,3,3> &t2_3,
+	     Tensor2_symmetric<double,3> &t2s_1,
+	     const Tensor2_symmetric<double,3> &t2s_2,
+	     const Tensor2_symmetric<double,3> &t2s_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T2s.h
--- a/tests/conformance/test_T2s.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-extern void test_T2s(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T2s.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/test_T2s.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,7 @@
+extern void test_T2s(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T3.h
--- a/tests/conformance/test_T3.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-extern void test_T3(const int &T, Tensor0<double*> &t0_1,
-		    const Tensor0<double*> &t0_2,
-		    Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-		    Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-		    const Tensor2<double,3,3> &t2_3,
-		    Tensor2_symmetric<double,3> &t2s_1,
-		    const Tensor2_symmetric<double,3> &t2s_2,
-		    const Tensor2_symmetric<double,3> &t2s_3,
-		    Tensor3_dg<double,3,3> &t3dg_1,
-		    const Tensor3_dg<double,3,3> &t3dg_2,
-		    const Tensor3_dg<double,3,3> &t3dg_3,
-		    Tensor3_christof<double,3,3> &t3ch_1,
-		    const Tensor3_christof<double,3,3> &t3ch_2,
-		    const Tensor3_christof<double,3,3> &t3ch_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T3.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/test_T3.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,14 @@
+extern void test_T3(const int &T, Tensor0<double*> &t0_1,
+		    const Tensor0<double*> &t0_2,
+		    Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+		    Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+		    const Tensor2<double,3,3> &t2_3,
+		    Tensor2_symmetric<double,3> &t2s_1,
+		    const Tensor2_symmetric<double,3> &t2s_2,
+		    const Tensor2_symmetric<double,3> &t2s_3,
+		    Tensor3_dg<double,3,3> &t3dg_1,
+		    const Tensor3_dg<double,3,3> &t3dg_2,
+		    const Tensor3_dg<double,3,3> &t3dg_3,
+		    Tensor3_christof<double,3,3> &t3ch_1,
+		    const Tensor3_christof<double,3,3> &t3ch_2,
+		    const Tensor3_christof<double,3,3> &t3ch_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T3II.h
--- a/tests/conformance/test_T3II.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-extern void test_T3II(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-		      const Tensor3_christof<double,3,3> &t3ch_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T3II.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/test_T3II.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,13 @@
+extern void test_T3II(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+		      const Tensor3_christof<double,3,3> &t3ch_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T3as.h
--- a/tests/conformance/test_T3as.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-extern 
-void test_T3as(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_antisymmetric<double,3,3> &t3as_1,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T3as.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/test_T3as.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,14 @@
+extern 
+void test_T3as(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_antisymmetric<double,3,3> &t3as_1,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	       const Tensor3_antisymmetric<double,3,3> &t3as_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T3ch.C
--- a/tests/conformance/test_T3ch.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,448 +0,0 @@
-#include <iostream>
-#include "../../FTensor.h"
-#include "test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T3ch(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  /* Tensor3_ch tests */
-
-  t2s_1(i,j)=t3ch_1(N0,i,j);
-  test_for_zero(t3ch_1(0,0,0)-t2s_1(0,0)
-		,"T3ch(N,i,j)(0,0,0)");
-  test_for_zero(t3ch_1(0,0,1)-t2s_1(0,1)
-		,"T3ch(N,i,j)(0,0,1)");
-  test_for_zero(t3ch_1(0,0,2)-t2s_1(0,2)
-		,"T3ch(N,i,j)(0,0,2)");
-  test_for_zero(t3ch_1(0,1,1)-t2s_1(1,1)
-		,"T3ch(N,i,j)(0,1,1)");
-  test_for_zero(t3ch_1(0,1,2)-t2s_1(1,2)
-		,"T3ch(N,i,j)(0,1,2)");
-  test_for_zero(t3ch_1(0,2,2)-t2s_1(2,2)
-		,"T3ch(N,i,j)(0,2,2)");
-  t2s_1(i,j)=t3ch_1(N1,i,j);
-  test_for_zero(t3ch_1(1,0,0)-t2s_1(0,0)
-		,"T3ch(N,i,j)(1,0,0)");
-  test_for_zero(t3ch_1(1,0,1)-t2s_1(0,1)
-		,"T3ch(N,i,j)(1,0,1)");
-  test_for_zero(t3ch_1(1,0,2)-t2s_1(0,2)
-		,"T3ch(N,i,j)(1,0,2)");
-  test_for_zero(t3ch_1(1,1,1)-t2s_1(1,1)
-		,"T3ch(N,i,j)(1,1,1)");
-  test_for_zero(t3ch_1(1,1,2)-t2s_1(1,2)
-		,"T3ch(N,i,j)(1,1,2)");
-  test_for_zero(t3ch_1(1,2,2)-t2s_1(2,2)
-		,"T3ch(N,i,j)(1,2,2)");
-  t2s_1(i,j)=t3ch_1(N2,i,j);
-  test_for_zero(t3ch_1(2,0,0)-t2s_1(0,0)
-		,"T3ch(N,i,j)(2,0,0)");
-  test_for_zero(t3ch_1(2,0,1)-t2s_1(0,1)
-		,"T3ch(N,i,j)(2,0,1)");
-  test_for_zero(t3ch_1(2,0,2)-t2s_1(0,2)
-		,"T3ch(N,i,j)(2,0,2)");
-  test_for_zero(t3ch_1(2,1,1)-t2s_1(1,1)
-		,"T3ch(N,i,j)(2,1,1)");
-  test_for_zero(t3ch_1(2,1,2)-t2s_1(1,2)
-		,"T3ch(N,i,j)(2,1,2)");
-  test_for_zero(t3ch_1(2,2,2)-t2s_1(2,2)
-		,"T3ch(N,i,j)(2,2,2)");
-
-  /* Now, test with actual numbers. */
-
-  t2s_1(i,j)=t3ch_2(0,i,j);
-  test_for_zero(t3ch_2(0,0,0)-t2s_1(0,0)
-		,"T3ch(Num,i,j)(0,0,0)");
-  test_for_zero(t3ch_2(0,0,1)-t2s_1(0,1)
-		,"T3ch(Num,i,j)(0,0,1)");
-  test_for_zero(t3ch_2(0,0,2)-t2s_1(0,2)
-		,"T3ch(Num,i,j)(0,0,2)");
-  test_for_zero(t3ch_2(0,1,0)-t2s_1(1,0)
-		,"T3ch(Num,i,j)(0,1,0)");
-  test_for_zero(t3ch_2(0,1,1)-t2s_1(1,1)
-		,"T3ch(Num,i,j)(0,1,1)");
-  test_for_zero(t3ch_2(0,1,2)-t2s_1(1,2)
-		,"T3ch(Num,i,j)(0,1,2)");
-  test_for_zero(t3ch_2(0,2,0)-t2s_1(2,0)
-		,"T3ch(Num,i,j)(0,2,0)");
-  test_for_zero(t3ch_2(0,2,1)-t2s_1(2,1)
-		,"T3ch(Num,i,j)(0,2,1)");
-  test_for_zero(t3ch_2(0,2,2)-t2s_1(2,2)
-		,"T3ch(Num,i,j)(0,2,2)");
-
-  t2s_1(i,j)=t3ch_2(1,i,j);
-  test_for_zero(t3ch_2(1,0,0)-t2s_1(0,0)
-		,"T3ch(Num,i,j)(1,0,0)");
-  test_for_zero(t3ch_2(1,0,1)-t2s_1(0,1)
-		,"T3ch(Num,i,j)(1,0,1)");
-  test_for_zero(t3ch_2(1,0,2)-t2s_1(0,2)
-		,"T3ch(Num,i,j)(1,0,2)");
-  test_for_zero(t3ch_2(1,1,0)-t2s_1(1,0)
-		,"T3ch(Num,i,j)(1,1,0)");
-  test_for_zero(t3ch_2(1,1,1)-t2s_1(1,1)
-		,"T3ch(Num,i,j)(1,1,1)");
-  test_for_zero(t3ch_2(1,1,2)-t2s_1(1,2)
-		,"T3ch(Num,i,j)(1,1,2)");
-  test_for_zero(t3ch_2(1,2,0)-t2s_1(2,0)
-		,"T3ch(Num,i,j)(1,2,0)");
-  test_for_zero(t3ch_2(1,2,1)-t2s_1(2,1)
-		,"T3ch(Num,i,j)(1,2,1)");
-  test_for_zero(t3ch_2(1,2,2)-t2s_1(2,2)
-		,"T3ch(Num,i,j)(1,2,2)");
-
-  t2s_1(i,j)=t3ch_2(2,i,j);
-  test_for_zero(t3ch_2(2,0,0)-t2s_1(0,0)
-		,"T3ch(Num,i,j)(2,0,0)");
-  test_for_zero(t3ch_2(2,0,1)-t2s_1(0,1)
-		,"T3ch(Num,i,j)(2,0,1)");
-  test_for_zero(t3ch_2(2,0,2)-t2s_1(0,2)
-		,"T3ch(Num,i,j)(2,0,2)");
-  test_for_zero(t3ch_2(2,1,0)-t2s_1(1,0)
-		,"T3ch(Num,i,j)(2,1,0)");
-  test_for_zero(t3ch_2(2,1,1)-t2s_1(1,1)
-		,"T3ch(Num,i,j)(2,1,1)");
-  test_for_zero(t3ch_2(2,1,2)-t2s_1(1,2)
-		,"T3ch(Num,i,j)(2,1,2)");
-  test_for_zero(t3ch_2(2,2,0)-t2s_1(2,0)
-		,"T3ch(Num,i,j)(2,2,0)");
-  test_for_zero(t3ch_2(2,2,1)-t2s_1(2,1)
-		,"T3ch(Num,i,j)(2,2,1)");
-  test_for_zero(t3ch_2(2,2,2)-t2s_1(2,2)
-		,"T3ch(Num,i,j)(2,2,2)");
-
-  t2_1(i,j)=t3ch_2(j,0,i);
-  test_for_zero(t3ch_2(0,0,0)-t2_1(0,0)
-		,"T3ch(j,Num,i)(0,0,0)");
-  test_for_zero(t3ch_2(1,0,0)-t2_1(0,1)
-		,"T3ch(j,Num,i)(0,0,1)");
-  test_for_zero(t3ch_2(2,0,0)-t2_1(0,2)
-		,"T3ch(j,Num,i)(0,0,2)");
-  test_for_zero(t3ch_2(0,0,1)-t2_1(1,0)
-		,"T3ch(j,Num,i)(0,1,0)");
-  test_for_zero(t3ch_2(1,0,1)-t2_1(1,1)
-		,"T3ch(j,Num,i)(0,1,1)");
-  test_for_zero(t3ch_2(2,0,1)-t2_1(1,2)
-		,"T3ch(j,Num,i)(0,1,2)");
-  test_for_zero(t3ch_2(0,0,2)-t2_1(2,0)
-		,"T3ch(j,Num,i)(0,2,0)");
-  test_for_zero(t3ch_2(1,0,2)-t2_1(2,1)
-		,"T3ch(j,Num,i)(0,2,1)");
-  test_for_zero(t3ch_2(2,0,2)-t2_1(2,2)
-		,"T3ch(j,Num,i)(0,2,2)");
-
-  t2_1(i,j)=t3ch_2(j,1,i);
-  test_for_zero(t3ch_2(0,1,0)-t2_1(0,0)
-		,"T3ch(j,Num,i)(1,0,0)");
-  test_for_zero(t3ch_2(1,1,0)-t2_1(0,1)
-		,"T3ch(j,Num,i)(1,0,1)");
-  test_for_zero(t3ch_2(2,1,0)-t2_1(0,2)
-		,"T3ch(j,Num,i)(1,0,2)");
-  test_for_zero(t3ch_2(0,1,1)-t2_1(1,0)
-		,"T3ch(j,Num,i)(1,1,0)");
-  test_for_zero(t3ch_2(1,1,1)-t2_1(1,1)
-		,"T3ch(j,Num,i)(1,1,1)");
-  test_for_zero(t3ch_2(2,1,1)-t2_1(1,2)
-		,"T3ch(j,Num,i)(1,1,2)");
-  test_for_zero(t3ch_2(0,1,2)-t2_1(2,0)
-		,"T3ch(j,Num,i)(1,2,0)");
-  test_for_zero(t3ch_2(1,1,2)-t2_1(2,1)
-		,"T3ch(j,Num,i)(1,2,1)");
-  test_for_zero(t3ch_2(2,1,2)-t2_1(2,2)
-		,"T3ch(j,Num,i)(1,2,2)");
-
-  t2_1(i,j)=t3ch_2(j,2,i);
-  test_for_zero(t3ch_2(0,2,0)-t2_1(0,0)
-		,"T3ch(j,Num,i)(2,0,0)");
-  test_for_zero(t3ch_2(1,2,0)-t2_1(0,1)
-		,"T3ch(j,Num,i)(2,0,1)");
-  test_for_zero(t3ch_2(2,2,0)-t2_1(0,2)
-		,"T3ch(j,Num,i)(2,0,2)");
-  test_for_zero(t3ch_2(0,2,1)-t2_1(1,0)
-		,"T3ch(j,Num,i)(2,1,0)");
-  test_for_zero(t3ch_2(1,2,1)-t2_1(1,1)
-		,"T3ch(j,Num,i)(2,1,1)");
-  test_for_zero(t3ch_2(2,2,1)-t2_1(1,2)
-		,"T3ch(j,Num,i)(2,1,2)");
-  test_for_zero(t3ch_2(0,2,2)-t2_1(2,0)
-		,"T3ch(j,Num,i)(2,2,0)");
-  test_for_zero(t3ch_2(1,2,2)-t2_1(2,1)
-		,"T3ch(j,Num,i)(2,2,1)");
-  test_for_zero(t3ch_2(2,2,2)-t2_1(2,2)
-		,"T3ch(j,Num,i)(2,2,2)");
-
-  t2_1(i,j)=t3ch_2(j,i,0);
-  test_for_zero(t3ch_2(0,0,0)-t2_1(0,0)
-		,"T3ch(j,i,Num)(0,0,0)");
-  test_for_zero(t3ch_2(1,0,0)-t2_1(0,1)
-		,"T3ch(j,i,Num)(0,0,1)");
-  test_for_zero(t3ch_2(2,0,0)-t2_1(0,2)
-		,"T3ch(j,i,Num)(0,0,2)");
-  test_for_zero(t3ch_2(0,1,0)-t2_1(1,0)
-		,"T3ch(j,i,Num)(0,1,0)");
-  test_for_zero(t3ch_2(1,1,0)-t2_1(1,1)
-		,"T3ch(j,i,Num)(0,1,1)");
-  test_for_zero(t3ch_2(2,1,0)-t2_1(1,2)
-		,"T3ch(j,i,Num)(0,1,2)");
-  test_for_zero(t3ch_2(0,2,0)-t2_1(2,0)
-		,"T3ch(j,i,Num)(0,2,0)");
-  test_for_zero(t3ch_2(1,2,0)-t2_1(2,1)
-		,"T3ch(j,i,Num)(0,2,1)");
-  test_for_zero(t3ch_2(2,2,0)-t2_1(2,2)
-		,"T3ch(j,i,Num)(0,2,2)");
-
-  t2_1(i,j)=t3ch_2(j,i,1);
-  test_for_zero(t3ch_2(0,0,1)-t2_1(0,0)
-		,"T3ch(j,i,Num)(1,0,0)");
-  test_for_zero(t3ch_2(1,0,1)-t2_1(0,1)
-		,"T3ch(j,i,Num)(1,0,1)");
-  test_for_zero(t3ch_2(2,0,1)-t2_1(0,2)
-		,"T3ch(j,i,Num)(1,0,2)");
-  test_for_zero(t3ch_2(0,1,1)-t2_1(1,0)
-		,"T3ch(j,i,Num)(1,1,0)");
-  test_for_zero(t3ch_2(1,1,1)-t2_1(1,1)
-		,"T3ch(j,i,Num)(1,1,1)");
-  test_for_zero(t3ch_2(2,1,1)-t2_1(1,2)
-		,"T3ch(j,i,Num)(1,1,2)");
-  test_for_zero(t3ch_2(0,2,1)-t2_1(2,0)
-		,"T3ch(j,i,Num)(1,2,0)");
-  test_for_zero(t3ch_2(1,2,1)-t2_1(2,1)
-		,"T3ch(j,i,Num)(1,2,1)");
-  test_for_zero(t3ch_2(2,2,1)-t2_1(2,2)
-		,"T3ch(j,i,Num)(1,2,2)");
-
-  t2_1(i,j)=t3ch_2(j,i,2);
-  test_for_zero(t3ch_2(0,0,2)-t2_1(0,0)
-		,"T3ch(j,i,Num)(2,0,0)");
-  test_for_zero(t3ch_2(1,0,2)-t2_1(0,1)
-		,"T3ch(j,i,Num)(2,0,1)");
-  test_for_zero(t3ch_2(2,0,2)-t2_1(0,2)
-		,"T3ch(j,i,Num)(2,0,2)");
-  test_for_zero(t3ch_2(0,1,2)-t2_1(1,0)
-		,"T3ch(j,i,Num)(2,1,0)");
-  test_for_zero(t3ch_2(1,1,2)-t2_1(1,1)
-		,"T3ch(j,i,Num)(2,1,1)");
-  test_for_zero(t3ch_2(2,1,2)-t2_1(1,2)
-		,"T3ch(j,i,Num)(2,1,2)");
-  test_for_zero(t3ch_2(0,2,2)-t2_1(2,0)
-		,"T3ch(j,i,Num)(2,2,0)");
-  test_for_zero(t3ch_2(1,2,2)-t2_1(2,1)
-		,"T3ch(j,i,Num)(2,2,1)");
-  test_for_zero(t3ch_2(2,2,2)-t2_1(2,2)
-		,"T3ch(j,i,Num)(2,2,2)");
-
-  /* Assignment to double */
-
-  t3ch_1(i,j,k)=10;
-  test_for_zero(t3ch_1(0,0,0) - 10
-		,"T3ch=T(0,0,0)");
-  test_for_zero(t3ch_1(0,0,1) - 10
-		,"T3ch=T(0,0,1)");
-  test_for_zero(t3ch_1(0,0,2) - 10
-		,"T3ch=T(0,0,2)");
-  test_for_zero(t3ch_1(0,1,0) - 10
-		,"T3ch=T(0,1,0)");
-  test_for_zero(t3ch_1(0,1,1) - 10
-		,"T3ch=T(0,1,1)");
-  test_for_zero(t3ch_1(0,1,2) - 10
-		,"T3ch=T(0,1,2)");
-  test_for_zero(t3ch_1(0,2,0) - 10
-		,"T3ch=T(0,2,0)");
-  test_for_zero(t3ch_1(0,2,1) - 10
-		,"T3ch=T(0,2,1)");
-  test_for_zero(t3ch_1(0,2,2) - 10
-		,"T3ch=T(0,2,2)");
-  test_for_zero(t3ch_1(1,0,0) - 10
-		,"T3ch=T(1,0,0)");
-  test_for_zero(t3ch_1(1,0,1) - 10
-		,"T3ch=T(1,0,1)");
-  test_for_zero(t3ch_1(1,0,2) - 10
-		,"T3ch=T(1,0,2)");
-  test_for_zero(t3ch_1(1,1,0) - 10
-		,"T3ch=T(1,1,0)");
-  test_for_zero(t3ch_1(1,1,1) - 10
-		,"T3ch=T(1,1,1)");
-  test_for_zero(t3ch_1(1,1,2) - 10
-		,"T3ch=T(1,1,2)");
-  test_for_zero(t3ch_1(1,2,0) - 10
-		,"T3ch=T(1,2,0)");
-  test_for_zero(t3ch_1(1,2,1) - 10
-		,"T3ch=T(1,2,1)");
-  test_for_zero(t3ch_1(1,2,2) - 10
-		,"T3ch=T(1,2,2)");
-  test_for_zero(t3ch_1(2,0,0) - 10
-		,"T3ch=T(2,0,0)");
-  test_for_zero(t3ch_1(2,0,1) - 10
-		,"T3ch=T(2,0,1)");
-  test_for_zero(t3ch_1(2,0,2) - 10
-		,"T3ch=T(2,0,2)");
-  test_for_zero(t3ch_1(2,1,0) - 10
-		,"T3ch=T(2,1,0)");
-  test_for_zero(t3ch_1(2,1,1) - 10
-		,"T3ch=T(2,1,1)");
-  test_for_zero(t3ch_1(2,1,2) - 10
-		,"T3ch=T(2,1,2)");
-  test_for_zero(t3ch_1(2,2,0) - 10
-		,"T3ch=T(2,2,0)");
-  test_for_zero(t3ch_1(2,2,1) - 10
-		,"T3ch=T(2,2,1)");
-  test_for_zero(t3ch_1(2,2,2) - 10
-		,"T3ch=T(2,2,2)");
-
-  t3ch_1(i,j,k)=t3dg_2(j,k,i);
-  test_for_zero(t3ch_1(0,0,0) - t3dg_2(0,0,0)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(0,0,0)");
-  test_for_zero(t3ch_1(0,0,1) - t3dg_2(0,1,0)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(0,0,1)");
-  test_for_zero(t3ch_1(0,0,2) - t3dg_2(0,2,0)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(0,0,2)");
-  test_for_zero(t3ch_1(0,1,0) - t3dg_2(1,0,0)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(0,1,0)");
-  test_for_zero(t3ch_1(0,1,1) - t3dg_2(1,1,0)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(0,1,1)");
-  test_for_zero(t3ch_1(0,1,2) - t3dg_2(1,2,0)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(0,1,2)");
-  test_for_zero(t3ch_1(0,2,0) - t3dg_2(2,0,0)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(0,2,0)");
-  test_for_zero(t3ch_1(0,2,1) - t3dg_2(2,1,0)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(0,2,1)");
-  test_for_zero(t3ch_1(0,2,2) - t3dg_2(2,2,0)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(0,2,2)");
-  test_for_zero(t3ch_1(1,0,0) - t3dg_2(0,0,1)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(1,0,0)");
-  test_for_zero(t3ch_1(1,0,1) - t3dg_2(0,1,1)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(1,0,1)");
-  test_for_zero(t3ch_1(1,0,2) - t3dg_2(0,2,1)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(1,0,2)");
-  test_for_zero(t3ch_1(1,1,0) - t3dg_2(1,0,1)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(1,1,0)");
-  test_for_zero(t3ch_1(1,1,1) - t3dg_2(1,1,1)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(1,1,1)");
-  test_for_zero(t3ch_1(1,1,2) - t3dg_2(1,2,1)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(1,1,2)");
-  test_for_zero(t3ch_1(1,2,0) - t3dg_2(2,0,1)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(1,2,0)");
-  test_for_zero(t3ch_1(1,2,1) - t3dg_2(2,1,1)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(1,2,1)");
-  test_for_zero(t3ch_1(1,2,2) - t3dg_2(2,2,1)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(1,2,2)");
-  test_for_zero(t3ch_1(2,0,0) - t3dg_2(0,0,2)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(2,0,0)");
-  test_for_zero(t3ch_1(2,0,1) - t3dg_2(0,1,2)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(2,0,1)");
-  test_for_zero(t3ch_1(2,0,2) - t3dg_2(0,2,2)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(2,0,2)");
-  test_for_zero(t3ch_1(2,1,0) - t3dg_2(1,0,2)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(2,1,0)");
-  test_for_zero(t3ch_1(2,1,1) - t3dg_2(1,1,2)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(2,1,1)");
-  test_for_zero(t3ch_1(2,1,2) - t3dg_2(1,2,2)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(2,1,2)");
-  test_for_zero(t3ch_1(2,2,0) - t3dg_2(2,0,2)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(2,2,0)");
-  test_for_zero(t3ch_1(2,2,1) - t3dg_2(2,1,2)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(2,2,1)");
-  test_for_zero(t3ch_1(2,2,2) - t3dg_2(2,2,2)
-		,"T3ch(i,j,k)=T3dg(j,k,i)(2,2,2)");
-
-  t3ch_1(i,j,k)=t3ch_2(i,j,k);
-  test_for_zero(t3ch_1(0,0,0) - t3ch_2(0,0,0)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(0,0,0)");
-  test_for_zero(t3ch_1(0,0,1) - t3ch_2(0,0,1)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(0,0,1)");
-  test_for_zero(t3ch_1(0,0,2) - t3ch_2(0,0,2)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(0,0,2)");
-  test_for_zero(t3ch_1(0,1,0) - t3ch_2(0,1,0)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(0,1,0)");
-  test_for_zero(t3ch_1(0,1,1) - t3ch_2(0,1,1)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(0,1,1)");
-  test_for_zero(t3ch_1(0,1,2) - t3ch_2(0,1,2)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(0,1,2)");
-  test_for_zero(t3ch_1(0,2,0) - t3ch_2(0,2,0)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(0,2,0)");
-  test_for_zero(t3ch_1(0,2,1) - t3ch_2(0,2,1)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(0,2,1)");
-  test_for_zero(t3ch_1(0,2,2) - t3ch_2(0,2,2)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(0,2,2)");
-  test_for_zero(t3ch_1(1,0,0) - t3ch_2(1,0,0)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(1,0,0)");
-  test_for_zero(t3ch_1(1,0,1) - t3ch_2(1,0,1)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(1,0,1)");
-  test_for_zero(t3ch_1(1,0,2) - t3ch_2(1,0,2)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(1,0,2)");
-  test_for_zero(t3ch_1(1,1,0) - t3ch_2(1,1,0)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(1,1,0)");
-  test_for_zero(t3ch_1(1,1,1) - t3ch_2(1,1,1)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(1,1,1)");
-  test_for_zero(t3ch_1(1,1,2) - t3ch_2(1,1,2)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(1,1,2)");
-  test_for_zero(t3ch_1(1,2,0) - t3ch_2(1,2,0)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(1,2,0)");
-  test_for_zero(t3ch_1(1,2,1) - t3ch_2(1,2,1)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(1,2,1)");
-  test_for_zero(t3ch_1(1,2,2) - t3ch_2(1,2,2)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(1,2,2)");
-  test_for_zero(t3ch_1(2,0,0) - t3ch_2(2,0,0)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(2,0,0)");
-  test_for_zero(t3ch_1(2,0,1) - t3ch_2(2,0,1)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(2,0,1)");
-  test_for_zero(t3ch_1(2,0,2) - t3ch_2(2,0,2)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(2,0,2)");
-  test_for_zero(t3ch_1(2,1,0) - t3ch_2(2,1,0)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(2,1,0)");
-  test_for_zero(t3ch_1(2,1,1) - t3ch_2(2,1,1)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(2,1,1)");
-  test_for_zero(t3ch_1(2,1,2) - t3ch_2(2,1,2)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(2,1,2)");
-  test_for_zero(t3ch_1(2,2,0) - t3ch_2(2,2,0)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(2,2,0)");
-  test_for_zero(t3ch_1(2,2,1) - t3ch_2(2,2,1)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(2,2,1)");
-  test_for_zero(t3ch_1(2,2,2) - t3ch_2(2,2,2)
-		,"T3ch(i,j,k)=T3ch(i,j,k)(2,2,2)");
-
-  t1_1(i)=t3ch_1(i,j,j);
-  test_for_zero(t1_1(0) - (t3ch_1(0,0,0) + t3ch_1(0,1,1) + t3ch_1(0,2,2))
-		,"t3ch(i,j,j)(0)");
-  test_for_zero(t1_1(1) - (t3ch_1(1,0,0) + t3ch_1(1,1,1) + t3ch_1(1,2,2))
-		,"t3ch(i,j,j)(1)");
-  test_for_zero(t1_1(2) - (t3ch_1(2,0,0) + t3ch_1(2,1,1) + t3ch_1(2,2,2))
-		,"t3ch(i,j,j)(2)");
-  t1_1(i)=t3ch_1(j,i,j);
-  test_for_zero(t1_1(0) - (t3ch_1(0,0,0) + t3ch_1(1,0,1) + t3ch_1(2,0,2))
-		,"t3ch(j,i,j)(0)");
-  test_for_zero(t1_1(1) - (t3ch_1(0,1,0) + t3ch_1(1,1,1) + t3ch_1(2,1,2))
-		,"t3ch(j,i,j)(1)");
-  test_for_zero(t1_1(2) - (t3ch_1(0,2,0) + t3ch_1(1,2,1) + t3ch_1(2,2,2))
-		,"t3ch(j,i,j)(2)");
-  t1_1(i)=t3ch_1(j,j,i);
-  test_for_zero(t1_1(0) - (t3ch_1(0,0,0) + t3ch_1(1,1,0) + t3ch_1(2,2,0))
-		,"t3ch(j,j,i)(0)");
-  test_for_zero(t1_1(1) - (t3ch_1(0,0,1) + t3ch_1(1,1,1) + t3ch_1(2,2,1))
-		,"t3ch(j,j,i)(1)");
-  test_for_zero(t1_1(2) - (t3ch_1(0,0,2) + t3ch_1(1,1,2) + t3ch_1(2,2,2))
-		,"t3ch(j,j,i)(2)");
-  cout << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T3ch.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/test_T3ch.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,448 @@
+#include <iostream>
+#include "../../FTensor.hpp"
+#include "test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T3ch(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  /* Tensor3_ch tests */
+
+  t2s_1(i,j)=t3ch_1(N0,i,j);
+  test_for_zero(t3ch_1(0,0,0)-t2s_1(0,0)
+		,"T3ch(N,i,j)(0,0,0)");
+  test_for_zero(t3ch_1(0,0,1)-t2s_1(0,1)
+		,"T3ch(N,i,j)(0,0,1)");
+  test_for_zero(t3ch_1(0,0,2)-t2s_1(0,2)
+		,"T3ch(N,i,j)(0,0,2)");
+  test_for_zero(t3ch_1(0,1,1)-t2s_1(1,1)
+		,"T3ch(N,i,j)(0,1,1)");
+  test_for_zero(t3ch_1(0,1,2)-t2s_1(1,2)
+		,"T3ch(N,i,j)(0,1,2)");
+  test_for_zero(t3ch_1(0,2,2)-t2s_1(2,2)
+		,"T3ch(N,i,j)(0,2,2)");
+  t2s_1(i,j)=t3ch_1(N1,i,j);
+  test_for_zero(t3ch_1(1,0,0)-t2s_1(0,0)
+		,"T3ch(N,i,j)(1,0,0)");
+  test_for_zero(t3ch_1(1,0,1)-t2s_1(0,1)
+		,"T3ch(N,i,j)(1,0,1)");
+  test_for_zero(t3ch_1(1,0,2)-t2s_1(0,2)
+		,"T3ch(N,i,j)(1,0,2)");
+  test_for_zero(t3ch_1(1,1,1)-t2s_1(1,1)
+		,"T3ch(N,i,j)(1,1,1)");
+  test_for_zero(t3ch_1(1,1,2)-t2s_1(1,2)
+		,"T3ch(N,i,j)(1,1,2)");
+  test_for_zero(t3ch_1(1,2,2)-t2s_1(2,2)
+		,"T3ch(N,i,j)(1,2,2)");
+  t2s_1(i,j)=t3ch_1(N2,i,j);
+  test_for_zero(t3ch_1(2,0,0)-t2s_1(0,0)
+		,"T3ch(N,i,j)(2,0,0)");
+  test_for_zero(t3ch_1(2,0,1)-t2s_1(0,1)
+		,"T3ch(N,i,j)(2,0,1)");
+  test_for_zero(t3ch_1(2,0,2)-t2s_1(0,2)
+		,"T3ch(N,i,j)(2,0,2)");
+  test_for_zero(t3ch_1(2,1,1)-t2s_1(1,1)
+		,"T3ch(N,i,j)(2,1,1)");
+  test_for_zero(t3ch_1(2,1,2)-t2s_1(1,2)
+		,"T3ch(N,i,j)(2,1,2)");
+  test_for_zero(t3ch_1(2,2,2)-t2s_1(2,2)
+		,"T3ch(N,i,j)(2,2,2)");
+
+  /* Now, test with actual numbers. */
+
+  t2s_1(i,j)=t3ch_2(0,i,j);
+  test_for_zero(t3ch_2(0,0,0)-t2s_1(0,0)
+		,"T3ch(Num,i,j)(0,0,0)");
+  test_for_zero(t3ch_2(0,0,1)-t2s_1(0,1)
+		,"T3ch(Num,i,j)(0,0,1)");
+  test_for_zero(t3ch_2(0,0,2)-t2s_1(0,2)
+		,"T3ch(Num,i,j)(0,0,2)");
+  test_for_zero(t3ch_2(0,1,0)-t2s_1(1,0)
+		,"T3ch(Num,i,j)(0,1,0)");
+  test_for_zero(t3ch_2(0,1,1)-t2s_1(1,1)
+		,"T3ch(Num,i,j)(0,1,1)");
+  test_for_zero(t3ch_2(0,1,2)-t2s_1(1,2)
+		,"T3ch(Num,i,j)(0,1,2)");
+  test_for_zero(t3ch_2(0,2,0)-t2s_1(2,0)
+		,"T3ch(Num,i,j)(0,2,0)");
+  test_for_zero(t3ch_2(0,2,1)-t2s_1(2,1)
+		,"T3ch(Num,i,j)(0,2,1)");
+  test_for_zero(t3ch_2(0,2,2)-t2s_1(2,2)
+		,"T3ch(Num,i,j)(0,2,2)");
+
+  t2s_1(i,j)=t3ch_2(1,i,j);
+  test_for_zero(t3ch_2(1,0,0)-t2s_1(0,0)
+		,"T3ch(Num,i,j)(1,0,0)");
+  test_for_zero(t3ch_2(1,0,1)-t2s_1(0,1)
+		,"T3ch(Num,i,j)(1,0,1)");
+  test_for_zero(t3ch_2(1,0,2)-t2s_1(0,2)
+		,"T3ch(Num,i,j)(1,0,2)");
+  test_for_zero(t3ch_2(1,1,0)-t2s_1(1,0)
+		,"T3ch(Num,i,j)(1,1,0)");
+  test_for_zero(t3ch_2(1,1,1)-t2s_1(1,1)
+		,"T3ch(Num,i,j)(1,1,1)");
+  test_for_zero(t3ch_2(1,1,2)-t2s_1(1,2)
+		,"T3ch(Num,i,j)(1,1,2)");
+  test_for_zero(t3ch_2(1,2,0)-t2s_1(2,0)
+		,"T3ch(Num,i,j)(1,2,0)");
+  test_for_zero(t3ch_2(1,2,1)-t2s_1(2,1)
+		,"T3ch(Num,i,j)(1,2,1)");
+  test_for_zero(t3ch_2(1,2,2)-t2s_1(2,2)
+		,"T3ch(Num,i,j)(1,2,2)");
+
+  t2s_1(i,j)=t3ch_2(2,i,j);
+  test_for_zero(t3ch_2(2,0,0)-t2s_1(0,0)
+		,"T3ch(Num,i,j)(2,0,0)");
+  test_for_zero(t3ch_2(2,0,1)-t2s_1(0,1)
+		,"T3ch(Num,i,j)(2,0,1)");
+  test_for_zero(t3ch_2(2,0,2)-t2s_1(0,2)
+		,"T3ch(Num,i,j)(2,0,2)");
+  test_for_zero(t3ch_2(2,1,0)-t2s_1(1,0)
+		,"T3ch(Num,i,j)(2,1,0)");
+  test_for_zero(t3ch_2(2,1,1)-t2s_1(1,1)
+		,"T3ch(Num,i,j)(2,1,1)");
+  test_for_zero(t3ch_2(2,1,2)-t2s_1(1,2)
+		,"T3ch(Num,i,j)(2,1,2)");
+  test_for_zero(t3ch_2(2,2,0)-t2s_1(2,0)
+		,"T3ch(Num,i,j)(2,2,0)");
+  test_for_zero(t3ch_2(2,2,1)-t2s_1(2,1)
+		,"T3ch(Num,i,j)(2,2,1)");
+  test_for_zero(t3ch_2(2,2,2)-t2s_1(2,2)
+		,"T3ch(Num,i,j)(2,2,2)");
+
+  t2_1(i,j)=t3ch_2(j,0,i);
+  test_for_zero(t3ch_2(0,0,0)-t2_1(0,0)
+		,"T3ch(j,Num,i)(0,0,0)");
+  test_for_zero(t3ch_2(1,0,0)-t2_1(0,1)
+		,"T3ch(j,Num,i)(0,0,1)");
+  test_for_zero(t3ch_2(2,0,0)-t2_1(0,2)
+		,"T3ch(j,Num,i)(0,0,2)");
+  test_for_zero(t3ch_2(0,0,1)-t2_1(1,0)
+		,"T3ch(j,Num,i)(0,1,0)");
+  test_for_zero(t3ch_2(1,0,1)-t2_1(1,1)
+		,"T3ch(j,Num,i)(0,1,1)");
+  test_for_zero(t3ch_2(2,0,1)-t2_1(1,2)
+		,"T3ch(j,Num,i)(0,1,2)");
+  test_for_zero(t3ch_2(0,0,2)-t2_1(2,0)
+		,"T3ch(j,Num,i)(0,2,0)");
+  test_for_zero(t3ch_2(1,0,2)-t2_1(2,1)
+		,"T3ch(j,Num,i)(0,2,1)");
+  test_for_zero(t3ch_2(2,0,2)-t2_1(2,2)
+		,"T3ch(j,Num,i)(0,2,2)");
+
+  t2_1(i,j)=t3ch_2(j,1,i);
+  test_for_zero(t3ch_2(0,1,0)-t2_1(0,0)
+		,"T3ch(j,Num,i)(1,0,0)");
+  test_for_zero(t3ch_2(1,1,0)-t2_1(0,1)
+		,"T3ch(j,Num,i)(1,0,1)");
+  test_for_zero(t3ch_2(2,1,0)-t2_1(0,2)
+		,"T3ch(j,Num,i)(1,0,2)");
+  test_for_zero(t3ch_2(0,1,1)-t2_1(1,0)
+		,"T3ch(j,Num,i)(1,1,0)");
+  test_for_zero(t3ch_2(1,1,1)-t2_1(1,1)
+		,"T3ch(j,Num,i)(1,1,1)");
+  test_for_zero(t3ch_2(2,1,1)-t2_1(1,2)
+		,"T3ch(j,Num,i)(1,1,2)");
+  test_for_zero(t3ch_2(0,1,2)-t2_1(2,0)
+		,"T3ch(j,Num,i)(1,2,0)");
+  test_for_zero(t3ch_2(1,1,2)-t2_1(2,1)
+		,"T3ch(j,Num,i)(1,2,1)");
+  test_for_zero(t3ch_2(2,1,2)-t2_1(2,2)
+		,"T3ch(j,Num,i)(1,2,2)");
+
+  t2_1(i,j)=t3ch_2(j,2,i);
+  test_for_zero(t3ch_2(0,2,0)-t2_1(0,0)
+		,"T3ch(j,Num,i)(2,0,0)");
+  test_for_zero(t3ch_2(1,2,0)-t2_1(0,1)
+		,"T3ch(j,Num,i)(2,0,1)");
+  test_for_zero(t3ch_2(2,2,0)-t2_1(0,2)
+		,"T3ch(j,Num,i)(2,0,2)");
+  test_for_zero(t3ch_2(0,2,1)-t2_1(1,0)
+		,"T3ch(j,Num,i)(2,1,0)");
+  test_for_zero(t3ch_2(1,2,1)-t2_1(1,1)
+		,"T3ch(j,Num,i)(2,1,1)");
+  test_for_zero(t3ch_2(2,2,1)-t2_1(1,2)
+		,"T3ch(j,Num,i)(2,1,2)");
+  test_for_zero(t3ch_2(0,2,2)-t2_1(2,0)
+		,"T3ch(j,Num,i)(2,2,0)");
+  test_for_zero(t3ch_2(1,2,2)-t2_1(2,1)
+		,"T3ch(j,Num,i)(2,2,1)");
+  test_for_zero(t3ch_2(2,2,2)-t2_1(2,2)
+		,"T3ch(j,Num,i)(2,2,2)");
+
+  t2_1(i,j)=t3ch_2(j,i,0);
+  test_for_zero(t3ch_2(0,0,0)-t2_1(0,0)
+		,"T3ch(j,i,Num)(0,0,0)");
+  test_for_zero(t3ch_2(1,0,0)-t2_1(0,1)
+		,"T3ch(j,i,Num)(0,0,1)");
+  test_for_zero(t3ch_2(2,0,0)-t2_1(0,2)
+		,"T3ch(j,i,Num)(0,0,2)");
+  test_for_zero(t3ch_2(0,1,0)-t2_1(1,0)
+		,"T3ch(j,i,Num)(0,1,0)");
+  test_for_zero(t3ch_2(1,1,0)-t2_1(1,1)
+		,"T3ch(j,i,Num)(0,1,1)");
+  test_for_zero(t3ch_2(2,1,0)-t2_1(1,2)
+		,"T3ch(j,i,Num)(0,1,2)");
+  test_for_zero(t3ch_2(0,2,0)-t2_1(2,0)
+		,"T3ch(j,i,Num)(0,2,0)");
+  test_for_zero(t3ch_2(1,2,0)-t2_1(2,1)
+		,"T3ch(j,i,Num)(0,2,1)");
+  test_for_zero(t3ch_2(2,2,0)-t2_1(2,2)
+		,"T3ch(j,i,Num)(0,2,2)");
+
+  t2_1(i,j)=t3ch_2(j,i,1);
+  test_for_zero(t3ch_2(0,0,1)-t2_1(0,0)
+		,"T3ch(j,i,Num)(1,0,0)");
+  test_for_zero(t3ch_2(1,0,1)-t2_1(0,1)
+		,"T3ch(j,i,Num)(1,0,1)");
+  test_for_zero(t3ch_2(2,0,1)-t2_1(0,2)
+		,"T3ch(j,i,Num)(1,0,2)");
+  test_for_zero(t3ch_2(0,1,1)-t2_1(1,0)
+		,"T3ch(j,i,Num)(1,1,0)");
+  test_for_zero(t3ch_2(1,1,1)-t2_1(1,1)
+		,"T3ch(j,i,Num)(1,1,1)");
+  test_for_zero(t3ch_2(2,1,1)-t2_1(1,2)
+		,"T3ch(j,i,Num)(1,1,2)");
+  test_for_zero(t3ch_2(0,2,1)-t2_1(2,0)
+		,"T3ch(j,i,Num)(1,2,0)");
+  test_for_zero(t3ch_2(1,2,1)-t2_1(2,1)
+		,"T3ch(j,i,Num)(1,2,1)");
+  test_for_zero(t3ch_2(2,2,1)-t2_1(2,2)
+		,"T3ch(j,i,Num)(1,2,2)");
+
+  t2_1(i,j)=t3ch_2(j,i,2);
+  test_for_zero(t3ch_2(0,0,2)-t2_1(0,0)
+		,"T3ch(j,i,Num)(2,0,0)");
+  test_for_zero(t3ch_2(1,0,2)-t2_1(0,1)
+		,"T3ch(j,i,Num)(2,0,1)");
+  test_for_zero(t3ch_2(2,0,2)-t2_1(0,2)
+		,"T3ch(j,i,Num)(2,0,2)");
+  test_for_zero(t3ch_2(0,1,2)-t2_1(1,0)
+		,"T3ch(j,i,Num)(2,1,0)");
+  test_for_zero(t3ch_2(1,1,2)-t2_1(1,1)
+		,"T3ch(j,i,Num)(2,1,1)");
+  test_for_zero(t3ch_2(2,1,2)-t2_1(1,2)
+		,"T3ch(j,i,Num)(2,1,2)");
+  test_for_zero(t3ch_2(0,2,2)-t2_1(2,0)
+		,"T3ch(j,i,Num)(2,2,0)");
+  test_for_zero(t3ch_2(1,2,2)-t2_1(2,1)
+		,"T3ch(j,i,Num)(2,2,1)");
+  test_for_zero(t3ch_2(2,2,2)-t2_1(2,2)
+		,"T3ch(j,i,Num)(2,2,2)");
+
+  /* Assignment to double */
+
+  t3ch_1(i,j,k)=10;
+  test_for_zero(t3ch_1(0,0,0) - 10
+		,"T3ch=T(0,0,0)");
+  test_for_zero(t3ch_1(0,0,1) - 10
+		,"T3ch=T(0,0,1)");
+  test_for_zero(t3ch_1(0,0,2) - 10
+		,"T3ch=T(0,0,2)");
+  test_for_zero(t3ch_1(0,1,0) - 10
+		,"T3ch=T(0,1,0)");
+  test_for_zero(t3ch_1(0,1,1) - 10
+		,"T3ch=T(0,1,1)");
+  test_for_zero(t3ch_1(0,1,2) - 10
+		,"T3ch=T(0,1,2)");
+  test_for_zero(t3ch_1(0,2,0) - 10
+		,"T3ch=T(0,2,0)");
+  test_for_zero(t3ch_1(0,2,1) - 10
+		,"T3ch=T(0,2,1)");
+  test_for_zero(t3ch_1(0,2,2) - 10
+		,"T3ch=T(0,2,2)");
+  test_for_zero(t3ch_1(1,0,0) - 10
+		,"T3ch=T(1,0,0)");
+  test_for_zero(t3ch_1(1,0,1) - 10
+		,"T3ch=T(1,0,1)");
+  test_for_zero(t3ch_1(1,0,2) - 10
+		,"T3ch=T(1,0,2)");
+  test_for_zero(t3ch_1(1,1,0) - 10
+		,"T3ch=T(1,1,0)");
+  test_for_zero(t3ch_1(1,1,1) - 10
+		,"T3ch=T(1,1,1)");
+  test_for_zero(t3ch_1(1,1,2) - 10
+		,"T3ch=T(1,1,2)");
+  test_for_zero(t3ch_1(1,2,0) - 10
+		,"T3ch=T(1,2,0)");
+  test_for_zero(t3ch_1(1,2,1) - 10
+		,"T3ch=T(1,2,1)");
+  test_for_zero(t3ch_1(1,2,2) - 10
+		,"T3ch=T(1,2,2)");
+  test_for_zero(t3ch_1(2,0,0) - 10
+		,"T3ch=T(2,0,0)");
+  test_for_zero(t3ch_1(2,0,1) - 10
+		,"T3ch=T(2,0,1)");
+  test_for_zero(t3ch_1(2,0,2) - 10
+		,"T3ch=T(2,0,2)");
+  test_for_zero(t3ch_1(2,1,0) - 10
+		,"T3ch=T(2,1,0)");
+  test_for_zero(t3ch_1(2,1,1) - 10
+		,"T3ch=T(2,1,1)");
+  test_for_zero(t3ch_1(2,1,2) - 10
+		,"T3ch=T(2,1,2)");
+  test_for_zero(t3ch_1(2,2,0) - 10
+		,"T3ch=T(2,2,0)");
+  test_for_zero(t3ch_1(2,2,1) - 10
+		,"T3ch=T(2,2,1)");
+  test_for_zero(t3ch_1(2,2,2) - 10
+		,"T3ch=T(2,2,2)");
+
+  t3ch_1(i,j,k)=t3dg_2(j,k,i);
+  test_for_zero(t3ch_1(0,0,0) - t3dg_2(0,0,0)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(0,0,0)");
+  test_for_zero(t3ch_1(0,0,1) - t3dg_2(0,1,0)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(0,0,1)");
+  test_for_zero(t3ch_1(0,0,2) - t3dg_2(0,2,0)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(0,0,2)");
+  test_for_zero(t3ch_1(0,1,0) - t3dg_2(1,0,0)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(0,1,0)");
+  test_for_zero(t3ch_1(0,1,1) - t3dg_2(1,1,0)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(0,1,1)");
+  test_for_zero(t3ch_1(0,1,2) - t3dg_2(1,2,0)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(0,1,2)");
+  test_for_zero(t3ch_1(0,2,0) - t3dg_2(2,0,0)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(0,2,0)");
+  test_for_zero(t3ch_1(0,2,1) - t3dg_2(2,1,0)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(0,2,1)");
+  test_for_zero(t3ch_1(0,2,2) - t3dg_2(2,2,0)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(0,2,2)");
+  test_for_zero(t3ch_1(1,0,0) - t3dg_2(0,0,1)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(1,0,0)");
+  test_for_zero(t3ch_1(1,0,1) - t3dg_2(0,1,1)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(1,0,1)");
+  test_for_zero(t3ch_1(1,0,2) - t3dg_2(0,2,1)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(1,0,2)");
+  test_for_zero(t3ch_1(1,1,0) - t3dg_2(1,0,1)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(1,1,0)");
+  test_for_zero(t3ch_1(1,1,1) - t3dg_2(1,1,1)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(1,1,1)");
+  test_for_zero(t3ch_1(1,1,2) - t3dg_2(1,2,1)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(1,1,2)");
+  test_for_zero(t3ch_1(1,2,0) - t3dg_2(2,0,1)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(1,2,0)");
+  test_for_zero(t3ch_1(1,2,1) - t3dg_2(2,1,1)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(1,2,1)");
+  test_for_zero(t3ch_1(1,2,2) - t3dg_2(2,2,1)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(1,2,2)");
+  test_for_zero(t3ch_1(2,0,0) - t3dg_2(0,0,2)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(2,0,0)");
+  test_for_zero(t3ch_1(2,0,1) - t3dg_2(0,1,2)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(2,0,1)");
+  test_for_zero(t3ch_1(2,0,2) - t3dg_2(0,2,2)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(2,0,2)");
+  test_for_zero(t3ch_1(2,1,0) - t3dg_2(1,0,2)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(2,1,0)");
+  test_for_zero(t3ch_1(2,1,1) - t3dg_2(1,1,2)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(2,1,1)");
+  test_for_zero(t3ch_1(2,1,2) - t3dg_2(1,2,2)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(2,1,2)");
+  test_for_zero(t3ch_1(2,2,0) - t3dg_2(2,0,2)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(2,2,0)");
+  test_for_zero(t3ch_1(2,2,1) - t3dg_2(2,1,2)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(2,2,1)");
+  test_for_zero(t3ch_1(2,2,2) - t3dg_2(2,2,2)
+		,"T3ch(i,j,k)=T3dg(j,k,i)(2,2,2)");
+
+  t3ch_1(i,j,k)=t3ch_2(i,j,k);
+  test_for_zero(t3ch_1(0,0,0) - t3ch_2(0,0,0)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(0,0,0)");
+  test_for_zero(t3ch_1(0,0,1) - t3ch_2(0,0,1)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(0,0,1)");
+  test_for_zero(t3ch_1(0,0,2) - t3ch_2(0,0,2)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(0,0,2)");
+  test_for_zero(t3ch_1(0,1,0) - t3ch_2(0,1,0)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(0,1,0)");
+  test_for_zero(t3ch_1(0,1,1) - t3ch_2(0,1,1)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(0,1,1)");
+  test_for_zero(t3ch_1(0,1,2) - t3ch_2(0,1,2)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(0,1,2)");
+  test_for_zero(t3ch_1(0,2,0) - t3ch_2(0,2,0)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(0,2,0)");
+  test_for_zero(t3ch_1(0,2,1) - t3ch_2(0,2,1)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(0,2,1)");
+  test_for_zero(t3ch_1(0,2,2) - t3ch_2(0,2,2)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(0,2,2)");
+  test_for_zero(t3ch_1(1,0,0) - t3ch_2(1,0,0)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(1,0,0)");
+  test_for_zero(t3ch_1(1,0,1) - t3ch_2(1,0,1)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(1,0,1)");
+  test_for_zero(t3ch_1(1,0,2) - t3ch_2(1,0,2)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(1,0,2)");
+  test_for_zero(t3ch_1(1,1,0) - t3ch_2(1,1,0)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(1,1,0)");
+  test_for_zero(t3ch_1(1,1,1) - t3ch_2(1,1,1)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(1,1,1)");
+  test_for_zero(t3ch_1(1,1,2) - t3ch_2(1,1,2)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(1,1,2)");
+  test_for_zero(t3ch_1(1,2,0) - t3ch_2(1,2,0)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(1,2,0)");
+  test_for_zero(t3ch_1(1,2,1) - t3ch_2(1,2,1)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(1,2,1)");
+  test_for_zero(t3ch_1(1,2,2) - t3ch_2(1,2,2)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(1,2,2)");
+  test_for_zero(t3ch_1(2,0,0) - t3ch_2(2,0,0)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(2,0,0)");
+  test_for_zero(t3ch_1(2,0,1) - t3ch_2(2,0,1)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(2,0,1)");
+  test_for_zero(t3ch_1(2,0,2) - t3ch_2(2,0,2)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(2,0,2)");
+  test_for_zero(t3ch_1(2,1,0) - t3ch_2(2,1,0)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(2,1,0)");
+  test_for_zero(t3ch_1(2,1,1) - t3ch_2(2,1,1)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(2,1,1)");
+  test_for_zero(t3ch_1(2,1,2) - t3ch_2(2,1,2)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(2,1,2)");
+  test_for_zero(t3ch_1(2,2,0) - t3ch_2(2,2,0)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(2,2,0)");
+  test_for_zero(t3ch_1(2,2,1) - t3ch_2(2,2,1)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(2,2,1)");
+  test_for_zero(t3ch_1(2,2,2) - t3ch_2(2,2,2)
+		,"T3ch(i,j,k)=T3ch(i,j,k)(2,2,2)");
+
+  t1_1(i)=t3ch_1(i,j,j);
+  test_for_zero(t1_1(0) - (t3ch_1(0,0,0) + t3ch_1(0,1,1) + t3ch_1(0,2,2))
+		,"t3ch(i,j,j)(0)");
+  test_for_zero(t1_1(1) - (t3ch_1(1,0,0) + t3ch_1(1,1,1) + t3ch_1(1,2,2))
+		,"t3ch(i,j,j)(1)");
+  test_for_zero(t1_1(2) - (t3ch_1(2,0,0) + t3ch_1(2,1,1) + t3ch_1(2,2,2))
+		,"t3ch(i,j,j)(2)");
+  t1_1(i)=t3ch_1(j,i,j);
+  test_for_zero(t1_1(0) - (t3ch_1(0,0,0) + t3ch_1(1,0,1) + t3ch_1(2,0,2))
+		,"t3ch(j,i,j)(0)");
+  test_for_zero(t1_1(1) - (t3ch_1(0,1,0) + t3ch_1(1,1,1) + t3ch_1(2,1,2))
+		,"t3ch(j,i,j)(1)");
+  test_for_zero(t1_1(2) - (t3ch_1(0,2,0) + t3ch_1(1,2,1) + t3ch_1(2,2,2))
+		,"t3ch(j,i,j)(2)");
+  t1_1(i)=t3ch_1(j,j,i);
+  test_for_zero(t1_1(0) - (t3ch_1(0,0,0) + t3ch_1(1,1,0) + t3ch_1(2,2,0))
+		,"t3ch(j,j,i)(0)");
+  test_for_zero(t1_1(1) - (t3ch_1(0,0,1) + t3ch_1(1,1,1) + t3ch_1(2,2,1))
+		,"t3ch(j,j,i)(1)");
+  test_for_zero(t1_1(2) - (t3ch_1(0,0,2) + t3ch_1(1,1,2) + t3ch_1(2,2,2))
+		,"t3ch(j,j,i)(2)");
+  cout << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T3ch.h
--- a/tests/conformance/test_T3ch.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-extern
-void test_T3ch(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T3ch.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/test_T3ch.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,14 @@
+extern
+void test_T3ch(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T3dg.h
--- a/tests/conformance/test_T3dg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-extern
-void test_T3dg(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	       const Tensor2<double,3,3> &t2_3,
-	       Tensor2_symmetric<double,3> &t2s_1,
-	       const Tensor2_symmetric<double,3> &t2s_2,
-	       const Tensor2_symmetric<double,3> &t2s_3,
-	       Tensor3_dg<double,3,3> &t3dg_1,
-	       const Tensor3_dg<double,3,3> &t3dg_2,
-	       const Tensor3_dg<double,3,3> &t3dg_3,
-	       Tensor3_christof<double,3,3> &t3ch_1,
-	       const Tensor3_christof<double,3,3> &t3ch_2,
-	       const Tensor3_christof<double,3,3> &t3ch_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T3dg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/test_T3dg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,14 @@
+extern
+void test_T3dg(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	       Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	       Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	       const Tensor2<double,3,3> &t2_3,
+	       Tensor2_symmetric<double,3> &t2s_1,
+	       const Tensor2_symmetric<double,3> &t2s_2,
+	       const Tensor2_symmetric<double,3> &t2s_3,
+	       Tensor3_dg<double,3,3> &t3dg_1,
+	       const Tensor3_dg<double,3,3> &t3dg_2,
+	       const Tensor3_dg<double,3,3> &t3dg_3,
+	       Tensor3_christof<double,3,3> &t3ch_1,
+	       const Tensor3_christof<double,3,3> &t3ch_2,
+	       const Tensor3_christof<double,3,3> &t3ch_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T4R.C
--- a/tests/conformance/test_T4R.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,559 +0,0 @@
-#include <iostream>
-#include "../../FTensor.h"
-#include "test_for_zero.h"
-using namespace FTensor;
-using namespace std;
-
-void test_T4R(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3,
-	      Tensor3_dg<double,3,3> &t3dg_1,
-	      const Tensor3_dg<double,3,3> &t3dg_2,
-	      const Tensor3_dg<double,3,3> &t3dg_3,
-	      Tensor3_antisymmetric<double,3,3> &t3as_1,
-	      const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	      const Tensor3_antisymmetric<double,3,3> &t3as_3)
-{
-  Index<'i',3> i;
-  Index<'j',3> j;
-  Index<'k',3> k;
-  Index<'l',3> l;
-  Index<'m',3> m;
-  Index<'n',3> n;
-
-  Number<0> N0;
-  Number<1> N1;
-  Number<2> N2;
-
-  Tensor4_Riemann<double,3> t4R_1, t4R_2, t4R_3;
-
-  cout << "T4_Riemann" << endl;
-
-  Tensor2_symmetric<double,3> delta_3(3,0,0,3,0,3), delta_5(5,0,0,5,0,5),
-    delta_2(2,0,0,2,0,2), delta_7(7,0,0,7,0,7);
-
-  t4R_1(i,j,k,l)=(delta_3(i,k)*delta_5(j,l) && delta_3(i,l)*delta_5(k,j));
-
-  test_for_zero(t4R_1(0,0,0,0) - (delta_3(0,0)*delta_5(0,0)-delta_3(0,0)*delta_5(0,0)),
-                "T4ddg && T4ddg (0,0,0,0)");
-  test_for_zero(t4R_1(0,0,0,1) - (delta_3(0,1)*delta_5(0,0)-delta_3(0,1)*delta_5(0,0)),
-                "T4ddg && T4ddg (0,0,0,1)");
-  test_for_zero(t4R_1(0,0,0,2) - (delta_3(0,2)*delta_5(0,0)-delta_3(0,2)*delta_5(0,0)),
-                "T4ddg && T4ddg (0,0,0,2)");
-  test_for_zero(t4R_1(0,0,1,0) - (delta_3(0,0)*delta_5(0,1)-delta_3(0,0)*delta_5(1,0)),
-                "T4ddg && T4ddg (0,0,1,0)");
-  test_for_zero(t4R_1(0,0,1,1) - (delta_3(0,1)*delta_5(0,1)-delta_3(0,1)*delta_5(1,0)),
-                "T4ddg && T4ddg (0,0,1,1)");
-  test_for_zero(t4R_1(0,0,1,2) - (delta_3(0,2)*delta_5(0,1)-delta_3(0,2)*delta_5(1,0)),
-                "T4ddg && T4ddg (0,0,1,2)");
-  test_for_zero(t4R_1(0,0,2,0) - (delta_3(0,0)*delta_5(0,2)-delta_3(0,0)*delta_5(2,0)),
-                "T4ddg && T4ddg (0,0,2,0)");
-  test_for_zero(t4R_1(0,0,2,1) - (delta_3(0,1)*delta_5(0,2)-delta_3(0,1)*delta_5(2,0)),
-                "T4ddg && T4ddg (0,0,2,1)");
-  test_for_zero(t4R_1(0,0,2,2) - (delta_3(0,2)*delta_5(0,2)-delta_3(0,2)*delta_5(2,0)),
-                "T4ddg && T4ddg (0,0,2,2)");
-  test_for_zero(t4R_1(0,1,0,0) - (delta_3(0,0)*delta_5(1,0)-delta_3(0,0)*delta_5(0,1)),
-                "T4ddg && T4ddg (0,1,0,0)");
-  test_for_zero(t4R_1(0,1,0,1) - (delta_3(0,0)*delta_5(1,1)-delta_3(0,1)*delta_5(0,1)),
-                "T4ddg && T4ddg (0,1,0,1)");
-  test_for_zero(t4R_1(0,1,0,2) - (delta_3(0,2)*delta_5(1,0)-delta_3(0,2)*delta_5(0,1)),
-                "T4ddg && T4ddg (0,1,0,2)");
-  test_for_zero(t4R_1(0,1,1,0) - (delta_3(0,0)*delta_5(1,1)-delta_3(0,0)*delta_5(1,1)),
-                "T4ddg && T4ddg (0,1,1,0)");
-  test_for_zero(t4R_1(0,1,1,1) - (delta_3(0,1)*delta_5(1,1)-delta_3(0,1)*delta_5(1,1)),
-                "T4ddg && T4ddg (0,1,1,1)");
-  test_for_zero(t4R_1(0,1,1,2) - (delta_3(0,2)*delta_5(1,1)-delta_3(0,2)*delta_5(1,1)),
-                "T4ddg && T4ddg (0,1,1,2)");
-  test_for_zero(t4R_1(0,1,2,0) - (delta_3(0,0)*delta_5(1,2)-delta_3(0,0)*delta_5(2,1)),
-                "T4ddg && T4ddg (0,1,2,0)");
-  test_for_zero(t4R_1(0,1,2,1) - (delta_3(0,1)*delta_5(1,2)-delta_3(0,1)*delta_5(2,1)),
-                "T4ddg && T4ddg (0,1,2,1)");
-  test_for_zero(t4R_1(0,1,2,2) - (delta_3(0,2)*delta_5(1,2)-delta_3(0,2)*delta_5(2,1)),
-                "T4ddg && T4ddg (0,1,2,2)");
-  test_for_zero(t4R_1(0,2,0,0) - (delta_3(0,0)*delta_5(2,0)-delta_3(0,0)*delta_5(0,2)),
-                "T4ddg && T4ddg (0,2,0,0)");
-  test_for_zero(t4R_1(0,2,0,1) - (delta_3(0,1)*delta_5(2,0)-delta_3(0,1)*delta_5(0,2)),
-                "T4ddg && T4ddg (0,2,0,1)");
-  test_for_zero(t4R_1(0,2,0,2) - (delta_3(0,0)*delta_5(2,2)-delta_3(0,2)*delta_5(0,2)),
-                "T4ddg && T4ddg (0,2,0,2)");
-  test_for_zero(t4R_1(0,2,1,0) - (delta_3(0,0)*delta_5(2,1)-delta_3(0,0)*delta_5(1,2)),
-                "T4ddg && T4ddg (0,2,1,0)");
-  test_for_zero(t4R_1(0,2,1,1) - (delta_3(0,1)*delta_5(2,1)-delta_3(0,1)*delta_5(1,2)),
-                "T4ddg && T4ddg (0,2,1,1)");
-  test_for_zero(t4R_1(0,2,1,2) - (delta_3(0,2)*delta_5(2,1)-delta_3(0,2)*delta_5(1,2)),
-                "T4ddg && T4ddg (0,2,1,2)");
-  test_for_zero(t4R_1(0,2,2,0) - (delta_3(0,0)*delta_5(2,2)-delta_3(0,0)*delta_5(2,2)),
-                "T4ddg && T4ddg (0,2,2,0)");
-  test_for_zero(t4R_1(0,2,2,1) - (delta_3(0,1)*delta_5(2,2)-delta_3(0,1)*delta_5(2,2)),
-                "T4ddg && T4ddg (0,2,2,1)");
-  test_for_zero(t4R_1(0,2,2,2) - (delta_3(0,2)*delta_5(2,2)-delta_3(0,2)*delta_5(2,2)),
-                "T4ddg && T4ddg (0,2,2,2)");
-  test_for_zero(t4R_1(1,0,0,0) - (delta_3(1,0)*delta_5(0,0)-delta_3(1,0)*delta_5(0,0)),
-                "T4ddg && T4ddg (1,0,0,0)");
-  test_for_zero(t4R_1(1,0,0,1) - (delta_3(1,1)*delta_5(0,0)-delta_3(1,1)*delta_5(0,0)),
-                "T4ddg && T4ddg (1,0,0,1)");
-  test_for_zero(t4R_1(1,0,0,2) - (delta_3(1,2)*delta_5(0,0)-delta_3(1,2)*delta_5(0,0)),
-                "T4ddg && T4ddg (1,0,0,2)");
-  test_for_zero(t4R_1(1,0,1,0) - (delta_3(1,0)*delta_5(0,1)-delta_3(1,0)*delta_5(1,0)),
-                "T4ddg && T4ddg (1,0,1,0)");
-  test_for_zero(t4R_1(1,0,1,1) - (delta_3(1,1)*delta_5(0,1)-delta_3(1,1)*delta_5(1,0)),
-                "T4ddg && T4ddg (1,0,1,1)");
-  test_for_zero(t4R_1(1,0,1,2) - (delta_3(1,2)*delta_5(0,1)-delta_3(1,2)*delta_5(1,0)),
-                "T4ddg && T4ddg (1,0,1,2)");
-  test_for_zero(t4R_1(1,0,2,0) - (delta_3(1,0)*delta_5(0,2)-delta_3(1,0)*delta_5(2,0)),
-                "T4ddg && T4ddg (1,0,2,0)");
-  test_for_zero(t4R_1(1,0,2,1) - (delta_3(1,1)*delta_5(0,2)-delta_3(1,1)*delta_5(2,0)),
-                "T4ddg && T4ddg (1,0,2,1)");
-  test_for_zero(t4R_1(1,0,2,2) - (delta_3(1,2)*delta_5(0,2)-delta_3(1,2)*delta_5(2,0)),
-                "T4ddg && T4ddg (1,0,2,2)");
-  test_for_zero(t4R_1(1,1,0,0) - (delta_3(1,0)*delta_5(1,0)-delta_3(1,0)*delta_5(0,1)),
-                "T4ddg && T4ddg (1,1,0,0)");
-  test_for_zero(t4R_1(1,1,0,1) - (delta_3(1,1)*delta_5(1,0)-delta_3(1,1)*delta_5(0,1)),
-                "T4ddg && T4ddg (1,1,0,1)");
-  test_for_zero(t4R_1(1,1,0,2) - (delta_3(1,2)*delta_5(1,0)-delta_3(1,2)*delta_5(0,1)),
-                "T4ddg && T4ddg (1,1,0,2)");
-  test_for_zero(t4R_1(1,1,1,0) - (delta_3(1,0)*delta_5(1,1)-delta_3(1,0)*delta_5(1,1)),
-                "T4ddg && T4ddg (1,1,1,0)");
-  test_for_zero(t4R_1(1,1,1,1) - (delta_3(1,1)*delta_5(1,1)-delta_3(1,1)*delta_5(1,1)),
-                "T4ddg && T4ddg (1,1,1,1)");
-  test_for_zero(t4R_1(1,1,1,2) - (delta_3(1,2)*delta_5(1,1)-delta_3(1,2)*delta_5(1,1)),
-                "T4ddg && T4ddg (1,1,1,2)");
-  test_for_zero(t4R_1(1,1,2,0) - (delta_3(1,0)*delta_5(1,2)-delta_3(1,0)*delta_5(2,1)),
-                "T4ddg && T4ddg (1,1,2,0)");
-  test_for_zero(t4R_1(1,1,2,1) - (delta_3(1,1)*delta_5(1,2)-delta_3(1,1)*delta_5(2,1)),
-                "T4ddg && T4ddg (1,1,2,1)");
-  test_for_zero(t4R_1(1,1,2,2) - (delta_3(1,2)*delta_5(1,2)-delta_3(1,2)*delta_5(2,1)),
-                "T4ddg && T4ddg (1,1,2,2)");
-  test_for_zero(t4R_1(1,2,0,0) - (delta_3(1,0)*delta_5(2,0)-delta_3(1,0)*delta_5(0,2)),
-                "T4ddg && T4ddg (1,2,0,0)");
-  test_for_zero(t4R_1(1,2,0,1) - (delta_3(1,1)*delta_5(2,0)-delta_3(1,1)*delta_5(0,2)),
-                "T4ddg && T4ddg (1,2,0,1)");
-  test_for_zero(t4R_1(1,2,0,2) - (delta_3(1,2)*delta_5(2,0)-delta_3(1,2)*delta_5(0,2)),
-                "T4ddg && T4ddg (1,2,0,2)");
-  test_for_zero(t4R_1(1,2,1,0) - (delta_3(1,0)*delta_5(2,1)-delta_3(1,0)*delta_5(1,2)),
-                "T4ddg && T4ddg (1,2,1,0)");
-  test_for_zero(t4R_1(1,2,1,1) - (delta_3(1,1)*delta_5(2,1)-delta_3(1,1)*delta_5(1,2)),
-                "T4ddg && T4ddg (1,2,1,1)");
-  test_for_zero(t4R_1(1,2,1,2) - (delta_3(1,1)*delta_5(2,2)-delta_3(1,2)*delta_5(1,2)),
-                "T4ddg && T4ddg (1,2,1,2)");
-  test_for_zero(t4R_1(1,2,2,0) - (delta_3(1,0)*delta_5(2,2)-delta_3(1,0)*delta_5(2,2)),
-                "T4ddg && T4ddg (1,2,2,0)");
-  test_for_zero(t4R_1(1,2,2,1) - (delta_3(1,1)*delta_5(2,2)-delta_3(1,1)*delta_5(2,2)),
-                "T4ddg && T4ddg (1,2,2,1)");
-  test_for_zero(t4R_1(1,2,2,2) - (delta_3(1,2)*delta_5(2,2)-delta_3(1,2)*delta_5(2,2)),
-                "T4ddg && T4ddg (1,2,2,2)");
-  test_for_zero(t4R_1(2,0,0,0) - (delta_3(2,0)*delta_5(0,0)-delta_3(2,0)*delta_5(0,0)),
-                "T4ddg && T4ddg (2,0,0,0)");
-  test_for_zero(t4R_1(2,0,0,1) - (delta_3(2,1)*delta_5(0,0)-delta_3(2,1)*delta_5(0,0)),
-                "T4ddg && T4ddg (2,0,0,1)");
-  test_for_zero(t4R_1(2,0,0,2) - (delta_3(2,2)*delta_5(0,0)-delta_3(2,2)*delta_5(0,0)),
-                "T4ddg && T4ddg (2,0,0,2)");
-  test_for_zero(t4R_1(2,0,1,0) - (delta_3(2,0)*delta_5(0,1)-delta_3(2,0)*delta_5(1,0)),
-                "T4ddg && T4ddg (2,0,1,0)");
-  test_for_zero(t4R_1(2,0,1,1) - (delta_3(2,1)*delta_5(0,1)-delta_3(2,1)*delta_5(1,0)),
-                "T4ddg && T4ddg (2,0,1,1)");
-  test_for_zero(t4R_1(2,0,1,2) - (delta_3(2,2)*delta_5(0,1)-delta_3(2,2)*delta_5(1,0)),
-                "T4ddg && T4ddg (2,0,1,2)");
-  test_for_zero(t4R_1(2,0,2,0) - (delta_3(2,0)*delta_5(0,2)-delta_3(2,0)*delta_5(2,0)),
-                "T4ddg && T4ddg (2,0,2,0)");
-  test_for_zero(t4R_1(2,0,2,1) - (delta_3(2,1)*delta_5(0,2)-delta_3(2,1)*delta_5(2,0)),
-                "T4ddg && T4ddg (2,0,2,1)");
-  test_for_zero(t4R_1(2,0,2,2) - (delta_3(2,2)*delta_5(0,2)-delta_3(2,2)*delta_5(2,0)),
-                "T4ddg && T4ddg (2,0,2,2)");
-  test_for_zero(t4R_1(2,1,0,0) - (delta_3(2,0)*delta_5(1,0)-delta_3(2,0)*delta_5(0,1)),
-                "T4ddg && T4ddg (2,1,0,0)");
-  test_for_zero(t4R_1(2,1,0,1) - (delta_3(2,1)*delta_5(1,0)-delta_3(2,1)*delta_5(0,1)),
-                "T4ddg && T4ddg (2,1,0,1)");
-  test_for_zero(t4R_1(2,1,0,2) - (delta_3(2,2)*delta_5(1,0)-delta_3(2,2)*delta_5(0,1)),
-                "T4ddg && T4ddg (2,1,0,2)");
-  test_for_zero(t4R_1(2,1,1,0) - (delta_3(2,0)*delta_5(1,1)-delta_3(2,0)*delta_5(1,1)),
-                "T4ddg && T4ddg (2,1,1,0)");
-  test_for_zero(t4R_1(2,1,1,1) - (delta_3(2,1)*delta_5(1,1)-delta_3(2,1)*delta_5(1,1)),
-                "T4ddg && T4ddg (2,1,1,1)");
-  test_for_zero(t4R_1(2,1,1,2) - (delta_3(2,2)*delta_5(1,1)-delta_3(2,2)*delta_5(1,1)),
-                "T4ddg && T4ddg (2,1,1,2)");
-  test_for_zero(t4R_1(2,1,2,0) - (delta_3(2,0)*delta_5(1,2)-delta_3(2,0)*delta_5(2,1)),
-                "T4ddg && T4ddg (2,1,2,0)");
-  test_for_zero(t4R_1(2,1,2,1) - (delta_3(2,1)*delta_5(1,2)-delta_3(2,1)*delta_5(2,1)),
-                "T4ddg && T4ddg (2,1,2,1)");
-  test_for_zero(t4R_1(2,1,2,2) - (delta_3(2,2)*delta_5(1,2)-delta_3(2,2)*delta_5(2,1)),
-                "T4ddg && T4ddg (2,1,2,2)");
-  test_for_zero(t4R_1(2,2,0,0) - (delta_3(2,0)*delta_5(2,0)-delta_3(2,0)*delta_5(0,2)),
-                "T4ddg && T4ddg (2,2,0,0)");
-  test_for_zero(t4R_1(2,2,0,1) - (delta_3(2,1)*delta_5(2,0)-delta_3(2,1)*delta_5(0,2)),
-                "T4ddg && T4ddg (2,2,0,1)");
-  test_for_zero(t4R_1(2,2,0,2) - (delta_3(2,2)*delta_5(2,0)-delta_3(2,2)*delta_5(0,2)),
-                "T4ddg && T4ddg (2,2,0,2)");
-  test_for_zero(t4R_1(2,2,1,0) - (delta_3(2,0)*delta_5(2,1)-delta_3(2,0)*delta_5(1,2)),
-                "T4ddg && T4ddg (2,2,1,0)");
-  test_for_zero(t4R_1(2,2,1,1) - (delta_3(2,1)*delta_5(2,1)-delta_3(2,1)*delta_5(1,2)),
-                "T4ddg && T4ddg (2,2,1,1)");
-  test_for_zero(t4R_1(2,2,1,2) - (delta_3(2,2)*delta_5(2,1)-delta_3(2,2)*delta_5(1,2)),
-                "T4ddg && T4ddg (2,2,1,2)");
-  test_for_zero(t4R_1(2,2,2,0) - (delta_3(2,0)*delta_5(2,2)-delta_3(2,0)*delta_5(2,2)),
-                "T4ddg && T4ddg (2,2,2,0)");
-  test_for_zero(t4R_1(2,2,2,1) - (delta_3(2,1)*delta_5(2,2)-delta_3(2,1)*delta_5(2,2)),
-                "T4ddg && T4ddg (2,2,2,1)");
-  test_for_zero(t4R_1(2,2,2,2) - (delta_3(2,2)*delta_5(2,2)-delta_3(2,2)*delta_5(2,2)),
-                "T4ddg && T4ddg (2,2,2,2)");
-
-
-  t4R_2(i,j,k,l)=(delta_2(i,k)*delta_7(j,l) && delta_2(i,l)*delta_7(k,j));
-
-  t4R_3(i,j,k,l)=t4R_1(i,j,k,l)+t4R_2(i,j,k,l);
-  test_for_zero(t4R_3(0,0,0,0) - (t4R_1(0,0,0,0)+t4R_2(0,0,0,0)),
-                "T4R + T4R (0,0,0,0)");
-  test_for_zero(t4R_3(0,0,0,1) - (t4R_1(0,0,0,1)+t4R_2(0,0,0,1)),
-                "T4R + T4R (0,0,0,1)");
-  test_for_zero(t4R_3(0,0,0,2) - (t4R_1(0,0,0,2)+t4R_2(0,0,0,2)),
-                "T4R + T4R (0,0,0,2)");
-  test_for_zero(t4R_3(0,0,1,0) - (t4R_1(0,0,1,0)+t4R_2(0,0,1,0)),
-                "T4R + T4R (0,0,1,0)");
-  test_for_zero(t4R_3(0,0,1,1) - (t4R_1(0,0,1,1)+t4R_2(0,0,1,1)),
-                "T4R + T4R (0,0,1,1)");
-  test_for_zero(t4R_3(0,0,1,2) - (t4R_1(0,0,1,2)+t4R_2(0,0,1,2)),
-                "T4R + T4R (0,0,1,2)");
-  test_for_zero(t4R_3(0,0,2,0) - (t4R_1(0,0,2,0)+t4R_2(0,0,2,0)),
-                "T4R + T4R (0,0,2,0)");
-  test_for_zero(t4R_3(0,0,2,1) - (t4R_1(0,0,2,1)+t4R_2(0,0,2,1)),
-                "T4R + T4R (0,0,2,1)");
-  test_for_zero(t4R_3(0,0,2,2) - (t4R_1(0,0,2,2)+t4R_2(0,0,2,2)),
-                "T4R + T4R (0,0,2,2)");
-  test_for_zero(t4R_3(0,1,0,0) - (t4R_1(0,1,0,0)+t4R_2(0,1,0,0)),
-                "T4R + T4R (0,1,0,0)");
-  test_for_zero(t4R_3(0,1,0,1) - (t4R_1(0,1,0,1)+t4R_2(0,1,0,1)),
-                "T4R + T4R (0,1,0,1)");
-  test_for_zero(t4R_3(0,1,0,2) - (t4R_1(0,1,0,2)+t4R_2(0,1,0,2)),
-                "T4R + T4R (0,1,0,2)");
-  test_for_zero(t4R_3(0,1,1,0) - (t4R_1(0,1,1,0)+t4R_2(0,1,1,0)),
-                "T4R + T4R (0,1,1,0)");
-  test_for_zero(t4R_3(0,1,1,1) - (t4R_1(0,1,1,1)+t4R_2(0,1,1,1)),
-                "T4R + T4R (0,1,1,1)");
-  test_for_zero(t4R_3(0,1,1,2) - (t4R_1(0,1,1,2)+t4R_2(0,1,1,2)),
-                "T4R + T4R (0,1,1,2)");
-  test_for_zero(t4R_3(0,1,2,0) - (t4R_1(0,1,2,0)+t4R_2(0,1,2,0)),
-                "T4R + T4R (0,1,2,0)");
-  test_for_zero(t4R_3(0,1,2,1) - (t4R_1(0,1,2,1)+t4R_2(0,1,2,1)),
-                "T4R + T4R (0,1,2,1)");
-  test_for_zero(t4R_3(0,1,2,2) - (t4R_1(0,1,2,2)+t4R_2(0,1,2,2)),
-                "T4R + T4R (0,1,2,2)");
-  test_for_zero(t4R_3(0,2,0,0) - (t4R_1(0,2,0,0)+t4R_2(0,2,0,0)),
-                "T4R + T4R (0,2,0,0)");
-  test_for_zero(t4R_3(0,2,0,1) - (t4R_1(0,2,0,1)+t4R_2(0,2,0,1)),
-                "T4R + T4R (0,2,0,1)");
-  test_for_zero(t4R_3(0,2,0,2) - (t4R_1(0,2,0,2)+t4R_2(0,2,0,2)),
-                "T4R + T4R (0,2,0,2)");
-  test_for_zero(t4R_3(0,2,1,0) - (t4R_1(0,2,1,0)+t4R_2(0,2,1,0)),
-                "T4R + T4R (0,2,1,0)");
-  test_for_zero(t4R_3(0,2,1,1) - (t4R_1(0,2,1,1)+t4R_2(0,2,1,1)),
-                "T4R + T4R (0,2,1,1)");
-  test_for_zero(t4R_3(0,2,1,2) - (t4R_1(0,2,1,2)+t4R_2(0,2,1,2)),
-                "T4R + T4R (0,2,1,2)");
-  test_for_zero(t4R_3(0,2,2,0) - (t4R_1(0,2,2,0)+t4R_2(0,2,2,0)),
-                "T4R + T4R (0,2,2,0)");
-  test_for_zero(t4R_3(0,2,2,1) - (t4R_1(0,2,2,1)+t4R_2(0,2,2,1)),
-                "T4R + T4R (0,2,2,1)");
-  test_for_zero(t4R_3(0,2,2,2) - (t4R_1(0,2,2,2)+t4R_2(0,2,2,2)),
-                "T4R + T4R (0,2,2,2)");
-  test_for_zero(t4R_3(1,0,0,0) - (t4R_1(1,0,0,0)+t4R_2(1,0,0,0)),
-                "T4R + T4R (1,0,0,0)");
-  test_for_zero(t4R_3(1,0,0,1) - (t4R_1(1,0,0,1)+t4R_2(1,0,0,1)),
-                "T4R + T4R (1,0,0,1)");
-  test_for_zero(t4R_3(1,0,0,2) - (t4R_1(1,0,0,2)+t4R_2(1,0,0,2)),
-                "T4R + T4R (1,0,0,2)");
-  test_for_zero(t4R_3(1,0,1,0) - (t4R_1(1,0,1,0)+t4R_2(1,0,1,0)),
-                "T4R + T4R (1,0,1,0)");
-  test_for_zero(t4R_3(1,0,1,1) - (t4R_1(1,0,1,1)+t4R_2(1,0,1,1)),
-                "T4R + T4R (1,0,1,1)");
-  test_for_zero(t4R_3(1,0,1,2) - (t4R_1(1,0,1,2)+t4R_2(1,0,1,2)),
-                "T4R + T4R (1,0,1,2)");
-  test_for_zero(t4R_3(1,0,2,0) - (t4R_1(1,0,2,0)+t4R_2(1,0,2,0)),
-                "T4R + T4R (1,0,2,0)");
-  test_for_zero(t4R_3(1,0,2,1) - (t4R_1(1,0,2,1)+t4R_2(1,0,2,1)),
-                "T4R + T4R (1,0,2,1)");
-  test_for_zero(t4R_3(1,0,2,2) - (t4R_1(1,0,2,2)+t4R_2(1,0,2,2)),
-                "T4R + T4R (1,0,2,2)");
-  test_for_zero(t4R_3(1,1,0,0) - (t4R_1(1,1,0,0)+t4R_2(1,1,0,0)),
-                "T4R + T4R (1,1,0,0)");
-  test_for_zero(t4R_3(1,1,0,1) - (t4R_1(1,1,0,1)+t4R_2(1,1,0,1)),
-                "T4R + T4R (1,1,0,1)");
-  test_for_zero(t4R_3(1,1,0,2) - (t4R_1(1,1,0,2)+t4R_2(1,1,0,2)),
-                "T4R + T4R (1,1,0,2)");
-  test_for_zero(t4R_3(1,1,1,0) - (t4R_1(1,1,1,0)+t4R_2(1,1,1,0)),
-                "T4R + T4R (1,1,1,0)");
-  test_for_zero(t4R_3(1,1,1,1) - (t4R_1(1,1,1,1)+t4R_2(1,1,1,1)),
-                "T4R + T4R (1,1,1,1)");
-  test_for_zero(t4R_3(1,1,1,2) - (t4R_1(1,1,1,2)+t4R_2(1,1,1,2)),
-                "T4R + T4R (1,1,1,2)");
-  test_for_zero(t4R_3(1,1,2,0) - (t4R_1(1,1,2,0)+t4R_2(1,1,2,0)),
-                "T4R + T4R (1,1,2,0)");
-  test_for_zero(t4R_3(1,1,2,1) - (t4R_1(1,1,2,1)+t4R_2(1,1,2,1)),
-                "T4R + T4R (1,1,2,1)");
-  test_for_zero(t4R_3(1,1,2,2) - (t4R_1(1,1,2,2)+t4R_2(1,1,2,2)),
-                "T4R + T4R (1,1,2,2)");
-  test_for_zero(t4R_3(1,2,0,0) - (t4R_1(1,2,0,0)+t4R_2(1,2,0,0)),
-                "T4R + T4R (1,2,0,0)");
-  test_for_zero(t4R_3(1,2,0,1) - (t4R_1(1,2,0,1)+t4R_2(1,2,0,1)),
-                "T4R + T4R (1,2,0,1)");
-  test_for_zero(t4R_3(1,2,0,2) - (t4R_1(1,2,0,2)+t4R_2(1,2,0,2)),
-                "T4R + T4R (1,2,0,2)");
-  test_for_zero(t4R_3(1,2,1,0) - (t4R_1(1,2,1,0)+t4R_2(1,2,1,0)),
-                "T4R + T4R (1,2,1,0)");
-  test_for_zero(t4R_3(1,2,1,1) - (t4R_1(1,2,1,1)+t4R_2(1,2,1,1)),
-                "T4R + T4R (1,2,1,1)");
-  test_for_zero(t4R_3(1,2,1,2) - (t4R_1(1,2,1,2)+t4R_2(1,2,1,2)),
-                "T4R + T4R (1,2,1,2)");
-  test_for_zero(t4R_3(1,2,2,0) - (t4R_1(1,2,2,0)+t4R_2(1,2,2,0)),
-                "T4R + T4R (1,2,2,0)");
-  test_for_zero(t4R_3(1,2,2,1) - (t4R_1(1,2,2,1)+t4R_2(1,2,2,1)),
-                "T4R + T4R (1,2,2,1)");
-  test_for_zero(t4R_3(1,2,2,2) - (t4R_1(1,2,2,2)+t4R_2(1,2,2,2)),
-                "T4R + T4R (1,2,2,2)");
-  test_for_zero(t4R_3(2,0,0,0) - (t4R_1(2,0,0,0)+t4R_2(2,0,0,0)),
-                "T4R + T4R (2,0,0,0)");
-  test_for_zero(t4R_3(2,0,0,1) - (t4R_1(2,0,0,1)+t4R_2(2,0,0,1)),
-                "T4R + T4R (2,0,0,1)");
-  test_for_zero(t4R_3(2,0,0,2) - (t4R_1(2,0,0,2)+t4R_2(2,0,0,2)),
-                "T4R + T4R (2,0,0,2)");
-  test_for_zero(t4R_3(2,0,1,0) - (t4R_1(2,0,1,0)+t4R_2(2,0,1,0)),
-                "T4R + T4R (2,0,1,0)");
-  test_for_zero(t4R_3(2,0,1,1) - (t4R_1(2,0,1,1)+t4R_2(2,0,1,1)),
-                "T4R + T4R (2,0,1,1)");
-  test_for_zero(t4R_3(2,0,1,2) - (t4R_1(2,0,1,2)+t4R_2(2,0,1,2)),
-                "T4R + T4R (2,0,1,2)");
-  test_for_zero(t4R_3(2,0,2,0) - (t4R_1(2,0,2,0)+t4R_2(2,0,2,0)),
-                "T4R + T4R (2,0,2,0)");
-  test_for_zero(t4R_3(2,0,2,1) - (t4R_1(2,0,2,1)+t4R_2(2,0,2,1)),
-                "T4R + T4R (2,0,2,1)");
-  test_for_zero(t4R_3(2,0,2,2) - (t4R_1(2,0,2,2)+t4R_2(2,0,2,2)),
-                "T4R + T4R (2,0,2,2)");
-  test_for_zero(t4R_3(2,1,0,0) - (t4R_1(2,1,0,0)+t4R_2(2,1,0,0)),
-                "T4R + T4R (2,1,0,0)");
-  test_for_zero(t4R_3(2,1,0,1) - (t4R_1(2,1,0,1)+t4R_2(2,1,0,1)),
-                "T4R + T4R (2,1,0,1)");
-  test_for_zero(t4R_3(2,1,0,2) - (t4R_1(2,1,0,2)+t4R_2(2,1,0,2)),
-                "T4R + T4R (2,1,0,2)");
-  test_for_zero(t4R_3(2,1,1,0) - (t4R_1(2,1,1,0)+t4R_2(2,1,1,0)),
-                "T4R + T4R (2,1,1,0)");
-  test_for_zero(t4R_3(2,1,1,1) - (t4R_1(2,1,1,1)+t4R_2(2,1,1,1)),
-                "T4R + T4R (2,1,1,1)");
-  test_for_zero(t4R_3(2,1,1,2) - (t4R_1(2,1,1,2)+t4R_2(2,1,1,2)),
-                "T4R + T4R (2,1,1,2)");
-  test_for_zero(t4R_3(2,1,2,0) - (t4R_1(2,1,2,0)+t4R_2(2,1,2,0)),
-                "T4R + T4R (2,1,2,0)");
-  test_for_zero(t4R_3(2,1,2,1) - (t4R_1(2,1,2,1)+t4R_2(2,1,2,1)),
-                "T4R + T4R (2,1,2,1)");
-  test_for_zero(t4R_3(2,1,2,2) - (t4R_1(2,1,2,2)+t4R_2(2,1,2,2)),
-                "T4R + T4R (2,1,2,2)");
-  test_for_zero(t4R_3(2,2,0,0) - (t4R_1(2,2,0,0)+t4R_2(2,2,0,0)),
-                "T4R + T4R (2,2,0,0)");
-  test_for_zero(t4R_3(2,2,0,1) - (t4R_1(2,2,0,1)+t4R_2(2,2,0,1)),
-                "T4R + T4R (2,2,0,1)");
-  test_for_zero(t4R_3(2,2,0,2) - (t4R_1(2,2,0,2)+t4R_2(2,2,0,2)),
-                "T4R + T4R (2,2,0,2)");
-  test_for_zero(t4R_3(2,2,1,0) - (t4R_1(2,2,1,0)+t4R_2(2,2,1,0)),
-                "T4R + T4R (2,2,1,0)");
-  test_for_zero(t4R_3(2,2,1,1) - (t4R_1(2,2,1,1)+t4R_2(2,2,1,1)),
-                "T4R + T4R (2,2,1,1)");
-  test_for_zero(t4R_3(2,2,1,2) - (t4R_1(2,2,1,2)+t4R_2(2,2,1,2)),
-                "T4R + T4R (2,2,1,2)");
-  test_for_zero(t4R_3(2,2,2,0) - (t4R_1(2,2,2,0)+t4R_2(2,2,2,0)),
-                "T4R + T4R (2,2,2,0)");
-  test_for_zero(t4R_3(2,2,2,1) - (t4R_1(2,2,2,1)+t4R_2(2,2,2,1)),
-                "T4R + T4R (2,2,2,1)");
-  test_for_zero(t4R_3(2,2,2,2) - (t4R_1(2,2,2,2)+t4R_2(2,2,2,2)),
-                "T4R + T4R (2,2,2,2)");
-
-  t4R_3(i,j,k,l)=t4R_1(i,j,k,l)-t4R_2(i,j,k,l);
-  test_for_zero(t4R_3(0,0,0,0) - (t4R_1(0,0,0,0)-t4R_2(0,0,0,0)),
-                "T4R - T4R (0,0,0,0)");
-  test_for_zero(t4R_3(0,0,0,1) - (t4R_1(0,0,0,1)-t4R_2(0,0,0,1)),
-                "T4R - T4R (0,0,0,1)");
-  test_for_zero(t4R_3(0,0,0,2) - (t4R_1(0,0,0,2)-t4R_2(0,0,0,2)),
-                "T4R - T4R (0,0,0,2)");
-  test_for_zero(t4R_3(0,0,1,0) - (t4R_1(0,0,1,0)-t4R_2(0,0,1,0)),
-                "T4R - T4R (0,0,1,0)");
-  test_for_zero(t4R_3(0,0,1,1) - (t4R_1(0,0,1,1)-t4R_2(0,0,1,1)),
-                "T4R - T4R (0,0,1,1)");
-  test_for_zero(t4R_3(0,0,1,2) - (t4R_1(0,0,1,2)-t4R_2(0,0,1,2)),
-                "T4R - T4R (0,0,1,2)");
-  test_for_zero(t4R_3(0,0,2,0) - (t4R_1(0,0,2,0)-t4R_2(0,0,2,0)),
-                "T4R - T4R (0,0,2,0)");
-  test_for_zero(t4R_3(0,0,2,1) - (t4R_1(0,0,2,1)-t4R_2(0,0,2,1)),
-                "T4R - T4R (0,0,2,1)");
-  test_for_zero(t4R_3(0,0,2,2) - (t4R_1(0,0,2,2)-t4R_2(0,0,2,2)),
-                "T4R - T4R (0,0,2,2)");
-  test_for_zero(t4R_3(0,1,0,0) - (t4R_1(0,1,0,0)-t4R_2(0,1,0,0)),
-                "T4R - T4R (0,1,0,0)");
-  test_for_zero(t4R_3(0,1,0,1) - (t4R_1(0,1,0,1)-t4R_2(0,1,0,1)),
-                "T4R - T4R (0,1,0,1)");
-  test_for_zero(t4R_3(0,1,0,2) - (t4R_1(0,1,0,2)-t4R_2(0,1,0,2)),
-                "T4R - T4R (0,1,0,2)");
-  test_for_zero(t4R_3(0,1,1,0) - (t4R_1(0,1,1,0)-t4R_2(0,1,1,0)),
-                "T4R - T4R (0,1,1,0)");
-  test_for_zero(t4R_3(0,1,1,1) - (t4R_1(0,1,1,1)-t4R_2(0,1,1,1)),
-                "T4R - T4R (0,1,1,1)");
-  test_for_zero(t4R_3(0,1,1,2) - (t4R_1(0,1,1,2)-t4R_2(0,1,1,2)),
-                "T4R - T4R (0,1,1,2)");
-  test_for_zero(t4R_3(0,1,2,0) - (t4R_1(0,1,2,0)-t4R_2(0,1,2,0)),
-                "T4R - T4R (0,1,2,0)");
-  test_for_zero(t4R_3(0,1,2,1) - (t4R_1(0,1,2,1)-t4R_2(0,1,2,1)),
-                "T4R - T4R (0,1,2,1)");
-  test_for_zero(t4R_3(0,1,2,2) - (t4R_1(0,1,2,2)-t4R_2(0,1,2,2)),
-                "T4R - T4R (0,1,2,2)");
-  test_for_zero(t4R_3(0,2,0,0) - (t4R_1(0,2,0,0)-t4R_2(0,2,0,0)),
-                "T4R - T4R (0,2,0,0)");
-  test_for_zero(t4R_3(0,2,0,1) - (t4R_1(0,2,0,1)-t4R_2(0,2,0,1)),
-                "T4R - T4R (0,2,0,1)");
-  test_for_zero(t4R_3(0,2,0,2) - (t4R_1(0,2,0,2)-t4R_2(0,2,0,2)),
-                "T4R - T4R (0,2,0,2)");
-  test_for_zero(t4R_3(0,2,1,0) - (t4R_1(0,2,1,0)-t4R_2(0,2,1,0)),
-                "T4R - T4R (0,2,1,0)");
-  test_for_zero(t4R_3(0,2,1,1) - (t4R_1(0,2,1,1)-t4R_2(0,2,1,1)),
-                "T4R - T4R (0,2,1,1)");
-  test_for_zero(t4R_3(0,2,1,2) - (t4R_1(0,2,1,2)-t4R_2(0,2,1,2)),
-                "T4R - T4R (0,2,1,2)");
-  test_for_zero(t4R_3(0,2,2,0) - (t4R_1(0,2,2,0)-t4R_2(0,2,2,0)),
-                "T4R - T4R (0,2,2,0)");
-  test_for_zero(t4R_3(0,2,2,1) - (t4R_1(0,2,2,1)-t4R_2(0,2,2,1)),
-                "T4R - T4R (0,2,2,1)");
-  test_for_zero(t4R_3(0,2,2,2) - (t4R_1(0,2,2,2)-t4R_2(0,2,2,2)),
-                "T4R - T4R (0,2,2,2)");
-  test_for_zero(t4R_3(1,0,0,0) - (t4R_1(1,0,0,0)-t4R_2(1,0,0,0)),
-                "T4R - T4R (1,0,0,0)");
-  test_for_zero(t4R_3(1,0,0,1) - (t4R_1(1,0,0,1)-t4R_2(1,0,0,1)),
-                "T4R - T4R (1,0,0,1)");
-  test_for_zero(t4R_3(1,0,0,2) - (t4R_1(1,0,0,2)-t4R_2(1,0,0,2)),
-                "T4R - T4R (1,0,0,2)");
-  test_for_zero(t4R_3(1,0,1,0) - (t4R_1(1,0,1,0)-t4R_2(1,0,1,0)),
-                "T4R - T4R (1,0,1,0)");
-  test_for_zero(t4R_3(1,0,1,1) - (t4R_1(1,0,1,1)-t4R_2(1,0,1,1)),
-                "T4R - T4R (1,0,1,1)");
-  test_for_zero(t4R_3(1,0,1,2) - (t4R_1(1,0,1,2)-t4R_2(1,0,1,2)),
-                "T4R - T4R (1,0,1,2)");
-  test_for_zero(t4R_3(1,0,2,0) - (t4R_1(1,0,2,0)-t4R_2(1,0,2,0)),
-                "T4R - T4R (1,0,2,0)");
-  test_for_zero(t4R_3(1,0,2,1) - (t4R_1(1,0,2,1)-t4R_2(1,0,2,1)),
-                "T4R - T4R (1,0,2,1)");
-  test_for_zero(t4R_3(1,0,2,2) - (t4R_1(1,0,2,2)-t4R_2(1,0,2,2)),
-                "T4R - T4R (1,0,2,2)");
-  test_for_zero(t4R_3(1,1,0,0) - (t4R_1(1,1,0,0)-t4R_2(1,1,0,0)),
-                "T4R - T4R (1,1,0,0)");
-  test_for_zero(t4R_3(1,1,0,1) - (t4R_1(1,1,0,1)-t4R_2(1,1,0,1)),
-                "T4R - T4R (1,1,0,1)");
-  test_for_zero(t4R_3(1,1,0,2) - (t4R_1(1,1,0,2)-t4R_2(1,1,0,2)),
-                "T4R - T4R (1,1,0,2)");
-  test_for_zero(t4R_3(1,1,1,0) - (t4R_1(1,1,1,0)-t4R_2(1,1,1,0)),
-                "T4R - T4R (1,1,1,0)");
-  test_for_zero(t4R_3(1,1,1,1) - (t4R_1(1,1,1,1)-t4R_2(1,1,1,1)),
-                "T4R - T4R (1,1,1,1)");
-  test_for_zero(t4R_3(1,1,1,2) - (t4R_1(1,1,1,2)-t4R_2(1,1,1,2)),
-                "T4R - T4R (1,1,1,2)");
-  test_for_zero(t4R_3(1,1,2,0) - (t4R_1(1,1,2,0)-t4R_2(1,1,2,0)),
-                "T4R - T4R (1,1,2,0)");
-  test_for_zero(t4R_3(1,1,2,1) - (t4R_1(1,1,2,1)-t4R_2(1,1,2,1)),
-                "T4R - T4R (1,1,2,1)");
-  test_for_zero(t4R_3(1,1,2,2) - (t4R_1(1,1,2,2)-t4R_2(1,1,2,2)),
-                "T4R - T4R (1,1,2,2)");
-  test_for_zero(t4R_3(1,2,0,0) - (t4R_1(1,2,0,0)-t4R_2(1,2,0,0)),
-                "T4R - T4R (1,2,0,0)");
-  test_for_zero(t4R_3(1,2,0,1) - (t4R_1(1,2,0,1)-t4R_2(1,2,0,1)),
-                "T4R - T4R (1,2,0,1)");
-  test_for_zero(t4R_3(1,2,0,2) - (t4R_1(1,2,0,2)-t4R_2(1,2,0,2)),
-                "T4R - T4R (1,2,0,2)");
-  test_for_zero(t4R_3(1,2,1,0) - (t4R_1(1,2,1,0)-t4R_2(1,2,1,0)),
-                "T4R - T4R (1,2,1,0)");
-  test_for_zero(t4R_3(1,2,1,1) - (t4R_1(1,2,1,1)-t4R_2(1,2,1,1)),
-                "T4R - T4R (1,2,1,1)");
-  test_for_zero(t4R_3(1,2,1,2) - (t4R_1(1,2,1,2)-t4R_2(1,2,1,2)),
-                "T4R - T4R (1,2,1,2)");
-  test_for_zero(t4R_3(1,2,2,0) - (t4R_1(1,2,2,0)-t4R_2(1,2,2,0)),
-                "T4R - T4R (1,2,2,0)");
-  test_for_zero(t4R_3(1,2,2,1) - (t4R_1(1,2,2,1)-t4R_2(1,2,2,1)),
-                "T4R - T4R (1,2,2,1)");
-  test_for_zero(t4R_3(1,2,2,2) - (t4R_1(1,2,2,2)-t4R_2(1,2,2,2)),
-                "T4R - T4R (1,2,2,2)");
-  test_for_zero(t4R_3(2,0,0,0) - (t4R_1(2,0,0,0)-t4R_2(2,0,0,0)),
-                "T4R - T4R (2,0,0,0)");
-  test_for_zero(t4R_3(2,0,0,1) - (t4R_1(2,0,0,1)-t4R_2(2,0,0,1)),
-                "T4R - T4R (2,0,0,1)");
-  test_for_zero(t4R_3(2,0,0,2) - (t4R_1(2,0,0,2)-t4R_2(2,0,0,2)),
-                "T4R - T4R (2,0,0,2)");
-  test_for_zero(t4R_3(2,0,1,0) - (t4R_1(2,0,1,0)-t4R_2(2,0,1,0)),
-                "T4R - T4R (2,0,1,0)");
-  test_for_zero(t4R_3(2,0,1,1) - (t4R_1(2,0,1,1)-t4R_2(2,0,1,1)),
-                "T4R - T4R (2,0,1,1)");
-  test_for_zero(t4R_3(2,0,1,2) - (t4R_1(2,0,1,2)-t4R_2(2,0,1,2)),
-                "T4R - T4R (2,0,1,2)");
-  test_for_zero(t4R_3(2,0,2,0) - (t4R_1(2,0,2,0)-t4R_2(2,0,2,0)),
-                "T4R - T4R (2,0,2,0)");
-  test_for_zero(t4R_3(2,0,2,1) - (t4R_1(2,0,2,1)-t4R_2(2,0,2,1)),
-                "T4R - T4R (2,0,2,1)");
-  test_for_zero(t4R_3(2,0,2,2) - (t4R_1(2,0,2,2)-t4R_2(2,0,2,2)),
-                "T4R - T4R (2,0,2,2)");
-  test_for_zero(t4R_3(2,1,0,0) - (t4R_1(2,1,0,0)-t4R_2(2,1,0,0)),
-                "T4R - T4R (2,1,0,0)");
-  test_for_zero(t4R_3(2,1,0,1) - (t4R_1(2,1,0,1)-t4R_2(2,1,0,1)),
-                "T4R - T4R (2,1,0,1)");
-  test_for_zero(t4R_3(2,1,0,2) - (t4R_1(2,1,0,2)-t4R_2(2,1,0,2)),
-                "T4R - T4R (2,1,0,2)");
-  test_for_zero(t4R_3(2,1,1,0) - (t4R_1(2,1,1,0)-t4R_2(2,1,1,0)),
-                "T4R - T4R (2,1,1,0)");
-  test_for_zero(t4R_3(2,1,1,1) - (t4R_1(2,1,1,1)-t4R_2(2,1,1,1)),
-                "T4R - T4R (2,1,1,1)");
-  test_for_zero(t4R_3(2,1,1,2) - (t4R_1(2,1,1,2)-t4R_2(2,1,1,2)),
-                "T4R - T4R (2,1,1,2)");
-  test_for_zero(t4R_3(2,1,2,0) - (t4R_1(2,1,2,0)-t4R_2(2,1,2,0)),
-                "T4R - T4R (2,1,2,0)");
-  test_for_zero(t4R_3(2,1,2,1) - (t4R_1(2,1,2,1)-t4R_2(2,1,2,1)),
-                "T4R - T4R (2,1,2,1)");
-  test_for_zero(t4R_3(2,1,2,2) - (t4R_1(2,1,2,2)-t4R_2(2,1,2,2)),
-                "T4R - T4R (2,1,2,2)");
-  test_for_zero(t4R_3(2,2,0,0) - (t4R_1(2,2,0,0)-t4R_2(2,2,0,0)),
-                "T4R - T4R (2,2,0,0)");
-  test_for_zero(t4R_3(2,2,0,1) - (t4R_1(2,2,0,1)-t4R_2(2,2,0,1)),
-                "T4R - T4R (2,2,0,1)");
-  test_for_zero(t4R_3(2,2,0,2) - (t4R_1(2,2,0,2)-t4R_2(2,2,0,2)),
-                "T4R - T4R (2,2,0,2)");
-  test_for_zero(t4R_3(2,2,1,0) - (t4R_1(2,2,1,0)-t4R_2(2,2,1,0)),
-                "T4R - T4R (2,2,1,0)");
-  test_for_zero(t4R_3(2,2,1,1) - (t4R_1(2,2,1,1)-t4R_2(2,2,1,1)),
-                "T4R - T4R (2,2,1,1)");
-  test_for_zero(t4R_3(2,2,1,2) - (t4R_1(2,2,1,2)-t4R_2(2,2,1,2)),
-                "T4R - T4R (2,2,1,2)");
-  test_for_zero(t4R_3(2,2,2,0) - (t4R_1(2,2,2,0)-t4R_2(2,2,2,0)),
-                "T4R - T4R (2,2,2,0)");
-  test_for_zero(t4R_3(2,2,2,1) - (t4R_1(2,2,2,1)-t4R_2(2,2,2,1)),
-                "T4R - T4R (2,2,2,1)");
-  test_for_zero(t4R_3(2,2,2,2) - (t4R_1(2,2,2,2)-t4R_2(2,2,2,2)),
-                "T4R - T4R (2,2,2,2)");
-
-//   t3as_1(i,j,k)=t4R_1(i,j,k,l)*t1_2(l);
-//   t3as_1(i,j,k)=t1_2(l)*t4R_1(i,j,k,l);
-//   t3as_1(i,j,k)=t4R_1(i,j,l,k)*t1_2(l);
-//   t3as_1(i,j,k)=t1_2(l)*t4R_1(i,j,l,k);
-//   t3as_1(i,j,k)=t4R_1(i,l,j,k)*t1_2(l);
-//   t3as_1(i,j,k)=t1_2(l)*t4R_1(i,l,j,k);
-//   t3as_1(i,j,k)=t4R_1(l,i,j,k)*t1_2(l);
-//   t3as_1(i,j,k)=t1_2(l)*t4R_1(l,i,j,k);
-
-//   cout << '\n';
-
-//   test_for_zero(t4R_1(i,j,k,l)*t4ddg_2(i,j,k,l)
-//       ); test_for_zero(t4ddg_2(i,j,k,l)*t4R_1(i,j,k,l)
-//       ); test_for_zero(t4R_1(i,j,k,l)*t4ddg_2(i,k,j,l)
-//       ); test_for_zero(t4ddg_2(i,k,j,l)*t4R_1(i,j,k,l)
-//       ); test_for_zero(t4R_3(i,j,k,l)*t4ddg_2(i,j,k,l)
-//       ); test_for_zero(t4ddg_2(i,j,k,l)*t4R_3(i,j,k,l)
-//       ); test_for_zero(t4R_3(i,j,k,l)*t4ddg_2(i,k,j,l)
-//       ); test_for_zero(t4ddg_2(i,k,j,l)*t4R_3(i,j,k,l));
-
-//   cout << '\n';
-
-//   t2s_1(j,l)=t4R_1(i,j,k,l)*t2s_2(i,k);
-//   t2s_1(j,l)=t2s_2(i,k)*t4R_1(i,j,k,l);
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T4R.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/test_T4R.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,559 @@
+#include <iostream>
+#include "../../FTensor.hpp"
+#include "test_for_zero.hpp"
+using namespace FTensor;
+using namespace std;
+
+void test_T4R(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3,
+	      Tensor3_dg<double,3,3> &t3dg_1,
+	      const Tensor3_dg<double,3,3> &t3dg_2,
+	      const Tensor3_dg<double,3,3> &t3dg_3,
+	      Tensor3_antisymmetric<double,3,3> &t3as_1,
+	      const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	      const Tensor3_antisymmetric<double,3,3> &t3as_3)
+{
+  Index<'i',3> i;
+  Index<'j',3> j;
+  Index<'k',3> k;
+  Index<'l',3> l;
+  Index<'m',3> m;
+  Index<'n',3> n;
+
+  Number<0> N0;
+  Number<1> N1;
+  Number<2> N2;
+
+  Tensor4_Riemann<double,3> t4R_1, t4R_2, t4R_3;
+
+  cout << "T4_Riemann" << endl;
+
+  Tensor2_symmetric<double,3> delta_3(3,0,0,3,0,3), delta_5(5,0,0,5,0,5),
+    delta_2(2,0,0,2,0,2), delta_7(7,0,0,7,0,7);
+
+  t4R_1(i,j,k,l)=(delta_3(i,k)*delta_5(j,l) && delta_3(i,l)*delta_5(k,j));
+
+  test_for_zero(t4R_1(0,0,0,0) - (delta_3(0,0)*delta_5(0,0)-delta_3(0,0)*delta_5(0,0)),
+                "T4ddg && T4ddg (0,0,0,0)");
+  test_for_zero(t4R_1(0,0,0,1) - (delta_3(0,1)*delta_5(0,0)-delta_3(0,1)*delta_5(0,0)),
+                "T4ddg && T4ddg (0,0,0,1)");
+  test_for_zero(t4R_1(0,0,0,2) - (delta_3(0,2)*delta_5(0,0)-delta_3(0,2)*delta_5(0,0)),
+                "T4ddg && T4ddg (0,0,0,2)");
+  test_for_zero(t4R_1(0,0,1,0) - (delta_3(0,0)*delta_5(0,1)-delta_3(0,0)*delta_5(1,0)),
+                "T4ddg && T4ddg (0,0,1,0)");
+  test_for_zero(t4R_1(0,0,1,1) - (delta_3(0,1)*delta_5(0,1)-delta_3(0,1)*delta_5(1,0)),
+                "T4ddg && T4ddg (0,0,1,1)");
+  test_for_zero(t4R_1(0,0,1,2) - (delta_3(0,2)*delta_5(0,1)-delta_3(0,2)*delta_5(1,0)),
+                "T4ddg && T4ddg (0,0,1,2)");
+  test_for_zero(t4R_1(0,0,2,0) - (delta_3(0,0)*delta_5(0,2)-delta_3(0,0)*delta_5(2,0)),
+                "T4ddg && T4ddg (0,0,2,0)");
+  test_for_zero(t4R_1(0,0,2,1) - (delta_3(0,1)*delta_5(0,2)-delta_3(0,1)*delta_5(2,0)),
+                "T4ddg && T4ddg (0,0,2,1)");
+  test_for_zero(t4R_1(0,0,2,2) - (delta_3(0,2)*delta_5(0,2)-delta_3(0,2)*delta_5(2,0)),
+                "T4ddg && T4ddg (0,0,2,2)");
+  test_for_zero(t4R_1(0,1,0,0) - (delta_3(0,0)*delta_5(1,0)-delta_3(0,0)*delta_5(0,1)),
+                "T4ddg && T4ddg (0,1,0,0)");
+  test_for_zero(t4R_1(0,1,0,1) - (delta_3(0,0)*delta_5(1,1)-delta_3(0,1)*delta_5(0,1)),
+                "T4ddg && T4ddg (0,1,0,1)");
+  test_for_zero(t4R_1(0,1,0,2) - (delta_3(0,2)*delta_5(1,0)-delta_3(0,2)*delta_5(0,1)),
+                "T4ddg && T4ddg (0,1,0,2)");
+  test_for_zero(t4R_1(0,1,1,0) - (delta_3(0,0)*delta_5(1,1)-delta_3(0,0)*delta_5(1,1)),
+                "T4ddg && T4ddg (0,1,1,0)");
+  test_for_zero(t4R_1(0,1,1,1) - (delta_3(0,1)*delta_5(1,1)-delta_3(0,1)*delta_5(1,1)),
+                "T4ddg && T4ddg (0,1,1,1)");
+  test_for_zero(t4R_1(0,1,1,2) - (delta_3(0,2)*delta_5(1,1)-delta_3(0,2)*delta_5(1,1)),
+                "T4ddg && T4ddg (0,1,1,2)");
+  test_for_zero(t4R_1(0,1,2,0) - (delta_3(0,0)*delta_5(1,2)-delta_3(0,0)*delta_5(2,1)),
+                "T4ddg && T4ddg (0,1,2,0)");
+  test_for_zero(t4R_1(0,1,2,1) - (delta_3(0,1)*delta_5(1,2)-delta_3(0,1)*delta_5(2,1)),
+                "T4ddg && T4ddg (0,1,2,1)");
+  test_for_zero(t4R_1(0,1,2,2) - (delta_3(0,2)*delta_5(1,2)-delta_3(0,2)*delta_5(2,1)),
+                "T4ddg && T4ddg (0,1,2,2)");
+  test_for_zero(t4R_1(0,2,0,0) - (delta_3(0,0)*delta_5(2,0)-delta_3(0,0)*delta_5(0,2)),
+                "T4ddg && T4ddg (0,2,0,0)");
+  test_for_zero(t4R_1(0,2,0,1) - (delta_3(0,1)*delta_5(2,0)-delta_3(0,1)*delta_5(0,2)),
+                "T4ddg && T4ddg (0,2,0,1)");
+  test_for_zero(t4R_1(0,2,0,2) - (delta_3(0,0)*delta_5(2,2)-delta_3(0,2)*delta_5(0,2)),
+                "T4ddg && T4ddg (0,2,0,2)");
+  test_for_zero(t4R_1(0,2,1,0) - (delta_3(0,0)*delta_5(2,1)-delta_3(0,0)*delta_5(1,2)),
+                "T4ddg && T4ddg (0,2,1,0)");
+  test_for_zero(t4R_1(0,2,1,1) - (delta_3(0,1)*delta_5(2,1)-delta_3(0,1)*delta_5(1,2)),
+                "T4ddg && T4ddg (0,2,1,1)");
+  test_for_zero(t4R_1(0,2,1,2) - (delta_3(0,2)*delta_5(2,1)-delta_3(0,2)*delta_5(1,2)),
+                "T4ddg && T4ddg (0,2,1,2)");
+  test_for_zero(t4R_1(0,2,2,0) - (delta_3(0,0)*delta_5(2,2)-delta_3(0,0)*delta_5(2,2)),
+                "T4ddg && T4ddg (0,2,2,0)");
+  test_for_zero(t4R_1(0,2,2,1) - (delta_3(0,1)*delta_5(2,2)-delta_3(0,1)*delta_5(2,2)),
+                "T4ddg && T4ddg (0,2,2,1)");
+  test_for_zero(t4R_1(0,2,2,2) - (delta_3(0,2)*delta_5(2,2)-delta_3(0,2)*delta_5(2,2)),
+                "T4ddg && T4ddg (0,2,2,2)");
+  test_for_zero(t4R_1(1,0,0,0) - (delta_3(1,0)*delta_5(0,0)-delta_3(1,0)*delta_5(0,0)),
+                "T4ddg && T4ddg (1,0,0,0)");
+  test_for_zero(t4R_1(1,0,0,1) - (delta_3(1,1)*delta_5(0,0)-delta_3(1,1)*delta_5(0,0)),
+                "T4ddg && T4ddg (1,0,0,1)");
+  test_for_zero(t4R_1(1,0,0,2) - (delta_3(1,2)*delta_5(0,0)-delta_3(1,2)*delta_5(0,0)),
+                "T4ddg && T4ddg (1,0,0,2)");
+  test_for_zero(t4R_1(1,0,1,0) - (delta_3(1,0)*delta_5(0,1)-delta_3(1,0)*delta_5(1,0)),
+                "T4ddg && T4ddg (1,0,1,0)");
+  test_for_zero(t4R_1(1,0,1,1) - (delta_3(1,1)*delta_5(0,1)-delta_3(1,1)*delta_5(1,0)),
+                "T4ddg && T4ddg (1,0,1,1)");
+  test_for_zero(t4R_1(1,0,1,2) - (delta_3(1,2)*delta_5(0,1)-delta_3(1,2)*delta_5(1,0)),
+                "T4ddg && T4ddg (1,0,1,2)");
+  test_for_zero(t4R_1(1,0,2,0) - (delta_3(1,0)*delta_5(0,2)-delta_3(1,0)*delta_5(2,0)),
+                "T4ddg && T4ddg (1,0,2,0)");
+  test_for_zero(t4R_1(1,0,2,1) - (delta_3(1,1)*delta_5(0,2)-delta_3(1,1)*delta_5(2,0)),
+                "T4ddg && T4ddg (1,0,2,1)");
+  test_for_zero(t4R_1(1,0,2,2) - (delta_3(1,2)*delta_5(0,2)-delta_3(1,2)*delta_5(2,0)),
+                "T4ddg && T4ddg (1,0,2,2)");
+  test_for_zero(t4R_1(1,1,0,0) - (delta_3(1,0)*delta_5(1,0)-delta_3(1,0)*delta_5(0,1)),
+                "T4ddg && T4ddg (1,1,0,0)");
+  test_for_zero(t4R_1(1,1,0,1) - (delta_3(1,1)*delta_5(1,0)-delta_3(1,1)*delta_5(0,1)),
+                "T4ddg && T4ddg (1,1,0,1)");
+  test_for_zero(t4R_1(1,1,0,2) - (delta_3(1,2)*delta_5(1,0)-delta_3(1,2)*delta_5(0,1)),
+                "T4ddg && T4ddg (1,1,0,2)");
+  test_for_zero(t4R_1(1,1,1,0) - (delta_3(1,0)*delta_5(1,1)-delta_3(1,0)*delta_5(1,1)),
+                "T4ddg && T4ddg (1,1,1,0)");
+  test_for_zero(t4R_1(1,1,1,1) - (delta_3(1,1)*delta_5(1,1)-delta_3(1,1)*delta_5(1,1)),
+                "T4ddg && T4ddg (1,1,1,1)");
+  test_for_zero(t4R_1(1,1,1,2) - (delta_3(1,2)*delta_5(1,1)-delta_3(1,2)*delta_5(1,1)),
+                "T4ddg && T4ddg (1,1,1,2)");
+  test_for_zero(t4R_1(1,1,2,0) - (delta_3(1,0)*delta_5(1,2)-delta_3(1,0)*delta_5(2,1)),
+                "T4ddg && T4ddg (1,1,2,0)");
+  test_for_zero(t4R_1(1,1,2,1) - (delta_3(1,1)*delta_5(1,2)-delta_3(1,1)*delta_5(2,1)),
+                "T4ddg && T4ddg (1,1,2,1)");
+  test_for_zero(t4R_1(1,1,2,2) - (delta_3(1,2)*delta_5(1,2)-delta_3(1,2)*delta_5(2,1)),
+                "T4ddg && T4ddg (1,1,2,2)");
+  test_for_zero(t4R_1(1,2,0,0) - (delta_3(1,0)*delta_5(2,0)-delta_3(1,0)*delta_5(0,2)),
+                "T4ddg && T4ddg (1,2,0,0)");
+  test_for_zero(t4R_1(1,2,0,1) - (delta_3(1,1)*delta_5(2,0)-delta_3(1,1)*delta_5(0,2)),
+                "T4ddg && T4ddg (1,2,0,1)");
+  test_for_zero(t4R_1(1,2,0,2) - (delta_3(1,2)*delta_5(2,0)-delta_3(1,2)*delta_5(0,2)),
+                "T4ddg && T4ddg (1,2,0,2)");
+  test_for_zero(t4R_1(1,2,1,0) - (delta_3(1,0)*delta_5(2,1)-delta_3(1,0)*delta_5(1,2)),
+                "T4ddg && T4ddg (1,2,1,0)");
+  test_for_zero(t4R_1(1,2,1,1) - (delta_3(1,1)*delta_5(2,1)-delta_3(1,1)*delta_5(1,2)),
+                "T4ddg && T4ddg (1,2,1,1)");
+  test_for_zero(t4R_1(1,2,1,2) - (delta_3(1,1)*delta_5(2,2)-delta_3(1,2)*delta_5(1,2)),
+                "T4ddg && T4ddg (1,2,1,2)");
+  test_for_zero(t4R_1(1,2,2,0) - (delta_3(1,0)*delta_5(2,2)-delta_3(1,0)*delta_5(2,2)),
+                "T4ddg && T4ddg (1,2,2,0)");
+  test_for_zero(t4R_1(1,2,2,1) - (delta_3(1,1)*delta_5(2,2)-delta_3(1,1)*delta_5(2,2)),
+                "T4ddg && T4ddg (1,2,2,1)");
+  test_for_zero(t4R_1(1,2,2,2) - (delta_3(1,2)*delta_5(2,2)-delta_3(1,2)*delta_5(2,2)),
+                "T4ddg && T4ddg (1,2,2,2)");
+  test_for_zero(t4R_1(2,0,0,0) - (delta_3(2,0)*delta_5(0,0)-delta_3(2,0)*delta_5(0,0)),
+                "T4ddg && T4ddg (2,0,0,0)");
+  test_for_zero(t4R_1(2,0,0,1) - (delta_3(2,1)*delta_5(0,0)-delta_3(2,1)*delta_5(0,0)),
+                "T4ddg && T4ddg (2,0,0,1)");
+  test_for_zero(t4R_1(2,0,0,2) - (delta_3(2,2)*delta_5(0,0)-delta_3(2,2)*delta_5(0,0)),
+                "T4ddg && T4ddg (2,0,0,2)");
+  test_for_zero(t4R_1(2,0,1,0) - (delta_3(2,0)*delta_5(0,1)-delta_3(2,0)*delta_5(1,0)),
+                "T4ddg && T4ddg (2,0,1,0)");
+  test_for_zero(t4R_1(2,0,1,1) - (delta_3(2,1)*delta_5(0,1)-delta_3(2,1)*delta_5(1,0)),
+                "T4ddg && T4ddg (2,0,1,1)");
+  test_for_zero(t4R_1(2,0,1,2) - (delta_3(2,2)*delta_5(0,1)-delta_3(2,2)*delta_5(1,0)),
+                "T4ddg && T4ddg (2,0,1,2)");
+  test_for_zero(t4R_1(2,0,2,0) - (delta_3(2,0)*delta_5(0,2)-delta_3(2,0)*delta_5(2,0)),
+                "T4ddg && T4ddg (2,0,2,0)");
+  test_for_zero(t4R_1(2,0,2,1) - (delta_3(2,1)*delta_5(0,2)-delta_3(2,1)*delta_5(2,0)),
+                "T4ddg && T4ddg (2,0,2,1)");
+  test_for_zero(t4R_1(2,0,2,2) - (delta_3(2,2)*delta_5(0,2)-delta_3(2,2)*delta_5(2,0)),
+                "T4ddg && T4ddg (2,0,2,2)");
+  test_for_zero(t4R_1(2,1,0,0) - (delta_3(2,0)*delta_5(1,0)-delta_3(2,0)*delta_5(0,1)),
+                "T4ddg && T4ddg (2,1,0,0)");
+  test_for_zero(t4R_1(2,1,0,1) - (delta_3(2,1)*delta_5(1,0)-delta_3(2,1)*delta_5(0,1)),
+                "T4ddg && T4ddg (2,1,0,1)");
+  test_for_zero(t4R_1(2,1,0,2) - (delta_3(2,2)*delta_5(1,0)-delta_3(2,2)*delta_5(0,1)),
+                "T4ddg && T4ddg (2,1,0,2)");
+  test_for_zero(t4R_1(2,1,1,0) - (delta_3(2,0)*delta_5(1,1)-delta_3(2,0)*delta_5(1,1)),
+                "T4ddg && T4ddg (2,1,1,0)");
+  test_for_zero(t4R_1(2,1,1,1) - (delta_3(2,1)*delta_5(1,1)-delta_3(2,1)*delta_5(1,1)),
+                "T4ddg && T4ddg (2,1,1,1)");
+  test_for_zero(t4R_1(2,1,1,2) - (delta_3(2,2)*delta_5(1,1)-delta_3(2,2)*delta_5(1,1)),
+                "T4ddg && T4ddg (2,1,1,2)");
+  test_for_zero(t4R_1(2,1,2,0) - (delta_3(2,0)*delta_5(1,2)-delta_3(2,0)*delta_5(2,1)),
+                "T4ddg && T4ddg (2,1,2,0)");
+  test_for_zero(t4R_1(2,1,2,1) - (delta_3(2,1)*delta_5(1,2)-delta_3(2,1)*delta_5(2,1)),
+                "T4ddg && T4ddg (2,1,2,1)");
+  test_for_zero(t4R_1(2,1,2,2) - (delta_3(2,2)*delta_5(1,2)-delta_3(2,2)*delta_5(2,1)),
+                "T4ddg && T4ddg (2,1,2,2)");
+  test_for_zero(t4R_1(2,2,0,0) - (delta_3(2,0)*delta_5(2,0)-delta_3(2,0)*delta_5(0,2)),
+                "T4ddg && T4ddg (2,2,0,0)");
+  test_for_zero(t4R_1(2,2,0,1) - (delta_3(2,1)*delta_5(2,0)-delta_3(2,1)*delta_5(0,2)),
+                "T4ddg && T4ddg (2,2,0,1)");
+  test_for_zero(t4R_1(2,2,0,2) - (delta_3(2,2)*delta_5(2,0)-delta_3(2,2)*delta_5(0,2)),
+                "T4ddg && T4ddg (2,2,0,2)");
+  test_for_zero(t4R_1(2,2,1,0) - (delta_3(2,0)*delta_5(2,1)-delta_3(2,0)*delta_5(1,2)),
+                "T4ddg && T4ddg (2,2,1,0)");
+  test_for_zero(t4R_1(2,2,1,1) - (delta_3(2,1)*delta_5(2,1)-delta_3(2,1)*delta_5(1,2)),
+                "T4ddg && T4ddg (2,2,1,1)");
+  test_for_zero(t4R_1(2,2,1,2) - (delta_3(2,2)*delta_5(2,1)-delta_3(2,2)*delta_5(1,2)),
+                "T4ddg && T4ddg (2,2,1,2)");
+  test_for_zero(t4R_1(2,2,2,0) - (delta_3(2,0)*delta_5(2,2)-delta_3(2,0)*delta_5(2,2)),
+                "T4ddg && T4ddg (2,2,2,0)");
+  test_for_zero(t4R_1(2,2,2,1) - (delta_3(2,1)*delta_5(2,2)-delta_3(2,1)*delta_5(2,2)),
+                "T4ddg && T4ddg (2,2,2,1)");
+  test_for_zero(t4R_1(2,2,2,2) - (delta_3(2,2)*delta_5(2,2)-delta_3(2,2)*delta_5(2,2)),
+                "T4ddg && T4ddg (2,2,2,2)");
+
+
+  t4R_2(i,j,k,l)=(delta_2(i,k)*delta_7(j,l) && delta_2(i,l)*delta_7(k,j));
+
+  t4R_3(i,j,k,l)=t4R_1(i,j,k,l)+t4R_2(i,j,k,l);
+  test_for_zero(t4R_3(0,0,0,0) - (t4R_1(0,0,0,0)+t4R_2(0,0,0,0)),
+                "T4R + T4R (0,0,0,0)");
+  test_for_zero(t4R_3(0,0,0,1) - (t4R_1(0,0,0,1)+t4R_2(0,0,0,1)),
+                "T4R + T4R (0,0,0,1)");
+  test_for_zero(t4R_3(0,0,0,2) - (t4R_1(0,0,0,2)+t4R_2(0,0,0,2)),
+                "T4R + T4R (0,0,0,2)");
+  test_for_zero(t4R_3(0,0,1,0) - (t4R_1(0,0,1,0)+t4R_2(0,0,1,0)),
+                "T4R + T4R (0,0,1,0)");
+  test_for_zero(t4R_3(0,0,1,1) - (t4R_1(0,0,1,1)+t4R_2(0,0,1,1)),
+                "T4R + T4R (0,0,1,1)");
+  test_for_zero(t4R_3(0,0,1,2) - (t4R_1(0,0,1,2)+t4R_2(0,0,1,2)),
+                "T4R + T4R (0,0,1,2)");
+  test_for_zero(t4R_3(0,0,2,0) - (t4R_1(0,0,2,0)+t4R_2(0,0,2,0)),
+                "T4R + T4R (0,0,2,0)");
+  test_for_zero(t4R_3(0,0,2,1) - (t4R_1(0,0,2,1)+t4R_2(0,0,2,1)),
+                "T4R + T4R (0,0,2,1)");
+  test_for_zero(t4R_3(0,0,2,2) - (t4R_1(0,0,2,2)+t4R_2(0,0,2,2)),
+                "T4R + T4R (0,0,2,2)");
+  test_for_zero(t4R_3(0,1,0,0) - (t4R_1(0,1,0,0)+t4R_2(0,1,0,0)),
+                "T4R + T4R (0,1,0,0)");
+  test_for_zero(t4R_3(0,1,0,1) - (t4R_1(0,1,0,1)+t4R_2(0,1,0,1)),
+                "T4R + T4R (0,1,0,1)");
+  test_for_zero(t4R_3(0,1,0,2) - (t4R_1(0,1,0,2)+t4R_2(0,1,0,2)),
+                "T4R + T4R (0,1,0,2)");
+  test_for_zero(t4R_3(0,1,1,0) - (t4R_1(0,1,1,0)+t4R_2(0,1,1,0)),
+                "T4R + T4R (0,1,1,0)");
+  test_for_zero(t4R_3(0,1,1,1) - (t4R_1(0,1,1,1)+t4R_2(0,1,1,1)),
+                "T4R + T4R (0,1,1,1)");
+  test_for_zero(t4R_3(0,1,1,2) - (t4R_1(0,1,1,2)+t4R_2(0,1,1,2)),
+                "T4R + T4R (0,1,1,2)");
+  test_for_zero(t4R_3(0,1,2,0) - (t4R_1(0,1,2,0)+t4R_2(0,1,2,0)),
+                "T4R + T4R (0,1,2,0)");
+  test_for_zero(t4R_3(0,1,2,1) - (t4R_1(0,1,2,1)+t4R_2(0,1,2,1)),
+                "T4R + T4R (0,1,2,1)");
+  test_for_zero(t4R_3(0,1,2,2) - (t4R_1(0,1,2,2)+t4R_2(0,1,2,2)),
+                "T4R + T4R (0,1,2,2)");
+  test_for_zero(t4R_3(0,2,0,0) - (t4R_1(0,2,0,0)+t4R_2(0,2,0,0)),
+                "T4R + T4R (0,2,0,0)");
+  test_for_zero(t4R_3(0,2,0,1) - (t4R_1(0,2,0,1)+t4R_2(0,2,0,1)),
+                "T4R + T4R (0,2,0,1)");
+  test_for_zero(t4R_3(0,2,0,2) - (t4R_1(0,2,0,2)+t4R_2(0,2,0,2)),
+                "T4R + T4R (0,2,0,2)");
+  test_for_zero(t4R_3(0,2,1,0) - (t4R_1(0,2,1,0)+t4R_2(0,2,1,0)),
+                "T4R + T4R (0,2,1,0)");
+  test_for_zero(t4R_3(0,2,1,1) - (t4R_1(0,2,1,1)+t4R_2(0,2,1,1)),
+                "T4R + T4R (0,2,1,1)");
+  test_for_zero(t4R_3(0,2,1,2) - (t4R_1(0,2,1,2)+t4R_2(0,2,1,2)),
+                "T4R + T4R (0,2,1,2)");
+  test_for_zero(t4R_3(0,2,2,0) - (t4R_1(0,2,2,0)+t4R_2(0,2,2,0)),
+                "T4R + T4R (0,2,2,0)");
+  test_for_zero(t4R_3(0,2,2,1) - (t4R_1(0,2,2,1)+t4R_2(0,2,2,1)),
+                "T4R + T4R (0,2,2,1)");
+  test_for_zero(t4R_3(0,2,2,2) - (t4R_1(0,2,2,2)+t4R_2(0,2,2,2)),
+                "T4R + T4R (0,2,2,2)");
+  test_for_zero(t4R_3(1,0,0,0) - (t4R_1(1,0,0,0)+t4R_2(1,0,0,0)),
+                "T4R + T4R (1,0,0,0)");
+  test_for_zero(t4R_3(1,0,0,1) - (t4R_1(1,0,0,1)+t4R_2(1,0,0,1)),
+                "T4R + T4R (1,0,0,1)");
+  test_for_zero(t4R_3(1,0,0,2) - (t4R_1(1,0,0,2)+t4R_2(1,0,0,2)),
+                "T4R + T4R (1,0,0,2)");
+  test_for_zero(t4R_3(1,0,1,0) - (t4R_1(1,0,1,0)+t4R_2(1,0,1,0)),
+                "T4R + T4R (1,0,1,0)");
+  test_for_zero(t4R_3(1,0,1,1) - (t4R_1(1,0,1,1)+t4R_2(1,0,1,1)),
+                "T4R + T4R (1,0,1,1)");
+  test_for_zero(t4R_3(1,0,1,2) - (t4R_1(1,0,1,2)+t4R_2(1,0,1,2)),
+                "T4R + T4R (1,0,1,2)");
+  test_for_zero(t4R_3(1,0,2,0) - (t4R_1(1,0,2,0)+t4R_2(1,0,2,0)),
+                "T4R + T4R (1,0,2,0)");
+  test_for_zero(t4R_3(1,0,2,1) - (t4R_1(1,0,2,1)+t4R_2(1,0,2,1)),
+                "T4R + T4R (1,0,2,1)");
+  test_for_zero(t4R_3(1,0,2,2) - (t4R_1(1,0,2,2)+t4R_2(1,0,2,2)),
+                "T4R + T4R (1,0,2,2)");
+  test_for_zero(t4R_3(1,1,0,0) - (t4R_1(1,1,0,0)+t4R_2(1,1,0,0)),
+                "T4R + T4R (1,1,0,0)");
+  test_for_zero(t4R_3(1,1,0,1) - (t4R_1(1,1,0,1)+t4R_2(1,1,0,1)),
+                "T4R + T4R (1,1,0,1)");
+  test_for_zero(t4R_3(1,1,0,2) - (t4R_1(1,1,0,2)+t4R_2(1,1,0,2)),
+                "T4R + T4R (1,1,0,2)");
+  test_for_zero(t4R_3(1,1,1,0) - (t4R_1(1,1,1,0)+t4R_2(1,1,1,0)),
+                "T4R + T4R (1,1,1,0)");
+  test_for_zero(t4R_3(1,1,1,1) - (t4R_1(1,1,1,1)+t4R_2(1,1,1,1)),
+                "T4R + T4R (1,1,1,1)");
+  test_for_zero(t4R_3(1,1,1,2) - (t4R_1(1,1,1,2)+t4R_2(1,1,1,2)),
+                "T4R + T4R (1,1,1,2)");
+  test_for_zero(t4R_3(1,1,2,0) - (t4R_1(1,1,2,0)+t4R_2(1,1,2,0)),
+                "T4R + T4R (1,1,2,0)");
+  test_for_zero(t4R_3(1,1,2,1) - (t4R_1(1,1,2,1)+t4R_2(1,1,2,1)),
+                "T4R + T4R (1,1,2,1)");
+  test_for_zero(t4R_3(1,1,2,2) - (t4R_1(1,1,2,2)+t4R_2(1,1,2,2)),
+                "T4R + T4R (1,1,2,2)");
+  test_for_zero(t4R_3(1,2,0,0) - (t4R_1(1,2,0,0)+t4R_2(1,2,0,0)),
+                "T4R + T4R (1,2,0,0)");
+  test_for_zero(t4R_3(1,2,0,1) - (t4R_1(1,2,0,1)+t4R_2(1,2,0,1)),
+                "T4R + T4R (1,2,0,1)");
+  test_for_zero(t4R_3(1,2,0,2) - (t4R_1(1,2,0,2)+t4R_2(1,2,0,2)),
+                "T4R + T4R (1,2,0,2)");
+  test_for_zero(t4R_3(1,2,1,0) - (t4R_1(1,2,1,0)+t4R_2(1,2,1,0)),
+                "T4R + T4R (1,2,1,0)");
+  test_for_zero(t4R_3(1,2,1,1) - (t4R_1(1,2,1,1)+t4R_2(1,2,1,1)),
+                "T4R + T4R (1,2,1,1)");
+  test_for_zero(t4R_3(1,2,1,2) - (t4R_1(1,2,1,2)+t4R_2(1,2,1,2)),
+                "T4R + T4R (1,2,1,2)");
+  test_for_zero(t4R_3(1,2,2,0) - (t4R_1(1,2,2,0)+t4R_2(1,2,2,0)),
+                "T4R + T4R (1,2,2,0)");
+  test_for_zero(t4R_3(1,2,2,1) - (t4R_1(1,2,2,1)+t4R_2(1,2,2,1)),
+                "T4R + T4R (1,2,2,1)");
+  test_for_zero(t4R_3(1,2,2,2) - (t4R_1(1,2,2,2)+t4R_2(1,2,2,2)),
+                "T4R + T4R (1,2,2,2)");
+  test_for_zero(t4R_3(2,0,0,0) - (t4R_1(2,0,0,0)+t4R_2(2,0,0,0)),
+                "T4R + T4R (2,0,0,0)");
+  test_for_zero(t4R_3(2,0,0,1) - (t4R_1(2,0,0,1)+t4R_2(2,0,0,1)),
+                "T4R + T4R (2,0,0,1)");
+  test_for_zero(t4R_3(2,0,0,2) - (t4R_1(2,0,0,2)+t4R_2(2,0,0,2)),
+                "T4R + T4R (2,0,0,2)");
+  test_for_zero(t4R_3(2,0,1,0) - (t4R_1(2,0,1,0)+t4R_2(2,0,1,0)),
+                "T4R + T4R (2,0,1,0)");
+  test_for_zero(t4R_3(2,0,1,1) - (t4R_1(2,0,1,1)+t4R_2(2,0,1,1)),
+                "T4R + T4R (2,0,1,1)");
+  test_for_zero(t4R_3(2,0,1,2) - (t4R_1(2,0,1,2)+t4R_2(2,0,1,2)),
+                "T4R + T4R (2,0,1,2)");
+  test_for_zero(t4R_3(2,0,2,0) - (t4R_1(2,0,2,0)+t4R_2(2,0,2,0)),
+                "T4R + T4R (2,0,2,0)");
+  test_for_zero(t4R_3(2,0,2,1) - (t4R_1(2,0,2,1)+t4R_2(2,0,2,1)),
+                "T4R + T4R (2,0,2,1)");
+  test_for_zero(t4R_3(2,0,2,2) - (t4R_1(2,0,2,2)+t4R_2(2,0,2,2)),
+                "T4R + T4R (2,0,2,2)");
+  test_for_zero(t4R_3(2,1,0,0) - (t4R_1(2,1,0,0)+t4R_2(2,1,0,0)),
+                "T4R + T4R (2,1,0,0)");
+  test_for_zero(t4R_3(2,1,0,1) - (t4R_1(2,1,0,1)+t4R_2(2,1,0,1)),
+                "T4R + T4R (2,1,0,1)");
+  test_for_zero(t4R_3(2,1,0,2) - (t4R_1(2,1,0,2)+t4R_2(2,1,0,2)),
+                "T4R + T4R (2,1,0,2)");
+  test_for_zero(t4R_3(2,1,1,0) - (t4R_1(2,1,1,0)+t4R_2(2,1,1,0)),
+                "T4R + T4R (2,1,1,0)");
+  test_for_zero(t4R_3(2,1,1,1) - (t4R_1(2,1,1,1)+t4R_2(2,1,1,1)),
+                "T4R + T4R (2,1,1,1)");
+  test_for_zero(t4R_3(2,1,1,2) - (t4R_1(2,1,1,2)+t4R_2(2,1,1,2)),
+                "T4R + T4R (2,1,1,2)");
+  test_for_zero(t4R_3(2,1,2,0) - (t4R_1(2,1,2,0)+t4R_2(2,1,2,0)),
+                "T4R + T4R (2,1,2,0)");
+  test_for_zero(t4R_3(2,1,2,1) - (t4R_1(2,1,2,1)+t4R_2(2,1,2,1)),
+                "T4R + T4R (2,1,2,1)");
+  test_for_zero(t4R_3(2,1,2,2) - (t4R_1(2,1,2,2)+t4R_2(2,1,2,2)),
+                "T4R + T4R (2,1,2,2)");
+  test_for_zero(t4R_3(2,2,0,0) - (t4R_1(2,2,0,0)+t4R_2(2,2,0,0)),
+                "T4R + T4R (2,2,0,0)");
+  test_for_zero(t4R_3(2,2,0,1) - (t4R_1(2,2,0,1)+t4R_2(2,2,0,1)),
+                "T4R + T4R (2,2,0,1)");
+  test_for_zero(t4R_3(2,2,0,2) - (t4R_1(2,2,0,2)+t4R_2(2,2,0,2)),
+                "T4R + T4R (2,2,0,2)");
+  test_for_zero(t4R_3(2,2,1,0) - (t4R_1(2,2,1,0)+t4R_2(2,2,1,0)),
+                "T4R + T4R (2,2,1,0)");
+  test_for_zero(t4R_3(2,2,1,1) - (t4R_1(2,2,1,1)+t4R_2(2,2,1,1)),
+                "T4R + T4R (2,2,1,1)");
+  test_for_zero(t4R_3(2,2,1,2) - (t4R_1(2,2,1,2)+t4R_2(2,2,1,2)),
+                "T4R + T4R (2,2,1,2)");
+  test_for_zero(t4R_3(2,2,2,0) - (t4R_1(2,2,2,0)+t4R_2(2,2,2,0)),
+                "T4R + T4R (2,2,2,0)");
+  test_for_zero(t4R_3(2,2,2,1) - (t4R_1(2,2,2,1)+t4R_2(2,2,2,1)),
+                "T4R + T4R (2,2,2,1)");
+  test_for_zero(t4R_3(2,2,2,2) - (t4R_1(2,2,2,2)+t4R_2(2,2,2,2)),
+                "T4R + T4R (2,2,2,2)");
+
+  t4R_3(i,j,k,l)=t4R_1(i,j,k,l)-t4R_2(i,j,k,l);
+  test_for_zero(t4R_3(0,0,0,0) - (t4R_1(0,0,0,0)-t4R_2(0,0,0,0)),
+                "T4R - T4R (0,0,0,0)");
+  test_for_zero(t4R_3(0,0,0,1) - (t4R_1(0,0,0,1)-t4R_2(0,0,0,1)),
+                "T4R - T4R (0,0,0,1)");
+  test_for_zero(t4R_3(0,0,0,2) - (t4R_1(0,0,0,2)-t4R_2(0,0,0,2)),
+                "T4R - T4R (0,0,0,2)");
+  test_for_zero(t4R_3(0,0,1,0) - (t4R_1(0,0,1,0)-t4R_2(0,0,1,0)),
+                "T4R - T4R (0,0,1,0)");
+  test_for_zero(t4R_3(0,0,1,1) - (t4R_1(0,0,1,1)-t4R_2(0,0,1,1)),
+                "T4R - T4R (0,0,1,1)");
+  test_for_zero(t4R_3(0,0,1,2) - (t4R_1(0,0,1,2)-t4R_2(0,0,1,2)),
+                "T4R - T4R (0,0,1,2)");
+  test_for_zero(t4R_3(0,0,2,0) - (t4R_1(0,0,2,0)-t4R_2(0,0,2,0)),
+                "T4R - T4R (0,0,2,0)");
+  test_for_zero(t4R_3(0,0,2,1) - (t4R_1(0,0,2,1)-t4R_2(0,0,2,1)),
+                "T4R - T4R (0,0,2,1)");
+  test_for_zero(t4R_3(0,0,2,2) - (t4R_1(0,0,2,2)-t4R_2(0,0,2,2)),
+                "T4R - T4R (0,0,2,2)");
+  test_for_zero(t4R_3(0,1,0,0) - (t4R_1(0,1,0,0)-t4R_2(0,1,0,0)),
+                "T4R - T4R (0,1,0,0)");
+  test_for_zero(t4R_3(0,1,0,1) - (t4R_1(0,1,0,1)-t4R_2(0,1,0,1)),
+                "T4R - T4R (0,1,0,1)");
+  test_for_zero(t4R_3(0,1,0,2) - (t4R_1(0,1,0,2)-t4R_2(0,1,0,2)),
+                "T4R - T4R (0,1,0,2)");
+  test_for_zero(t4R_3(0,1,1,0) - (t4R_1(0,1,1,0)-t4R_2(0,1,1,0)),
+                "T4R - T4R (0,1,1,0)");
+  test_for_zero(t4R_3(0,1,1,1) - (t4R_1(0,1,1,1)-t4R_2(0,1,1,1)),
+                "T4R - T4R (0,1,1,1)");
+  test_for_zero(t4R_3(0,1,1,2) - (t4R_1(0,1,1,2)-t4R_2(0,1,1,2)),
+                "T4R - T4R (0,1,1,2)");
+  test_for_zero(t4R_3(0,1,2,0) - (t4R_1(0,1,2,0)-t4R_2(0,1,2,0)),
+                "T4R - T4R (0,1,2,0)");
+  test_for_zero(t4R_3(0,1,2,1) - (t4R_1(0,1,2,1)-t4R_2(0,1,2,1)),
+                "T4R - T4R (0,1,2,1)");
+  test_for_zero(t4R_3(0,1,2,2) - (t4R_1(0,1,2,2)-t4R_2(0,1,2,2)),
+                "T4R - T4R (0,1,2,2)");
+  test_for_zero(t4R_3(0,2,0,0) - (t4R_1(0,2,0,0)-t4R_2(0,2,0,0)),
+                "T4R - T4R (0,2,0,0)");
+  test_for_zero(t4R_3(0,2,0,1) - (t4R_1(0,2,0,1)-t4R_2(0,2,0,1)),
+                "T4R - T4R (0,2,0,1)");
+  test_for_zero(t4R_3(0,2,0,2) - (t4R_1(0,2,0,2)-t4R_2(0,2,0,2)),
+                "T4R - T4R (0,2,0,2)");
+  test_for_zero(t4R_3(0,2,1,0) - (t4R_1(0,2,1,0)-t4R_2(0,2,1,0)),
+                "T4R - T4R (0,2,1,0)");
+  test_for_zero(t4R_3(0,2,1,1) - (t4R_1(0,2,1,1)-t4R_2(0,2,1,1)),
+                "T4R - T4R (0,2,1,1)");
+  test_for_zero(t4R_3(0,2,1,2) - (t4R_1(0,2,1,2)-t4R_2(0,2,1,2)),
+                "T4R - T4R (0,2,1,2)");
+  test_for_zero(t4R_3(0,2,2,0) - (t4R_1(0,2,2,0)-t4R_2(0,2,2,0)),
+                "T4R - T4R (0,2,2,0)");
+  test_for_zero(t4R_3(0,2,2,1) - (t4R_1(0,2,2,1)-t4R_2(0,2,2,1)),
+                "T4R - T4R (0,2,2,1)");
+  test_for_zero(t4R_3(0,2,2,2) - (t4R_1(0,2,2,2)-t4R_2(0,2,2,2)),
+                "T4R - T4R (0,2,2,2)");
+  test_for_zero(t4R_3(1,0,0,0) - (t4R_1(1,0,0,0)-t4R_2(1,0,0,0)),
+                "T4R - T4R (1,0,0,0)");
+  test_for_zero(t4R_3(1,0,0,1) - (t4R_1(1,0,0,1)-t4R_2(1,0,0,1)),
+                "T4R - T4R (1,0,0,1)");
+  test_for_zero(t4R_3(1,0,0,2) - (t4R_1(1,0,0,2)-t4R_2(1,0,0,2)),
+                "T4R - T4R (1,0,0,2)");
+  test_for_zero(t4R_3(1,0,1,0) - (t4R_1(1,0,1,0)-t4R_2(1,0,1,0)),
+                "T4R - T4R (1,0,1,0)");
+  test_for_zero(t4R_3(1,0,1,1) - (t4R_1(1,0,1,1)-t4R_2(1,0,1,1)),
+                "T4R - T4R (1,0,1,1)");
+  test_for_zero(t4R_3(1,0,1,2) - (t4R_1(1,0,1,2)-t4R_2(1,0,1,2)),
+                "T4R - T4R (1,0,1,2)");
+  test_for_zero(t4R_3(1,0,2,0) - (t4R_1(1,0,2,0)-t4R_2(1,0,2,0)),
+                "T4R - T4R (1,0,2,0)");
+  test_for_zero(t4R_3(1,0,2,1) - (t4R_1(1,0,2,1)-t4R_2(1,0,2,1)),
+                "T4R - T4R (1,0,2,1)");
+  test_for_zero(t4R_3(1,0,2,2) - (t4R_1(1,0,2,2)-t4R_2(1,0,2,2)),
+                "T4R - T4R (1,0,2,2)");
+  test_for_zero(t4R_3(1,1,0,0) - (t4R_1(1,1,0,0)-t4R_2(1,1,0,0)),
+                "T4R - T4R (1,1,0,0)");
+  test_for_zero(t4R_3(1,1,0,1) - (t4R_1(1,1,0,1)-t4R_2(1,1,0,1)),
+                "T4R - T4R (1,1,0,1)");
+  test_for_zero(t4R_3(1,1,0,2) - (t4R_1(1,1,0,2)-t4R_2(1,1,0,2)),
+                "T4R - T4R (1,1,0,2)");
+  test_for_zero(t4R_3(1,1,1,0) - (t4R_1(1,1,1,0)-t4R_2(1,1,1,0)),
+                "T4R - T4R (1,1,1,0)");
+  test_for_zero(t4R_3(1,1,1,1) - (t4R_1(1,1,1,1)-t4R_2(1,1,1,1)),
+                "T4R - T4R (1,1,1,1)");
+  test_for_zero(t4R_3(1,1,1,2) - (t4R_1(1,1,1,2)-t4R_2(1,1,1,2)),
+                "T4R - T4R (1,1,1,2)");
+  test_for_zero(t4R_3(1,1,2,0) - (t4R_1(1,1,2,0)-t4R_2(1,1,2,0)),
+                "T4R - T4R (1,1,2,0)");
+  test_for_zero(t4R_3(1,1,2,1) - (t4R_1(1,1,2,1)-t4R_2(1,1,2,1)),
+                "T4R - T4R (1,1,2,1)");
+  test_for_zero(t4R_3(1,1,2,2) - (t4R_1(1,1,2,2)-t4R_2(1,1,2,2)),
+                "T4R - T4R (1,1,2,2)");
+  test_for_zero(t4R_3(1,2,0,0) - (t4R_1(1,2,0,0)-t4R_2(1,2,0,0)),
+                "T4R - T4R (1,2,0,0)");
+  test_for_zero(t4R_3(1,2,0,1) - (t4R_1(1,2,0,1)-t4R_2(1,2,0,1)),
+                "T4R - T4R (1,2,0,1)");
+  test_for_zero(t4R_3(1,2,0,2) - (t4R_1(1,2,0,2)-t4R_2(1,2,0,2)),
+                "T4R - T4R (1,2,0,2)");
+  test_for_zero(t4R_3(1,2,1,0) - (t4R_1(1,2,1,0)-t4R_2(1,2,1,0)),
+                "T4R - T4R (1,2,1,0)");
+  test_for_zero(t4R_3(1,2,1,1) - (t4R_1(1,2,1,1)-t4R_2(1,2,1,1)),
+                "T4R - T4R (1,2,1,1)");
+  test_for_zero(t4R_3(1,2,1,2) - (t4R_1(1,2,1,2)-t4R_2(1,2,1,2)),
+                "T4R - T4R (1,2,1,2)");
+  test_for_zero(t4R_3(1,2,2,0) - (t4R_1(1,2,2,0)-t4R_2(1,2,2,0)),
+                "T4R - T4R (1,2,2,0)");
+  test_for_zero(t4R_3(1,2,2,1) - (t4R_1(1,2,2,1)-t4R_2(1,2,2,1)),
+                "T4R - T4R (1,2,2,1)");
+  test_for_zero(t4R_3(1,2,2,2) - (t4R_1(1,2,2,2)-t4R_2(1,2,2,2)),
+                "T4R - T4R (1,2,2,2)");
+  test_for_zero(t4R_3(2,0,0,0) - (t4R_1(2,0,0,0)-t4R_2(2,0,0,0)),
+                "T4R - T4R (2,0,0,0)");
+  test_for_zero(t4R_3(2,0,0,1) - (t4R_1(2,0,0,1)-t4R_2(2,0,0,1)),
+                "T4R - T4R (2,0,0,1)");
+  test_for_zero(t4R_3(2,0,0,2) - (t4R_1(2,0,0,2)-t4R_2(2,0,0,2)),
+                "T4R - T4R (2,0,0,2)");
+  test_for_zero(t4R_3(2,0,1,0) - (t4R_1(2,0,1,0)-t4R_2(2,0,1,0)),
+                "T4R - T4R (2,0,1,0)");
+  test_for_zero(t4R_3(2,0,1,1) - (t4R_1(2,0,1,1)-t4R_2(2,0,1,1)),
+                "T4R - T4R (2,0,1,1)");
+  test_for_zero(t4R_3(2,0,1,2) - (t4R_1(2,0,1,2)-t4R_2(2,0,1,2)),
+                "T4R - T4R (2,0,1,2)");
+  test_for_zero(t4R_3(2,0,2,0) - (t4R_1(2,0,2,0)-t4R_2(2,0,2,0)),
+                "T4R - T4R (2,0,2,0)");
+  test_for_zero(t4R_3(2,0,2,1) - (t4R_1(2,0,2,1)-t4R_2(2,0,2,1)),
+                "T4R - T4R (2,0,2,1)");
+  test_for_zero(t4R_3(2,0,2,2) - (t4R_1(2,0,2,2)-t4R_2(2,0,2,2)),
+                "T4R - T4R (2,0,2,2)");
+  test_for_zero(t4R_3(2,1,0,0) - (t4R_1(2,1,0,0)-t4R_2(2,1,0,0)),
+                "T4R - T4R (2,1,0,0)");
+  test_for_zero(t4R_3(2,1,0,1) - (t4R_1(2,1,0,1)-t4R_2(2,1,0,1)),
+                "T4R - T4R (2,1,0,1)");
+  test_for_zero(t4R_3(2,1,0,2) - (t4R_1(2,1,0,2)-t4R_2(2,1,0,2)),
+                "T4R - T4R (2,1,0,2)");
+  test_for_zero(t4R_3(2,1,1,0) - (t4R_1(2,1,1,0)-t4R_2(2,1,1,0)),
+                "T4R - T4R (2,1,1,0)");
+  test_for_zero(t4R_3(2,1,1,1) - (t4R_1(2,1,1,1)-t4R_2(2,1,1,1)),
+                "T4R - T4R (2,1,1,1)");
+  test_for_zero(t4R_3(2,1,1,2) - (t4R_1(2,1,1,2)-t4R_2(2,1,1,2)),
+                "T4R - T4R (2,1,1,2)");
+  test_for_zero(t4R_3(2,1,2,0) - (t4R_1(2,1,2,0)-t4R_2(2,1,2,0)),
+                "T4R - T4R (2,1,2,0)");
+  test_for_zero(t4R_3(2,1,2,1) - (t4R_1(2,1,2,1)-t4R_2(2,1,2,1)),
+                "T4R - T4R (2,1,2,1)");
+  test_for_zero(t4R_3(2,1,2,2) - (t4R_1(2,1,2,2)-t4R_2(2,1,2,2)),
+                "T4R - T4R (2,1,2,2)");
+  test_for_zero(t4R_3(2,2,0,0) - (t4R_1(2,2,0,0)-t4R_2(2,2,0,0)),
+                "T4R - T4R (2,2,0,0)");
+  test_for_zero(t4R_3(2,2,0,1) - (t4R_1(2,2,0,1)-t4R_2(2,2,0,1)),
+                "T4R - T4R (2,2,0,1)");
+  test_for_zero(t4R_3(2,2,0,2) - (t4R_1(2,2,0,2)-t4R_2(2,2,0,2)),
+                "T4R - T4R (2,2,0,2)");
+  test_for_zero(t4R_3(2,2,1,0) - (t4R_1(2,2,1,0)-t4R_2(2,2,1,0)),
+                "T4R - T4R (2,2,1,0)");
+  test_for_zero(t4R_3(2,2,1,1) - (t4R_1(2,2,1,1)-t4R_2(2,2,1,1)),
+                "T4R - T4R (2,2,1,1)");
+  test_for_zero(t4R_3(2,2,1,2) - (t4R_1(2,2,1,2)-t4R_2(2,2,1,2)),
+                "T4R - T4R (2,2,1,2)");
+  test_for_zero(t4R_3(2,2,2,0) - (t4R_1(2,2,2,0)-t4R_2(2,2,2,0)),
+                "T4R - T4R (2,2,2,0)");
+  test_for_zero(t4R_3(2,2,2,1) - (t4R_1(2,2,2,1)-t4R_2(2,2,2,1)),
+                "T4R - T4R (2,2,2,1)");
+  test_for_zero(t4R_3(2,2,2,2) - (t4R_1(2,2,2,2)-t4R_2(2,2,2,2)),
+                "T4R - T4R (2,2,2,2)");
+
+//   t3as_1(i,j,k)=t4R_1(i,j,k,l)*t1_2(l);
+//   t3as_1(i,j,k)=t1_2(l)*t4R_1(i,j,k,l);
+//   t3as_1(i,j,k)=t4R_1(i,j,l,k)*t1_2(l);
+//   t3as_1(i,j,k)=t1_2(l)*t4R_1(i,j,l,k);
+//   t3as_1(i,j,k)=t4R_1(i,l,j,k)*t1_2(l);
+//   t3as_1(i,j,k)=t1_2(l)*t4R_1(i,l,j,k);
+//   t3as_1(i,j,k)=t4R_1(l,i,j,k)*t1_2(l);
+//   t3as_1(i,j,k)=t1_2(l)*t4R_1(l,i,j,k);
+
+//   cout << '\n';
+
+//   test_for_zero(t4R_1(i,j,k,l)*t4ddg_2(i,j,k,l)
+//       ); test_for_zero(t4ddg_2(i,j,k,l)*t4R_1(i,j,k,l)
+//       ); test_for_zero(t4R_1(i,j,k,l)*t4ddg_2(i,k,j,l)
+//       ); test_for_zero(t4ddg_2(i,k,j,l)*t4R_1(i,j,k,l)
+//       ); test_for_zero(t4R_3(i,j,k,l)*t4ddg_2(i,j,k,l)
+//       ); test_for_zero(t4ddg_2(i,j,k,l)*t4R_3(i,j,k,l)
+//       ); test_for_zero(t4R_3(i,j,k,l)*t4ddg_2(i,k,j,l)
+//       ); test_for_zero(t4ddg_2(i,k,j,l)*t4R_3(i,j,k,l));
+
+//   cout << '\n';
+
+//   t2s_1(j,l)=t4R_1(i,j,k,l)*t2s_2(i,k);
+//   t2s_1(j,l)=t2s_2(i,k)*t4R_1(i,j,k,l);
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T4R.h
--- a/tests/conformance/test_T4R.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-extern
-void test_T4R(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-	      const Tensor2<double,3,3> &t2_3,
-	      Tensor2_symmetric<double,3> &t2s_1,
-	      const Tensor2_symmetric<double,3> &t2s_2,
-	      const Tensor2_symmetric<double,3> &t2s_3,
-	      Tensor3_dg<double,3,3> &t3dg_1,
-	      const Tensor3_dg<double,3,3> &t3dg_2,
-	      const Tensor3_dg<double,3,3> &t3dg_3,
-	      Tensor3_antisymmetric<double,3,3> &t3as_1,
-	      const Tensor3_antisymmetric<double,3,3> &t3as_2,
-	      const Tensor3_antisymmetric<double,3,3> &t3as_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T4R.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/test_T4R.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,14 @@
+extern
+void test_T4R(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+	      Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+	      Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+	      const Tensor2<double,3,3> &t2_3,
+	      Tensor2_symmetric<double,3> &t2s_1,
+	      const Tensor2_symmetric<double,3> &t2s_2,
+	      const Tensor2_symmetric<double,3> &t2s_3,
+	      Tensor3_dg<double,3,3> &t3dg_1,
+	      const Tensor3_dg<double,3,3> &t3dg_2,
+	      const Tensor3_dg<double,3,3> &t3dg_3,
+	      Tensor3_antisymmetric<double,3,3> &t3as_1,
+	      const Tensor3_antisymmetric<double,3,3> &t3as_2,
+	      const Tensor3_antisymmetric<double,3,3> &t3as_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T4ddg.h
--- a/tests/conformance/test_T4ddg.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-extern
-void test_T4ddg(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-		Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-		Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-		const Tensor2<double,3,3> &t2_3,
-		Tensor2_symmetric<double,3> &t2s_1,
-		const Tensor2_symmetric<double,3> &t2s_2,
-		const Tensor2_symmetric<double,3> &t2s_3,
-		Tensor3_dg<double,3,3> &t3dg_1,
-		const Tensor3_dg<double,3,3> &t3dg_2,
-		const Tensor3_dg<double,3,3> &t3dg_3,
-		Tensor3_christof<double,3,3> &t3ch_1,
-		const Tensor3_christof<double,3,3> &t3ch_2,
-		const Tensor3_christof<double,3,3> &t3ch_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T4ddg.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/test_T4ddg.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,14 @@
+extern
+void test_T4ddg(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+		Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+		Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+		const Tensor2<double,3,3> &t2_3,
+		Tensor2_symmetric<double,3> &t2s_1,
+		const Tensor2_symmetric<double,3> &t2s_2,
+		const Tensor2_symmetric<double,3> &t2s_3,
+		Tensor3_dg<double,3,3> &t3dg_1,
+		const Tensor3_dg<double,3,3> &t3dg_2,
+		const Tensor3_dg<double,3,3> &t3dg_3,
+		Tensor3_christof<double,3,3> &t3ch_1,
+		const Tensor3_christof<double,3,3> &t3ch_2,
+		const Tensor3_christof<double,3,3> &t3ch_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T4ddgII.h
--- a/tests/conformance/test_T4ddgII.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-extern void test_T4ddgII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-		Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-		Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-		const Tensor2<double,3,3> &t2_3,
-		Tensor2_symmetric<double,3> &t2s_1,
-		const Tensor2_symmetric<double,3> &t2s_2,
-		const Tensor2_symmetric<double,3> &t2s_3,
-		Tensor3_dg<double,3,3> &t3dg_1,
-		const Tensor3_dg<double,3,3> &t3dg_2,
-		const Tensor3_dg<double,3,3> &t3dg_3,
-		Tensor3_christof<double,3,3> &t3ch_1,
-		const Tensor3_christof<double,3,3> &t3ch_2,
-		       const Tensor3_christof<double,3,3> &t3ch_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T4ddgII.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/test_T4ddgII.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,13 @@
+extern void test_T4ddgII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+		Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+		Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+		const Tensor2<double,3,3> &t2_3,
+		Tensor2_symmetric<double,3> &t2s_1,
+		const Tensor2_symmetric<double,3> &t2s_2,
+		const Tensor2_symmetric<double,3> &t2s_3,
+		Tensor3_dg<double,3,3> &t3dg_1,
+		const Tensor3_dg<double,3,3> &t3dg_2,
+		const Tensor3_dg<double,3,3> &t3dg_3,
+		Tensor3_christof<double,3,3> &t3ch_1,
+		const Tensor3_christof<double,3,3> &t3ch_2,
+		       const Tensor3_christof<double,3,3> &t3ch_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T4ddgIII.h
--- a/tests/conformance/test_T4ddgIII.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-extern void test_T4ddgIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-		Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-		Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-		const Tensor2<double,3,3> &t2_3,
-		Tensor2_symmetric<double,3> &t2s_1,
-		const Tensor2_symmetric<double,3> &t2s_2,
-		const Tensor2_symmetric<double,3> &t2s_3,
-		Tensor3_dg<double,3,3> &t3dg_1,
-		const Tensor3_dg<double,3,3> &t3dg_2,
-		const Tensor3_dg<double,3,3> &t3dg_3,
-		Tensor3_christof<double,3,3> &t3ch_1,
-		const Tensor3_christof<double,3,3> &t3ch_2,
-		       const Tensor3_christof<double,3,3> &t3ch_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T4ddgIII.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/test_T4ddgIII.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,13 @@
+extern void test_T4ddgIII(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+		Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+		Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+		const Tensor2<double,3,3> &t2_3,
+		Tensor2_symmetric<double,3> &t2s_1,
+		const Tensor2_symmetric<double,3> &t2s_2,
+		const Tensor2_symmetric<double,3> &t2s_3,
+		Tensor3_dg<double,3,3> &t3dg_1,
+		const Tensor3_dg<double,3,3> &t3dg_2,
+		const Tensor3_dg<double,3,3> &t3dg_3,
+		Tensor3_christof<double,3,3> &t3ch_1,
+		const Tensor3_christof<double,3,3> &t3ch_2,
+		       const Tensor3_christof<double,3,3> &t3ch_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T4ddgIV.h
--- a/tests/conformance/test_T4ddgIV.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-extern void test_T4ddgIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-		Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-		Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-		const Tensor2<double,3,3> &t2_3,
-		Tensor2_symmetric<double,3> &t2s_1,
-		const Tensor2_symmetric<double,3> &t2s_2,
-		const Tensor2_symmetric<double,3> &t2s_3,
-		Tensor3_dg<double,3,3> &t3dg_1,
-		const Tensor3_dg<double,3,3> &t3dg_2,
-		const Tensor3_dg<double,3,3> &t3dg_3,
-		Tensor3_christof<double,3,3> &t3ch_1,
-		const Tensor3_christof<double,3,3> &t3ch_2,
-		       const Tensor3_christof<double,3,3> &t3ch_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T4ddgIV.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/test_T4ddgIV.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,13 @@
+extern void test_T4ddgIV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+		Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+		Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+		const Tensor2<double,3,3> &t2_3,
+		Tensor2_symmetric<double,3> &t2s_1,
+		const Tensor2_symmetric<double,3> &t2s_2,
+		const Tensor2_symmetric<double,3> &t2s_3,
+		Tensor3_dg<double,3,3> &t3dg_1,
+		const Tensor3_dg<double,3,3> &t3dg_2,
+		const Tensor3_dg<double,3,3> &t3dg_3,
+		Tensor3_christof<double,3,3> &t3ch_1,
+		const Tensor3_christof<double,3,3> &t3ch_2,
+		       const Tensor3_christof<double,3,3> &t3ch_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T4ddgV.h
--- a/tests/conformance/test_T4ddgV.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-extern void test_T4ddgV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
-		Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
-		Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
-		const Tensor2<double,3,3> &t2_3,
-		Tensor2_symmetric<double,3> &t2s_1,
-		const Tensor2_symmetric<double,3> &t2s_2,
-		const Tensor2_symmetric<double,3> &t2s_3,
-		Tensor3_dg<double,3,3> &t3dg_1,
-		const Tensor3_dg<double,3,3> &t3dg_2,
-		const Tensor3_dg<double,3,3> &t3dg_3,
-		Tensor3_christof<double,3,3> &t3ch_1,
-		const Tensor3_christof<double,3,3> &t3ch_2,
-		       const Tensor3_christof<double,3,3> &t3ch_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_T4ddgV.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/test_T4ddgV.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,13 @@
+extern void test_T4ddgV(const int &T, Tensor0<double*> &t0_1, const Tensor0<double*> &t0_2,
+		Tensor1<double,3> &t1_1, const Tensor1<double,3> &t1_2,
+		Tensor2<double,3,3> &t2_1, const Tensor2<double,3,3> &t2_2,
+		const Tensor2<double,3,3> &t2_3,
+		Tensor2_symmetric<double,3> &t2s_1,
+		const Tensor2_symmetric<double,3> &t2s_2,
+		const Tensor2_symmetric<double,3> &t2s_3,
+		Tensor3_dg<double,3,3> &t3dg_1,
+		const Tensor3_dg<double,3,3> &t3dg_2,
+		const Tensor3_dg<double,3,3> &t3dg_3,
+		Tensor3_christof<double,3,3> &t3ch_1,
+		const Tensor3_christof<double,3,3> &t3ch_2,
+		       const Tensor3_christof<double,3,3> &t3ch_3);
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_for_zero.h
--- a/tests/conformance/test_for_zero.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-#include <iostream>
-#include <cmath>
-
-template<class T>
-void test_for_zero(const T &t, const char *s)
-{
-  if(std::abs(t)<1e-14)
-    std::cout << "PASS: " << s << std::endl;
-  else
-    std::cout << "FAIL: " << s << " " << std::abs(t) << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/test_for_zero.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/test_for_zero.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,11 @@
+#include <iostream>
+#include <cmath>
+
+template<class T>
+void test_for_zero(const T &t, const char *s)
+{
+  if(std::abs(t)<1e-14)
+    std::cout << "PASS: " << s << std::endl;
+  else
+    std::cout << "FAIL: " << s << " " << std::abs(t) << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/testcases.C
--- a/tests/conformance/testcases.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-#include <iostream>
-#include "../../FTensor.h"
-using namespace FTensor;
-using namespace std;
-
-#include "test_T0.h"
-#include "test_T1.h"
-#include "test_T2.h"
-#include "test_T2s.h"
-#include "test_T3.h"
-#include "test_T3II.h"
-#include "test_T3dg.h"
-#include "test_T3ch.h"
-#include "test_T3as.h"
-#include "test_T4ddg.h"
-#include "test_T4ddgII.h"
-#include "test_T4ddgIII.h"
-#include "test_T4ddgIV.h"
-#include "test_T4ddgV.h"
-#include "test_T4R.h"
-
-int main()
-{
-  double t01(12), t02(14);
-
-  Tensor0<double *> t0_1(&t01), t0_2(&t02);
-  Tensor1<double,3> t1_1(1,2,3), t1_2(4,5,6), t1_3(7,8,9);
-  Tensor2<double,3,3> t2_1(10,20,30,40,50,60,70,80,90),
-    t2_2(11,21,31,41,51,61,71,81,91),
-    t2_3(12,22,32,42,52,62,72,82,92);
-  Tensor2_symmetric<double,3> t2s_1(13,23,33,43,53,63),
-    t2s_2(14,24,34,44,54,64), t2s_3(15,25,35,45,55,65);
-  Tensor3_dg<double,3,3> t3dg_1(101,102,103,104,105,106,107,108,109,110,111,
-				112,113,114,115,116,117,118),
-    t3dg_2(201,202,203,204,205,206,207,208,209,210,211,
-	   212,213,214,215,216,217,218),
-    t3dg_3(301,302,303,304,305,306,307,308,309,310,311,
-	   312,313,314,315,316,317,318);
-  Tensor3_christof<double,3,3>
-    t3ch_1(401,402,403,404,405,406,407,408,409,410,411,
-	   412,413,414,415,416,417,418),
-    t3ch_2(501,502,503,504,505,506,507,508,509,510,511,
-	   512,513,514,515,516,517,518),
-    t3ch_3(601,602,603,604,605,606,607,608,609,610,611,
-	   612,613,614,615,616,617,618);
-  Tensor3_antisymmetric<double,3,3>
-    t3as_1(701,702,703,704,705,706,707,708,709),
-    t3as_2(801,802,803,804,805,806,807,808,809),
-    t3as_3(901,902,903,904,905,906,907,908,909);
-
-  test_T0(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T1(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2s(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T3(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
- 	  t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3II(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
- 	    t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3dg(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
- 	    t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3ch(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
-	    t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3as(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
- 	    t3dg_1,t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
-  test_T4ddg(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
- 	     t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T4ddgII(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
-	       t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T4ddgIII(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
-		t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T4ddgIV(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
-	       t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T4ddgV(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
-	      t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T4R(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
-  	   t3dg_1,t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
-
-
-  cout << '\n';
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/testcases.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/testcases.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,80 @@
+#include <iostream>
+#include "../../FTensor.hpp"
+using namespace FTensor;
+using namespace std;
+
+#include "test_T0.hpp"
+#include "test_T1.hpp"
+#include "test_T2.hpp"
+#include "test_T2s.hpp"
+#include "test_T3.hpp"
+#include "test_T3II.hpp"
+#include "test_T3dg.hpp"
+#include "test_T3ch.hpp"
+#include "test_T3as.hpp"
+#include "test_T4ddg.hpp"
+#include "test_T4ddgII.hpp"
+#include "test_T4ddgIII.hpp"
+#include "test_T4ddgIV.hpp"
+#include "test_T4ddgV.hpp"
+#include "test_T4R.hpp"
+
+int main()
+{
+  double t01(12), t02(14);
+
+  Tensor0<double *> t0_1(&t01), t0_2(&t02);
+  Tensor1<double,3> t1_1(1,2,3), t1_2(4,5,6), t1_3(7,8,9);
+  Tensor2<double,3,3> t2_1(10,20,30,40,50,60,70,80,90),
+    t2_2(11,21,31,41,51,61,71,81,91),
+    t2_3(12,22,32,42,52,62,72,82,92);
+  Tensor2_symmetric<double,3> t2s_1(13,23,33,43,53,63),
+    t2s_2(14,24,34,44,54,64), t2s_3(15,25,35,45,55,65);
+  Tensor3_dg<double,3,3> t3dg_1(101,102,103,104,105,106,107,108,109,110,111,
+				112,113,114,115,116,117,118),
+    t3dg_2(201,202,203,204,205,206,207,208,209,210,211,
+	   212,213,214,215,216,217,218),
+    t3dg_3(301,302,303,304,305,306,307,308,309,310,311,
+	   312,313,314,315,316,317,318);
+  Tensor3_christof<double,3,3>
+    t3ch_1(401,402,403,404,405,406,407,408,409,410,411,
+	   412,413,414,415,416,417,418),
+    t3ch_2(501,502,503,504,505,506,507,508,509,510,511,
+	   512,513,514,515,516,517,518),
+    t3ch_3(601,602,603,604,605,606,607,608,609,610,611,
+	   612,613,614,615,616,617,618);
+  Tensor3_antisymmetric<double,3,3>
+    t3as_1(701,702,703,704,705,706,707,708,709),
+    t3as_2(801,802,803,804,805,806,807,808,809),
+    t3as_3(901,902,903,904,905,906,907,908,909);
+
+  test_T0(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T1(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2s(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T3(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
+ 	  t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3II(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
+ 	    t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3dg(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
+ 	    t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3ch(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
+	    t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3as(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
+ 	    t3dg_1,t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
+  test_T4ddg(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
+ 	     t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T4ddgII(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
+	       t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T4ddgIII(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
+		t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T4ddgIV(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
+	       t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T4ddgV(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
+	      t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T4R(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
+  	   t3dg_1,t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
+
+
+  cout << '\n';
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/testcases_compiler.C
--- a/tests/conformance/testcases_compiler.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-#include <iostream>
-#include "../../FTensor.h"
-using namespace FTensor;
-using namespace std;
-
-#include "test_T0.h"
-#include "test_T1.h"
-#include "test_T2.h"
-#include "test_T2s.h"
-#include "test_T3ch.h"
-#include "test_T3as.h"
-
-int main()
-{
-  double t01(12), t02(14);
-
-  Tensor0<double *> t0_1(&t01), t0_2(&t02);
-  Tensor1<double,3> t1_1(1,2,3), t1_2(4,5,6), t1_3(7,8,9);
-  Tensor2<double,3,3> t2_1(10,20,30,40,50,60,70,80,90),
-    t2_2(11,21,31,41,51,61,71,81,91),
-    t2_3(12,22,32,42,52,62,72,82,92);
-  Tensor2_symmetric<double,3> t2s_1(13,23,33,43,53,63),
-    t2s_2(14,24,34,44,54,64), t2s_3(15,25,35,45,55,65);
-  Tensor3_dg<double,3,3> t3dg_1(101,102,103,104,105,106,107,108,109,110,111,
-				112,113,114,115,116,117,118),
-    t3dg_2(201,202,203,204,205,206,207,208,209,210,211,
-	   212,213,214,215,216,217,218),
-    t3dg_3(301,302,303,304,305,306,307,308,309,310,311,
-	   312,313,314,315,316,317,318);
-  Tensor3_christof<double,3,3>
-    t3ch_1(401,402,403,404,405,406,407,408,409,410,411,
-	   412,413,414,415,416,417,418),
-    t3ch_2(501,502,503,504,505,506,507,508,509,510,511,
-	   512,513,514,515,516,517,518),
-    t3ch_3(601,602,603,604,605,606,607,608,609,610,611,
-	   612,613,614,615,616,617,618);
-  Tensor3_antisymmetric<double,3,3>
-    t3as_1(701,702,703,704,705,706,707,708,709),
-    t3as_2(801,802,803,804,805,806,807,808,809),
-    t3as_3(901,902,903,904,905,906,907,908,909);
-
-  test_T0(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T1(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T2s(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
-  test_T3ch(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
-	    t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
-  test_T3as(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
- 	    t3dg_1,t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
-
-  cout << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/conformance/testcases_compiler.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/conformance/testcases_compiler.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,52 @@
+#include <iostream>
+#include "../../FTensor.hpp"
+using namespace FTensor;
+using namespace std;
+
+#include "test_T0.hpp"
+#include "test_T1.hpp"
+#include "test_T2.hpp"
+#include "test_T2s.hpp"
+#include "test_T3ch.hpp"
+#include "test_T3as.hpp"
+
+int main()
+{
+  double t01(12), t02(14);
+
+  Tensor0<double *> t0_1(&t01), t0_2(&t02);
+  Tensor1<double,3> t1_1(1,2,3), t1_2(4,5,6), t1_3(7,8,9);
+  Tensor2<double,3,3> t2_1(10,20,30,40,50,60,70,80,90),
+    t2_2(11,21,31,41,51,61,71,81,91),
+    t2_3(12,22,32,42,52,62,72,82,92);
+  Tensor2_symmetric<double,3> t2s_1(13,23,33,43,53,63),
+    t2s_2(14,24,34,44,54,64), t2s_3(15,25,35,45,55,65);
+  Tensor3_dg<double,3,3> t3dg_1(101,102,103,104,105,106,107,108,109,110,111,
+				112,113,114,115,116,117,118),
+    t3dg_2(201,202,203,204,205,206,207,208,209,210,211,
+	   212,213,214,215,216,217,218),
+    t3dg_3(301,302,303,304,305,306,307,308,309,310,311,
+	   312,313,314,315,316,317,318);
+  Tensor3_christof<double,3,3>
+    t3ch_1(401,402,403,404,405,406,407,408,409,410,411,
+	   412,413,414,415,416,417,418),
+    t3ch_2(501,502,503,504,505,506,507,508,509,510,511,
+	   512,513,514,515,516,517,518),
+    t3ch_3(601,602,603,604,605,606,607,608,609,610,611,
+	   612,613,614,615,616,617,618);
+  Tensor3_antisymmetric<double,3,3>
+    t3as_1(701,702,703,704,705,706,707,708,709),
+    t3as_2(801,802,803,804,805,806,807,808,809),
+    t3as_3(901,902,903,904,905,906,907,908,909);
+
+  test_T0(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T1(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T2s(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3);
+  test_T3ch(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
+	    t3dg_1,t3dg_2,t3dg_3,t3ch_1,t3ch_2,t3ch_3);
+  test_T3as(13,t0_1,t0_2,t1_1,t1_2,t2_1,t2_2,t2_3,t2s_1,t2s_2,t2s_3,
+ 	    t3dg_1,t3dg_2,t3dg_3,t3as_1,t3as_2,t3as_3);
+
+  cout << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/Number_test.C
--- a/tests/speed/Number_test.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-#include <iostream>
-#include "../FTensor.h"
-
-using namespace FTensor;
-
-int main()
-{
-  Tensor1<double,3> y(0,1,2);
-  Tensor1<double,3> x(2,3,4);
-  Tensor1<double,3> n(5,6,7);
-  Tensor2 t2(1,2,3,4,5,6,7,8,9);
-
-  const Index<'i',3> i;
-  const Index<'j'> j;
-  const Number<0> N0;
-  const Number<1> N1;
-  const Number<2> N2;
-
-  for(int ii=0;ii<100000000;ii++)
-    {
-      y(i)+=(x(i)+n(i)+t2(i,N0))
-//    	-(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
-//    	-(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
-//    	-(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
-//    	-(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
-//    	-(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
-//    	-(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
-//    	-(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
-//    	-(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
-//    	-(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
-//  -(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
-//  -(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
-//  -(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
-//  -(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
-	;
-    }
-  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/Number_test.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/Number_test.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,39 @@
+#include <iostream>
+#include "../FTensor.hpp"
+
+using namespace FTensor;
+
+int main()
+{
+  Tensor1<double,3> y(0,1,2);
+  Tensor1<double,3> x(2,3,4);
+  Tensor1<double,3> n(5,6,7);
+  Tensor2 t2(1,2,3,4,5,6,7,8,9);
+
+  const Index<'i',3> i;
+  const Index<'j'> j;
+  const Number<0> N0;
+  const Number<1> N1;
+  const Number<2> N2;
+
+  for(int ii=0;ii<100000000;ii++)
+    {
+      y(i)+=(x(i)+n(i)+t2(i,N0))
+//    	-(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
+//    	-(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
+//    	-(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
+//    	-(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
+//    	-(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
+//    	-(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
+//    	-(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
+//    	-(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
+//    	-(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
+//  -(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
+//  -(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
+//  -(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
+//  -(x(i)+n(i)+t2(i,N0))+(x(i)+n(i)+t2(i,N0))
+	;
+    }
+  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
+}
+
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/acoustic.C
--- a/tests/speed/acoustic.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,108 +0,0 @@
-#include <iostream>
-#include <cmath>
-#include <cstdlib>
-#include <vector>
-using namespace std;
-
-#include "../../FTensor.h"
-
-void initial(double P1[], double P2[], double P3[],
-	     double c[], const int N)
-{
-  int cr = N/2-1;
-  int cc = 7.0*N/8.0-1;
-  float s2 = 64.0 * 9.0 / pow(N/2.0,2.0);
-  
-  for(int i=0;i<N;++i)
-    for(int j=0;j<N;++j)
-      {
-	c[i+N*j]=0.2;
-	P1[i+N*j] = 0.0;
-	P2[i+N*j] = exp(-(pow(i-cr,2.0)+pow(j-cc,2.0)) * s2);
-	P3[i+N*j] = 0.0;
-      }
-
-  const int blockLeft = 0;
-  const int blockRight = 2 * N / 5.0;
-  const int blockTop = N / 3.0;
-  const int blockBottom = 2 * N / 3.0;
-
-  for(int i=blockTop; i<blockBottom; ++i)
-    for(int j=blockLeft; j<blockRight; ++j)
-      c[i+N*j] = 0.5;
-
-  int channelLeft = 4*N/5.0;
-  int channelRight = N;
-  int channel1Height = 3*N/8.0;
-  int channel2Height = 5*N/8.0;
-  for(int i=channelLeft; i<channelRight; ++i)
-    for(int j=channel1Height; j<channel2Height; ++j)
-      c[i+N*j]=0;
-}
-
-void FTen(double P1_[], double P2_[], double P3_[],
-	    double c_[], const int N)
-{
-  FTensor::Tensor0<double*> P1(P1_), P2(P2_), P3(P3_), c(c_);
-  
-  FTensor::Tensor1<int,2> d_ijk(1,N);
-  FTensor::Tensor1<double,2> d_xyz(1,1);
-  FTensor::Index<'l',2> l;
-  FTensor::Index<'m',2> m;
-  for(int j=0;j<N;++j)
-    for(int i=0;i<N;++i)
-      {
-	if(i!=0 && i!=N-1 && j!=0 && j!=N-1)
-	  {
-//  	    P3 = 2*P2 - P1;
-	    P3 = 2*P2 - P1
-	      + c*(dd(P2,l,m,d_ijk,d_xyz)(0,0)
-		   + dd(P2,l,m,d_ijk,d_xyz)(1,1));
-	  }
-	++P1;
-	++P2;
-	++P3;
-	++c;
-      }
-//    cout << P3_[(N/2-1)+N*((7*N)/8-1)] << endl;
-}
-
-
-void simple(double P1[], double P2[], double P3[],
-	    double c[], const int N)
-{
-  for(int j=1;j<N-1;++j)
-    for(int i=1;i<N-1;++i)
-      {
-//  	P3[i+N*j] = 2*P2[i+N*j] - P1[i+N*j];
-	P3[i+N*j] = (2-4*c[i+N*j])*P2[i+N*j] - P1[i+N*j]
-	  + c[i+N*j]*(P2[i-1+N*j] + P2[i+1+N*j]
-		      + P2[i+N*(j-1)] + P2[i+N*(j+1)]);
-      }
-//    cout << P3[(N/2-1)+N*((7*N)/8-1)] << endl;
-}
-
-
-int main(int argc, char *argv[])
-{
-  const int N=atoi(argv[1]);
-
-  vector<double> P1(N*N), P2(N*N), P3(N*N), c(N*N);
-
-  initial(&c[0],&P1[0],&P2[0],&P3[0],N);
-
-
-  const int niters=atoi(argv[2]);
-
-  for(int i=0;i<niters;++i)
-    {    
-//        simple(&P1[0],&P2[0],&P3[0],&c[0],N);
-//        simple(&P2[0],&P3[0],&P1[0],&c[0],N);
-//        simple(&P3[0],&P1[0],&P2[0],&c[0],N);
-      FTen(&P1[0],&P2[0],&P3[0],&c[0],N);
-      FTen(&P2[0],&P3[0],&P1[0],&c[0],N);
-      FTen(&P3[0],&P1[0],&P2[0],&c[0],N);
-    }
-}
-
-
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/acoustic.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/acoustic.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,108 @@
+#include <iostream>
+#include <cmath>
+#include <cstdlib>
+#include <vector>
+using namespace std;
+
+#include "../../FTensor.hpp"
+
+void initial(double P1[], double P2[], double P3[],
+	     double c[], const int N)
+{
+  int cr = N/2-1;
+  int cc = 7.0*N/8.0-1;
+  float s2 = 64.0 * 9.0 / pow(N/2.0,2.0);
+  
+  for(int i=0;i<N;++i)
+    for(int j=0;j<N;++j)
+      {
+	c[i+N*j]=0.2;
+	P1[i+N*j] = 0.0;
+	P2[i+N*j] = exp(-(pow(i-cr,2.0)+pow(j-cc,2.0)) * s2);
+	P3[i+N*j] = 0.0;
+      }
+
+  const int blockLeft = 0;
+  const int blockRight = 2 * N / 5.0;
+  const int blockTop = N / 3.0;
+  const int blockBottom = 2 * N / 3.0;
+
+  for(int i=blockTop; i<blockBottom; ++i)
+    for(int j=blockLeft; j<blockRight; ++j)
+      c[i+N*j] = 0.5;
+
+  int channelLeft = 4*N/5.0;
+  int channelRight = N;
+  int channel1Height = 3*N/8.0;
+  int channel2Height = 5*N/8.0;
+  for(int i=channelLeft; i<channelRight; ++i)
+    for(int j=channel1Height; j<channel2Height; ++j)
+      c[i+N*j]=0;
+}
+
+void FTen(double P1_[], double P2_[], double P3_[],
+	    double c_[], const int N)
+{
+  FTensor::Tensor0<double*> P1(P1_), P2(P2_), P3(P3_), c(c_);
+  
+  FTensor::Tensor1<int,2> d_ijk(1,N);
+  FTensor::Tensor1<double,2> d_xyz(1,1);
+  FTensor::Index<'l',2> l;
+  FTensor::Index<'m',2> m;
+  for(int j=0;j<N;++j)
+    for(int i=0;i<N;++i)
+      {
+	if(i!=0 && i!=N-1 && j!=0 && j!=N-1)
+	  {
+//  	    P3 = 2*P2 - P1;
+	    P3 = 2*P2 - P1
+	      + c*(dd(P2,l,m,d_ijk,d_xyz)(0,0)
+		   + dd(P2,l,m,d_ijk,d_xyz)(1,1));
+	  }
+	++P1;
+	++P2;
+	++P3;
+	++c;
+      }
+//    cout << P3_[(N/2-1)+N*((7*N)/8-1)] << endl;
+}
+
+
+void simple(double P1[], double P2[], double P3[],
+	    double c[], const int N)
+{
+  for(int j=1;j<N-1;++j)
+    for(int i=1;i<N-1;++i)
+      {
+//  	P3[i+N*j] = 2*P2[i+N*j] - P1[i+N*j];
+	P3[i+N*j] = (2-4*c[i+N*j])*P2[i+N*j] - P1[i+N*j]
+	  + c[i+N*j]*(P2[i-1+N*j] + P2[i+1+N*j]
+		      + P2[i+N*(j-1)] + P2[i+N*(j+1)]);
+      }
+//    cout << P3[(N/2-1)+N*((7*N)/8-1)] << endl;
+}
+
+
+int main(int argc, char *argv[])
+{
+  const int N=atoi(argv[1]);
+
+  vector<double> P1(N*N), P2(N*N), P3(N*N), c(N*N);
+
+  initial(&c[0],&P1[0],&P2[0],&P3[0],N);
+
+
+  const int niters=atoi(argv[2]);
+
+  for(int i=0;i<niters;++i)
+    {    
+//        simple(&P1[0],&P2[0],&P3[0],&c[0],N);
+//        simple(&P2[0],&P3[0],&P1[0],&c[0],N);
+//        simple(&P3[0],&P1[0],&P2[0],&c[0],N);
+      FTen(&P1[0],&P2[0],&P3[0],&c[0],N);
+      FTen(&P2[0],&P3[0],&P1[0],&c[0],N);
+      FTen(&P3[0],&P1[0],&P2[0],&c[0],N);
+    }
+}
+
+
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/example.C
--- a/tests/speed/example.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,102 +0,0 @@
-#include <iostream>
-using namespace std;
-#include "../../FTensor.h"
-using namespace FTensor;
-
-int main()
-{
-  Tensor1<double,3> y(0,1,2);
-  Tensor1<double,3> x(2,3,4);
-  Tensor1<double,3> n(5,6,7);
-  const Index<'i',3> i;
-
-  for(int j=0;j<10000000;j++)
-    {
-      y(i)=x(i)+n(i);
-      x(i)=y(i)-n(i);
-      n(i)=n(i)+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))
-	+(y(i)-x(i))-(y(i)-x(i));
-
-      n(i)=n(i)+y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
- +y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-+y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// +y(i)-x(i)
-// 	+y(i)-x(i)	
-	;
-
-//        n(i)=(y(i)-x(i))*(y(i)-x(i))/(n(i));
-// n(i)=(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))/(n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i));
-    }
-  cout << y(0) << " " << y(1) << " " << y(2) << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/example.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/example.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,102 @@
+#include <iostream>
+using namespace std;
+#include "../../FTensor.hpp"
+using namespace FTensor;
+
+int main()
+{
+  Tensor1<double,3> y(0,1,2);
+  Tensor1<double,3> x(2,3,4);
+  Tensor1<double,3> n(5,6,7);
+  const Index<'i',3> i;
+
+  for(int j=0;j<10000000;j++)
+    {
+      y(i)=x(i)+n(i);
+      x(i)=y(i)-n(i);
+      n(i)=n(i)+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))
+	+(y(i)-x(i))-(y(i)-x(i));
+
+      n(i)=n(i)+y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
+ +y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
++y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// +y(i)-x(i)
+// 	+y(i)-x(i)	
+	;
+
+//        n(i)=(y(i)-x(i))*(y(i)-x(i))/(n(i));
+// n(i)=(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))/(n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i));
+    }
+  cout << y(0) << " " << y(1) << " " << y(2) << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/examplefast.C
--- a/tests/speed/examplefast.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-#include <iostream>
-using namespace std;
-int main()
-{
-  double x[3],y[3],n[3];
-
-  y[0]=0; y[1]=1; y[2]=2;
-  x[0]=2; x[1]=3; x[2]=4;
-  n[0]=5; n[1]=6; n[2]=7;
-  for(int i=1;i<10000000;i++)
-    {
-      y[0]=(x[0]+n[0]);
-      y[1]=(x[1]+n[1]);
-      y[2]=(x[2]+n[2]);
-
-      x[0]=(y[0]-n[0]);
-      x[1]=(y[1]-n[1]);
-      x[2]=(y[2]-n[2]);
-
-      n[0]=n[0]+(y[0]-x[0])-(y[0]-x[0])+(y[0]-x[0])-(y[0]-x[0])+(y[0]-x[0])-(y[0]-x[0]);
-      n[1]=n[1]+(y[1]-x[1])-(y[1]-x[1])+(y[1]-x[1])-(y[1]-x[1])+(y[1]-x[1])-(y[1]-x[1]);
-      n[2]=n[2]+(y[2]-x[2])-(y[2]-x[2])+(y[2]-x[2])-(y[2]-x[2])+(y[2]-x[2])-(y[2]-x[2]);
-    }
-  cout << y[0] << " " << y[1] << " " << y[2] << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/examplefast.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/examplefast.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,25 @@
+#include <iostream>
+using namespace std;
+int main()
+{
+  double x[3],y[3],n[3];
+
+  y[0]=0; y[1]=1; y[2]=2;
+  x[0]=2; x[1]=3; x[2]=4;
+  n[0]=5; n[1]=6; n[2]=7;
+  for(int i=1;i<10000000;i++)
+    {
+      y[0]=(x[0]+n[0]);
+      y[1]=(x[1]+n[1]);
+      y[2]=(x[2]+n[2]);
+
+      x[0]=(y[0]-n[0]);
+      x[1]=(y[1]-n[1]);
+      x[2]=(y[2]-n[2]);
+
+      n[0]=n[0]+(y[0]-x[0])-(y[0]-x[0])+(y[0]-x[0])-(y[0]-x[0])+(y[0]-x[0])-(y[0]-x[0]);
+      n[1]=n[1]+(y[1]-x[1])-(y[1]-x[1])+(y[1]-x[1])-(y[1]-x[1])+(y[1]-x[1])-(y[1]-x[1]);
+      n[2]=n[2]+(y[2]-x[2])-(y[2]-x[2])+(y[2]-x[2])-(y[2]-x[2])+(y[2]-x[2])-(y[2]-x[2]);
+    }
+  cout << y[0] << " " << y[1] << " " << y[2] << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/little.C
--- a/tests/speed/little.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-#include <iostream>
-#include "../../FTensor.h"
-
-using namespace FTensor;
-
-int main()
-{
-  Tensor1<double,3> y(0,1,2);
-
-//    Tensor1<double,3> y(0,1,2);
-  Tensor1<double,3> x(2,3,4);
-  Tensor1<double,3> n(5,6,7);
-//    Tensor2 t2(1,2,3,4,5,6,7,8,9);
-//    Tensor2 t2e(9,8,7,6,5,4,3,2,1);
-//    Tensor2_symmetric t2s(1,2,3,4,5,6);
-//    Tensor2_symmetric t2es(9,8,7,6,5,4);
-
-  const Index<'i',3> i;
-//    const Index<'j'> j;
-//    const Index<'k'> k;
-
-//    y(i)=-n(i)+2.0;
-//    y(i)+=n(i)-2.0;
-//    y(i)-=n(i)*2.0;
-//    y(i)+=2.0;
-//    y(i)-=2.0;
-//    y(i)*=2.0;
-//    y(i)/=2.0;
-//    x(i)=2.0+y(i)-n(i)/2.0;
-//    n(i)=2.0-y(i)+2.0*x(i);
-//    n(i)=-(y(i)+x(i))*n(i)*0.0+1.0;
-//    t2(i,j)=t2(i,j)+2.0*t2e(i,j)-t2(i,j)*2.0;
-//    t2e(i,j)=n(k)*n(i)*(-t2(k,j));
-//    x(i)=t2e(i,j)*n(j) - n(j)*t2e(i,j);
-//    n(i)=t2e(j,i)*n(j) - n(j)*t2e(j,i) + t2s(i,j)*y(j);
-//    n(i)+=(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i));
-//  //    n(i)=(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))/(n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i));
-
-  for(int ii=0;ii<100000000;ii++)
-    {
-//        const Index<'i',3> i;
-
-//    n(i)+=(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i));
-
-//        y(i)+=x(i)+n(i);
-
-
-      y(i)+=(x(i)+n(i))
-    	-(x(i)+n(i))+(x(i)+n(i))
-    	-(x(i)+n(i))+(x(i)+n(i))
-//      	-(x(i)+n(i))+(x(i)+n(i))
-//    	-(x(i)+n(i))+(x(i)+n(i))
-//    	-(x(i)+n(i))+(x(i)+n(i))
-//    	-(x(i)+n(i))+(x(i)+n(i))
-//    	-(x(i)+n(i))+(x(i)+n(i))
-//    	-(x(i)+n(i))+(x(i)+n(i))
-//    	-(x(i)+n(i))+(x(i)+n(i))
-//  -(x(i)+n(i))+(x(i)+n(i))
-//  -(x(i)+n(i))+(x(i)+n(i))
-//  -(x(i)+n(i))+(x(i)+n(i))
-//  -(x(i)+n(i))+(x(i)+n(i))
-	;
-    }
-  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
-//         << x(0) << " " << x(1) << " " << x(2) << endl
-//         << n(0) << " " << n(1) << " " << n(2) << endl
-//         << y(i)*n(i) << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/little.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/little.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,68 @@
+#include <iostream>
+#include "../../FTensor.hpp"
+
+using namespace FTensor;
+
+int main()
+{
+  Tensor1<double,3> y(0,1,2);
+
+//    Tensor1<double,3> y(0,1,2);
+  Tensor1<double,3> x(2,3,4);
+  Tensor1<double,3> n(5,6,7);
+//    Tensor2 t2(1,2,3,4,5,6,7,8,9);
+//    Tensor2 t2e(9,8,7,6,5,4,3,2,1);
+//    Tensor2_symmetric t2s(1,2,3,4,5,6);
+//    Tensor2_symmetric t2es(9,8,7,6,5,4);
+
+  const Index<'i',3> i;
+//    const Index<'j'> j;
+//    const Index<'k'> k;
+
+//    y(i)=-n(i)+2.0;
+//    y(i)+=n(i)-2.0;
+//    y(i)-=n(i)*2.0;
+//    y(i)+=2.0;
+//    y(i)-=2.0;
+//    y(i)*=2.0;
+//    y(i)/=2.0;
+//    x(i)=2.0+y(i)-n(i)/2.0;
+//    n(i)=2.0-y(i)+2.0*x(i);
+//    n(i)=-(y(i)+x(i))*n(i)*0.0+1.0;
+//    t2(i,j)=t2(i,j)+2.0*t2e(i,j)-t2(i,j)*2.0;
+//    t2e(i,j)=n(k)*n(i)*(-t2(k,j));
+//    x(i)=t2e(i,j)*n(j) - n(j)*t2e(i,j);
+//    n(i)=t2e(j,i)*n(j) - n(j)*t2e(j,i) + t2s(i,j)*y(j);
+//    n(i)+=(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i));
+//  //    n(i)=(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))*(y(i)-x(i))/(n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i)*n(i));
+
+  for(int ii=0;ii<100000000;ii++)
+    {
+//        const Index<'i',3> i;
+
+//    n(i)+=(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i))+(y(i)-x(i))-(y(i)-x(i));
+
+//        y(i)+=x(i)+n(i);
+
+
+      y(i)+=(x(i)+n(i))
+    	-(x(i)+n(i))+(x(i)+n(i))
+    	-(x(i)+n(i))+(x(i)+n(i))
+//      	-(x(i)+n(i))+(x(i)+n(i))
+//    	-(x(i)+n(i))+(x(i)+n(i))
+//    	-(x(i)+n(i))+(x(i)+n(i))
+//    	-(x(i)+n(i))+(x(i)+n(i))
+//    	-(x(i)+n(i))+(x(i)+n(i))
+//    	-(x(i)+n(i))+(x(i)+n(i))
+//    	-(x(i)+n(i))+(x(i)+n(i))
+//  -(x(i)+n(i))+(x(i)+n(i))
+//  -(x(i)+n(i))+(x(i)+n(i))
+//  -(x(i)+n(i))+(x(i)+n(i))
+//  -(x(i)+n(i))+(x(i)+n(i))
+	;
+    }
+  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
+//         << x(0) << " " << x(1) << " " << x(2) << endl
+//         << n(0) << " " << n(1) << " " << n(2) << endl
+//         << y(i)*n(i) << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/littlefast.C
--- a/tests/speed/littlefast.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-#include <iostream>
-
-int main()
-{
-  double y[3],x[3],n[3];
-
-  y[0]=0;
-  y[1]=1;
-  y[2]=2;
-
-  x[0]=2;
-  x[1]=3;
-  x[2]=4;
-
-  n[0]=5;
-  n[1]=6;
-  n[2]=7;
-
-  for(int i=0;i<100000000;i++)
-    {
-//        y[0]=y[0]+n[0];
-//        y[1]=y[1]+n[1];
-//        y[2]=y[2]+n[2];
-
-  n[0]+=(y[0]-x[0])-(y[0]-x[0])+(y[0]-x[0])-(y[0]-x[0])+(y[0]-x[0])-(y[0]-x[0])+(y[0]-x[0])-(y[0]-x[0])+(y[0]-x[0])-(y[0]-x[0])+(y[0]-x[0])-(y[0]-x[0])+(y[0]-x[0])-(y[0]-x[0])+(y[0]-x[0])-(y[0]-x[0]);
-  n[1]+=(y[1]-x[1])-(y[1]-x[1])+(y[1]-x[1])-(y[1]-x[1])+(y[1]-x[1])-(y[1]-x[1])+(y[1]-x[1])-(y[1]-x[1])+(y[1]-x[1])-(y[1]-x[1])+(y[1]-x[1])-(y[1]-x[1])+(y[1]-x[1])-(y[1]-x[1])+(y[1]-x[1])-(y[1]-x[1]);
-  n[2]+=(y[2]-x[2])-(y[2]-x[2])+(y[2]-x[2])-(y[2]-x[2])+(y[2]-x[2])-(y[2]-x[2])+(y[2]-x[2])-(y[2]-x[2])+(y[2]-x[2])-(y[2]-x[2])+(y[2]-x[2])-(y[2]-x[2])+(y[2]-x[2])-(y[2]-x[2])+(y[2]-x[2])-(y[2]-x[2]);
-
-      y[0]+=x[0]+n[0];
-      y[1]+=x[1]+n[1];
-      y[2]+=x[2]+n[2];
-    }
-  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/littlefast.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/littlefast.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,34 @@
+#include <iostream>
+
+int main()
+{
+  double y[3],x[3],n[3];
+
+  y[0]=0;
+  y[1]=1;
+  y[2]=2;
+
+  x[0]=2;
+  x[1]=3;
+  x[2]=4;
+
+  n[0]=5;
+  n[1]=6;
+  n[2]=7;
+
+  for(int i=0;i<100000000;i++)
+    {
+//        y[0]=y[0]+n[0];
+//        y[1]=y[1]+n[1];
+//        y[2]=y[2]+n[2];
+
+  n[0]+=(y[0]-x[0])-(y[0]-x[0])+(y[0]-x[0])-(y[0]-x[0])+(y[0]-x[0])-(y[0]-x[0])+(y[0]-x[0])-(y[0]-x[0])+(y[0]-x[0])-(y[0]-x[0])+(y[0]-x[0])-(y[0]-x[0])+(y[0]-x[0])-(y[0]-x[0])+(y[0]-x[0])-(y[0]-x[0]);
+  n[1]+=(y[1]-x[1])-(y[1]-x[1])+(y[1]-x[1])-(y[1]-x[1])+(y[1]-x[1])-(y[1]-x[1])+(y[1]-x[1])-(y[1]-x[1])+(y[1]-x[1])-(y[1]-x[1])+(y[1]-x[1])-(y[1]-x[1])+(y[1]-x[1])-(y[1]-x[1])+(y[1]-x[1])-(y[1]-x[1]);
+  n[2]+=(y[2]-x[2])-(y[2]-x[2])+(y[2]-x[2])-(y[2]-x[2])+(y[2]-x[2])-(y[2]-x[2])+(y[2]-x[2])-(y[2]-x[2])+(y[2]-x[2])-(y[2]-x[2])+(y[2]-x[2])-(y[2]-x[2])+(y[2]-x[2])-(y[2]-x[2])+(y[2]-x[2])-(y[2]-x[2]);
+
+      y[0]+=x[0]+n[0];
+      y[1]+=x[1]+n[1];
+      y[2]+=x[2]+n[2];
+    }
+  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x.C
--- a/tests/speed/one_over_1_minus_x.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-#include <iostream>
-#include "one_over_1_minus_x.h"
-
-int main()
-{
-  Tensor1<double,3> y(0,1,2);
-  Tensor1<double,3> a1(2,3,4);
-
-  for(int ii=0;ii<100000000;ii++)
-    {
-          func1(y,a1);
-    }
-  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,14 @@
+#include <iostream>
+#include "one_over_1_minus_x.hpp"
+
+int main()
+{
+  Tensor1<double,3> y(0,1,2);
+  Tensor1<double,3> a1(2,3,4);
+
+  for(int ii=0;ii<100000000;ii++)
+    {
+          func1(y,a1);
+    }
+  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x.h
--- a/tests/speed/one_over_1_minus_x.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,190 +0,0 @@
-#include "../../FTensor.h"
-using namespace FTensor;
-
-inline void func1(Tensor1<double,3> &y, Tensor1<double,3> &a1)
-{
-  const Index<'i',3> i;
-
-  y(i)+=a1(i);
-  a1(i)*=0.1;
-  return;
-}
-
-inline void func2(Tensor1<double,3> &y, Tensor1<double,3> &a1, Tensor1<double,3> &a2)
-{
-  const Index<'i',3> i;
-
-  y(i)+=a1(i)
-    + 2*a2(i)
-    ;
-  a1(i)*=0.1;
-  a2(i)*=0.2;
-  return;
-}
-
-inline void func3(Tensor1<double,3> &y, Tensor1<double,3> &a1, Tensor1<double,3> &a2, Tensor1<double,3> &a3)
-{
-  const Index<'i',3> i;
-  const Index<'j',3> j;
-
-  y(i)+=a1(i)
-    + 2*a2(i)
-    + 3*(a1(j)*a2(j))*a3(i)
-    ;
-  a1(i)*=0.1;
-  a2(i)*=0.2;
-  a3(i)*=0.3;
-  return;
-}
-
-inline void func4(Tensor1<double,3> &y, Tensor1<double,3> &a1, Tensor1<double,3> &a2, Tensor1<double,3> &a3,
-		  Tensor1<double,3> &a4)
-{
-  const Index<'i',3> i;
-  const Index<'j',3> j;
-  const Index<'k',3> k;
-
-  y(i)+=a1(i)
-    + 2*a2(i)
-    + 3*(a1(j)*a2(j))*a3(i)
-    + 4*(a1(j)*a3(j))*(a2(k)*a2(k))*a4(i)
-    ;
-  a1(i)*=0.1;
-  a2(i)*=0.2;
-  a3(i)*=0.3;
-  a4(i)*=0.4;
-  return;
-}
-
-inline void func5(Tensor1<double,3> &y, Tensor1<double,3> &a1, Tensor1<double,3> &a2, Tensor1<double,3> &a3,
-		  Tensor1<double,3> &a4, Tensor1<double,3> &a5)
-{
-  const Index<'i',3> i;
-  const Index<'j',3> j;
-  const Index<'k',3> k;
-
-  y(i)+=a1(i)
-    + 2*a2(i)
-    + 3*(a1(j)*a2(j))*a3(i)
-    + 4*(a1(j)*a3(j))*(a2(k)*a2(k))*a4(i)
-    + 5*(a1(j)*a4(j))*(a2(k)*a3(k))*a5(i)
-    ;
-  a1(i)*=0.1;
-  a2(i)*=0.2;
-  a3(i)*=0.3;
-  a4(i)*=0.4;
-  a5(i)*=0.5;
-  return;
-}
-
-inline void func6(Tensor1<double,3> &y, Tensor1<double,3> &a1, Tensor1<double,3> &a2, Tensor1<double,3> &a3,
-		  Tensor1<double,3> &a4, Tensor1<double,3> &a5, Tensor1<double,3> &a6)
-{
-  const Index<'i',3> i;
-  const Index<'j',3> j;
-  const Index<'k',3> k;
-  const Index<'l',3> l;
-
-  y(i)+=a1(i)
-    + 2*a2(i)
-    + 3*(a1(j)*a2(j))*a3(i)
-    + 4*(a1(j)*a3(j))*(a2(k)*a2(k))*a4(i)
-    + 5*(a1(j)*a4(j))*(a2(k)*a3(k))*a5(i)
-    + 6*(a1(j)*a5(j))*(a2(k)*a4(k))*(a3(l)*a3(l))*a6(i)
-    ;
-  a1(i)*=0.1;
-  a2(i)*=0.2;
-  a3(i)*=0.3;
-  a4(i)*=0.4;
-  a5(i)*=0.5;
-  a6(i)*=0.6;
-  return;
-}
-
-inline void func7(Tensor1<double,3> &y, Tensor1<double,3> &a1, Tensor1<double,3> &a2, Tensor1<double,3> &a3,
-		  Tensor1<double,3> &a4, Tensor1<double,3> &a5, Tensor1<double,3> &a6, Tensor1<double,3> &a7)
-{
-  const Index<'i',3> i;
-  const Index<'j',3> j;
-  const Index<'k',3> k;
-  const Index<'l',3> l;
-
-  y(i)+=a1(i)
-    + 2*a2(i)
-    + 3*(a1(j)*a2(j))*a3(i)
-    + 4*(a1(j)*a3(j))*(a2(k)*a2(k))*a4(i)
-    + 5*(a1(j)*a4(j))*(a2(k)*a3(k))*a5(i)
-    + 6*(a1(j)*a5(j))*(a2(k)*a4(k))*(a3(l)*a3(l))*a6(i)
-    + 7*(a1(j)*a6(j))*(a2(k)*a5(k))*(a3(l)*a4(l))*a7(i)
-    ;
-  a1(i)*=0.1;
-  a2(i)*=0.2;
-  a3(i)*=0.3;
-  a4(i)*=0.4;
-  a5(i)*=0.5;
-  a6(i)*=0.6;
-  a7(i)*=0.7;
-  return;
-}
-
-inline void func8(Tensor1<double,3> &y, Tensor1<double,3> &a1, Tensor1<double,3> &a2, Tensor1<double,3> &a3,
-		  Tensor1<double,3> &a4, Tensor1<double,3> &a5, Tensor1<double,3> &a6, Tensor1<double,3> &a7,
-		  Tensor1<double,3> &a8)
-{
-  const Index<'i',3> i;
-  const Index<'j',3> j;
-  const Index<'k',3> k;
-  const Index<'l',3> l;
-  const Index<'m',3> m;
-
-  y(i)+=a1(i)
-    + 2*a2(i)
-    + 3*(a1(j)*a2(j))*a3(i)
-    + 4*(a1(j)*a3(j))*(a2(k)*a2(k))*a4(i)
-    + 5*(a1(j)*a4(j))*(a2(k)*a3(k))*a5(i)
-    + 6*(a1(j)*a5(j))*(a2(k)*a4(k))*(a3(l)*a3(l))*a6(i)
-    + 7*(a1(j)*a6(j))*(a2(k)*a5(k))*(a3(l)*a4(l))*a7(i)
-    + 8*(a1(j)*a7(j))*(a2(k)*a6(k))*(a3(l)*a5(l))*(a4(m)*a4(m))*a8(i)
-    ;
-  a1(i)*=0.1;
-  a2(i)*=0.2;
-  a3(i)*=0.3;
-  a4(i)*=0.4;
-  a5(i)*=0.5;
-  a6(i)*=0.6;
-  a7(i)*=0.7;
-  a8(i)*=0.8;
-  return;
-}
-
-inline void func9(Tensor1<double,3> &y, Tensor1<double,3> &a1, Tensor1<double,3> &a2, Tensor1<double,3> &a3,
-		  Tensor1<double,3> &a4, Tensor1<double,3> &a5, Tensor1<double,3> &a6, Tensor1<double,3> &a7,
-		  Tensor1<double,3> &a8, Tensor1<double,3> &a9)
-{
-  const Index<'i',3> i;
-  const Index<'j',3> j;
-  const Index<'k',3> k;
-  const Index<'l',3> l;
-  const Index<'m',3> m;
-
-  y(i)+=a1(i)
-    + 2*a2(i)
-    + 3*(a1(j)*a2(j))*a3(i)
-    + 4*(a1(j)*a3(j))*(a2(k)*a2(k))*a4(i)
-    + 5*(a1(j)*a4(j))*(a2(k)*a3(k))*a5(i)
-    + 6*(a1(j)*a5(j))*(a2(k)*a4(k))*(a3(l)*a3(l))*a6(i)
-    + 7*(a1(j)*a6(j))*(a2(k)*a5(k))*(a3(l)*a4(l))*a7(i)
-    + 8*(a1(j)*a7(j))*(a2(k)*a6(k))*(a3(l)*a5(l))*(a4(m)*a4(m))*a8(i)
-    + 9*(a1(j)*a8(j))*(a2(k)*a7(k))*(a3(l)*a6(l))*(a4(m)*a5(m))*a9(i)
-    ;
-  a1(i)*=0.1;
-  a2(i)*=0.2;
-  a3(i)*=0.3;
-  a4(i)*=0.4;
-  a5(i)*=0.5;
-  a6(i)*=0.6;
-  a7(i)*=0.7;
-  a8(i)*=0.8;
-  a9(i)*=0.9;
-  return;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,190 @@
+#include "../../FTensor.hpp"
+using namespace FTensor;
+
+inline void func1(Tensor1<double,3> &y, Tensor1<double,3> &a1)
+{
+  const Index<'i',3> i;
+
+  y(i)+=a1(i);
+  a1(i)*=0.1;
+  return;
+}
+
+inline void func2(Tensor1<double,3> &y, Tensor1<double,3> &a1, Tensor1<double,3> &a2)
+{
+  const Index<'i',3> i;
+
+  y(i)+=a1(i)
+    + 2*a2(i)
+    ;
+  a1(i)*=0.1;
+  a2(i)*=0.2;
+  return;
+}
+
+inline void func3(Tensor1<double,3> &y, Tensor1<double,3> &a1, Tensor1<double,3> &a2, Tensor1<double,3> &a3)
+{
+  const Index<'i',3> i;
+  const Index<'j',3> j;
+
+  y(i)+=a1(i)
+    + 2*a2(i)
+    + 3*(a1(j)*a2(j))*a3(i)
+    ;
+  a1(i)*=0.1;
+  a2(i)*=0.2;
+  a3(i)*=0.3;
+  return;
+}
+
+inline void func4(Tensor1<double,3> &y, Tensor1<double,3> &a1, Tensor1<double,3> &a2, Tensor1<double,3> &a3,
+		  Tensor1<double,3> &a4)
+{
+  const Index<'i',3> i;
+  const Index<'j',3> j;
+  const Index<'k',3> k;
+
+  y(i)+=a1(i)
+    + 2*a2(i)
+    + 3*(a1(j)*a2(j))*a3(i)
+    + 4*(a1(j)*a3(j))*(a2(k)*a2(k))*a4(i)
+    ;
+  a1(i)*=0.1;
+  a2(i)*=0.2;
+  a3(i)*=0.3;
+  a4(i)*=0.4;
+  return;
+}
+
+inline void func5(Tensor1<double,3> &y, Tensor1<double,3> &a1, Tensor1<double,3> &a2, Tensor1<double,3> &a3,
+		  Tensor1<double,3> &a4, Tensor1<double,3> &a5)
+{
+  const Index<'i',3> i;
+  const Index<'j',3> j;
+  const Index<'k',3> k;
+
+  y(i)+=a1(i)
+    + 2*a2(i)
+    + 3*(a1(j)*a2(j))*a3(i)
+    + 4*(a1(j)*a3(j))*(a2(k)*a2(k))*a4(i)
+    + 5*(a1(j)*a4(j))*(a2(k)*a3(k))*a5(i)
+    ;
+  a1(i)*=0.1;
+  a2(i)*=0.2;
+  a3(i)*=0.3;
+  a4(i)*=0.4;
+  a5(i)*=0.5;
+  return;
+}
+
+inline void func6(Tensor1<double,3> &y, Tensor1<double,3> &a1, Tensor1<double,3> &a2, Tensor1<double,3> &a3,
+		  Tensor1<double,3> &a4, Tensor1<double,3> &a5, Tensor1<double,3> &a6)
+{
+  const Index<'i',3> i;
+  const Index<'j',3> j;
+  const Index<'k',3> k;
+  const Index<'l',3> l;
+
+  y(i)+=a1(i)
+    + 2*a2(i)
+    + 3*(a1(j)*a2(j))*a3(i)
+    + 4*(a1(j)*a3(j))*(a2(k)*a2(k))*a4(i)
+    + 5*(a1(j)*a4(j))*(a2(k)*a3(k))*a5(i)
+    + 6*(a1(j)*a5(j))*(a2(k)*a4(k))*(a3(l)*a3(l))*a6(i)
+    ;
+  a1(i)*=0.1;
+  a2(i)*=0.2;
+  a3(i)*=0.3;
+  a4(i)*=0.4;
+  a5(i)*=0.5;
+  a6(i)*=0.6;
+  return;
+}
+
+inline void func7(Tensor1<double,3> &y, Tensor1<double,3> &a1, Tensor1<double,3> &a2, Tensor1<double,3> &a3,
+		  Tensor1<double,3> &a4, Tensor1<double,3> &a5, Tensor1<double,3> &a6, Tensor1<double,3> &a7)
+{
+  const Index<'i',3> i;
+  const Index<'j',3> j;
+  const Index<'k',3> k;
+  const Index<'l',3> l;
+
+  y(i)+=a1(i)
+    + 2*a2(i)
+    + 3*(a1(j)*a2(j))*a3(i)
+    + 4*(a1(j)*a3(j))*(a2(k)*a2(k))*a4(i)
+    + 5*(a1(j)*a4(j))*(a2(k)*a3(k))*a5(i)
+    + 6*(a1(j)*a5(j))*(a2(k)*a4(k))*(a3(l)*a3(l))*a6(i)
+    + 7*(a1(j)*a6(j))*(a2(k)*a5(k))*(a3(l)*a4(l))*a7(i)
+    ;
+  a1(i)*=0.1;
+  a2(i)*=0.2;
+  a3(i)*=0.3;
+  a4(i)*=0.4;
+  a5(i)*=0.5;
+  a6(i)*=0.6;
+  a7(i)*=0.7;
+  return;
+}
+
+inline void func8(Tensor1<double,3> &y, Tensor1<double,3> &a1, Tensor1<double,3> &a2, Tensor1<double,3> &a3,
+		  Tensor1<double,3> &a4, Tensor1<double,3> &a5, Tensor1<double,3> &a6, Tensor1<double,3> &a7,
+		  Tensor1<double,3> &a8)
+{
+  const Index<'i',3> i;
+  const Index<'j',3> j;
+  const Index<'k',3> k;
+  const Index<'l',3> l;
+  const Index<'m',3> m;
+
+  y(i)+=a1(i)
+    + 2*a2(i)
+    + 3*(a1(j)*a2(j))*a3(i)
+    + 4*(a1(j)*a3(j))*(a2(k)*a2(k))*a4(i)
+    + 5*(a1(j)*a4(j))*(a2(k)*a3(k))*a5(i)
+    + 6*(a1(j)*a5(j))*(a2(k)*a4(k))*(a3(l)*a3(l))*a6(i)
+    + 7*(a1(j)*a6(j))*(a2(k)*a5(k))*(a3(l)*a4(l))*a7(i)
+    + 8*(a1(j)*a7(j))*(a2(k)*a6(k))*(a3(l)*a5(l))*(a4(m)*a4(m))*a8(i)
+    ;
+  a1(i)*=0.1;
+  a2(i)*=0.2;
+  a3(i)*=0.3;
+  a4(i)*=0.4;
+  a5(i)*=0.5;
+  a6(i)*=0.6;
+  a7(i)*=0.7;
+  a8(i)*=0.8;
+  return;
+}
+
+inline void func9(Tensor1<double,3> &y, Tensor1<double,3> &a1, Tensor1<double,3> &a2, Tensor1<double,3> &a3,
+		  Tensor1<double,3> &a4, Tensor1<double,3> &a5, Tensor1<double,3> &a6, Tensor1<double,3> &a7,
+		  Tensor1<double,3> &a8, Tensor1<double,3> &a9)
+{
+  const Index<'i',3> i;
+  const Index<'j',3> j;
+  const Index<'k',3> k;
+  const Index<'l',3> l;
+  const Index<'m',3> m;
+
+  y(i)+=a1(i)
+    + 2*a2(i)
+    + 3*(a1(j)*a2(j))*a3(i)
+    + 4*(a1(j)*a3(j))*(a2(k)*a2(k))*a4(i)
+    + 5*(a1(j)*a4(j))*(a2(k)*a3(k))*a5(i)
+    + 6*(a1(j)*a5(j))*(a2(k)*a4(k))*(a3(l)*a3(l))*a6(i)
+    + 7*(a1(j)*a6(j))*(a2(k)*a5(k))*(a3(l)*a4(l))*a7(i)
+    + 8*(a1(j)*a7(j))*(a2(k)*a6(k))*(a3(l)*a5(l))*(a4(m)*a4(m))*a8(i)
+    + 9*(a1(j)*a8(j))*(a2(k)*a7(k))*(a3(l)*a6(l))*(a4(m)*a5(m))*a9(i)
+    ;
+  a1(i)*=0.1;
+  a2(i)*=0.2;
+  a3(i)*=0.3;
+  a4(i)*=0.4;
+  a5(i)*=0.5;
+  a6(i)*=0.6;
+  a7(i)*=0.7;
+  a8(i)*=0.8;
+  a9(i)*=0.9;
+  return;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x1.C
--- a/tests/speed/one_over_1_minus_x1.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-#include <iostream>
-#include "one_over_1_minus_x.h"
-
-int main()
-{
-  Tensor1<double,3> y(0,1,2);
-  Tensor1<double,3> a1(2,3,4);
-
-  for(int ii=0;ii<100000000;ii++)
-    {
-          func1(y,a1);
-    }
-  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x1.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x1.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,14 @@
+#include <iostream>
+#include "one_over_1_minus_x.hpp"
+
+int main()
+{
+  Tensor1<double,3> y(0,1,2);
+  Tensor1<double,3> a1(2,3,4);
+
+  for(int ii=0;ii<100000000;ii++)
+    {
+          func1(y,a1);
+    }
+  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x2.C
--- a/tests/speed/one_over_1_minus_x2.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-#include <iostream>
-#include "one_over_1_minus_x.h"
-
-int main()
-{
-  Tensor1<double,3> y(0,1,2);
-  Tensor1<double,3> a1(2,3,4);
-  Tensor1<double,3> a2(5,6,7);
-
-  for(int ii=0;ii<100000000;ii++)
-    {
-      func2(y,a1,a2);
-    }
-  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x2.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x2.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,15 @@
+#include <iostream>
+#include "one_over_1_minus_x.hpp"
+
+int main()
+{
+  Tensor1<double,3> y(0,1,2);
+  Tensor1<double,3> a1(2,3,4);
+  Tensor1<double,3> a2(5,6,7);
+
+  for(int ii=0;ii<100000000;ii++)
+    {
+      func2(y,a1,a2);
+    }
+  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x3.C
--- a/tests/speed/one_over_1_minus_x3.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-#include <iostream>
-#include "one_over_1_minus_x.h"
-
-int main()
-{
-  Tensor1<double,3> y(0,1,2);
-  Tensor1<double,3> a1(2,3,4);
-  Tensor1<double,3> a2(5,6,7);
-  Tensor1<double,3> a3(8,9,10);
-
-  for(int ii=0;ii<10000000;ii++)
-    {
-      func3(y,a1,a2,a3);
-    }
-  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x3.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x3.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,16 @@
+#include <iostream>
+#include "one_over_1_minus_x.hpp"
+
+int main()
+{
+  Tensor1<double,3> y(0,1,2);
+  Tensor1<double,3> a1(2,3,4);
+  Tensor1<double,3> a2(5,6,7);
+  Tensor1<double,3> a3(8,9,10);
+
+  for(int ii=0;ii<10000000;ii++)
+    {
+      func3(y,a1,a2,a3);
+    }
+  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x4.C
--- a/tests/speed/one_over_1_minus_x4.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-#include <iostream>
-#include "one_over_1_minus_x.h"
-
-int main()
-{
-  Tensor1<double,3> y(0,1,2);
-  Tensor1<double,3> a1(2,3,4);
-  Tensor1<double,3> a2(5,6,7);
-  Tensor1<double,3> a3(8,9,10);
-  Tensor1<double,3> a4(11,12,13);
-
-  for(int ii=0;ii<10000000;ii++)
-    {
-      func4(y,a1,a2,a3,a4);
-    }
-  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x4.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x4.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,17 @@
+#include <iostream>
+#include "one_over_1_minus_x.hpp"
+
+int main()
+{
+  Tensor1<double,3> y(0,1,2);
+  Tensor1<double,3> a1(2,3,4);
+  Tensor1<double,3> a2(5,6,7);
+  Tensor1<double,3> a3(8,9,10);
+  Tensor1<double,3> a4(11,12,13);
+
+  for(int ii=0;ii<10000000;ii++)
+    {
+      func4(y,a1,a2,a3,a4);
+    }
+  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x5.C
--- a/tests/speed/one_over_1_minus_x5.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-#include <iostream>
-#include "one_over_1_minus_x.h"
-
-int main()
-{
-  Tensor1<double,3> y(0,1,2);
-  Tensor1<double,3> a1(2,3,4);
-  Tensor1<double,3> a2(5,6,7);
-  Tensor1<double,3> a3(8,9,10);
-  Tensor1<double,3> a4(11,12,13);
-  Tensor1<double,3> a5(14,15,16);
-
-  for(int ii=0;ii<10000000;ii++)
-    {
-      func5(y,a1,a2,a3,a4,a5);
-    }
-  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x5.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x5.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,18 @@
+#include <iostream>
+#include "one_over_1_minus_x.hpp"
+
+int main()
+{
+  Tensor1<double,3> y(0,1,2);
+  Tensor1<double,3> a1(2,3,4);
+  Tensor1<double,3> a2(5,6,7);
+  Tensor1<double,3> a3(8,9,10);
+  Tensor1<double,3> a4(11,12,13);
+  Tensor1<double,3> a5(14,15,16);
+
+  for(int ii=0;ii<10000000;ii++)
+    {
+      func5(y,a1,a2,a3,a4,a5);
+    }
+  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x6.C
--- a/tests/speed/one_over_1_minus_x6.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-#include <iostream>
-#include "one_over_1_minus_x.h"
-
-int main()
-{
-  Tensor1<double,3> y(0,1,2);
-  Tensor1<double,3> a1(2,3,4);
-  Tensor1<double,3> a2(5,6,7);
-  Tensor1<double,3> a3(8,9,10);
-  Tensor1<double,3> a4(11,12,13);
-  Tensor1<double,3> a5(14,15,16);
-  Tensor1<double,3> a6(17,18,19);
-
-  for(int ii=0;ii<1000000;ii++)
-    {
-      func6(y,a1,a2,a3,a4,a5,a6);
-    }
-  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x6.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x6.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,19 @@
+#include <iostream>
+#include "one_over_1_minus_x.hpp"
+
+int main()
+{
+  Tensor1<double,3> y(0,1,2);
+  Tensor1<double,3> a1(2,3,4);
+  Tensor1<double,3> a2(5,6,7);
+  Tensor1<double,3> a3(8,9,10);
+  Tensor1<double,3> a4(11,12,13);
+  Tensor1<double,3> a5(14,15,16);
+  Tensor1<double,3> a6(17,18,19);
+
+  for(int ii=0;ii<1000000;ii++)
+    {
+      func6(y,a1,a2,a3,a4,a5,a6);
+    }
+  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x7.C
--- a/tests/speed/one_over_1_minus_x7.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#include <iostream>
-#include "one_over_1_minus_x.h"
-
-int main()
-{
-  Tensor1<double,3> y(0,1,2);
-  Tensor1<double,3> a1(2,3,4);
-  Tensor1<double,3> a2(5,6,7);
-  Tensor1<double,3> a3(8,9,10);
-  Tensor1<double,3> a4(11,12,13);
-  Tensor1<double,3> a5(14,15,16);
-  Tensor1<double,3> a6(17,18,19);
-  Tensor1<double,3> a7(20,21,22);
-
-  for(int ii=0;ii<1000000;ii++)
-    {
-      func7(y,a1,a2,a3,a4,a5,a6,a7);
-    }
-  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x7.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x7.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,20 @@
+#include <iostream>
+#include "one_over_1_minus_x.hpp"
+
+int main()
+{
+  Tensor1<double,3> y(0,1,2);
+  Tensor1<double,3> a1(2,3,4);
+  Tensor1<double,3> a2(5,6,7);
+  Tensor1<double,3> a3(8,9,10);
+  Tensor1<double,3> a4(11,12,13);
+  Tensor1<double,3> a5(14,15,16);
+  Tensor1<double,3> a6(17,18,19);
+  Tensor1<double,3> a7(20,21,22);
+
+  for(int ii=0;ii<1000000;ii++)
+    {
+      func7(y,a1,a2,a3,a4,a5,a6,a7);
+    }
+  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x8.C
--- a/tests/speed/one_over_1_minus_x8.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,21 +0,0 @@
-#include <iostream>
-#include "one_over_1_minus_x.h"
-
-int main()
-{
-  Tensor1<double,3> y(0,1,2);
-  Tensor1<double,3> a1(2,3,4);
-  Tensor1<double,3> a2(5,6,7);
-  Tensor1<double,3> a3(8,9,10);
-  Tensor1<double,3> a4(11,12,13);
-  Tensor1<double,3> a5(14,15,16);
-  Tensor1<double,3> a6(17,18,19);
-  Tensor1<double,3> a7(20,21,22);
-  Tensor1<double,3> a8(23,24,25);
-
-  for(int ii=0;ii<1000000;ii++)
-    {
-	  func8(y,a1,a2,a3,a4,a5,a6,a7,a8);
-    }
-  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x8.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x8.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,21 @@
+#include <iostream>
+#include "one_over_1_minus_x.hpp"
+
+int main()
+{
+  Tensor1<double,3> y(0,1,2);
+  Tensor1<double,3> a1(2,3,4);
+  Tensor1<double,3> a2(5,6,7);
+  Tensor1<double,3> a3(8,9,10);
+  Tensor1<double,3> a4(11,12,13);
+  Tensor1<double,3> a5(14,15,16);
+  Tensor1<double,3> a6(17,18,19);
+  Tensor1<double,3> a7(20,21,22);
+  Tensor1<double,3> a8(23,24,25);
+
+  for(int ii=0;ii<1000000;ii++)
+    {
+	  func8(y,a1,a2,a3,a4,a5,a6,a7,a8);
+    }
+  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x9.C
--- a/tests/speed/one_over_1_minus_x9.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-#include <iostream>
-#include "one_over_1_minus_x.h"
-
-int main()
-{
-  Tensor1<double,3> y(0,1,2);
-  Tensor1<double,3> a1(2,3,4);
-  Tensor1<double,3> a2(5,6,7);
-  Tensor1<double,3> a3(8,9,10);
-  Tensor1<double,3> a4(11,12,13);
-  Tensor1<double,3> a5(14,15,16);
-  Tensor1<double,3> a6(17,18,19);
-  Tensor1<double,3> a7(20,21,22);
-  Tensor1<double,3> a8(23,24,25);
-  Tensor1<double,3> a9(26,27,28);
-
-  for(int ii=0;ii<1000000;ii++)
-    {
-      func9(y,a1,a2,a3,a4,a5,a6,a7,a8,a9);
-    }
-  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x9.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x9.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,22 @@
+#include <iostream>
+#include "one_over_1_minus_x.hpp"
+
+int main()
+{
+  Tensor1<double,3> y(0,1,2);
+  Tensor1<double,3> a1(2,3,4);
+  Tensor1<double,3> a2(5,6,7);
+  Tensor1<double,3> a3(8,9,10);
+  Tensor1<double,3> a4(11,12,13);
+  Tensor1<double,3> a5(14,15,16);
+  Tensor1<double,3> a6(17,18,19);
+  Tensor1<double,3> a7(20,21,22);
+  Tensor1<double,3> a8(23,24,25);
+  Tensor1<double,3> a9(26,27,28);
+
+  for(int ii=0;ii<1000000;ii++)
+    {
+      func9(y,a1,a2,a3,a4,a5,a6,a7,a8,a9);
+    }
+  std::cout << y(0) << " " << y(1) << " " << y(2) << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast.C
--- a/tests/speed/one_over_1_minus_x_fast.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,379 +0,0 @@
-#include <iostream>
-
-inline void func1(double * restrict y, double * restrict a1)
-{
-  y[0]+=a1[0];
-  y[1]+=a1[1];
-  y[2]+=a1[2];
-  a1[0]*=0.1;
-  a1[1]*=0.1;
-  a1[2]*=0.1;
-  return;
-}
-
-inline void func2(double * restrict y, double * restrict a1, double * restrict a2)
-{
-  y[0]+=a1[0]
-    + 2*a2[0]
-    ;
-  y[1]+=a1[1]
-    + 2*a2[1]
-    ;
-  y[2]+=a1[2]
-    + 2*a2[2]
-    ;
-  a1[0]*=0.1;
-  a2[0]*=0.2;
-  a1[1]*=0.1;
-  a2[1]*=0.2;
-  a1[2]*=0.1;
-  a2[2]*=0.2;
-  return;
-}
-
-inline void func3(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3)
-{
-  y[0]+=a1[0]
-    + 2*a2[0]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
-    ;
-  y[1]+=a1[1]
-    + 2*a2[1]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
-    ;
-  y[2]+=a1[2]
-    + 2*a2[2]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
-    ;
-  a1[0]*=0.1;
-  a2[0]*=0.2;
-  a3[0]*=0.3;
-  a1[1]*=0.1;
-  a2[1]*=0.2;
-  a3[1]*=0.3;
-  a1[2]*=0.1;
-  a2[2]*=0.2;
-  a3[2]*=0.3;
-  return;
-}
-
-inline void func4(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
-		  double * restrict a4)
-{
-  y[0]+=a1[0]
-    + 2*a2[0]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
-    ;
-  y[1]+=a1[1]
-    + 2*a2[1]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
-    ;
-  y[2]+=a1[2]
-    + 2*a2[2]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
-    ;
-  a1[0]*=0.1;
-  a2[0]*=0.2;
-  a3[0]*=0.3;
-  a4[0]*=0.4;
-  a1[1]*=0.1;
-  a2[1]*=0.2;
-  a3[1]*=0.3;
-  a4[1]*=0.4;
-  a1[2]*=0.1;
-  a2[2]*=0.2;
-  a3[2]*=0.3;
-  a4[2]*=0.4;
-  return;
-}
-
-inline void func5(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
-		  double * restrict a4, double * restrict a5)
-{
-  y[0]+=a1[0]
-    + 2*a2[0]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[0]
-    ;
-  y[1]+=a1[1]
-    + 2*a2[1]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[1]
-    ;
-  y[2]+=a1[2]
-    + 2*a2[2]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[2]
-    ;
-  a1[0]*=0.1;
-  a2[0]*=0.2;
-  a3[0]*=0.3;
-  a4[0]*=0.4;
-  a5[0]*=0.5;
-  a1[1]*=0.1;
-  a2[1]*=0.2;
-  a3[1]*=0.3;
-  a4[1]*=0.4;
-  a5[1]*=0.5;
-  a1[2]*=0.1;
-  a2[2]*=0.2;
-  a3[2]*=0.3;
-  a4[2]*=0.4;
-  a5[2]*=0.5;
-  return;
-}
-
-inline void func6(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
-		  double * restrict a4, double * restrict a5, double * restrict a6)
-{
-  y[0]+=a1[0]
-    + 2*a2[0]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[0]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[0]
-    ;
-  y[1]+=a1[1]
-    + 2*a2[1]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[1]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[1]
-    ;
-  y[2]+=a1[2]
-    + 2*a2[2]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[2]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[2]
-    ;
-  a1[0]*=0.1;
-  a2[0]*=0.2;
-  a3[0]*=0.3;
-  a4[0]*=0.4;
-  a5[0]*=0.5;
-  a6[0]*=0.6;
-  a1[1]*=0.1;
-  a2[1]*=0.2;
-  a3[1]*=0.3;
-  a4[1]*=0.4;
-  a5[1]*=0.5;
-  a6[1]*=0.6;
-  a1[2]*=0.1;
-  a2[2]*=0.2;
-  a3[2]*=0.3;
-  a4[2]*=0.4;
-  a5[2]*=0.5;
-  a6[2]*=0.6;
-  return;
-}
-
-inline void func7(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
-		  double * restrict a4, double * restrict a5, double * restrict a6, double * restrict a7)
-{
-  y[0]+=a1[0]
-    + 2*a2[0]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[0]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[0]
-    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[0]
-    ;
-  y[1]+=a1[1]
-    + 2*a2[1]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[1]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[1]
-    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[1]
-    ;
-  y[2]+=a1[2]
-    + 2*a2[2]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[2]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[2]
-    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[2]
-    ;
-  a1[0]*=0.1;
-  a2[0]*=0.2;
-  a3[0]*=0.3;
-  a4[0]*=0.4;
-  a5[0]*=0.5;
-  a6[0]*=0.6;
-  a7[0]*=0.7;
-  a1[1]*=0.1;
-  a2[1]*=0.2;
-  a3[1]*=0.3;
-  a4[1]*=0.4;
-  a5[1]*=0.5;
-  a6[1]*=0.6;
-  a7[1]*=0.7;
-  a1[2]*=0.1;
-  a2[2]*=0.2;
-  a3[2]*=0.3;
-  a4[2]*=0.4;
-  a5[2]*=0.5;
-  a6[2]*=0.6;
-  a7[2]*=0.7;
-  return;
-}
-
-inline void func8(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
-		  double * restrict a4, double * restrict a5, double * restrict a6, double * restrict a7,
-		  double * restrict a8)
-{
-  y[0]+=a1[0]
-    + 2*a2[0]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[0]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[0]
-    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[0]
-    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[0]
-    ;
-  y[1]+=a1[1]
-    + 2*a2[1]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[1]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[1]
-    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[1]
-    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[1]
-    ;
-  y[2]+=a1[2]
-    + 2*a2[2]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[2]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[2]
-    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[2]
-    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[2]
-    ;
-  a1[0]*=0.1;
-  a2[0]*=0.2;
-  a3[0]*=0.3;
-  a4[0]*=0.4;
-  a5[0]*=0.5;
-  a6[0]*=0.6;
-  a7[0]*=0.7;
-  a8[0]*=0.8;
-  a1[1]*=0.1;
-  a2[1]*=0.2;
-  a3[1]*=0.3;
-  a4[1]*=0.4;
-  a5[1]*=0.5;
-  a6[1]*=0.6;
-  a7[1]*=0.7;
-  a8[1]*=0.8;
-  a1[2]*=0.1;
-  a2[2]*=0.2;
-  a3[2]*=0.3;
-  a4[2]*=0.4;
-  a5[2]*=0.5;
-  a6[2]*=0.6;
-  a7[2]*=0.7;
-  a8[2]*=0.8;
-  return;
-}
-
-inline void func9(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
-		  double * restrict a4, double * restrict a5, double * restrict a6, double * restrict a7,
-		  double * restrict a8, double * restrict a9)
-{
-  y[0]+=a1[0]
-    + 2*a2[0]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[0]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[0]
-    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[0]
-    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[0]
-    + 9*(a1[0]*a8[0]+a1[1]*a8[1]+a1[2]*a8[2])*(a2[0]*a7[0]+a2[1]*a7[1]+a2[2]*a7[2])*(a3[0]*a6[0]+a3[1]*a6[1]+a3[2]*a6[2])*(a4[0]*a5[0]+a4[1]*a5[1]+a4[2]*a5[2])*a9[0]
-    ;
-  y[1]+=a1[1]
-    + 2*a2[1]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[1]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[1]
-    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[1]
-    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[1]
-    + 9*(a1[0]*a8[0]+a1[1]*a8[1]+a1[2]*a8[2])*(a2[0]*a7[0]+a2[1]*a7[1]+a2[2]*a7[2])*(a3[0]*a6[0]+a3[1]*a6[1]+a3[2]*a6[2])*(a4[0]*a5[0]+a4[1]*a5[1]+a4[2]*a5[2])*a9[1]
-    ;
-  y[2]+=a1[2]
-    + 2*a2[2]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[2]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[2]
-    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[2]
-    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[2]
-    + 9*(a1[0]*a8[0]+a1[1]*a8[1]+a1[2]*a8[2])*(a2[0]*a7[0]+a2[1]*a7[1]+a2[2]*a7[2])*(a3[0]*a6[0]+a3[1]*a6[1]+a3[2]*a6[2])*(a4[0]*a5[0]+a4[1]*a5[1]+a4[2]*a5[2])*a9[2]
-    ;
-  a1[0]*=0.1;
-  a2[0]*=0.2;
-  a3[0]*=0.3;
-  a4[0]*=0.4;
-  a5[0]*=0.5;
-  a6[0]*=0.6;
-  a7[0]*=0.7;
-  a8[0]*=0.8;
-  a9[0]*=0.9;
-  a1[1]*=0.1;
-  a2[1]*=0.2;
-  a3[1]*=0.3;
-  a4[1]*=0.4;
-  a5[1]*=0.5;
-  a6[1]*=0.6;
-  a7[1]*=0.7;
-  a8[1]*=0.8;
-  a9[1]*=0.9;
-  a1[2]*=0.1;
-  a2[2]*=0.2;
-  a3[2]*=0.3;
-  a4[2]*=0.4;
-  a5[2]*=0.5;
-  a6[2]*=0.6;
-  a7[2]*=0.7;
-  a8[2]*=0.8;
-  a9[2]*=0.9;
-  return;
-}
-
-int main()
-{
-  double y[]={0,1,2};
-  double a1[]={2,3,4};
-  double a2[]={5,6,7};
-  double a3[]={8,9,10};
-  double a4[]={11,12,13};
-  double a5[]={14,15,16};
-  double a6[]={17,18,19};
-  double a7[]={20,21,22};
-  double a8[]={23,24,25};
-  double a9[]={26,27,28};
-
-  for(int ii=0;ii<1000000;ii++)
-    {
-//          func1(y,a1);
-//            func2(y,a1,a2);
-      func3(y,a1,a2,a3);
-//            func4(y,a1,a2,a3,a4);
-//            func5(y,a1,a2,a3,a4,a5);
-//            func6(y,a1,a2,a3,a4,a5,a6);
-//        func7(y,a1,a2,a3,a4,a5,a6,a7);
-//        func8(y,a1,a2,a3,a4,a5,a6,a7,a8);
-//        func9(y,a1,a2,a3,a4,a5,a6,a7,a8,a9);
-    }
-  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
-//         << x(0) << " " << x(1) << " " << x(2) << endl
-//         << n(0) << " " << n(1) << " " << n(2) << endl
-//         << y(i)*n(i) << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x_fast.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,379 @@
+#include <iostream>
+
+inline void func1(double * restrict y, double * restrict a1)
+{
+  y[0]+=a1[0];
+  y[1]+=a1[1];
+  y[2]+=a1[2];
+  a1[0]*=0.1;
+  a1[1]*=0.1;
+  a1[2]*=0.1;
+  return;
+}
+
+inline void func2(double * restrict y, double * restrict a1, double * restrict a2)
+{
+  y[0]+=a1[0]
+    + 2*a2[0]
+    ;
+  y[1]+=a1[1]
+    + 2*a2[1]
+    ;
+  y[2]+=a1[2]
+    + 2*a2[2]
+    ;
+  a1[0]*=0.1;
+  a2[0]*=0.2;
+  a1[1]*=0.1;
+  a2[1]*=0.2;
+  a1[2]*=0.1;
+  a2[2]*=0.2;
+  return;
+}
+
+inline void func3(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3)
+{
+  y[0]+=a1[0]
+    + 2*a2[0]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
+    ;
+  y[1]+=a1[1]
+    + 2*a2[1]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
+    ;
+  y[2]+=a1[2]
+    + 2*a2[2]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
+    ;
+  a1[0]*=0.1;
+  a2[0]*=0.2;
+  a3[0]*=0.3;
+  a1[1]*=0.1;
+  a2[1]*=0.2;
+  a3[1]*=0.3;
+  a1[2]*=0.1;
+  a2[2]*=0.2;
+  a3[2]*=0.3;
+  return;
+}
+
+inline void func4(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
+		  double * restrict a4)
+{
+  y[0]+=a1[0]
+    + 2*a2[0]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
+    ;
+  y[1]+=a1[1]
+    + 2*a2[1]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
+    ;
+  y[2]+=a1[2]
+    + 2*a2[2]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
+    ;
+  a1[0]*=0.1;
+  a2[0]*=0.2;
+  a3[0]*=0.3;
+  a4[0]*=0.4;
+  a1[1]*=0.1;
+  a2[1]*=0.2;
+  a3[1]*=0.3;
+  a4[1]*=0.4;
+  a1[2]*=0.1;
+  a2[2]*=0.2;
+  a3[2]*=0.3;
+  a4[2]*=0.4;
+  return;
+}
+
+inline void func5(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
+		  double * restrict a4, double * restrict a5)
+{
+  y[0]+=a1[0]
+    + 2*a2[0]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[0]
+    ;
+  y[1]+=a1[1]
+    + 2*a2[1]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[1]
+    ;
+  y[2]+=a1[2]
+    + 2*a2[2]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[2]
+    ;
+  a1[0]*=0.1;
+  a2[0]*=0.2;
+  a3[0]*=0.3;
+  a4[0]*=0.4;
+  a5[0]*=0.5;
+  a1[1]*=0.1;
+  a2[1]*=0.2;
+  a3[1]*=0.3;
+  a4[1]*=0.4;
+  a5[1]*=0.5;
+  a1[2]*=0.1;
+  a2[2]*=0.2;
+  a3[2]*=0.3;
+  a4[2]*=0.4;
+  a5[2]*=0.5;
+  return;
+}
+
+inline void func6(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
+		  double * restrict a4, double * restrict a5, double * restrict a6)
+{
+  y[0]+=a1[0]
+    + 2*a2[0]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[0]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[0]
+    ;
+  y[1]+=a1[1]
+    + 2*a2[1]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[1]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[1]
+    ;
+  y[2]+=a1[2]
+    + 2*a2[2]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[2]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[2]
+    ;
+  a1[0]*=0.1;
+  a2[0]*=0.2;
+  a3[0]*=0.3;
+  a4[0]*=0.4;
+  a5[0]*=0.5;
+  a6[0]*=0.6;
+  a1[1]*=0.1;
+  a2[1]*=0.2;
+  a3[1]*=0.3;
+  a4[1]*=0.4;
+  a5[1]*=0.5;
+  a6[1]*=0.6;
+  a1[2]*=0.1;
+  a2[2]*=0.2;
+  a3[2]*=0.3;
+  a4[2]*=0.4;
+  a5[2]*=0.5;
+  a6[2]*=0.6;
+  return;
+}
+
+inline void func7(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
+		  double * restrict a4, double * restrict a5, double * restrict a6, double * restrict a7)
+{
+  y[0]+=a1[0]
+    + 2*a2[0]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[0]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[0]
+    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[0]
+    ;
+  y[1]+=a1[1]
+    + 2*a2[1]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[1]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[1]
+    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[1]
+    ;
+  y[2]+=a1[2]
+    + 2*a2[2]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[2]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[2]
+    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[2]
+    ;
+  a1[0]*=0.1;
+  a2[0]*=0.2;
+  a3[0]*=0.3;
+  a4[0]*=0.4;
+  a5[0]*=0.5;
+  a6[0]*=0.6;
+  a7[0]*=0.7;
+  a1[1]*=0.1;
+  a2[1]*=0.2;
+  a3[1]*=0.3;
+  a4[1]*=0.4;
+  a5[1]*=0.5;
+  a6[1]*=0.6;
+  a7[1]*=0.7;
+  a1[2]*=0.1;
+  a2[2]*=0.2;
+  a3[2]*=0.3;
+  a4[2]*=0.4;
+  a5[2]*=0.5;
+  a6[2]*=0.6;
+  a7[2]*=0.7;
+  return;
+}
+
+inline void func8(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
+		  double * restrict a4, double * restrict a5, double * restrict a6, double * restrict a7,
+		  double * restrict a8)
+{
+  y[0]+=a1[0]
+    + 2*a2[0]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[0]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[0]
+    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[0]
+    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[0]
+    ;
+  y[1]+=a1[1]
+    + 2*a2[1]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[1]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[1]
+    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[1]
+    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[1]
+    ;
+  y[2]+=a1[2]
+    + 2*a2[2]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[2]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[2]
+    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[2]
+    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[2]
+    ;
+  a1[0]*=0.1;
+  a2[0]*=0.2;
+  a3[0]*=0.3;
+  a4[0]*=0.4;
+  a5[0]*=0.5;
+  a6[0]*=0.6;
+  a7[0]*=0.7;
+  a8[0]*=0.8;
+  a1[1]*=0.1;
+  a2[1]*=0.2;
+  a3[1]*=0.3;
+  a4[1]*=0.4;
+  a5[1]*=0.5;
+  a6[1]*=0.6;
+  a7[1]*=0.7;
+  a8[1]*=0.8;
+  a1[2]*=0.1;
+  a2[2]*=0.2;
+  a3[2]*=0.3;
+  a4[2]*=0.4;
+  a5[2]*=0.5;
+  a6[2]*=0.6;
+  a7[2]*=0.7;
+  a8[2]*=0.8;
+  return;
+}
+
+inline void func9(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
+		  double * restrict a4, double * restrict a5, double * restrict a6, double * restrict a7,
+		  double * restrict a8, double * restrict a9)
+{
+  y[0]+=a1[0]
+    + 2*a2[0]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[0]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[0]
+    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[0]
+    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[0]
+    + 9*(a1[0]*a8[0]+a1[1]*a8[1]+a1[2]*a8[2])*(a2[0]*a7[0]+a2[1]*a7[1]+a2[2]*a7[2])*(a3[0]*a6[0]+a3[1]*a6[1]+a3[2]*a6[2])*(a4[0]*a5[0]+a4[1]*a5[1]+a4[2]*a5[2])*a9[0]
+    ;
+  y[1]+=a1[1]
+    + 2*a2[1]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[1]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[1]
+    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[1]
+    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[1]
+    + 9*(a1[0]*a8[0]+a1[1]*a8[1]+a1[2]*a8[2])*(a2[0]*a7[0]+a2[1]*a7[1]+a2[2]*a7[2])*(a3[0]*a6[0]+a3[1]*a6[1]+a3[2]*a6[2])*(a4[0]*a5[0]+a4[1]*a5[1]+a4[2]*a5[2])*a9[1]
+    ;
+  y[2]+=a1[2]
+    + 2*a2[2]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[2]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[2]
+    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[2]
+    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[2]
+    + 9*(a1[0]*a8[0]+a1[1]*a8[1]+a1[2]*a8[2])*(a2[0]*a7[0]+a2[1]*a7[1]+a2[2]*a7[2])*(a3[0]*a6[0]+a3[1]*a6[1]+a3[2]*a6[2])*(a4[0]*a5[0]+a4[1]*a5[1]+a4[2]*a5[2])*a9[2]
+    ;
+  a1[0]*=0.1;
+  a2[0]*=0.2;
+  a3[0]*=0.3;
+  a4[0]*=0.4;
+  a5[0]*=0.5;
+  a6[0]*=0.6;
+  a7[0]*=0.7;
+  a8[0]*=0.8;
+  a9[0]*=0.9;
+  a1[1]*=0.1;
+  a2[1]*=0.2;
+  a3[1]*=0.3;
+  a4[1]*=0.4;
+  a5[1]*=0.5;
+  a6[1]*=0.6;
+  a7[1]*=0.7;
+  a8[1]*=0.8;
+  a9[1]*=0.9;
+  a1[2]*=0.1;
+  a2[2]*=0.2;
+  a3[2]*=0.3;
+  a4[2]*=0.4;
+  a5[2]*=0.5;
+  a6[2]*=0.6;
+  a7[2]*=0.7;
+  a8[2]*=0.8;
+  a9[2]*=0.9;
+  return;
+}
+
+int main()
+{
+  double y[]={0,1,2};
+  double a1[]={2,3,4};
+  double a2[]={5,6,7};
+  double a3[]={8,9,10};
+  double a4[]={11,12,13};
+  double a5[]={14,15,16};
+  double a6[]={17,18,19};
+  double a7[]={20,21,22};
+  double a8[]={23,24,25};
+  double a9[]={26,27,28};
+
+  for(int ii=0;ii<1000000;ii++)
+    {
+//          func1(y,a1);
+//            func2(y,a1,a2);
+      func3(y,a1,a2,a3);
+//            func4(y,a1,a2,a3,a4);
+//            func5(y,a1,a2,a3,a4,a5);
+//            func6(y,a1,a2,a3,a4,a5,a6);
+//        func7(y,a1,a2,a3,a4,a5,a6,a7);
+//        func8(y,a1,a2,a3,a4,a5,a6,a7,a8);
+//        func9(y,a1,a2,a3,a4,a5,a6,a7,a8,a9);
+    }
+  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
+//         << x(0) << " " << x(1) << " " << x(2) << endl
+//         << n(0) << " " << n(1) << " " << n(2) << endl
+//         << y(i)*n(i) << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast.h
--- a/tests/speed/one_over_1_minus_x_fast.h	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,346 +0,0 @@
-inline void func1(double * restrict y, double * restrict a1)
-{
-  y[0]+=a1[0];
-  y[1]+=a1[1];
-  y[2]+=a1[2];
-  a1[0]*=0.1;
-  a1[1]*=0.1;
-  a1[2]*=0.1;
-  return;
-}
-
-inline void func2(double * restrict y, double * restrict a1, double * restrict a2)
-{
-  y[0]+=a1[0]
-    + 2*a2[0]
-    ;
-  y[1]+=a1[1]
-    + 2*a2[1]
-    ;
-  y[2]+=a1[2]
-    + 2*a2[2]
-    ;
-  a1[0]*=0.1;
-  a2[0]*=0.2;
-  a1[1]*=0.1;
-  a2[1]*=0.2;
-  a1[2]*=0.1;
-  a2[2]*=0.2;
-  return;
-}
-
-inline void func3(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3)
-{
-  y[0]+=a1[0]
-    + 2*a2[0]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
-    ;
-  y[1]+=a1[1]
-    + 2*a2[1]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
-    ;
-  y[2]+=a1[2]
-    + 2*a2[2]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
-    ;
-  a1[0]*=0.1;
-  a2[0]*=0.2;
-  a3[0]*=0.3;
-  a1[1]*=0.1;
-  a2[1]*=0.2;
-  a3[1]*=0.3;
-  a1[2]*=0.1;
-  a2[2]*=0.2;
-  a3[2]*=0.3;
-  return;
-}
-
-inline void func4(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
-		  double * restrict a4)
-{
-  y[0]+=a1[0]
-    + 2*a2[0]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
-    ;
-  y[1]+=a1[1]
-    + 2*a2[1]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
-    ;
-  y[2]+=a1[2]
-    + 2*a2[2]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
-    ;
-  a1[0]*=0.1;
-  a2[0]*=0.2;
-  a3[0]*=0.3;
-  a4[0]*=0.4;
-  a1[1]*=0.1;
-  a2[1]*=0.2;
-  a3[1]*=0.3;
-  a4[1]*=0.4;
-  a1[2]*=0.1;
-  a2[2]*=0.2;
-  a3[2]*=0.3;
-  a4[2]*=0.4;
-  return;
-}
-
-inline void func5(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
-		  double * restrict a4, double * restrict a5)
-{
-  y[0]+=a1[0]
-    + 2*a2[0]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[0]
-    ;
-  y[1]+=a1[1]
-    + 2*a2[1]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[1]
-    ;
-  y[2]+=a1[2]
-    + 2*a2[2]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[2]
-    ;
-  a1[0]*=0.1;
-  a2[0]*=0.2;
-  a3[0]*=0.3;
-  a4[0]*=0.4;
-  a5[0]*=0.5;
-  a1[1]*=0.1;
-  a2[1]*=0.2;
-  a3[1]*=0.3;
-  a4[1]*=0.4;
-  a5[1]*=0.5;
-  a1[2]*=0.1;
-  a2[2]*=0.2;
-  a3[2]*=0.3;
-  a4[2]*=0.4;
-  a5[2]*=0.5;
-  return;
-}
-
-inline void func6(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
-		  double * restrict a4, double * restrict a5, double * restrict a6)
-{
-  y[0]+=a1[0]
-    + 2*a2[0]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[0]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[0]
-    ;
-  y[1]+=a1[1]
-    + 2*a2[1]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[1]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[1]
-    ;
-  y[2]+=a1[2]
-    + 2*a2[2]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[2]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[2]
-    ;
-  a1[0]*=0.1;
-  a2[0]*=0.2;
-  a3[0]*=0.3;
-  a4[0]*=0.4;
-  a5[0]*=0.5;
-  a6[0]*=0.6;
-  a1[1]*=0.1;
-  a2[1]*=0.2;
-  a3[1]*=0.3;
-  a4[1]*=0.4;
-  a5[1]*=0.5;
-  a6[1]*=0.6;
-  a1[2]*=0.1;
-  a2[2]*=0.2;
-  a3[2]*=0.3;
-  a4[2]*=0.4;
-  a5[2]*=0.5;
-  a6[2]*=0.6;
-  return;
-}
-
-inline void func7(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
-		  double * restrict a4, double * restrict a5, double * restrict a6, double * restrict a7)
-{
-  y[0]+=a1[0]
-    + 2*a2[0]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[0]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[0]
-    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[0]
-    ;
-  y[1]+=a1[1]
-    + 2*a2[1]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[1]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[1]
-    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[1]
-    ;
-  y[2]+=a1[2]
-    + 2*a2[2]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[2]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[2]
-    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[2]
-    ;
-  a1[0]*=0.1;
-  a2[0]*=0.2;
-  a3[0]*=0.3;
-  a4[0]*=0.4;
-  a5[0]*=0.5;
-  a6[0]*=0.6;
-  a7[0]*=0.7;
-  a1[1]*=0.1;
-  a2[1]*=0.2;
-  a3[1]*=0.3;
-  a4[1]*=0.4;
-  a5[1]*=0.5;
-  a6[1]*=0.6;
-  a7[1]*=0.7;
-  a1[2]*=0.1;
-  a2[2]*=0.2;
-  a3[2]*=0.3;
-  a4[2]*=0.4;
-  a5[2]*=0.5;
-  a6[2]*=0.6;
-  a7[2]*=0.7;
-  return;
-}
-
-inline void func8(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
-		  double * restrict a4, double * restrict a5, double * restrict a6, double * restrict a7,
-		  double * restrict a8)
-{
-  y[0]+=a1[0]
-    + 2*a2[0]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[0]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[0]
-    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[0]
-    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[0]
-    ;
-  y[1]+=a1[1]
-    + 2*a2[1]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[1]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[1]
-    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[1]
-    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[1]
-    ;
-  y[2]+=a1[2]
-    + 2*a2[2]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[2]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[2]
-    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[2]
-    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[2]
-    ;
-  a1[0]*=0.1;
-  a2[0]*=0.2;
-  a3[0]*=0.3;
-  a4[0]*=0.4;
-  a5[0]*=0.5;
-  a6[0]*=0.6;
-  a7[0]*=0.7;
-  a8[0]*=0.8;
-  a1[1]*=0.1;
-  a2[1]*=0.2;
-  a3[1]*=0.3;
-  a4[1]*=0.4;
-  a5[1]*=0.5;
-  a6[1]*=0.6;
-  a7[1]*=0.7;
-  a8[1]*=0.8;
-  a1[2]*=0.1;
-  a2[2]*=0.2;
-  a3[2]*=0.3;
-  a4[2]*=0.4;
-  a5[2]*=0.5;
-  a6[2]*=0.6;
-  a7[2]*=0.7;
-  a8[2]*=0.8;
-  return;
-}
-
-inline void func9(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
-		  double * restrict a4, double * restrict a5, double * restrict a6, double * restrict a7,
-		  double * restrict a8, double * restrict a9)
-{
-  y[0]+=a1[0]
-    + 2*a2[0]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[0]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[0]
-    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[0]
-    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[0]
-    + 9*(a1[0]*a8[0]+a1[1]*a8[1]+a1[2]*a8[2])*(a2[0]*a7[0]+a2[1]*a7[1]+a2[2]*a7[2])*(a3[0]*a6[0]+a3[1]*a6[1]+a3[2]*a6[2])*(a4[0]*a5[0]+a4[1]*a5[1]+a4[2]*a5[2])*a9[0]
-    ;
-  y[1]+=a1[1]
-    + 2*a2[1]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[1]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[1]
-    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[1]
-    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[1]
-    + 9*(a1[0]*a8[0]+a1[1]*a8[1]+a1[2]*a8[2])*(a2[0]*a7[0]+a2[1]*a7[1]+a2[2]*a7[2])*(a3[0]*a6[0]+a3[1]*a6[1]+a3[2]*a6[2])*(a4[0]*a5[0]+a4[1]*a5[1]+a4[2]*a5[2])*a9[1]
-    ;
-  y[2]+=a1[2]
-    + 2*a2[2]
-    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
-    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
-    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[2]
-    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[2]
-    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[2]
-    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[2]
-    + 9*(a1[0]*a8[0]+a1[1]*a8[1]+a1[2]*a8[2])*(a2[0]*a7[0]+a2[1]*a7[1]+a2[2]*a7[2])*(a3[0]*a6[0]+a3[1]*a6[1]+a3[2]*a6[2])*(a4[0]*a5[0]+a4[1]*a5[1]+a4[2]*a5[2])*a9[2]
-    ;
-  a1[0]*=0.1;
-  a2[0]*=0.2;
-  a3[0]*=0.3;
-  a4[0]*=0.4;
-  a5[0]*=0.5;
-  a6[0]*=0.6;
-  a7[0]*=0.7;
-  a8[0]*=0.8;
-  a9[0]*=0.9;
-  a1[1]*=0.1;
-  a2[1]*=0.2;
-  a3[1]*=0.3;
-  a4[1]*=0.4;
-  a5[1]*=0.5;
-  a6[1]*=0.6;
-  a7[1]*=0.7;
-  a8[1]*=0.8;
-  a9[1]*=0.9;
-  a1[2]*=0.1;
-  a2[2]*=0.2;
-  a3[2]*=0.3;
-  a4[2]*=0.4;
-  a5[2]*=0.5;
-  a6[2]*=0.6;
-  a7[2]*=0.7;
-  a8[2]*=0.8;
-  a9[2]*=0.9;
-  return;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast.hpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x_fast.hpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,346 @@
+inline void func1(double * restrict y, double * restrict a1)
+{
+  y[0]+=a1[0];
+  y[1]+=a1[1];
+  y[2]+=a1[2];
+  a1[0]*=0.1;
+  a1[1]*=0.1;
+  a1[2]*=0.1;
+  return;
+}
+
+inline void func2(double * restrict y, double * restrict a1, double * restrict a2)
+{
+  y[0]+=a1[0]
+    + 2*a2[0]
+    ;
+  y[1]+=a1[1]
+    + 2*a2[1]
+    ;
+  y[2]+=a1[2]
+    + 2*a2[2]
+    ;
+  a1[0]*=0.1;
+  a2[0]*=0.2;
+  a1[1]*=0.1;
+  a2[1]*=0.2;
+  a1[2]*=0.1;
+  a2[2]*=0.2;
+  return;
+}
+
+inline void func3(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3)
+{
+  y[0]+=a1[0]
+    + 2*a2[0]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
+    ;
+  y[1]+=a1[1]
+    + 2*a2[1]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
+    ;
+  y[2]+=a1[2]
+    + 2*a2[2]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
+    ;
+  a1[0]*=0.1;
+  a2[0]*=0.2;
+  a3[0]*=0.3;
+  a1[1]*=0.1;
+  a2[1]*=0.2;
+  a3[1]*=0.3;
+  a1[2]*=0.1;
+  a2[2]*=0.2;
+  a3[2]*=0.3;
+  return;
+}
+
+inline void func4(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
+		  double * restrict a4)
+{
+  y[0]+=a1[0]
+    + 2*a2[0]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
+    ;
+  y[1]+=a1[1]
+    + 2*a2[1]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
+    ;
+  y[2]+=a1[2]
+    + 2*a2[2]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
+    ;
+  a1[0]*=0.1;
+  a2[0]*=0.2;
+  a3[0]*=0.3;
+  a4[0]*=0.4;
+  a1[1]*=0.1;
+  a2[1]*=0.2;
+  a3[1]*=0.3;
+  a4[1]*=0.4;
+  a1[2]*=0.1;
+  a2[2]*=0.2;
+  a3[2]*=0.3;
+  a4[2]*=0.4;
+  return;
+}
+
+inline void func5(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
+		  double * restrict a4, double * restrict a5)
+{
+  y[0]+=a1[0]
+    + 2*a2[0]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[0]
+    ;
+  y[1]+=a1[1]
+    + 2*a2[1]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[1]
+    ;
+  y[2]+=a1[2]
+    + 2*a2[2]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[2]
+    ;
+  a1[0]*=0.1;
+  a2[0]*=0.2;
+  a3[0]*=0.3;
+  a4[0]*=0.4;
+  a5[0]*=0.5;
+  a1[1]*=0.1;
+  a2[1]*=0.2;
+  a3[1]*=0.3;
+  a4[1]*=0.4;
+  a5[1]*=0.5;
+  a1[2]*=0.1;
+  a2[2]*=0.2;
+  a3[2]*=0.3;
+  a4[2]*=0.4;
+  a5[2]*=0.5;
+  return;
+}
+
+inline void func6(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
+		  double * restrict a4, double * restrict a5, double * restrict a6)
+{
+  y[0]+=a1[0]
+    + 2*a2[0]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[0]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[0]
+    ;
+  y[1]+=a1[1]
+    + 2*a2[1]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[1]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[1]
+    ;
+  y[2]+=a1[2]
+    + 2*a2[2]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[2]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[2]
+    ;
+  a1[0]*=0.1;
+  a2[0]*=0.2;
+  a3[0]*=0.3;
+  a4[0]*=0.4;
+  a5[0]*=0.5;
+  a6[0]*=0.6;
+  a1[1]*=0.1;
+  a2[1]*=0.2;
+  a3[1]*=0.3;
+  a4[1]*=0.4;
+  a5[1]*=0.5;
+  a6[1]*=0.6;
+  a1[2]*=0.1;
+  a2[2]*=0.2;
+  a3[2]*=0.3;
+  a4[2]*=0.4;
+  a5[2]*=0.5;
+  a6[2]*=0.6;
+  return;
+}
+
+inline void func7(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
+		  double * restrict a4, double * restrict a5, double * restrict a6, double * restrict a7)
+{
+  y[0]+=a1[0]
+    + 2*a2[0]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[0]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[0]
+    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[0]
+    ;
+  y[1]+=a1[1]
+    + 2*a2[1]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[1]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[1]
+    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[1]
+    ;
+  y[2]+=a1[2]
+    + 2*a2[2]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[2]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[2]
+    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[2]
+    ;
+  a1[0]*=0.1;
+  a2[0]*=0.2;
+  a3[0]*=0.3;
+  a4[0]*=0.4;
+  a5[0]*=0.5;
+  a6[0]*=0.6;
+  a7[0]*=0.7;
+  a1[1]*=0.1;
+  a2[1]*=0.2;
+  a3[1]*=0.3;
+  a4[1]*=0.4;
+  a5[1]*=0.5;
+  a6[1]*=0.6;
+  a7[1]*=0.7;
+  a1[2]*=0.1;
+  a2[2]*=0.2;
+  a3[2]*=0.3;
+  a4[2]*=0.4;
+  a5[2]*=0.5;
+  a6[2]*=0.6;
+  a7[2]*=0.7;
+  return;
+}
+
+inline void func8(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
+		  double * restrict a4, double * restrict a5, double * restrict a6, double * restrict a7,
+		  double * restrict a8)
+{
+  y[0]+=a1[0]
+    + 2*a2[0]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[0]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[0]
+    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[0]
+    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[0]
+    ;
+  y[1]+=a1[1]
+    + 2*a2[1]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[1]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[1]
+    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[1]
+    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[1]
+    ;
+  y[2]+=a1[2]
+    + 2*a2[2]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[2]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[2]
+    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[2]
+    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[2]
+    ;
+  a1[0]*=0.1;
+  a2[0]*=0.2;
+  a3[0]*=0.3;
+  a4[0]*=0.4;
+  a5[0]*=0.5;
+  a6[0]*=0.6;
+  a7[0]*=0.7;
+  a8[0]*=0.8;
+  a1[1]*=0.1;
+  a2[1]*=0.2;
+  a3[1]*=0.3;
+  a4[1]*=0.4;
+  a5[1]*=0.5;
+  a6[1]*=0.6;
+  a7[1]*=0.7;
+  a8[1]*=0.8;
+  a1[2]*=0.1;
+  a2[2]*=0.2;
+  a3[2]*=0.3;
+  a4[2]*=0.4;
+  a5[2]*=0.5;
+  a6[2]*=0.6;
+  a7[2]*=0.7;
+  a8[2]*=0.8;
+  return;
+}
+
+inline void func9(double * restrict y, double * restrict a1, double * restrict a2, double * restrict a3,
+		  double * restrict a4, double * restrict a5, double * restrict a6, double * restrict a7,
+		  double * restrict a8, double * restrict a9)
+{
+  y[0]+=a1[0]
+    + 2*a2[0]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[0]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[0]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[0]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[0]
+    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[0]
+    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[0]
+    + 9*(a1[0]*a8[0]+a1[1]*a8[1]+a1[2]*a8[2])*(a2[0]*a7[0]+a2[1]*a7[1]+a2[2]*a7[2])*(a3[0]*a6[0]+a3[1]*a6[1]+a3[2]*a6[2])*(a4[0]*a5[0]+a4[1]*a5[1]+a4[2]*a5[2])*a9[0]
+    ;
+  y[1]+=a1[1]
+    + 2*a2[1]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[1]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[1]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[1]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[1]
+    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[1]
+    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[1]
+    + 9*(a1[0]*a8[0]+a1[1]*a8[1]+a1[2]*a8[2])*(a2[0]*a7[0]+a2[1]*a7[1]+a2[2]*a7[2])*(a3[0]*a6[0]+a3[1]*a6[1]+a3[2]*a6[2])*(a4[0]*a5[0]+a4[1]*a5[1]+a4[2]*a5[2])*a9[1]
+    ;
+  y[2]+=a1[2]
+    + 2*a2[2]
+    + 3*(a1[0]*a2[0]+a1[1]*a2[1]+a1[2]*a2[2])*a3[2]
+    + 4*(a1[0]*a3[0]+a1[1]*a3[1]+a1[2]*a3[2])*(a2[0]*a2[0]+a2[1]*a2[1]+a2[2]*a2[2])*a4[2]
+    + 5*(a1[0]*a4[0]+a1[1]*a4[1]+a1[2]*a4[2])*(a2[0]*a3[0]+a2[1]*a3[1]+a2[2]*a3[2])*a5[2]
+    + 6*(a1[0]*a5[0]+a1[1]*a5[1]+a1[2]*a5[2])*(a2[0]*a4[0]+a2[1]*a4[1]+a2[2]*a4[2])*(a3[0]*a3[0]+a3[1]*a3[1]+a3[2]*a3[2])*a6[2]
+    + 7*(a1[0]*a6[0]+a1[1]*a6[1]+a1[2]*a6[2])*(a2[0]*a5[0]+a2[1]*a5[1]+a2[2]*a5[2])*(a3[0]*a4[0]+a3[1]*a4[1]+a3[2]*a4[2])*a7[2]
+    + 8*(a1[0]*a7[0]+a1[1]*a7[1]+a1[2]*a7[2])*(a2[0]*a6[0]+a2[1]*a6[1]+a2[2]*a6[2])*(a3[0]*a5[0]+a3[1]*a5[1]+a3[2]*a5[2])*(a4[0]*a4[0]+a4[1]*a4[1]+a4[2]*a4[2])*a8[2]
+    + 9*(a1[0]*a8[0]+a1[1]*a8[1]+a1[2]*a8[2])*(a2[0]*a7[0]+a2[1]*a7[1]+a2[2]*a7[2])*(a3[0]*a6[0]+a3[1]*a6[1]+a3[2]*a6[2])*(a4[0]*a5[0]+a4[1]*a5[1]+a4[2]*a5[2])*a9[2]
+    ;
+  a1[0]*=0.1;
+  a2[0]*=0.2;
+  a3[0]*=0.3;
+  a4[0]*=0.4;
+  a5[0]*=0.5;
+  a6[0]*=0.6;
+  a7[0]*=0.7;
+  a8[0]*=0.8;
+  a9[0]*=0.9;
+  a1[1]*=0.1;
+  a2[1]*=0.2;
+  a3[1]*=0.3;
+  a4[1]*=0.4;
+  a5[1]*=0.5;
+  a6[1]*=0.6;
+  a7[1]*=0.7;
+  a8[1]*=0.8;
+  a9[1]*=0.9;
+  a1[2]*=0.1;
+  a2[2]*=0.2;
+  a3[2]*=0.3;
+  a4[2]*=0.4;
+  a5[2]*=0.5;
+  a6[2]*=0.6;
+  a7[2]*=0.7;
+  a8[2]*=0.8;
+  a9[2]*=0.9;
+  return;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast1.C
--- a/tests/speed/one_over_1_minus_x_fast1.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-#include <iostream>
-#include "one_over_1_minus_x_fast.h"
-
-int main()
-{
-  double y[]={0,1,2};
-  double a1[]={2,3,4};
-
-  for(int ii=0;ii<100000000;ii++)
-    {
-      func1(y,a1);
-    }
-  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast1.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x_fast1.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,14 @@
+#include <iostream>
+#include "one_over_1_minus_x_fast.hpp"
+
+int main()
+{
+  double y[]={0,1,2};
+  double a1[]={2,3,4};
+
+  for(int ii=0;ii<100000000;ii++)
+    {
+      func1(y,a1);
+    }
+  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast2.C
--- a/tests/speed/one_over_1_minus_x_fast2.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-#include <iostream>
-#include "one_over_1_minus_x_fast.h"
-
-int main()
-{
-  double y[]={0,1,2};
-  double a1[]={2,3,4};
-  double a2[]={5,6,7};
-
-  for(int ii=0;ii<100000000;ii++)
-    {
-      func2(y,a1,a2);
-    }
-  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast2.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x_fast2.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,15 @@
+#include <iostream>
+#include "one_over_1_minus_x_fast.hpp"
+
+int main()
+{
+  double y[]={0,1,2};
+  double a1[]={2,3,4};
+  double a2[]={5,6,7};
+
+  for(int ii=0;ii<100000000;ii++)
+    {
+      func2(y,a1,a2);
+    }
+  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast3.C
--- a/tests/speed/one_over_1_minus_x_fast3.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-#include <iostream>
-#include "one_over_1_minus_x_fast.h"
-
-int main()
-{
-  double y[]={0,1,2};
-  double a1[]={2,3,4};
-  double a2[]={5,6,7};
-  double a3[]={8,9,10};
-
-  for(int ii=0;ii<10000000;ii++)
-    {
-      func3(y,a1,a2,a3);
-    }
-  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast3.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x_fast3.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,16 @@
+#include <iostream>
+#include "one_over_1_minus_x_fast.hpp"
+
+int main()
+{
+  double y[]={0,1,2};
+  double a1[]={2,3,4};
+  double a2[]={5,6,7};
+  double a3[]={8,9,10};
+
+  for(int ii=0;ii<10000000;ii++)
+    {
+      func3(y,a1,a2,a3);
+    }
+  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast4.C
--- a/tests/speed/one_over_1_minus_x_fast4.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-#include <iostream>
-#include "one_over_1_minus_x_fast.h"
-
-int main()
-{
-  double y[]={0,1,2};
-  double a1[]={2,3,4};
-  double a2[]={5,6,7};
-  double a3[]={8,9,10};
-  double a4[]={11,12,13};
-
-  for(int ii=0;ii<10000000;ii++)
-    {
-      func4(y,a1,a2,a3,a4);
-    }
-  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast4.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x_fast4.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,17 @@
+#include <iostream>
+#include "one_over_1_minus_x_fast.hpp"
+
+int main()
+{
+  double y[]={0,1,2};
+  double a1[]={2,3,4};
+  double a2[]={5,6,7};
+  double a3[]={8,9,10};
+  double a4[]={11,12,13};
+
+  for(int ii=0;ii<10000000;ii++)
+    {
+      func4(y,a1,a2,a3,a4);
+    }
+  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast5.C
--- a/tests/speed/one_over_1_minus_x_fast5.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-#include <iostream>
-#include "one_over_1_minus_x_fast.h"
-
-int main()
-{
-  double y[]={0,1,2};
-  double a1[]={2,3,4};
-  double a2[]={5,6,7};
-  double a3[]={8,9,10};
-  double a4[]={11,12,13};
-  double a5[]={14,15,16};
-
-  for(int ii=0;ii<10000000;ii++)
-    {
-          func5(y,a1,a2,a3,a4,a5);
-    }
-  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast5.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x_fast5.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,18 @@
+#include <iostream>
+#include "one_over_1_minus_x_fast.hpp"
+
+int main()
+{
+  double y[]={0,1,2};
+  double a1[]={2,3,4};
+  double a2[]={5,6,7};
+  double a3[]={8,9,10};
+  double a4[]={11,12,13};
+  double a5[]={14,15,16};
+
+  for(int ii=0;ii<10000000;ii++)
+    {
+          func5(y,a1,a2,a3,a4,a5);
+    }
+  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast6.C
--- a/tests/speed/one_over_1_minus_x_fast6.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-#include <iostream>
-#include "one_over_1_minus_x_fast.h"
-
-int main()
-{
-  double y[]={0,1,2};
-  double a1[]={2,3,4};
-  double a2[]={5,6,7};
-  double a3[]={8,9,10};
-  double a4[]={11,12,13};
-  double a5[]={14,15,16};
-  double a6[]={17,18,19};
-
-  for(int ii=0;ii<1000000;ii++)
-    {
-      func6(y,a1,a2,a3,a4,a5,a6);
-    }
-  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast6.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x_fast6.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,19 @@
+#include <iostream>
+#include "one_over_1_minus_x_fast.hpp"
+
+int main()
+{
+  double y[]={0,1,2};
+  double a1[]={2,3,4};
+  double a2[]={5,6,7};
+  double a3[]={8,9,10};
+  double a4[]={11,12,13};
+  double a5[]={14,15,16};
+  double a6[]={17,18,19};
+
+  for(int ii=0;ii<1000000;ii++)
+    {
+      func6(y,a1,a2,a3,a4,a5,a6);
+    }
+  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast7.C
--- a/tests/speed/one_over_1_minus_x_fast7.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,21 +0,0 @@
-#include <iostream>
-#include "one_over_1_minus_x_fast.h"
-
-int main()
-{
-  double y[]={0,1,2};
-  double a1[]={2,3,4};
-  double a2[]={5,6,7};
-  double a3[]={8,9,10};
-  double a4[]={11,12,13};
-  double a5[]={14,15,16};
-  double a6[]={17,18,19};
-  double a7[]={20,21,22};
-
-  for(int ii=0;ii<1000000;ii++)
-    {
-      func7(y,a1,a2,a3,a4,a5,a6,a7);
-
-    }
-  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast7.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x_fast7.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,21 @@
+#include <iostream>
+#include "one_over_1_minus_x_fast.hpp"
+
+int main()
+{
+  double y[]={0,1,2};
+  double a1[]={2,3,4};
+  double a2[]={5,6,7};
+  double a3[]={8,9,10};
+  double a4[]={11,12,13};
+  double a5[]={14,15,16};
+  double a6[]={17,18,19};
+  double a7[]={20,21,22};
+
+  for(int ii=0;ii<1000000;ii++)
+    {
+      func7(y,a1,a2,a3,a4,a5,a6,a7);
+
+    }
+  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast8.C
--- a/tests/speed/one_over_1_minus_x_fast8.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,21 +0,0 @@
-#include <iostream>
-#include "one_over_1_minus_x_fast.h"
-
-int main()
-{
-  double y[]={0,1,2};
-  double a1[]={2,3,4};
-  double a2[]={5,6,7};
-  double a3[]={8,9,10};
-  double a4[]={11,12,13};
-  double a5[]={14,15,16};
-  double a6[]={17,18,19};
-  double a7[]={20,21,22};
-  double a8[]={23,24,25};
-
-  for(int ii=0;ii<1000000;ii++)
-    {
-      func8(y,a1,a2,a3,a4,a5,a6,a7,a8);
-    }
-  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast8.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x_fast8.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,21 @@
+#include <iostream>
+#include "one_over_1_minus_x_fast.hpp"
+
+int main()
+{
+  double y[]={0,1,2};
+  double a1[]={2,3,4};
+  double a2[]={5,6,7};
+  double a3[]={8,9,10};
+  double a4[]={11,12,13};
+  double a5[]={14,15,16};
+  double a6[]={17,18,19};
+  double a7[]={20,21,22};
+  double a8[]={23,24,25};
+
+  for(int ii=0;ii<1000000;ii++)
+    {
+      func8(y,a1,a2,a3,a4,a5,a6,a7,a8);
+    }
+  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast9.C
--- a/tests/speed/one_over_1_minus_x_fast9.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-#include <iostream>
-#include "one_over_1_minus_x_fast.h"
-
-int main()
-{
-  double y[]={0,1,2};
-  double a1[]={2,3,4};
-  double a2[]={5,6,7};
-  double a3[]={8,9,10};
-  double a4[]={11,12,13};
-  double a5[]={14,15,16};
-  double a6[]={17,18,19};
-  double a7[]={20,21,22};
-  double a8[]={23,24,25};
-  double a9[]={26,27,28};
-
-  for(int ii=0;ii<1000000;ii++)
-    {
-      func9(y,a1,a2,a3,a4,a5,a6,a7,a8,a9);
-    }
-  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/one_over_1_minus_x_fast9.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/one_over_1_minus_x_fast9.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,22 @@
+#include <iostream>
+#include "one_over_1_minus_x_fast.hpp"
+
+int main()
+{
+  double y[]={0,1,2};
+  double a1[]={2,3,4};
+  double a2[]={5,6,7};
+  double a3[]={8,9,10};
+  double a4[]={11,12,13};
+  double a5[]={14,15,16};
+  double a6[]={17,18,19};
+  double a7[]={20,21,22};
+  double a8[]={23,24,25};
+  double a9[]={26,27,28};
+
+  for(int ii=0;ii<1000000;ii++)
+    {
+      func9(y,a1,a2,a3,a4,a5,a6,a7,a8,a9);
+    }
+  std::cout << y[0] << " " << y[1] << " " << y[2] << std::endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/simple.C
--- a/tests/speed/simple.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-#include <iostream>
-using namespace std;
-
-void temp(int x, int y=10)
-{
-  cout << x << " " << y << endl;
-}
-
-
-//  template<class T, int Dim>
-//  class helper;
-
-//  template<class T>
-//  class helper<T,1>
-//  {
-//  public:
-//    helper(T temp[1], T a)
-//    {
-//      temp[0]=a;
-//    }
-//  };
-
-//  template<class T, int Dim>
-//  class simp
-//  {
-//  public:
-//    T temp[Dim];
-//    simp(T a)
-//    {
-//      helper<T,Dim>(temp,a);
-//    }
-//  };
-
-int main()
-{
-  temp(10);
-  temp(10,20);
-
-//    simp<int,1> ttx(12);
-//    cout << ttx.temp[0] << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/simple.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/simple.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,41 @@
+#include <iostream>
+using namespace std;
+
+void temp(int x, int y=10)
+{
+  cout << x << " " << y << endl;
+}
+
+
+//  template<class T, int Dim>
+//  class helper;
+
+//  template<class T>
+//  class helper<T,1>
+//  {
+//  public:
+//    helper(T temp[1], T a)
+//    {
+//      temp[0]=a;
+//    }
+//  };
+
+//  template<class T, int Dim>
+//  class simp
+//  {
+//  public:
+//    T temp[Dim];
+//    simp(T a)
+//    {
+//      helper<T,Dim>(temp,a);
+//    }
+//  };
+
+int main()
+{
+  temp(10);
+  temp(10,20);
+
+//    simp<int,1> ttx(12);
+//    cout << ttx.temp[0] << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/single.C
--- a/tests/speed/single.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-#include <iostream.h>
-#include <ostream.h>
-template<char i>
-class Index
-{
-public:
-  Index() {};
-};
-
-class Tensor1;
-
-template <class A, char i>
-class Tensor1_Expr
-{
-  A *iter;
-public:
-  Tensor1_Expr(A *a): iter(a) {}
-  double & operator()(const int N)
-  {
-    return (*iter)(N);
-  }
-  double operator()(const int N) const
-  {
-    return (*iter)(N);
-  }
-
-  const A operator=(const Tensor1_Expr<Tensor1,'i'> &result)
-  {
-    cout << "equaling" << endl;
-    iter->data0=result(0);
-    iter->data1=result(1);
-    iter->data2=result(2);
-    return *iter;
-  }
-
-//    template<class B>
-//    const A operator=(const Tensor1_Expr<B,'i'> &result)
-//    {
-//      cout << "equaling" << endl;
-//      iter->data0=result(0);
-//      iter->data1=result(1);
-//      iter->data2=result(2);
-//      return iter;
-//    }
-};
-
-class Tensor1
-{
-public:
-  double data0, data1, data2;
-public:
-  Tensor1(double d0, double d1, double d2): data0(d0), data1(d1), data2(d2) {}
-  double & operator()(const int N)
-  {
-    return N==0 ? data0 : (N==1 ? data1 : data2);
-  }
-
-  double operator()(const int N) const
-  {
-    return N==0 ? data0 : (N==1 ? data1 : data2);
-  }
-
-  template<char i>
-  Tensor1_Expr<Tensor1,i> operator()(const Index<i> index)
-  {
-    return Tensor1_Expr<Tensor1,i>(this);
-  }
-
-  friend ostream& operator<<(ostream& s, const Tensor1 &a);
-};
-
-ostream& operator<<(ostream& s, const Tensor1 &a)
-{
-  return s << a.data0 << " " << a.data1 << " " << a.data2 << " ";
-}
-
-int main()
-{
-  Tensor1 y(0,1,2);
-  Tensor1 x(2,3,4);
-  const Index<'i'> i;
-
-  y(i)=x(i);
-
-  cout << y << endl;
-}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/single.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/single.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,86 @@
+#include <iostream.hpp>
+#include <ostream.hpp>
+template<char i>
+class Index
+{
+public:
+  Index() {};
+};
+
+class Tensor1;
+
+template <class A, char i>
+class Tensor1_Expr
+{
+  A *iter;
+public:
+  Tensor1_Expr(A *a): iter(a) {}
+  double & operator()(const int N)
+  {
+    return (*iter)(N);
+  }
+  double operator()(const int N) const
+  {
+    return (*iter)(N);
+  }
+
+  const A operator=(const Tensor1_Expr<Tensor1,'i'> &result)
+  {
+    cout << "equaling" << endl;
+    iter->data0=result(0);
+    iter->data1=result(1);
+    iter->data2=result(2);
+    return *iter;
+  }
+
+//    template<class B>
+//    const A operator=(const Tensor1_Expr<B,'i'> &result)
+//    {
+//      cout << "equaling" << endl;
+//      iter->data0=result(0);
+//      iter->data1=result(1);
+//      iter->data2=result(2);
+//      return iter;
+//    }
+};
+
+class Tensor1
+{
+public:
+  double data0, data1, data2;
+public:
+  Tensor1(double d0, double d1, double d2): data0(d0), data1(d1), data2(d2) {}
+  double & operator()(const int N)
+  {
+    return N==0 ? data0 : (N==1 ? data1 : data2);
+  }
+
+  double operator()(const int N) const
+  {
+    return N==0 ? data0 : (N==1 ? data1 : data2);
+  }
+
+  template<char i>
+  Tensor1_Expr<Tensor1,i> operator()(const Index<i> index)
+  {
+    return Tensor1_Expr<Tensor1,i>(this);
+  }
+
+  friend ostream& operator<<(ostream& s, const Tensor1 &a);
+};
+
+ostream& operator<<(ostream& s, const Tensor1 &a)
+{
+  return s << a.data0 << " " << a.data1 << " " << a.data2 << " ";
+}
+
+int main()
+{
+  Tensor1 y(0,1,2);
+  Tensor1 x(2,3,4);
+  const Index<'i'> i;
+
+  y(i)=x(i);
+
+  cout << y << endl;
+}
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/speed_test.C
--- a/tests/speed/speed_test.C	Sun Dec 13 21:43:54 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,127 +0,0 @@
-/* Tests the difference that loop fusion makes. */
-
-const int N=60000;
-
-void fused(const double metric[6][N], double inverse[6][N])
-{
-  for(int i=0;i<N;++i)
-    {
-      double det=metric[0][i]*metric[3][i]*metric[5][i] 
-	+ metric[1][i]*metric[4][i]*metric[2][i]
-	+ metric[2][i]*metric[1][i]*metric[4][i]
-	- metric[0][i]*metric[4][i]*metric[4][i]
-	- metric[1][i]*metric[1][i]*metric[5][i]
-	- metric[2][i]*metric[3][i]*metric[2][i];
-      inverse[0][i]=
-	(metric[3][i]*metric[5][i] - metric[4][i]*metric[4][i])/det;
-      inverse[1][i]=
-	(metric[2][i]*metric[4][i] - metric[1][i]*metric[5][i])/det;
-      inverse[2][i]=
-	(metric[1][i]*metric[4][i] - metric[2][i]*metric[3][i])/det;
-      inverse[3][i]=
-	(metric[0][i]*metric[5][i] - metric[2][i]*metric[2][i])/det;
-      inverse[4][i]=
-	(metric[2][i]*metric[1][i] - metric[0][i]*metric[4][i])/det;
-      inverse[5][i]=
-	(metric[3][i]*metric[0][i] - metric[1][i]*metric[1][i])/det;
-    }
-}
-
-void fused_big(const double metric[6][N], double inverse[6][N])
-{
-  double det[N];
-  for(int i=0;i<N;++i)
-    {
-      det[i]=metric[0][i]*metric[3][i]*metric[5][i] 
-	+ metric[1][i]*metric[4][i]*metric[2][i]
-	+ metric[2][i]*metric[1][i]*metric[4][i]
-	- metric[0][i]*metric[4][i]*metric[4][i]
-	- metric[1][i]*metric[1][i]*metric[5][i]
-	- metric[2][i]*metric[3][i]*metric[2][i];
-    }
-  for(int i=0;i<N;++i)
-    {
-      inverse[0][i]=
-	(metric[3][i]*metric[5][i] - metric[4][i]*metric[4][i])/det[i];
-    }
-  for(int i=0;i<N;++i)
-    {
-      inverse[1][i]=
-	(metric[2][i]*metric[4][i] - metric[1][i]*metric[5][i])/det[i];
-    }
-  for(int i=0;i<N;++i)
-    {
-      inverse[2][i]=
-	(metric[1][i]*metric[4][i] - metric[2][i]*metric[3][i])/det[i];
-    }
-  for(int i=0;i<N;++i)
-    {
-      inverse[3][i]=
-	(metric[0][i]*metric[5][i] - metric[2][i]*metric[2][i])/det[i];
-    }
-  for(int i=0;i<N;++i)
-    {
-      inverse[4][i]=
-	(metric[2][i]*metric[1][i] - metric[0][i]*metric[4][i])/det[i];
-    }
-  for(int i=0;i<N;++i)
-    {
-      inverse[5][i]=
-	(metric[3][i]*metric[0][i] - metric[1][i]*metric[1][i])/det[i];
-    }
-}
-
-
-void unfused(const double metric[6][N], double inverse[6][N])
-{
-  double det[N];
-
-  for(int i=0;i<N;++i)
-    det[i]=metric[0][i]*metric[3][i]*metric[5][i] 
-      + metric[1][i]*metric[4][i]*metric[2][i]
-      + metric[2][i]*metric[1][i]*metric[4][i]
-      - metric[0][i]*metric[4][i]*metric[4][i]
-      - metric[1][i]*metric[1][i]*metric[5][i]
-      - metric[2][i]*metric[3][i]*metric[2][i];
-  for(int i=0;i<N;++i)
-    inverse[0][i]=
-      (metric[3][i]*metric[5][i] - metric[4][i]*metric[4][i])/det[i];
-  for(int i=0;i<N;++i)
-    inverse[1][i]=
-      (metric[2][i]*metric[4][i] - metric[1][i]*metric[5][i])/det[i];
-  for(int i=0;i<N;++i)
-    inverse[2][i]=
-      (metric[1][i]*metric[4][i] - metric[2][i]*metric[3][i])/det[i];
-  for(int i=0;i<N;++i)
-    inverse[3][i]=
-      (metric[0][i]*metric[5][i] - metric[2][i]*metric[2][i])/det[i];
-  for(int i=0;i<N;++i)
-    inverse[4][i]=
-      (metric[2][i]*metric[1][i] - metric[0][i]*metric[4][i])/det[i];
-  for(int i=0;i<N;++i)
-    inverse[5][i]=
-      (metric[3][i]*metric[0][i] - metric[1][i]*metric[1][i])/det[i];
-}
-
-#include <ctime>
-#include <iostream>
-
-using namespace std;
-int main()
-{
-  double metric[6][N], inverse[6][N];
-  
-  for(int j=0;j<6;++j)
-    for(int i=0;i<N;++i)
-      metric[j][i]=1+i+j;
-
-  const int iterations=30;
-
-  for(int i=0;i<iterations;++i)
-    {
-//        fused_big(metric,inverse);
-//        fused(metric,inverse);
-//        unfused(metric,inverse);
-    }
-}
-
diff -r dd991b426d75 -r 1042a48dad5a tests/speed/speed_test.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/speed/speed_test.cpp	Mon Dec 14 00:52:50 2009 -0800
@@ -0,0 +1,127 @@
+/* Tests the difference that loop fusion makes. */
+
+const int N=60000;
+
+void fused(const double metric[6][N], double inverse[6][N])
+{
+  for(int i=0;i<N;++i)
+    {
+      double det=metric[0][i]*metric[3][i]*metric[5][i] 
+	+ metric[1][i]*metric[4][i]*metric[2][i]
+	+ metric[2][i]*metric[1][i]*metric[4][i]
+	- metric[0][i]*metric[4][i]*metric[4][i]
+	- metric[1][i]*metric[1][i]*metric[5][i]
+	- metric[2][i]*metric[3][i]*metric[2][i];
+      inverse[0][i]=
+	(metric[3][i]*metric[5][i] - metric[4][i]*metric[4][i])/det;
+      inverse[1][i]=
+	(metric[2][i]*metric[4][i] - metric[1][i]*metric[5][i])/det;
+      inverse[2][i]=
+	(metric[1][i]*metric[4][i] - metric[2][i]*metric[3][i])/det;
+      inverse[3][i]=
+	(metric[0][i]*metric[5][i] - metric[2][i]*metric[2][i])/det;
+      inverse[4][i]=
+	(metric[2][i]*metric[1][i] - metric[0][i]*metric[4][i])/det;
+      inverse[5][i]=
+	(metric[3][i]*metric[0][i] - metric[1][i]*metric[1][i])/det;
+    }
+}
+
+void fused_big(const double metric[6][N], double inverse[6][N])
+{
+  double det[N];
+  for(int i=0;i<N;++i)
+    {
+      det[i]=metric[0][i]*metric[3][i]*metric[5][i] 
+	+ metric[1][i]*metric[4][i]*metric[2][i]
+	+ metric[2][i]*metric[1][i]*metric[4][i]
+	- metric[0][i]*metric[4][i]*metric[4][i]
+	- metric[1][i]*metric[1][i]*metric[5][i]
+	- metric[2][i]*metric[3][i]*metric[2][i];
+    }
+  for(int i=0;i<N;++i)
+    {
+      inverse[0][i]=
+	(metric[3][i]*metric[5][i] - metric[4][i]*metric[4][i])/det[i];
+    }
+  for(int i=0;i<N;++i)
+    {
+      inverse[1][i]=
+	(metric[2][i]*metric[4][i] - metric[1][i]*metric[5][i])/det[i];
+    }
+  for(int i=0;i<N;++i)
+    {
+      inverse[2][i]=
+	(metric[1][i]*metric[4][i] - metric[2][i]*metric[3][i])/det[i];
+    }
+  for(int i=0;i<N;++i)
+    {
+      inverse[3][i]=
+	(metric[0][i]*metric[5][i] - metric[2][i]*metric[2][i])/det[i];
+    }
+  for(int i=0;i<N;++i)
+    {
+      inverse[4][i]=
+	(metric[2][i]*metric[1][i] - metric[0][i]*metric[4][i])/det[i];
+    }
+  for(int i=0;i<N;++i)
+    {
+      inverse[5][i]=
+	(metric[3][i]*metric[0][i] - metric[1][i]*metric[1][i])/det[i];
+    }
+}
+
+
+void unfused(const double metric[6][N], double inverse[6][N])
+{
+  double det[N];
+
+  for(int i=0;i<N;++i)
+    det[i]=metric[0][i]*metric[3][i]*metric[5][i] 
+      + metric[1][i]*metric[4][i]*metric[2][i]
+      + metric[2][i]*metric[1][i]*metric[4][i]
+      - metric[0][i]*metric[4][i]*metric[4][i]
+      - metric[1][i]*metric[1][i]*metric[5][i]
+      - metric[2][i]*metric[3][i]*metric[2][i];
+  for(int i=0;i<N;++i)
+    inverse[0][i]=
+      (metric[3][i]*metric[5][i] - metric[4][i]*metric[4][i])/det[i];
+  for(int i=0;i<N;++i)
+    inverse[1][i]=
+      (metric[2][i]*metric[4][i] - metric[1][i]*metric[5][i])/det[i];
+  for(int i=0;i<N;++i)
+    inverse[2][i]=
+      (metric[1][i]*metric[4][i] - metric[2][i]*metric[3][i])/det[i];
+  for(int i=0;i<N;++i)
+    inverse[3][i]=
+      (metric[0][i]*metric[5][i] - metric[2][i]*metric[2][i])/det[i];
+  for(int i=0;i<N;++i)
+    inverse[4][i]=
+      (metric[2][i]*metric[1][i] - metric[0][i]*metric[4][i])/det[i];
+  for(int i=0;i<N;++i)
+    inverse[5][i]=
+      (metric[3][i]*metric[0][i] - metric[1][i]*metric[1][i])/det[i];
+}
+
+#include <ctime>
+#include <iostream>
+
+using namespace std;
+int main()
+{
+  double metric[6][N], inverse[6][N];
+  
+  for(int j=0;j<6;++j)
+    for(int i=0;i<N;++i)
+      metric[j][i]=1+i+j;
+
+  const int iterations=30;
+
+  for(int i=0;i<iterations;++i)
+    {
+//        fused_big(metric,inverse);
+//        fused(metric,inverse);
+//        unfused(metric,inverse);
+    }
+}
+



More information about the CIG-COMMITS mailing list