[Trilinos-Users] Solving a trivial nonlinear system with pytrilinos nox with an exact Jacobian.
Bill Spotz
wfspotz at sandia.gov
Mon Jan 25 17:28:31 MST 2010
Scott,
So, this illustrates an improvement I need to make to the
PyTrilinos.NOX documentation.
NOX.defaultSolver() calls NOX.defaultGroup(), whose documentation says:
defaultGroup(nonlinearParameters, initGuess, reqInterface,
jacInterface=None,
jacobian=None, precInterface=None,
preconditioner=None) -> Group
Return a NOX.Epetra.Group based upon the given input arguments:
nonlinearParameters - a dict with nonlinear parameters. Can be
obtained
from defaultNonlinearParameters()
initGuess - an initial guess Epetra.Vector.
reqInterface - an Interface.Required object
jacInterface - an Interface.Jacobian object
jacobian - if jacInterface is given, this should be the
Epetra.Operator that is the Jacobian matrix
precInterface - an Interface.Preconditioner object
preconditioner - if precInterface is given, this should be the
Epetra.Operator that is the Preconditioner
So when you provide jacInterface, you should also provide jacobian (I
will try to improve the facet of the interface).
I have now gone through this use case and I determined that I have not
implemented everything you need. The NOX C++ code is going to call
back to your python computeJacobian() method, sending Jac as an
Epetra.Operator, downcast from whatever type you provided to
defaultSolver() in the "jacobian" argument. In C++, you would upcast
back to an Epetra_RowMatrix or Epetra_CrsMatrix. In python, there is
no way to do this. This operator later gets passed to an AztecOO
solver, and it has to be an Epetra_RowMatrix or something derived from
it.
What I ned to do is change the conversion logic so that the "Jac"
argument in computeJacobian() is sent back to you as the same type you
provided in "jacobian" when you call defaultSolver(). Until then, you
can use finite difference coloring, as shown in exNOX_1Dfem.
On Jan 25, 2010, at 3:42 PM, Askey, Scott A Capt USAF AETC AFIT/ENY
wrote:
> How do I pass in the formula for the analytical jacobian to NOX?
> Following the template for the 1DFEM and the doc strings are a bit
> vague on this point.
>
>
> V/R
>
> Scott
>
>
> The problem is taken from didasko/examples/nox/ex1.cpp
> F=[x1**2+x2**2-1, x2-x1**2]...find the roots.
>
>
>
> The error is:
> ValueError: invalid null reference in method
> 'new_LinearSystemAztecOO', argument 5 of type 'Teuchos::RCP<
> Epetra_Operator > const &'
>
> My 30 line attemp follows:
>
> from PyTrilinos import Epetra, NOX
>
> class MyProblem(NOX.Epetra.Interface.Required):
> def __init__(self):
> NOX.Epetra.Interface.Required.__init__(self)
> self.__comm = Epetra.SerialComm()
> def computeF(self,x,F,flag):
> try:
> F[:]=[x[0]*x[0]+x[1]*x[1]-1,x[1]-x[0]*x[0]]
> except Exception, e:
> print "Expeption in computeF method "
> print e
> return False
> return True
>
> class MyJacobian(NOX.Epetra.Interface.Jacobian):
> def __init__(self):
> NOX.Epetra.Interface.Jacobian.__init__(self)
> self.__comm = Epetra.SerialComm()
> def computeJacobian(self,x,Jac,flag):
> try:
> Jac=[[2*x[0],2*x[1]],[-2*x[0],1]]
> except Exception, e:
> print "Expeption in computeJacobian"
> print e
> return False
> return True
>
> def main():
> soln =Epetra.Vector([.5,.5])
> initGuess=Epetra.Vector([.5,.5])
>
> problem=MyProblem()
> myJac=MyJacobian()
>
> NOX.defaultSolver(initGuess,problem,jacInterface=myJac,jacobian=None\
> , precInterface=None, preconditioner=None, nlParams=None)
> finalGroup = solver.getSolutionGroup()
> finalSoln = finalGroup.getX()
>
>
>
>
>
>
>
> _______________________________________________
> Trilinos-Users mailing list
> Trilinos-Users at software.sandia.gov
> http://software.sandia.gov/mailman/listinfo/trilinos-users
** Bill Spotz **
** Sandia National Laboratories Voice: (505)845-0170 **
** P.O. Box 5800 Fax: (505)284-0154 **
** Albuquerque, NM 87185-0370 Email: wfspotz at sandia.gov **
More information about the Trilinos-Users
mailing list