Hello, I'm trying to write in Python one of the TS PETSc tutorial example:

https://www.mcs.anl.gov/petsc/petsc-current/src/ts/examples/tutorials/ex13.c.html

I'm not able to fill the Jacobian matrix in the right way in Python. Maybe there are some other conversion errors.
Might someone help, please?

This is my code:

# Example 13 petsc TS
import sys, petsc4py
petsc4py.init(sys.argv)

from petsc4py import PETSc
from mpi4py import MPI
import numpy as np
import math

def RHS_func(ts, t, X, xdot, F):
    da = ts.getDM()

    mx, my = da.getSizes()

    hx, hy = [1.0/(m-1) for m in [mx, my]]
    sx = 1.0/(hx*hx)
    sy = 1.0/(hy*hy)

    x = X.getArray(readonly=1).reshape(8, 8, order='C')
    f = F.getArray(readonly=0).reshape(8, 8, order='C')

    (xs, xm), (ys, ym) = da.getRanges()
    aa = np.zeros((8,8))
    for j in range(ys, ym):
        for i in range(xs, xm):
            if i == 0 or j == 0 or i == (mx-1) or j == (my-1):
                f[i,j] = x[i,j]
                continue
            u = x[i,j]
            uxx = (-2.0 * u + x[i, j-1] + x[i, j+1]) * sx
            uyy = (-2.0 * u + x[i-1, j] + x[i+1, j])* sy
            f[i, j] = uxx + uyy
    F.assemble()

def Jacobian_func(ts, t, x, xdot, a, A, B):
    mx, my = da.getSizes()
    hx = 1.0/(mx-1)
    hy = 1.0/(my-1)
    sx = 1.0/(hx*hx)
    sy = 1.0/(hy*hy)

    B.zeroEntries()
    (i0, i1), (j0, j1) = da.getRanges()
    row = PETSc.Mat.Stencil()
    col = PETSc.Mat.Stencil()

    for i in range(j0, j1):
        for j in range(i0, i1):
            row.index = (i,j)
            row.field = 0
            if i == 0 or j== 0 or i==(my-1) or j==(mx-1):
                B.setValueStencil(row, row, 1.0)
            else:
                for index, value in [
                    ((i-1, j),   sx),
                    ((i+1, j),   sx),
                    ((i,   j-1), sy),
                    ((i-1, j+1), sy),
                    ((i,   j),  -2*sx - 2*sy)]:
                    col.index = index
                    col.field = 0
                    B.setValueStencil(row, col, value)

    B.assemble()
    if A != B: B.assemble()
    return PETSc.Mat.Structure.SAME_NONZERO_PATTERN

def make_initial_solution(da, U, c):
    mx, my = da.getSizes()
    hx = 1.0/(mx-1)
    hy = 1.0/(my-1)
    (xs, xm), (ys, ym) = da.getRanges()

    u = U.getArray(readonly=0).reshape(8, 8, order='C')

    for j in range(ys, ym):
        y = j*hy
        for i in range(xs, xm):
            x = i*hx
            r = math.sqrt((x-0.5)**2+(y-0.5)**2)
            if r < (0.125):
                u[i, j] = math.exp(c*r*r*r)
            else:
                u[i, j] = 0.0
    U.assemble()

def monitor(ts, i, t, x):
    xx = x[:].tolist()
    history.append((i, t, xx))

history = []
nx = 8
ny = 8
da = PETSc.DMDA().create([nx, ny], stencil_type= PETSc.DA.StencilType.STAR)
da.setFromOptions()
da.setUp()

u = da.createGlobalVec()
f = u.duplicate()

c = -30.0

ts = PETSc.TS().create()
ts.setDM(da)
ts.setType(ts.Type.BEULER)

ts.setIFunction(RHS_func, f)
ts.setIJacobian(Jacobian_func)

ftime = 1.0
ts.setMaxTime(ftime)
ts.setExactFinalTime(PETSc.TS.ExactFinalTime.STEPOVER)

make_initial_solution(da, u, c)
dt = 0.01
ts.setMonitor(monitor)
ts.setTimeStep(dt)
ts.setFromOptions()
ts.solve(u)

ftime = ts.getSolveTime()
steps = ts.getStepNumber()

Thanks.

Nicola

--

Nicola Creati
Istituto Nazionale di Oceanografia e di Geofisica Sperimentale - OGS 
www.inogs.it
Dipartimento di Geofisica della Litosfera Geophysics of Lithosphere Department
CARS (Cartography and Remote Sensing) Research Group http://www.inogs.it/Cars/
Borgo Grotta Gigante 42/c 34010 Sgonico - Trieste - ITALY [email protected]
off.   +39 040 2140 213
fax.   +39 040 327307

_____________________________________________________________________
This communication, that may contain confidential and/or legally privileged information, 
is intended solely for the use of the intended addressees. Opinions, conclusions and 
other information contained in this message, that do not relate to the official business 
of OGS, shall be considered as not given or endorsed by it. Every opinion or advice 
contained in this communication is subject to the terms and conditions provided by the 
agreement governing the engagement with such a client. Any use, disclosure, copying or 
distribution of the contents of this communication by a not-intended recipient or in 
violation of the purposes of this communication is strictly prohibited and may be 
unlawful. For Italy only: Ai sensi del D.Lgs.196/2003 - "T.U. sulla Privacy" si 
precisa che le informazioni contenute in questo messaggio sono riservate ed a uso 
esclusivo del destinatario.

Reply via email to