Example #1
0
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
Example #2
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