'Problem on solving Partial Differential Equations with Gekko Python
I get a converging solution while trying to solve a Partial Differential Equation attached below.
In my code, I want to calculate a volume flow rate over time by integrating 2pir*v(r)*dr . I have used scipy.integrate.trapz to solve this inside the code m.GEKKO().
I want to have a graph of Qgap vs time. When I execute the code, I get a single Qgap value in the solution.
Please help me.
All the details can be easily found through this article <<Modeling of a hydraulic damper with shear thinning fluid for damping mechanism analysis>> by Sujuan Jiao et al.
The velocity profile is discretised by 100 points in space between r1 and r1+delta with BC at r1=u (piston velocity) and 0 at the wall.
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate
amp=10e-2
freq=10
tf = 2/freq
omega=2*np.pi*freq
npt = 101
time = np.linspace(0,tf,npt)
xglob=amp*np.sin(omega*time)
uglob=amp*omega*np.cos(omega*time)
delta=0.007
npx=100
dx=np.float32(delta/npx)
r1=0.01
r2=0.004
xpos = np.linspace(r1,r1+delta,npx)
Ap=np.pi*(r1**2-r2**2)
rho=850
beta=5e8
L=0.06
l=0.01
pressf=12*amp*0.707*uglob\
*np.cos(2*np.pi*freq*time)/(delta**2)\
*630*(1+(0.05*(0.707*uglob/delta)**2))**(-0.23)
m = GEKKO()
def Q(r,v):
Q=(2*np.pi*r*np.transpose(np.array(v)))
return scipy.integrate.trapz(Q,r)
m.time = time
t=m.Param(m.time)
x=m.MV(ub=amp+1)
x.value=np.ones(npt)*xglob
u=m.MV(ub=10)
u.value=np.ones(npt)*uglob
pf=m.MV(lb=20)
pf.value=np.ones(npt)*pressf
u1=[m.Var(1) for i in range(npx)]
p1=m.Var(800000)
p2=m.Var(800000)
Qgap=Q(xpos,u1)
m.Equation(u1[0].dt()==-1*(p1-p2+pf)/l \
+ ((630 * (1+(0.05*((u-u1[0])/dx))**2)**(-0.23))/rho)\
*((u-2*u1[0]+u1[1])/(dx*dx)))
m.Equations([(u1[i].dt()==-1*(p1-p2+pf)/l \
+ ((630 * (1+(0.05*((u1[i+1]-u1[i-1])/(2*dx)))**2)**(-0.23))/rho)\
*((u1[i+1]-2*u1[i]+u1[i-1])/(dx*dx))) for i in range(1,npx-1)])
m.Equation(u1[-1].dt()==-1*(p1-p2+pf)/l \
+ (((630 * (1+(0.05*((u1[-1]-0)/dx))**2)**(-0.23)))/rho)\
*((u1[-2]-2*u1[-1]+0)/(dx*dx)))
m.Equation(p1.dt()==(beta/(Ap*(L-x)))*(-Qgap+Ap*u))
m.Equation(p2.dt()==(beta/(Ap*(L+x)))*(Qgap-Ap*u))
# simulation
m.options.IMODE = 4
m.options.solver=1
m.options.nodes=3
m.solve(disp=True)
Solution 1:[1]
Although the problem solves successfully:
Iter Objective Convergence
50 6.52927E-21 1.43369E-03
Successful solution
---------------------------------------------------
Solver : APOPT (v1.0)
Solution time : 36.8693000000021 sec
Objective : 0.000000000000000E+000
Successful solution
---------------------------------------------------
It is not using the scipy.integrate.trapz()
function inside the Gekko model. Gekko builds a symbolic model. See gk0_model.apm
in m.path
or use m.open_folder()
to open the run folder.
There is an m.integral()
function in gekko, but this integrates with respect to time. You likely need to write out the collocation equations or the integral in Gekko equation form.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | John Hedengren |