As promised, here is the pull request discussed earlier (before close-of-business Central time!): https://bitbucket.org/petsc/petsc/pull-requests/633
To illustrate the point here, I will use examples from ksp/ksp/examples/tutorials/ex10.c Consider this test block: test: suffix: 19 requires: datafilespath args: -f0 ${DATAFILESPATH}/matrices/poisson1 args: -ksp_type cg -pc_type icc -pc_factor_levels 2 test: test: args: -mat_type seqsbaij which has two subtests or children tests (feel free to rename). This will generate a shell script runex19.sh that does something like: mpiexec -n 1 ex19 ${args} > ex19.temp petscdiff ex19.out ex19.tmp mpiexec -n 1 ex19 ${args} -mat_type seqsbaij > ex19.temp petscdiff ex19.out ex19.tmp This works because the argument '-mat_type seqsbaij' DOES NOT CHANGE THE OUTPUT enabling the same output_file to be used. It also makes for a nice compact specification. But what if arguments change the output file? Putting suffix then triggers separate "tests" (defined as separate shell scripts): test: requires: datafilespath args: -f0 ${DATAFILESPATH}/matrices/medium args: -ksp_type bicg test: suffix: 4 args: -pc_type lu test: suffix: 5 This will generate runex4.sh and runex5.sh that only differ in the '-pc_type lu' in the arguments and in the output file names. One can quickly see that they are very similar tests, and it's very compact in it's representation. Now consider for loops: test: suffix: 7_d requires: datafilespath args: -f0 ${DATAFILESPATH}/matrices/medium args: -viewer_binary_skip_info -mat_type seqbaij args: -matload_block_size {{2 3 4 5 6 7 8}} args: -ksp_type preonly -pc_type lu This generates: -------------------------------------- for matload_block_size in 2 3 4 5 6 7 8; do petsc_testrun "${mpiexec} -n 1 ${exec} ${args} -matload_block_siz e ${matload_block_size}" ex10_7_d.tmp ${testname}.err "${label}_matlo ad_block_size-${matload_block_size}" petsc_testrun "${diff_exe} /Users/kruger/ptsolveall/upstream/petsc /src/ksp/ksp/examples/tutorials/output/ex10_7_d.out ex10_7_d.tmp" dif f-${testname}.out diff-${testname}.out diff-${label}_matload_block_si ze-${matload_block_size} "" done -------------------------------------- All 7 diff tests will be against the same file. Here, I have the reporting being labelled with the variable name and value to make it easy to see what is being tested. What if your for loop creates a different output? In most of the petsc legacy tests this seemed to be handled by appending it to one massive file and diffing the whole thing. Keeping with the 1 shell script => 1 file we want to have it labelled. Tobin proposed one naming scheme that gives a lot of developer control, but I moved to a more automated naming scheme (we'll see if it is sufficient or not). Here is an example. The key variable is separate_testvars which says that the loop variable should create separate tests. test: suffix: 19 requires: datafilespath args: -f0 ${DATAFILESPATH}/matrices/poisson1 args: -ksp_type cg -pc_type icc args: -pc_factor_levels {{0 2 4}} separate_testvars: pc_factor_levels test: args: test: args: -mat_type seqsbaij This will generate 3 shell scripts: runex10_19_pc_factor_levels-0.sh runex10_19_pc_factor_levels-2.sh runex10_19_pc_factor_levels-4.sh Each with a different output file being tested against (but each shell script invoking ex19 twice). Between suffixes and separate_testvars, it's easy to go nuts (even multiple loops can make it get very verbose). Here is an example from ex10: test: suffix: 7 requires: datafilespath args: -f0 ${DATAFILESPATH}/matrices/medium args: -viewer_binary_skip_info -mat_type seqbaij args: -matload_block_size {{2 3 4 5 6 7 8}} args: -ksp_max_it 100 -ksp_gmres_cgs_refinement_type refine_always args: -ksp_rtol 1.0e-15 -ksp_monitor_short separate_testvars: matload_block_size test: suffix: a test: suffix: b args: -pc_factor_mat_ordering_type nd test: suffix: c args: -pc_factor_levels 1 This creates 21 shell scripts: runex10_7_matload_block_size-2_a.sh runex10_7_matload_block_size-2_b.sh runex10_7_matload_block_size-2_c.sh runex10_7_matload_block_size-3_a.sh ... ex10 is a good example because there were 63 runex10* targets in the makefile. After conversion, we have 110 shell scripts being generated coming from this separation of files instead of concatenation. The mumps examples are also interesting because they exercise a lot of mumps and petsc options, but they are all diffed against the same file. This uses the output_file parameter to enable specification of this same output_file. Other misc: testparse.py gives better much better error reporting although I highly recommend invoking it directly during development to catch errors. It saved me a bunch of time while converting ex10.c. gmakegentest.py is cleaner. Many thanks to Tobin for help in this. -- Tech-X Corporation kru...@txcorp.com 5621 Arapahoe Ave, Suite A Phone: (720) 974-1841 Boulder, CO 80303 Fax: (303) 448-7756