I have recently been trying to solve these 6 coupled, nonlinear PDEs of the general form:
[cid:a9dfc2f3-d8a7-47c2-883b-b8466ce6d924] (where N_1,N_2,P_1,P_2,E_1, and E_2 are the solutions sought; t and z are the independent variables (only 2 at the moment); a,b,c,d,e,f,g,h and k are positive constants) I have set the parameters and constants equal to 1 for simplicity in this example. Here is my code: [code] from fipy import * import numpy as np zmax = 10. #final length of z domain tmax = 5. #final length of t domain if __name__ == "__main__": steps = nz = nt = 100 #number of elements, where dn is increments, so range is nn*dn #for the nth variable assessed else: steps = nz = nt = 10 mesh = Grid2D(nx=nz, ny=nt, dx=(zmax/nz), dy=(tmax/nt)) #dx = dz, dy = dt z, t = mesh.cellCenters #pairs z and t to make a grid with nz by nt elements dz = (zmax/nz) dt = (tmax/nt) N1 = CellVariable(name=r"$N_1$", mesh=mesh, hasOld=True, value=0.0) #value here changes every element N2 = CellVariable(name=r"$N_2$", mesh=mesh, hasOld=True) #and sets values of function.old argument! P1 = CellVariable(name=r"$P_1$", mesh=mesh, hasOld=True) P2 = CellVariable(name=r"$P_2$", mesh=mesh, hasOld=True) E1 = CellVariable(name=r"$E_1$", mesh=mesh, hasOld=True, value = 0.) E2 = CellVariable(name=r"$E_2$", mesh=mesh, hasOld=True) #The CellVariables are in a grid with nz by nt elements, which corresponds to #a particular point on the grid #The CellVariables are in the format of F = F(z,t) where t is constant for nz elements #and then changes for the nz + 1 element to the next step t + dt for i in range(nz): #this sets initial condition at t = dt (not necessarily t = 0) N1[i] = 0.01 N2[i] = 0. P1[i] = 1. P2[i] = 0. E1[i] = 0. E2[i] = 1. #sets boundary condition at z = dz (not necessarily z = 0) N1[::nt] = 0.01*(np.e**(-2.*np.log(2)*((t[::nt]-t[0])**2))) N2[::nt] = 0. P1[::nt] = 1.*(np.e**(-2.*np.log(2)*((t[::nt]-t[0])**2))) P2[::nt] = 0. E1[::nt] = 0. E2[::nt] = 1.*(np.e**(-2.*np.log(2)*((t[::nt]-t[0])**2))) if __name__ == "__main__": viewer = Viewer(vars=(N1, N2, P1, P2, E1, E2)) # , datamin=0., datamax=1.) #constants & parameters hbar = 1 c = 1 eps = 1 omega = 1. d = 1. T1 = 1. T2 = 1. Ldiff = 1. CoEff = CellVariable(mesh=mesh, value=(1), rank=1) #vector with values 1 dN1dt = (-2/hbar)*(P2*E1 + P1*E2) - N1/T1 dN2dt = -N2/T1 dP1dt = (2*(d**2)/hbar)*(E2*N1 - E1*N2) - P1/T2 dP2dt = (2*(d**2)/hbar)*(E1*N1 + E2*N2) - P2/T2 dE1dz = (omega/(2*eps*c))*P2 - E1/Ldiff dE2dz = (omega/(2*eps*c))*P1 - E2/Ldiff eq1 = (TransientTerm(var=N1) == dN1dt) eq2 = (TransientTerm(var=N2) == dN2dt) eq3 = (TransientTerm(var=P1) == dP1dt) eq4 = (TransientTerm(var=P2) == dP2dt) eq5 = (CentralDifferenceConvectionTerm(coeff=CoEff,var=E1) == dE1dz) eq6 = (CentralDifferenceConvectionTerm(coeff=CoEff,var=E2) == dE2dz) eq = eq1 & eq2 & eq3 & eq4 & eq5 & eq6 elapsedt = 0. i = 0 while elapsedt < tmax: N1.updateOld() N2.updateOld() P1.updateOld() P2.updateOld() E1.updateOld() E2.updateOld() i = i + 1 T = i*(tmax/nt)#min(100, numerix.exp(dexp)) elapsedt += dt eq.solve(dt=T) if __name__ == "__main__": viewer.plot() if __name__ == '__main__': raw_input("Coupled equations. Press <return> to proceed...") [\code] I do not have any particular boundary/initial conditions I want to specifically test at the moment, but besides trivial conditions, I have been finding the output essentially always diverges. Increasing the number of steps also appears to freeze the script. So please feel free to test any conditions you like even if they differ from the ones in my code. Any thoughts on improving the code and suggestions to solve the above nonlinear, coupled PDEs would be of much interest. I am also curious if FiPy is well-suited to handle such a problem involving nonlinear terms in the coupled PDEs since most examples I have noted are linear and do not typically involve two independent variables. Any and all input is welcome. Abhilash
_______________________________________________ fipy mailing list fipy@nist.gov http://www.ctcms.nist.gov/fipy [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]