def test_scaling(self): # Make sure values are unscaled/dimensional. def custom_method(d_outputs, d_residuals, mode): # This should be -1 because the jac setter pokes a -1.0 in phys state. if d_outputs['out_var'][0] != -1.0: raise ValueError('This value should be unscaled.') class ScaledComp(om.ImplicitComponent): def setup(self): self.add_input('a', val=10., units='m') self.add_output('states', val=20.0, ref=3333.0) self.add_output('out_var', val=20.0, ref=12.0) p = om.Problem() p.model.add_subsystem('des_vars', om.IndepVarComp('a', val=10., units='m'), promotes=['*']) p.model.add_subsystem('icomp', ScaledComp(), promotes=['*']) model = p.model model.linear_solver = om.LinearUserDefined(custom_method) p.setup(mode='rev', check=False) p.run_model() jac = p.compute_totals(of=['out_var'], wrt=['a'], return_format='dict')
def setup(self): self.add_input('a', val=10., units='m') rank = self.comm.rank GLOBAL_SIZE = 15 sizes, offsets = evenly_distrib_idxs(self.comm.size, GLOBAL_SIZE) self.add_output('states', shape=int(sizes[rank])) self.add_output('out_var', shape=1) self.local_size = sizes[rank] self.linear_solver = om.PETScKrylov() self.linear_solver.precon = om.LinearUserDefined(solve_function=self.mysolve)
def test_method_default(self): # Uses `solve_linear` by default p = om.Problem() p.model.add_subsystem('des_vars', om.IndepVarComp('a', val=10., units='m'), promotes=['*']) p.model.add_subsystem('icomp', DistribStateImplicit(), promotes=['*']) model = p.model model.linear_solver = om.PETScKrylov() model.linear_solver.precon = om.LinearRunOnce() p.setup(mode='rev', check=False) model.icomp.linear_solver.precon = om.LinearUserDefined() p.run_model() jac = p.compute_totals(of=['out_var'], wrt=['a'], return_format='dict') assert_near_equal(15.0, jac['out_var']['a'][0][0])