[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203
Stephane Popinet
s.popinet at niwa.co.nz
Fri May 15 02:52:26 UTC 2009
The following commit has been merged in the upstream branch:
commit 55e3c02d5f29bd07542801f6ad3b39f1bbc32609
Author: Stephane Popinet <s.popinet at niwa.co.nz>
Date: Tue Aug 9 14:37:26 2005 +1000
New and updated Poisson test cases
Rather than plotting residual vs multigrid cycles, we plot residual vs
CPU time which is much more meaningful. A new thin plate test is
representative of pathological cases which did not work well with the
former version of the multigrid Poisson solver.
darcs-hash:20050809043726-fbd8f-11ecdbb7c3cf61013e6ba60205958ed290d2ba6f.gz
diff --git a/test/euler/circle/circle.gfs b/test/euler/circle/circle.gfs
index bcdbb78..2784d1d 100644
--- a/test/euler/circle/circle.gfs
+++ b/test/euler/circle/circle.gfs
@@ -53,7 +53,7 @@
# Author: St\'ephane Popinet
# Command: shapes -n 500 ellipse > shape.gts && sh circle.sh circle.gfs
# Version: 0.8.0
-# Required files: circle.sh res-7.ref error.ref order.ref
+# Required files: circle.sh res-7.ref error.ref order.ref solution.gfv
# Generated files: residual.eps rate.eps error.eps order.eps solution.eps
#
1 0 GfsPoisson GfsBox GfsGEdge {} {
@@ -67,11 +67,15 @@
return -M_PI*M_PI*(k*k + l*l)*sin (M_PI*k*x)*sin (M_PI*l*y);
}
}
- OutputProjectionStats { istep = 1 } {
+ OutputTime { istep = 1 } {
+ awk '{printf ("%g ", $8); fflush (stdout)}'
+ }
+ OutputProjectionStats { istep = 1 } {
awk '{
if ($1 == "niter:") printf ("%d ", $2);
if ($1 == "residual.infty:") print $3 " " $4;
- }' > res-LEVEL
+ fflush (stdout);
+ }'
}
OutputSimulation { start = end } sim-LEVEL { variables = P }
}
diff --git a/test/euler/circle/circle.sh b/test/euler/circle/circle.sh
index ec4fab2..4e40064 100644
--- a/test/euler/circle/circle.sh
+++ b/test/euler/circle/circle.sh
@@ -1,10 +1,7 @@
if ! $donotrun; then
for level in 3 4 5 6 7 8 9; do
if sed "s/LEVEL/$level/g" < $1 | \
- gerris2D - | \
- awk -v level=$level '{
- print level " " $5 " " $7 " " $9
- }'; then :
+ gerris2D - > res-$level; then :
else
exit 1
fi
@@ -43,15 +40,15 @@ fi
if cat <<EOF | gnuplot ; then :
set term postscript eps color lw 3 solid 20
set output 'residual.eps'
- set xlabel 'V-cycle'
+ set xlabel 'CPU time'
set ylabel 'Maximum residual'
set logscale y
- plot 'res-7.ref' u 1:2 t 'ref' w lp, 'res-7' u 1:2 t '' w lp
+ plot 'res-7.ref' u 1:3 t 'ref' w lp, 'res-7' u 1:3 t '' w lp
set output 'rate.eps'
set xlabel 'V-cycle'
set ylabel 'Cumulative residual reduction factor'
unset logscale
- plot 'res-7.ref' u 1:3 t 'ref' w lp, 'res-7' u 1:3 t '' w lp
+ plot 'res-7.ref' u 2:4 t 'ref' w lp, 'res-7' u 2:4 t '' w lp
set output 'error.eps'
set xlabel 'Level'
set ylabel 'Error norms'
@@ -85,7 +82,7 @@ fi
if cat <<EOF | python ; then :
from check import *
from sys import *
-if (Curve('res-7',1,2) - Curve('res-7.ref',1,2)).max() > 1e-8 or\
+if (Curve('res-7',1,3) - Curve('res-7.ref',1,3)).max() > 1e-8 or\
(Curve('error',1,4) - Curve('error.ref',1,4)).max() > 1e-6:
exit(1)
EOF
diff --git a/test/euler/circle/refined/error.ref b/test/euler/circle/refined/error.ref
new file mode 100644
index 0000000..3d1bc2b
--- /dev/null
+++ b/test/euler/circle/refined/error.ref
@@ -0,0 +1,6 @@
+3 8.643e-02 1.183e-01 3.033e-01
+4 2.899e-02 3.527e-02 7.264e-02
+5 6.577e-03 7.947e-03 1.699e-02
+6 1.500e-03 1.827e-03 4.007e-03
+7 3.381e-04 4.152e-04 9.449e-04
+8 8.068e-05 9.918e-05 2.623e-04
diff --git a/test/euler/circle/refined/order.ref b/test/euler/circle/refined/order.ref
new file mode 100644
index 0000000..c8aaf9b
--- /dev/null
+++ b/test/euler/circle/refined/order.ref
@@ -0,0 +1,5 @@
+4 1.57598 1.74594 2.06191
+5 2.14005 2.14996 2.09608
+6 2.13247 2.12093 2.08409
+7 2.14944 2.1376 2.08429
+8 2.06717 2.06569 1.84894
diff --git a/test/euler/circle/star/star.gfs b/test/euler/circle/refined/refined.gfs
similarity index 76%
copy from test/euler/circle/star/star.gfs
copy to test/euler/circle/refined/refined.gfs
index bf5a0ab..f7f80c1 100644
--- a/test/euler/circle/star/star.gfs
+++ b/test/euler/circle/refined/refined.gfs
@@ -1,16 +1,9 @@
-# Title: Star-shaped solid boundary
+# Title: Star-shaped solid boundary with refinement
#
# Description:
#
-# A similar but more difficult test using a star-shaped solid boundary
-# defined in polar coordinates as
-# $$
-# r(\theta)=0.2765+0.079\cos(6\theta)
-# $$
-#
-# The convergence rate is smaller because the shape of the boundary is
-# not represented properly on the coarsest levels of the multigrid
-# hierarchy.
+# Same as the star test but with two levels of refinement added near
+# the solid boundary.
#
# \begin{figure}[htbp]
# \begin{center}
@@ -53,14 +46,15 @@
# \end{figure}
#
# Author: St\'ephane Popinet
-# Command: shapes -n 2000 --dr 0.1 star | transform -s 0.79 > shape.gts && sh ../circle.sh star.gfs
+# Command: shapes -n 2000 --dr 0.1 star | transform -s 0.79 > shape.gts && sh ../circle.sh refined.gfs
# Version: 0.8.0
-# Required files: res-7.ref error.ref order.ref
+# Required files: res-7.ref error.ref order.ref solution.gfv
# Generated files: residual.eps rate.eps error.eps order.eps solution.eps
#
1 0 GfsPoisson GfsBox GfsGEdge {} {
Time { iend = 10 }
Refine LEVEL
+ RefineSolid (LEVEL + 2)
GtsSurfaceFile shape.gts
ApproxProjectionParams { nrelax = 4 tolerance = 1e-30 }
Init {} {
@@ -69,11 +63,15 @@
return -M_PI*M_PI*(k*k + l*l)*sin (M_PI*k*x)*sin (M_PI*l*y);
}
}
- OutputProjectionStats { istep = 1 } {
+ OutputTime { istep = 1 } {
+ awk '{printf ("%g ", $8); fflush (stdout)}'
+ }
+ OutputProjectionStats { istep = 1 } {
awk '{
if ($1 == "niter:") printf ("%d ", $2);
if ($1 == "residual.infty:") print $3 " " $4;
- }' > res-LEVEL
+ fflush (stdout);
+ }'
}
OutputSimulation { start = end } sim-LEVEL { variables = P }
}
diff --git a/test/euler/circle/refined/res-7.ref b/test/euler/circle/refined/res-7.ref
new file mode 100644
index 0000000..ec62cc1
--- /dev/null
+++ b/test/euler/circle/refined/res-7.ref
@@ -0,0 +1,11 @@
+0.1 0 1.775e+02 0
+0.38 1 4.834e+01 3.7
+0.63 2 1.985e+00 9.5
+0.88 3 3.036e-02 18
+1.14 4 7.333e-04 22
+1.39 5 2.552e-05 23
+1.65 6 1.103e-06 23
+1.9 7 3.674e-08 24
+2.15 8 9.856e-10 26
+2.41 9 1.992e-10 21
+2.66 10 2.109e-10 16
diff --git a/test/euler/circle/solution.gfv b/test/euler/circle/refined/solution.gfv
similarity index 100%
copy from test/euler/circle/solution.gfv
copy to test/euler/circle/refined/solution.gfv
diff --git a/test/euler/circle/res-7.ref b/test/euler/circle/res-7.ref
index e465cb5..6f5017a 100644
--- a/test/euler/circle/res-7.ref
+++ b/test/euler/circle/res-7.ref
@@ -1,11 +1,11 @@
-0 1.775e+02 0
-1 2.484e+01 7.1
-2 2.417e+00 8.6
-3 3.439e-01 8
-4 2.953e-02 8.8
-5 2.921e-03 9.1
-6 2.281e-04 9.6
-7 2.225e-05 9.7
-8 1.583e-06 10
-9 1.478e-07 10
-10 1.035e-08 11
+0.02 0 1.775e+02 0
+0.1 1 4.906e+00 36
+0.16 2 1.515e-01 34
+0.22 3 5.785e-03 31
+0.28 4 2.185e-04 30
+0.34 5 7.225e-06 30
+0.4 6 2.313e-07 30
+0.46 7 7.186e-09 31
+0.52 8 2.910e-10 30
+0.58 9 2.541e-11 27
+0.64 10 2.692e-11 19
diff --git a/test/euler/circle/star/res-7.ref b/test/euler/circle/star/res-7.ref
index 70211ad..af2edcc 100644
--- a/test/euler/circle/star/res-7.ref
+++ b/test/euler/circle/star/res-7.ref
@@ -1,11 +1,11 @@
-0 1.775e+02 0
-1 3.072e+01 5.8
-2 1.315e+01 3.7
-3 1.604e+00 4.8
-4 2.373e-01 5.2
-5 4.074e-02 5.3
-6 6.330e-03 5.5
-7 2.543e-03 4.9
-8 9.526e-04 4.6
-9 3.483e-04 4.3
-10 1.249e-04 4.1
+0.02 0 1.775e+02 0
+0.1 1 2.218e+01 8
+0.15 2 7.919e-01 15
+0.21 3 2.018e-02 21
+0.27 4 9.980e-04 21
+0.32 5 3.118e-05 22
+0.38 6 1.312e-06 23
+0.44 7 6.377e-08 22
+0.49 8 2.324e-09 23
+0.55 9 1.334e-10 22
+0.61 10 3.024e-11 19
diff --git a/test/euler/circle/star/star.gfs b/test/euler/circle/star/star.gfs
index bf5a0ab..35cf012 100644
--- a/test/euler/circle/star/star.gfs
+++ b/test/euler/circle/star/star.gfs
@@ -55,7 +55,7 @@
# Author: St\'ephane Popinet
# Command: shapes -n 2000 --dr 0.1 star | transform -s 0.79 > shape.gts && sh ../circle.sh star.gfs
# Version: 0.8.0
-# Required files: res-7.ref error.ref order.ref
+# Required files: res-7.ref error.ref order.ref solution.gfv
# Generated files: residual.eps rate.eps error.eps order.eps solution.eps
#
1 0 GfsPoisson GfsBox GfsGEdge {} {
@@ -69,11 +69,15 @@
return -M_PI*M_PI*(k*k + l*l)*sin (M_PI*k*x)*sin (M_PI*l*y);
}
}
- OutputProjectionStats { istep = 1 } {
+ OutputTime { istep = 1 } {
+ awk '{printf ("%g ", $8); fflush (stdout)}'
+ }
+ OutputProjectionStats { istep = 1 } {
awk '{
if ($1 == "niter:") printf ("%d ", $2);
if ($1 == "residual.infty:") print $3 " " $4;
- }' > res-LEVEL
+ fflush (stdout);
+ }'
}
OutputSimulation { start = end } sim-LEVEL { variables = P }
}
diff --git a/test/euler/circle/thin/error.ref b/test/euler/circle/thin/error.ref
new file mode 100644
index 0000000..6ba8e5e
--- /dev/null
+++ b/test/euler/circle/thin/error.ref
@@ -0,0 +1,6 @@
+3 1.577e-01 1.943e-01 4.335e-01
+4 6.417e-02 7.586e-02 2.048e-01
+5 2.960e-02 3.379e-02 1.364e-01
+6 1.426e-02 1.605e-02 9.463e-02
+7 7.001e-03 7.844e-03 6.646e-02
+8 3.468e-03 3.880e-03 4.687e-02
diff --git a/test/euler/circle/thin/order.ref b/test/euler/circle/thin/order.ref
new file mode 100644
index 0000000..59a91d2
--- /dev/null
+++ b/test/euler/circle/thin/order.ref
@@ -0,0 +1,5 @@
+4 1.29721 1.35687 1.08182
+5 1.1163 1.16674 0.586372
+6 1.05362 1.07402 0.527474
+7 1.02634 1.03291 0.509811
+8 1.01346 1.01553 0.503821
diff --git a/test/euler/circle/thin/res-7.ref b/test/euler/circle/thin/res-7.ref
new file mode 100644
index 0000000..d0efd17
--- /dev/null
+++ b/test/euler/circle/thin/res-7.ref
@@ -0,0 +1,10 @@
+0.48 1 2.892e+02 0.61
+0.78 2 8.184e+01 1.5
+1.09 3 2.229e+01 2
+1.4 4 6.010e+00 2.3
+1.7 5 1.618e+00 2.6
+2.01 6 4.356e-01 2.7
+2.34 7 1.172e-01 2.8
+2.66 8 3.156e-02 2.9
+2.97 9 8.494e-03 3
+3.27 10 2.286e-03 3.1
diff --git a/test/euler/circle/star/solution.gfv b/test/euler/circle/thin/solution.gfv
similarity index 70%
copy from test/euler/circle/star/solution.gfv
copy to test/euler/circle/thin/solution.gfv
index 994d73b..c25505d 100644
--- a/test/euler/circle/star/solution.gfv
+++ b/test/euler/circle/thin/solution.gfv
@@ -1,8 +1,8 @@
# GfsView 2D
View {
- tx = 0 ty = 0
+ tx = -0.591968 ty = 0.496337
q0 = 0 q1 = 0 q2 = 0 q3 = 1
- fov = 30
+ fov = 37.9885
r = 0.3 g = 0.4 b = 0.6
res = 1
lc = 0.001
@@ -29,3 +29,12 @@ Isoline {
} {
n = 30
}
+Squares {
+ r = 0 g = 0 b = 0
+ shading = Constant
+ maxlevel = -1
+} P {
+ amin = 1
+ amax = 1
+ cmap = Jet
+}
diff --git a/test/euler/circle/star/star.gfs b/test/euler/circle/thin/thin.gfs
similarity index 70%
copy from test/euler/circle/star/star.gfs
copy to test/euler/circle/thin/thin.gfs
index bf5a0ab..3576c68 100644
--- a/test/euler/circle/star/star.gfs
+++ b/test/euler/circle/thin/thin.gfs
@@ -1,16 +1,9 @@
-# Title: Star-shaped solid boundary
+# Title: Thin wall at box boundary
#
# Description:
#
-# A similar but more difficult test using a star-shaped solid boundary
-# defined in polar coordinates as
-# $$
-# r(\theta)=0.2765+0.079\cos(6\theta)
-# $$
-#
-# The convergence rate is smaller because the shape of the boundary is
-# not represented properly on the coarsest levels of the multigrid
-# hierarchy.
+# Boxes are used to setup a similar problem but with an infinitely
+# thin wall.
#
# \begin{figure}[htbp]
# \begin{center}
@@ -53,28 +46,39 @@
# \end{figure}
#
# Author: St\'ephane Popinet
-# Command: shapes -n 2000 --dr 0.1 star | transform -s 0.79 > shape.gts && sh ../circle.sh star.gfs
+# Command: sh ../circle.sh thin.gfs
# Version: 0.8.0
-# Required files: res-7.ref error.ref order.ref
+# Required files: res-7.ref error.ref order.ref solution.gfv
# Generated files: residual.eps rate.eps error.eps order.eps solution.eps
#
-1 0 GfsPoisson GfsBox GfsGEdge {} {
+4 3 GfsPoisson GfsBox GfsGEdge {} {
Time { iend = 10 }
Refine LEVEL
- GtsSurfaceFile shape.gts
ApproxProjectionParams { nrelax = 4 tolerance = 1e-30 }
Init {} {
Div = {
int k = 3, l = 3;
+ x = (x - 0.5)/2.;
+ y = (y + 0.5)/2.;
return -M_PI*M_PI*(k*k + l*l)*sin (M_PI*k*x)*sin (M_PI*l*y);
}
}
- OutputProjectionStats { istep = 1 } {
+ OutputTime { istep = 1 } {
+ awk '{printf ("%g ", $8); fflush (stdout)}'
+ }
+ OutputProjectionStats { istep = 1 } {
awk '{
if ($1 == "niter:") printf ("%d ", $2);
if ($1 == "residual.infty:") print $3 " " $4;
- }' > res-LEVEL
+ fflush (stdout);
+ }'
}
OutputSimulation { start = end } sim-LEVEL { variables = P }
}
GfsBox {}
+GfsBox {}
+GfsBox {}
+GfsBox {}
+1 2 right
+2 3 bottom
+3 4 left
diff --git a/test/euler/poisson/circle/circle.gfs b/test/euler/poisson/circle/circle.gfs
index d805f1e..1f37e59 100644
--- a/test/euler/poisson/circle/circle.gfs
+++ b/test/euler/poisson/circle/circle.gfs
@@ -57,13 +57,19 @@
return -M_PI*M_PI*(k*k + l*l)*sin (M_PI*k*x)*sin (M_PI*l*y);
}
}
+ OutputTime { istep = 1 } {
+ awk '{printf ("%g ", $8); fflush (stdout)}'
+ }
OutputProjectionStats { istep = 1 } {
awk '{
if ($1 == "niter:") printf ("%d ", $2);
if ($1 == "residual.infty:") print $3 " " $4;
- }' > res-LEVEL
+ fflush (stdout);
+ }'
}
- OutputErrorNorm { start = end } stdout { v = P } {
+ OutputErrorNorm { start = end } {
+ awk '{print LEVEL " " $5 " " $7 " " $9}' >> error
+ } { v = P } {
s = (sin (M_PI*3.*x)*sin (M_PI*3.*y))
unbiased = 1
}
diff --git a/test/euler/poisson/circle/res-7.ref b/test/euler/poisson/circle/res-7.ref
index 651898e..13a141a 100644
--- a/test/euler/poisson/circle/res-7.ref
+++ b/test/euler/poisson/circle/res-7.ref
@@ -1,11 +1,11 @@
-0 1.777e+02 0
-1 1.067e+02 1.7
-2 8.034e+00 4.7
-3 2.446e-01 9
-4 2.207e-02 9.5
-5 9.792e-04 11
-6 8.396e-05 11
-7 5.078e-06 12
-8 2.981e-07 12
-9 1.649e-08 13
-10 9.635e-10 13
+0.02 0 1.777e+02 0
+0.57 1 8.641e+00 21
+1.07 2 1.273e-01 37
+1.57 3 1.975e-03 45
+2.07 4 4.779e-05 44
+2.56 5 1.552e-06 41
+3.06 6 6.236e-08 38
+3.56 7 2.364e-09 36
+4.05 8 3.217e-10 29
+4.55 9 3.372e-10 20
+5.04 10 3.122e-10 15
diff --git a/test/euler/poisson/poisson.gfs b/test/euler/poisson/poisson.gfs
index ac2457a..d884982 100644
--- a/test/euler/poisson/poisson.gfs
+++ b/test/euler/poisson/poisson.gfs
@@ -14,7 +14,7 @@
# \phi(x,y)=\sin(\pi kx)\sin(\pi ly).
# $$
# Figure \ref{residual} illustrates the evolution of the maximum
-# residual as a function of the number of V-cycles. Figure \ref{rate}
+# residual as a function of CPU time. Figure \ref{rate}
# illustrates the average residual reduction factor (per V-cycle). The
# evolution of the norms of the error of the final solution as a
# function of resolution is illustrated on Figure \ref{error}. The
@@ -68,13 +68,19 @@
return -M_PI*M_PI*(k*k + l*l)*sin (M_PI*k*x)*sin (M_PI*l*y);
}
}
- OutputProjectionStats { istep = 1 } {
+ OutputTime { istep = 1 } {
+ awk '{printf ("%g ", $8); fflush (stdout)}'
+ }
+ OutputProjectionStats { istep = 1 } {
awk '{
if ($1 == "niter:") printf ("%d ", $2);
if ($1 == "residual.infty:") print $3 " " $4;
- }' > res-LEVEL
+ fflush (stdout);
+ }'
}
- OutputErrorNorm { start = end } stdout { v = P } {
+ OutputErrorNorm { start = end } {
+ awk '{print LEVEL " " $5 " " $7 " " $9}' >> error
+ } { v = P } {
s = (sin (M_PI*3.*x)*sin (M_PI*3.*y))
unbiased = 1
}
diff --git a/test/euler/poisson/poisson.sh b/test/euler/poisson/poisson.sh
index 5016ee3..2432849 100644
--- a/test/euler/poisson/poisson.sh
+++ b/test/euler/poisson/poisson.sh
@@ -1,11 +1,9 @@
if ! $donotrun; then
rm -f error
for level in 3 4 5 6 7 8; do
+ rm -f res-$level
if sed "s/LEVEL/$level/g" < $1 | \
- gerris2D - | \
- awk -v level=$level '{
- print level " " $5 " " $7 " " $9
- }' >> error; then :
+ gerris2D - >> res-$level; then :
else
exit 1
fi
@@ -28,15 +26,15 @@ fi
if cat <<EOF | gnuplot ; then :
set term postscript eps color lw 3 solid 20
set output 'residual.eps'
- set xlabel 'V-cycle'
+ set xlabel 'CPU time'
set ylabel 'Maximum residual'
set logscale y
- plot 'res-7.ref' u 1:2 t 'ref' w lp, 'res-7' u 1:2 t '' w lp
+ plot 'res-7.ref' u 1:3 t 'ref' w lp, 'res-7' u 1:3 t '' w lp
set output 'rate.eps'
set xlabel 'V-cycle'
set ylabel 'Cumulative residual reduction factor'
unset logscale
- plot 'res-7.ref' u 1:3 t 'ref' w lp, 'res-7' u 1:3 t '' w lp
+ plot 'res-7.ref' u 2:4 t 'ref' w lp, 'res-7' u 2:4 t '' w lp
set output 'error.eps'
set xlabel 'Level'
set ylabel 'Error norms'
@@ -70,7 +68,7 @@ fi
if cat <<EOF | python ; then :
from check import *
from sys import *
-if (Curve('res-7',1,2) - Curve('res-7.ref',1,2)).max() > 1e-8 or\
+if (Curve('res-7',1,3) - Curve('res-7.ref',1,3)).max() > 1e-8 or\
(Curve('error',1,4) - Curve('error.ref',1,4)).max() > 1e-6:
exit(1)
EOF
diff --git a/test/euler/poisson/res-7.ref b/test/euler/poisson/res-7.ref
index d0d290e..dc2a64c 100644
--- a/test/euler/poisson/res-7.ref
+++ b/test/euler/poisson/res-7.ref
@@ -1,11 +1,11 @@
-0 1.776e+02 0
-1 2.282e+01 7.8
-2 9.101e-01 14
-3 2.181e-02 20
-4 5.611e-04 24
-5 1.564e-05 26
-6 4.869e-07 27
-7 2.231e-08 26
-8 8.190e-10 26
-9 2.753e-11 27
-10 2.007e-11 20
+0.02 0 1.776e+02 0
+0.11 1 2.259e+00 79
+0.18 2 3.119e-02 75
+0.25 3 1.255e-03 52
+0.32 4 3.490e-05 47
+0.4 5 1.596e-06 41
+0.47 6 6.523e-08 37
+0.54 7 2.886e-09 35
+0.61 8 1.193e-10 33
+0.68 9 1.927e-11 28
+0.75 10 1.890e-11 20
diff --git a/test/euler/template.tex b/test/euler/template.tex
index d997ae0..225796d 100644
--- a/test/euler/template.tex
+++ b/test/euler/template.tex
@@ -32,6 +32,8 @@ current stable branch of the version-controlled source code.
\input{poisson/circle/circle.tex}
\input{circle/circle.tex}
\input{circle/star/star.tex}
+\input{circle/refined/refined.tex}
+\input{circle/thin/thin.tex}
\section{Euler}
--
Gerris Flow Solver
More information about the debian-science-commits
mailing list