Source code for sfepy.solvers.petsc_worker

#!/usr/bin/env python
"""
PETSc solver worker process.
"""
import time
import sys

try:
    import petsc4py
    petsc4py.init(sys.argv)

    from petsc4py import PETSc

except ImportError:
    pass

[docs]def solve(): opts = PETSc.Options() mat_filename = opts.getString('-mtx', 'mtx.dat') rhs_filename = opts.getString('-rhs', 'rhs.dat') sol0_filename = opts.getString('-sol0', '') sol_filename = opts.getString('-sol', 'sol.dat') status_filename = opts.getString('-status', 'status.txt') view_mtx = PETSc.Viewer().createBinary(mat_filename, mode='r') view_rhs = PETSc.Viewer().createBinary(rhs_filename, mode='r') mtx = PETSc.Mat().load(view_mtx) rhs = PETSc.Vec().load(view_rhs) ksp = PETSc.KSP().create() ksp.setOperators(mtx) ksp.setFromOptions() if not sol0_filename: sol = rhs.duplicate() else: view_sol0 = PETSc.Viewer().createBinary(sol0_filename, mode='r') sol = PETSc.Vec().load(view_sol0) ksp.setInitialGuessNonzero(True) tt = time.clock() ksp.solve(rhs, sol) elapsed = time.clock() - tt view_sol = PETSc.Viewer().createBinary(sol_filename, mode='w') sol.view(view_sol) fd = open(status_filename, 'w') fd.write('%d %.2f' % (ksp.reason, elapsed)) fd.close()
if __name__ == '__main__': solve()