def Precond(t, c, fc, jok, jcurPtr, gamma, P_data, vtemp1, vtemp2, vtemp3): wdata = ctypes.cast(P_data, PWebData).contents cvode_mem = wdata.cvode_mem rewt = nvecserial.NVector(wdata.rewt) cvode.CVodeGetErrWeights(cvode_mem, rewt) uround = nvecserial.UNIT_ROUNDOFF P = wdata.P pivot = wdata.pivot jxr = wdata.jxr jyr = wdata.jyr mp = wdata.mp srur = wdata.srur ngrp = wdata.ngrp ngx = wdata.ngx ngy = wdata.ngy mxmp = wdata.mxmp fsave = wdata.fsave fac = fc.wrmsnorm(rewt) r0 = 1000.0*abs(gamma)*uround*NEQ*fac if r0 == 0.0: r0 = 1.0 for igy in range(ngy): jy = jyr[igy] if00 = jy*mxmp for igx in range(ngx): jx = jxr[igx] if0 = if00 + jx*mp ig = igx + igy*ngx for j in range(mp): jj = if0 + j save = c[jj] r = max([srur*abs(save),r0/rewt[jj]]) c[jj] += r fac = -gamma/r fblock (t, c, jx, jy, vtemp1, wdata) for i in range(mp): P[ig][j][i] = (vtemp1[i] - fsave[if0+i])*fac c[jj] = save for ig in range(ngrp): cvode.denaddI(P[ig], mp) ier = cvode.denGETRF(P[ig], mp, mp, pivot[ig]) if ier != 0: return 1 jcurPtr.contents.value = 1 return 0
def Precond(tn, u, fu, jok, jcurPtr, gamma, P_data, vtemp1, vtemp2, vtemp3): data = ctypes.cast(P_data, PUserData).contents if jok: for jy in range(MY): for jx in range(MX): cvode.dencopy(data.Jbd[jx][jy], data.P[jx][jy], NUM_SPECIES, NUM_SPECIES) jcurPtr.contents.value = 0 else: q4coef = data.q4 dely = data.dy verdco = data.vdco hordco = data.hdco for jy in range(MY): ydn = YMIN + (jy - 0.5)*dely yup = ydn + dely cydn = verdco*math.exp(0.2*ydn) cyup = verdco*math.exp(0.2*yup) diag = -(cydn + cyup + 2.0*hordco) for jx in range(MX): c1 = u[1-1 + (jx)*NUM_SPECIES + (jy)*NSMX] c2 = u[2-1 + (jx)*NUM_SPECIES + (jy)*NSMX] j = data.Jbd[jx][jy] a = data.P[jx][jy] j[0][0] = (-Q1*C3 - Q2*c2) + diag j[1][0] = -Q2*c1 + q4coef j[0][1] = Q1*C3 - Q2*c2 j[1][1] = (-Q2*c1 - q4coef) + diag cvode.dencopy(j, a, NUM_SPECIES, NUM_SPECIES) jcurPtr.contents.value = 1 for jy in range(MY): for jx in range(MX): cvode.denscale(-gamma, data.P[jx][jy], NUM_SPECIES, NUM_SPECIES) for jx in range(MX): for jy in range(MY): cvode.denaddI(data.P[jx][jy], NUM_SPECIES) ier = cvode.denGETRF(data.P[jx][jy], NUM_SPECIES, NUM_SPECIES, data.pivot[jx][jy]) if ier != 0: return 1 return 0