title: OpenMDAO hierarchical solvers recording
body: <p>In OpenMDAO, is there any recommendation on how to record and read solver cases if the model is composed of multiple groups/cycles, and multiple nonlinear solvers?</p>
  <p>I have a model built of 2 cycles (cycle1 and cycle2), one of them containing two subcycles (cycle1_1 and cycle1_2). For now I am attaching a solver to each of my nonlinear solvers:</p>
  <pre><code>solver1 = model.cycle1.nonlinear_solver
  solver1_1 = model.cycle1.cycle1_1.nonlinear_solver
  solver1_2 = model.cycle1.cycle1_2.nonlinear_solver
  solver2 = model.cycle2.nonlinear_solver
  
  solver1.add_recorder(recorder)
  solver1_1.add_recorder(recorder)
  solver1_2.add_recorder(recorder)
  solver2.add_recorder(recorder)
  </code></pre>
  <p>When trying to read the results with:</p>
  <pre><code>cr = om.CaseReader(results)
  </code></pre>
  <p>I am getting the following error:</p>
  <blockquote>
  <p>RuntimeError: Can't parse solver iteration coordinate:
  rank0:root._solve_nonlinear|0|NLRunOnce|0|cycle1._solve_nonlinear|0|NonlinearBlockGS|1|cycle1.cycle1_1._solve_nonlinear|1|NonlinearBlockGS|1</p>
  </blockquote>
  <p>I am looking to get information about the convergence history and some plots on the coupling variables.</p>
  <p>EDIT: My code has a structure similar to that in <a href="https://openmdao.org/newdocs/versions/latest/basic_user_guide/multidisciplinary_optimization/sellar.html" rel="nofollow noreferrer">https://openmdao.org/newdocs/versions/latest/basic_user_guide/multidisciplinary_optimization/sellar.html</a>, with the groups defined in setup:</p>
  <pre><code>import openmdao.api as om
  
  class MDA(om.Group):
      
      # class ObjCmp(om.ExplicitComponent):
          # some objective component
      # class ConCmp(om.ExplicitComponent):
          # some constraint component
      
      def setup(self):
          
          cycle1 = self.add_subsystem('cycle1', om.Group(), promotes=['*'])
          
          cycle1_1 = cycle1.add_subsystem('cycle1_1', om.Group(), promotes=['*'])
          cycle1_1_comp = cycle1_1.add_subsystem('comp', om.ExecComp('x1 = 3 + x2'), promotes=[&quot;*&quot;])
  
          cycle1_2 = cycle1.add_subsystem('cycle1_2', om.Group(), promotes=['*'])
          cycle1_2_comp = cycle1_2.add_subsystem('comp',  om.ExecComp('x2 = 3 + x1 + y'), promotes=[&quot;*&quot;])
  
          cycle2 = self.add_subsystem('cycle2', om.Group(), promotes=['*'])
          cycle2.add_subsystem('comp', om.ExecComp('y = x1 + 2'), promotes=['*'])
  
  p = om.Problem(model=MDA())
  model = p.model
  
  p.setup()
  
  p.run_model()
  </code></pre>