Commits

Matt Knepley committed ad7c120 Merge

Merge branch 'knepley/feature-test-parser'

* knepley/feature-test-parser:
Builder: Reorganized test output checking - Output replacement and file checking moved outside of checker - 'parser' test argument now used to set output parser class - Use SolverParser for simple KSP and SNES output parsing - Parser returns lines it did not process, which gets checked in the normal way
Builder: Added really simplistic parser for KSP and SNES output
SNES ex62: Added SNES monitor back in
DMPlex ex9: Speedup test
SNES ex62: Readying test output for parsing

Comments (0)

Files changed (13)

config/builder.py

                         'src/dm/impls/plex/examples/tests/ex9': [# 2D Simplex P_1 scalar tests
                                                                  {'numProcs': 1, 'args': '-num_dof 1,0,0 -iterations 10000 \
                                                                   -max_cone_time 1.1e-8 -max_closure_time 1.3e-7 -max_vec_closure_time 3.6e-7'},
-                                                                 {'numProcs': 1, 'args': '-refinement_limit 1.0e-5 -num_dof 1,0,0 -iterations 10 \
+                                                                 {'numProcs': 1, 'args': '-refinement_limit 1.0e-5 -num_dof 1,0,0 -iterations 2 \
                                                                   -max_cone_time 2.1e-8 -max_closure_time 1.5e-7 -max_vec_closure_time 3.6e-7'},
                                                                  {'numProcs': 1, 'args': '-num_fields 1 -num_components 1 -num_dof 1,0,0 -iterations 10000 \
                                                                   -max_cone_time 1.1e-8 -max_closure_time 1.3e-7 -max_vec_closure_time 4.5e-7'},
-                                                                 {'numProcs': 1, 'args': '-refinement_limit 1.0e-5 -num_fields 1 -num_components 1 -num_dof 1,0,0 -iterations 10 \
+                                                                 {'numProcs': 1, 'args': '-refinement_limit 1.0e-5 -num_fields 1 -num_components 1 -num_dof 1,0,0 -iterations 2 \
                                                                   -max_cone_time 2.1e-8 -max_closure_time 1.5e-7 -max_vec_closure_time 4.7e-7'},
                                                                  {'numProcs': 1, 'args': '-interpolate -num_dof 1,0,0 -iterations 10000 \
                                                                   -max_cone_time 1.1e-8 -max_closure_time 6.5e-7 -max_vec_closure_time 1.0e-6'},
-                                                                 {'numProcs': 1, 'args': '-interpolate -refinement_limit 1.0e-5 -num_dof 1,0,0 -iterations 10 \
+                                                                 {'numProcs': 1, 'args': '-interpolate -refinement_limit 1.0e-5 -num_dof 1,0,0 -iterations 2 \
                                                                   -max_cone_time 2.1e-8 -max_closure_time 6.5e-7 -max_vec_closure_time 1.0e-6'},
                                                                  {'numProcs': 1, 'args': '-interpolate -num_fields 1 -num_components 1 -num_dof 1,0,0 -iterations 10000 \
                                                                   -max_cone_time 1.1e-8 -max_closure_time 6.5e-7 -max_vec_closure_time 1.1e-6'},
-                                                                 {'numProcs': 1, 'args': '-interpolate -refinement_limit 1.0e-5 -num_fields 1 -num_components 1 -num_dof 1,0,0 -iterations 10 \
+                                                                 {'numProcs': 1, 'args': '-interpolate -refinement_limit 1.0e-5 -num_fields 1 -num_components 1 -num_dof 1,0,0 -iterations 2 \
                                                                   -max_cone_time 2.1e-8 -max_closure_time 6.5e-7 -max_vec_closure_time 1.2e-6'},
                                                                  # 2D Simplex P_1 vector tests
                                                                  # 2D Simplex P_2 scalar tests
                                                                {'numProcs': 3, 'args': '-run_type test -refinement_limit 0.0625 -bc_type dirichlet -interpolate 1 -vel_petscspace_order 1 -pres_petscspace_order 1 -dm_plex_print_fem 1'},
                                                                {'numProcs': 5, 'args': '-run_type test -refinement_limit 0.0625 -bc_type dirichlet -interpolate 1 -vel_petscspace_order 1 -pres_petscspace_order 1 -dm_plex_print_fem 1'},
                                                                # Full solutions 18-29
-                                                               {'numProcs': 1, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 0 -vel_petscspace_order 1 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_monitor_short -ksp_monitor_short -snes_converged_reason -snes_view'},
-                                                               {'numProcs': 2, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 0 -vel_petscspace_order 1 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_monitor_short -ksp_monitor_short -snes_converged_reason -snes_view'},
-                                                               {'numProcs': 3, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 0 -vel_petscspace_order 1 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_converged_reason -snes_view'},
-                                                               {'numProcs': 5, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 0 -vel_petscspace_order 1 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-10 -snes_converged_reason -snes_view'},
-                                                               {'numProcs': 1, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 1 -vel_petscspace_order 1 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_monitor_short -ksp_monitor_short -snes_converged_reason -snes_view'},
-                                                               {'numProcs': 2, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 1 -vel_petscspace_order 1 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_monitor_short -ksp_monitor_short -snes_converged_reason -snes_view'},
-                                                               {'numProcs': 3, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 1 -vel_petscspace_order 1 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_converged_reason -snes_view'},
-                                                               {'numProcs': 5, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 1 -vel_petscspace_order 1 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_converged_reason -snes_view'},
-                                                               {'numProcs': 1, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 1 -vel_petscspace_order 2 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_monitor_short -ksp_monitor_short -snes_converged_reason -snes_view'},
-                                                               {'numProcs': 2, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 1 -vel_petscspace_order 2 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_monitor_short -ksp_monitor_short -snes_converged_reason -snes_view'},
-                                                               {'numProcs': 3, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 1 -vel_petscspace_order 2 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_converged_reason -snes_view'},
-                                                               {'numProcs': 5, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 1 -vel_petscspace_order 2 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_converged_reason -snes_view'},
+                                                               {'numProcs': 1, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 0 -vel_petscspace_order 1 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_monitor_short -ksp_monitor_short -snes_converged_reason -ksp_converged_reason -snes_view', 'parser': 'Solver'},
+                                                               {'numProcs': 2, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 0 -vel_petscspace_order 1 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_monitor_short -ksp_monitor_short -snes_converged_reason -ksp_converged_reason -snes_view', 'parser': 'Solver'},
+                                                               {'numProcs': 3, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 0 -vel_petscspace_order 1 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_monitor_short -snes_converged_reason -snes_view', 'parser': 'Solver'},
+                                                               {'numProcs': 5, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 0 -vel_petscspace_order 1 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-10 -snes_monitor_short -snes_converged_reason -snes_view', 'parser': 'Solver'},
+                                                               {'numProcs': 1, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 1 -vel_petscspace_order 1 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_monitor_short -ksp_monitor_short -snes_converged_reason -ksp_converged_reason -snes_view', 'parser': 'Solver'},
+                                                               {'numProcs': 2, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 1 -vel_petscspace_order 1 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_monitor_short -ksp_monitor_short -snes_converged_reason -ksp_converged_reason -snes_view', 'parser': 'Solver'},
+                                                               {'numProcs': 3, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 1 -vel_petscspace_order 1 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_monitor_short -snes_converged_reason -snes_view', 'parser': 'Solver'},
+                                                               {'numProcs': 5, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 1 -vel_petscspace_order 1 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_monitor_short -snes_converged_reason -snes_view', 'parser': 'Solver'},
+                                                               {'numProcs': 1, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 1 -vel_petscspace_order 2 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_monitor_short -ksp_monitor_short -snes_converged_reason -ksp_converged_reason -snes_view', 'parser': 'Solver'},
+                                                               {'numProcs': 2, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 1 -vel_petscspace_order 2 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_monitor_short -ksp_monitor_short -snes_converged_reason -ksp_converged_reason -snes_view', 'parser': 'Solver'},
+                                                               {'numProcs': 3, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 1 -vel_petscspace_order 2 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_monitor_short -snes_converged_reason -snes_view', 'parser': 'Solver'},
+                                                               {'numProcs': 5, 'args': '-run_type full -refinement_limit 0.0625 -bc_type dirichlet -interpolate 1 -vel_petscspace_order 2 -pres_petscspace_order 1 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_monitor_short -snes_converged_reason -snes_view', 'parser': 'Solver'},
                                                                # Stokes preconditioners 30-36
                                                                #   Jacobi
                                                                {'numProcs': 1, 'args': '-run_type full -refinement_limit 0.00625 -bc_type dirichlet -interpolate 1 -vel_petscspace_order 2 -pres_petscspace_order 1 -ksp_gmres_restart 100 -pc_type jacobi -ksp_rtol 1.0e-9 -snes_monitor_short -ksp_monitor_short -snes_converged_reason -snes_view -show_solution 0'},
   ''' Do no check result'''
   return
 
+class IdentityParser(object):
+  def __init__(self):
+    return
+
+  def parse(self, text):
+    return text, ''
+
+class KSP(object):
+  def __init__(self, atol = 1.0e-12, rtol = 1.0e-8):
+    self.res  = []
+    self.atol = atol
+    self.rtol = rtol
+    return
+
+  def addResidual(self, n, res):
+    if not len(self.res) == n: raise RuntimeError('Invalid KSP residual at iterate '+str(n))
+    self.res.append(res)
+    return
+
+  def __eq__(self, s):
+    return all([abs(a-b) < self.atol or abs((a-b)/a) < self.rtol for a, b in zip(self.res, s.res)])
+
+  def __str__(self):
+    return 'SNES:\n'+str(self.res)
+
+class SNES(object):
+  def __init__(self, atol = 1.0e-12, rtol = 1.0e-8):
+    self.res = []
+    self.atol = atol
+    self.rtol = rtol
+    return
+
+  def addResidual(self, n, res):
+    if not len(self.res) == n: raise RuntimeError('Invalid SNES residual at iterate '+str(n))
+    self.res.append(res)
+    return
+
+  def __eq__(self, s):
+    return all([abs(a-b) < self.atol or abs((a-b)/a) < self.rtol for a, b in zip(self.res, s.res)])
+
+  def __str__(self):
+    return 'SNES:\n'+str(self.res)
+
+class SolverParser(object):
+  def __init__(self, atol = 1.0e-12):
+    import re
+
+    self.atol   = atol
+    self.reSNES = re.compile(r'\s*(?P<it>\d+) SNES Function norm (?P<norm>\d+\.\d+(e(\+|-)\d+)?)')
+    self.reKSP  = re.compile(r'\s*(?P<it>\d+) KSP Residual norm (?P<norm>\d+\.\d+(e(\+|-)\d+)?)')
+    return
+
+  def parse(self, text):
+    lines  = text.split('\n')
+    objs   = []
+    stack  = []
+    excess = []
+    for line in lines:
+      mSNES = self.reSNES.match(line)
+      mKSP  = self.reKSP.match(line)
+      if mSNES:
+        it = int(mSNES.group('it'))
+        if it == 0: stack.append(SNES(atol = self.atol))
+        stack[-1].addResidual(it, float(mSNES.group('norm')))
+      elif mKSP:
+        it = int(mKSP.group('it'))
+        if it == 0: stack.append(KSP(atol = self.atol))
+        stack[-1].addResidual(it, float(mKSP.group('norm')))
+      elif line.strip().startswith('Nonlinear solve converged'):
+        objs.append(stack.pop())
+      elif line.strip().startswith('Linear solve converged'):
+        objs.append(stack.pop())
+      else:
+        excess.append(line)
+    return objs, '\n'.join(excess)
+
 class MakeParser(object):
   def __init__(self, maker):
     self.maker = maker
        os.remove(fname)
    return
 
- def checkTestOutput(self, testDir, executable, cmd, output, testNum, replace = False):
+ def checkTestOutputGeneric(self, parser, testDir, executable, cmd, output, testNum):
    from difflib import unified_diff
    outputName = os.path.join(testDir, 'output', os.path.basename(executable)+'_'+testNum+'.out')
    ret        = 0
-   if not os.path.isfile(outputName):
-     if replace:
-       with file(outputName, 'w') as f:
-         f.write(output)
-       self.logPrint("REPLACED: Regression output file %s (test %s) was stored" % (outputName, testNum), debugSection='screen')
+   with file(outputName) as f:
+     output                  = output.strip()
+     parse, excess           = parser.parse(output)
+     validOutput             = f.read().strip().replace('\r', '') # Jed is now stripping output it appears
+     validParse, validExcess = parser.parse(validOutput)
+     if not validParse == parse or not validExcess == excess:
+       self.logPrint("TEST ERROR: Regression output for %s (test %s) does not match\n" % (executable, testNum), debugSection = 'screen')
+       for linum,line in enumerate(unified_diff(validOutput.split('\n'), output.split('\n'), fromfile=outputName, tofile=cmd)):
+         end = '' if linum < 3 else '\n' # Control lines have their own end-lines
+         self.logWrite(line+end, debugSection = 'screen', forceScroll = True)
+       self.logPrint('Reference output from %s\n' % outputName)
+       self.logPrint(validOutput, indent = 0)
+       self.logPrint('Current output from %s' % cmd)
+       self.logPrint(output, indent = 0)
+       ret = -1
      else:
-       self.logPrint("MISCONFIGURATION: Regression output file %s (test %s) is missing" % (outputName, testNum), debugSection='screen')
-   else:
-     with file(outputName) as f:
-       output      = output.strip()
-       validOutput = f.read().strip().replace('\r', '') # Jed is now stripping output it appears
-       if not validOutput == output:
-         if replace:
-           with file(outputName, 'w') as f:
-             f.write(output)
-           self.logPrint("REPLACED: Regression output file %s (test %s) was stored" % (outputName, testNum), debugSection='screen')
-         else:
-           self.logPrint("TEST ERROR: Regression output for %s (test %s) does not match\n" % (executable, testNum), debugSection = 'screen')
-           for linum,line in enumerate(unified_diff(validOutput.split('\n'), output.split('\n'), fromfile=outputName, tofile=cmd)):
-               end = '' if linum < 3 else '\n' # Control lines have their own end-lines
-               self.logWrite(line+end, debugSection = 'screen', forceScroll = True)
-           self.logPrint('Reference output from %s\n' % outputName)
-           self.logPrint(validOutput, indent = 0)
-           self.logPrint('Current output from %s' % cmd)
-           self.logPrint(output, indent = 0)
-           ret = -1
-       else:
-         self.logPrint("TEST SUCCESS: Regression output for %s (test %s) matches" % (executable, testNum))
+       self.logPrint("TEST SUCCESS: Regression output for %s (test %s) matches" % (executable, testNum))
    return ret
 
+ def checkTestOutput(self, numProcs, testDir, executable, cmd, output, testNum):
+   return self.checkTestOutputGeneric(IdentityParser(), testDir, executable, cmd, output, testNum)
+
+ def checkTestOutputSolver(self, numProcs, testDir, executable, cmd, output, testNum):
+   if numProcs > 1: parser = SolverParser(atol = 1.0e-9)
+   else:            parser = SolverParser()
+   return self.checkTestOutputGeneric(parser, testDir, executable, cmd, output, testNum)
+
  def getTestCommand(self, executable, **params):
    numProcs = params.get('numProcs', 1)
    try:
 
  def runTest(self, testDir, executable, testNum, replace, **params):
    '''testNum can be any string'''
+   num = str(testNum)
    cmd = self.getTestCommand(executable, **params)
-   self.logPrint('Running #%s: %s' % (str(testNum), cmd), debugSection='screen')
+   numProcs = params.get('numProcs', 1)
+   self.logPrint('Running #%s: %s' % (num, cmd), debugSection='screen')
    if not self.dryRun:
      (output, error, status) = self.executeShellCommand(cmd, checkCommand = noCheckCommand, log=self.log)
+     outputName = os.path.join(testDir, 'output', os.path.basename(executable)+'_'+num+'.out')
      if status:
        self.logPrint("TEST ERROR: Failed to execute %s\n" % executable, debugSection='screen')
        self.logPrint(output+error, indent = 0, debugSection='screen')
        ret = -2
+     elif replace:
+       outputName = os.path.join(testDir, 'output', os.path.basename(executable)+'_'+str(testNum)+'.out')
+       with file(outputName, 'w') as f:
+         f.write(output+error)
+       self.logPrint("REPLACED: Regression output file %s (test %s) was stored" % (outputName, str(testNum)), debugSection='screen')
+       ret = 0
+     elif not os.path.isfile(outputName):
+       self.logPrint("MISCONFIGURATION: Regression output file %s (test %s) is missing" % (outputName, testNum), debugSection='screen')
+       ret = 0
      else:
-       ret = self.checkTestOutput(testDir, executable, cmd, output+error, str(testNum), replace)
+       ret = getattr(self, 'checkTestOutput'+params.get('parser', ''))(numProcs, testDir, executable, cmd, output+error, num)
    return ret
 
  def regressionTestsDir(self, dirname, dummy):

src/snes/examples/tutorials/output/ex62_18.out

-0 SNES Function norm 6.3332 
+  0 SNES Function norm 6.3332 
     0 KSP Residual norm 1.61536 
     1 KSP Residual norm 0.553251 
     2 KSP Residual norm 0.208201 
    10 KSP Residual norm 2.33887e-06 
    11 KSP Residual norm 5.27771e-09 
    12 KSP Residual norm 1.751e-11 
+  Linear solve converged due to CONVERGED_RTOL iterations 12
   1 SNES Function norm 6.779e-11 
 Nonlinear solve converged due to CONVERGED_FNORM_RELATIVE iterations 1
 SNES Object: 1 MPI processes
 -3
 1.125
 0.125
-1.5
+1.5

src/snes/examples/tutorials/output/ex62_19.out

-0 SNES Function norm 6.3332 
+  0 SNES Function norm 6.3332 
     0 KSP Residual norm 1.61536 
     1 KSP Residual norm 0.553251 
     2 KSP Residual norm 0.208201 
    10 KSP Residual norm 1.79866e-06 
    11 KSP Residual norm 8.52126e-09 
    12 KSP Residual norm 2.582e-11 
+  Linear solve converged due to CONVERGED_RTOL iterations 12
   1 SNES Function norm 1.011e-10 
 Nonlinear solve converged due to CONVERGED_FNORM_RELATIVE iterations 1
 SNES Object: 2 MPI processes
 3
 1.125
 0.125
-1.5
+1.5

src/snes/examples/tutorials/output/ex62_20.out

+  0 SNES Function norm 6.3332 
+  1 SNES Function norm 3.95949e-09 
 Nonlinear solve converged due to CONVERGED_FNORM_RELATIVE iterations 1
 SNES Object: 3 MPI processes
   type: newtonls
 3
 1.125
 0.125
-1.5
+1.5

src/snes/examples/tutorials/output/ex62_21.out

+  0 SNES Function norm 6.3332 
+  1 SNES Function norm 1.461e-10 
 Nonlinear solve converged due to CONVERGED_FNORM_RELATIVE iterations 1
 SNES Object: 5 MPI processes
   type: newtonls
 3
 1.125
 0.125
-1.5
+1.5

src/snes/examples/tutorials/output/ex62_22.out

-0 SNES Function norm 6.3332 
+  0 SNES Function norm 6.3332 
     0 KSP Residual norm 1.61536 
     1 KSP Residual norm 0.553251 
     2 KSP Residual norm 0.208201 
    10 KSP Residual norm 2.33887e-06 
    11 KSP Residual norm 5.27771e-09 
    12 KSP Residual norm 1.751e-11 
+  Linear solve converged due to CONVERGED_RTOL iterations 12
   1 SNES Function norm 6.779e-11 
 Nonlinear solve converged due to CONVERGED_FNORM_RELATIVE iterations 1
 SNES Object: 1 MPI processes
 -3
 1.125
 0.125
-1.5
+1.5

src/snes/examples/tutorials/output/ex62_23.out

-0 SNES Function norm 6.3332 
+  0 SNES Function norm 6.3332 
     0 KSP Residual norm 1.61536 
     1 KSP Residual norm 0.553251 
     2 KSP Residual norm 0.208201 
    10 KSP Residual norm 1.79866e-06 
    11 KSP Residual norm 8.52126e-09 
    12 KSP Residual norm 2.582e-11 
+  Linear solve converged due to CONVERGED_RTOL iterations 12
   1 SNES Function norm 1.011e-10 
 Nonlinear solve converged due to CONVERGED_FNORM_RELATIVE iterations 1
 SNES Object: 2 MPI processes
 3
 1.125
 0.125
-1.5
+1.5

src/snes/examples/tutorials/output/ex62_24.out

+  0 SNES Function norm 6.3332 
+  1 SNES Function norm 3.95949e-09 
 Nonlinear solve converged due to CONVERGED_FNORM_RELATIVE iterations 1
 SNES Object: 3 MPI processes
   type: newtonls
 3
 1.125
 0.125
-1.5
+1.5

src/snes/examples/tutorials/output/ex62_25.out

+  0 SNES Function norm 6.3332 
+  1 SNES Function norm 5.14036e-09 
 Nonlinear solve converged due to CONVERGED_FNORM_RELATIVE iterations 1
 SNES Object: 5 MPI processes
   type: newtonls
 3
 1.125
 0.125
-1.5
+1.5

src/snes/examples/tutorials/output/ex62_26.out

-0 SNES Function norm 13.3457 
+  0 SNES Function norm 13.3457 
     0 KSP Residual norm 2.61037 
     1 KSP Residual norm 1.1058 
     2 KSP Residual norm 0.694597 
    27 KSP Residual norm 2.74228e-05 
    28 KSP Residual norm 2.67335e-05 
    29 KSP Residual norm 2.691e-10 
+  Linear solve converged due to CONVERGED_RTOL iterations 29
   1 SNES Function norm 1.31227e-09 
 Nonlinear solve converged due to CONVERGED_FNORM_RELATIVE iterations 1
 SNES Object: 1 MPI processes
 0.53125
 0.3125
 1.15625
--0.3125
+-0.3125

src/snes/examples/tutorials/output/ex62_27.out

-0 SNES Function norm 13.3457 
+  0 SNES Function norm 13.3457 
     0 KSP Residual norm 2.61037 
     1 KSP Residual norm 1.1058 
     2 KSP Residual norm 0.694597 
    27 KSP Residual norm 2.73449e-05 
    28 KSP Residual norm 2.63972e-05 
    29 KSP Residual norm 3.653e-10 
+  Linear solve converged due to CONVERGED_RTOL iterations 29
   1 SNES Function norm 1.77632e-09 
 Nonlinear solve converged due to CONVERGED_FNORM_RELATIVE iterations 1
 SNES Object: 2 MPI processes
 0.53125
 -0.1875
 1.15625
--0.3125
+-0.3125

src/snes/examples/tutorials/output/ex62_28.out

+  0 SNES Function norm 13.3457 
+  1 SNES Function norm 1.36733e-09 
 Nonlinear solve converged due to CONVERGED_FNORM_RELATIVE iterations 1
 SNES Object: 3 MPI processes
   type: newtonls
         has attached null space
         using I-node (on process 0) routines: found 7 nodes, limit used is 5
 Number of SNES iterations = 1
-L_2 Error: 6.33e-11
+L_2 Error: 6.68e-11
 Solution
 Vec Object: 3 MPI processes
   type: mpi
 0.53125
 -0.1875
 1.15625
--0.3125
+-0.3125

src/snes/examples/tutorials/output/ex62_29.out

+  0 SNES Function norm 13.3457 
+  1 SNES Function norm 1.41204e-09 
 Nonlinear solve converged due to CONVERGED_FNORM_RELATIVE iterations 1
 SNES Object: 5 MPI processes
   type: newtonls
 0.53125
 -0.1875
 1.15625
--0.3125
+-0.3125