Interpolated on what ? After the loop on the steps, the variable phi is still accessible, you should be able to manipulate it as a numpy array and store it or do whatever you like with it.
Thibault Bridel-Bertomeu 2017-05-18 14:37 GMT+02:00 Sergio Manzetti <sergio.manze...@fjordforsk.no>: > Thibault, the solution plotted by the Viewer looks like a decaying > exponential function. Is there any way to get out from this plot an > interpolated function, which is the result to the solved PDE? > > Thanks! > > > Sergio Manzetti > > <http://www.fjordforsk.no/logo_hr2.jpg> > > Fjordforsk AS <http://www.fjordforsk.no> > <http://www.fjordforsk.no> > Midtun > 6894 Vangsnes > Norge > Org.nr. 911 659 654 > Tlf: +47 57695621 <+47%2057%2069%2056%2021> > Økolab <http://www.oekolab.com> | Nanofactory <http://www.nanofact.no> > | AQ-Lab <http://www.aq-lab.no> | FAP <http://www.phap.no> > > > ------------------------------ > *From: *"Thibault Bridel-Bertomeu" <thibault.bridellel...@gmail.com> > *To: *"fipy" <fipy@nist.gov> > *Sent: *Thursday, May 18, 2017 2:29:23 PM > > *Subject: *Re: Problems running a simple PDE > > I invite you to take a look at : http://www.ctcms.nist.gov/ > fipy/examples/README.html for an overview of all the examples written for > fipy > and http://www.ctcms.nist.gov/fipy/documentation/numerical/discret.html > for a reminder on how the finite volume method works. > > As for your equation, if you are in 1D, you may consider it as follow : > > du/dx : is a convection term with a unit scalar coefficient, i.e. > <SpecificConvectionTerm>(coeff=(1.,), var=u) - you will find a list of > all available convection schemes here : http://www.ctcms.nist.gov/ > fipy/documentation/numerical/discret.html#convection-term > > du/dt : is a transient term that you can treat as before, i.e. > TransientTerm(var=u) > > and u^2, as a nonlinear term, one possibility is to update it during the > iterations. > > All in all, you would write for instance : > > #!/usr/bin/env python > > from fipy import * > from fipy import numerix > > nx = 50 > dx = 1. / float(nx) > > mesh = Grid1D(nx=nx,dx=dx) > X = mesh.cellCenters[0] > > phi = CellVariable(mesh=mesh, name="solution") > phi.setValue(0.5-0.5*numerix.tanh(10*(X-0.5))) > > vi = Viewer(vars=phi,datamin=0.0, datamax=1.0) > vi.plot() > > raw_input("Initialization ...") > > phi.constrain(1., mesh.facesLeft) > phi.constrain(0., mesh.facesRight) > > phi_sq = CellVariable(mesh=mesh) > phi_sq.setValue( phi*phi ) > > eq = TransientTerm(coeff=1., var=phi) + ExponentialConvectionTerm(coeff=(1.,), > var=phi) + phi_sq == 0.0 > > dt = 0.01 > steps = 100 > for step in range(steps): > eq.sweep(dt=dt) > # > phi_sq.setValue( phi * phi ) > # > vi.plot() > > raw_input("Press <return> ...") > > The sweep method allows to advance the equation of one timestep only. Then > I can update phi_sq which the next sweep will use to solve the equation. > And so on .. > > Hope this helps to understand. I can however only advise you to browse > through all the examples, you will definitely find something similar to > your case you can start from ! > > Best > > T. Bridel-Bertomeu > > > > 2017-05-18 14:10 GMT+02:00 Sergio Manzetti <sergio.manze...@fjordforsk.no> > : > >> OK, this really helped. If I wanted to change this into: >> >> >> du/dx + i*du/dt + u^2 = 0 >> >> in the following format: >> >> >> eqX = TransientTerm(var=phi) == ExplicitDiffusionTerm(coeff=D, var=phi) >> for step in range(steps): >> eqX.solve(dt=timeStepDuration) >> >> >> there would be alot of different terms. Where can I find an explanation >> on how to change these variables you mentioned into an equation one >> requires to run on fipy? >> >> Sergio >> >> >> Sergio Manzetti >> >> <http://www.fjordforsk.no/logo_hr2.jpg> >> >> Fjordforsk AS <http://www.fjordforsk.no> >> <http://www.fjordforsk.no> >> Midtun >> 6894 Vangsnes >> Norge >> Org.nr. 911 659 654 >> Tlf: +47 57695621 <+47%2057%2069%2056%2021> >> Økolab <http://www.oekolab.com> | Nanofactory <http://www.nanofact.no> >> | AQ-Lab <http://www.aq-lab.no> | FAP <http://www.phap.no> >> >> >> ------------------------------ >> *From: *"Thibault Bridel-Bertomeu" <thibault.bridellel...@gmail.com> >> *To: *"fipy" <fipy@nist.gov> >> *Sent: *Thursday, May 18, 2017 2:09:47 PM >> *Subject: *Re: Problems running a simple PDE >> >> Hello again Sergio, >> When you define eqX = TransientTerm() == ExplicitDiffusionTerm(coeff=D) >> you ready the equation, and then eqX.solve(var=phi, dt=timeStepDuration) >> solves the equation for an infinitesimal timestep dt, and the variable >> phi as asked. >> >> You could also have written :: >> >> eqX = TransientTerm(var=phi) == ExplicitDiffusionTerm(coeff=D, var=phi) >> for step in range(steps): >> eqX.solve(dt=timeStepDuration) >> >> Best >> >> Thibault Bridel-Bertomeu >> >> >> 2017-05-18 13:57 GMT+02:00 Sergio Manzetti <sergio.manze...@fjordforsk.no >> >: >> >>> Dear all, referring to the email below, I removed the phi_nw and >>> phi_old, however, I am not sure where the actual PDE given in the first >>> example at . 58, >>> >>> d phi/dt = A d^2x∕dx^2 >>> >>> >>> appears in the actual python code. >>> >>> >>> This would be important to change the PDE into other PDEs >>> >>> Where do I define this PDE? >>> >>> Thanks >>> >>> Sergio Manzetti >>> >>> <http://www.fjordforsk.no/logo_hr2.jpg> >>> >>> Fjordforsk AS <http://www.fjordforsk.no> >>> <http://www.fjordforsk.no> >>> Midtun >>> 6894 Vangsnes >>> Norge >>> Org.nr. 911 659 654 >>> Tlf: +47 57695621 <+47%2057%2069%2056%2021> >>> Økolab <http://www.oekolab.com> | Nanofactory >>> <http://www.nanofact.no> | AQ-Lab <http://www.aq-lab.no> | FAP >>> <http://www.phap.no> >>> >>> >>> ------------------------------ >>> *From: *"sergio manzetti" <sergio.manze...@fjordforsk.no> >>> *To: *"fipy" <fipy@nist.gov> >>> *Sent: *Thursday, May 18, 2017 1:36:57 PM >>> *Subject: *Problems running a simple PDE >>> >>> Hello, following the manual, at the first example with the 1D diffusion, >>> I have tried to make the python script for this (python2.7) and I get a >>> missing name, which is not defined in the example at all. >>> >>> This is the name "cell", which appears on p 58 in the manual. >>> >>> Please see this code which describes this example: >>> >>> >>> Thanks! >>> >>> >>> >>> #Python script for solving a Partial Differential Equation in a >>> diffusion case >>> >>> >>> >>> from fipy import * >>> nx = 50 >>> dx = 1 >>> mesh = Grid1D(nx=nx, dx=dx) >>> phi = CellVariable(name="Solution variable", >>> mesh=mesh, >>> value=0.) >>> >>> >>> #We'll use the coefficient set to D=1 >>> >>> D=1 >>> >>> # We give then 2000 time-steps for the computation, which is defined by >>> 90 percent of the maximum stable timestep, which is given >>> >>> timeStepDuration = 0.9 * dx**2 / (2 * D) >>> steps = 2000 >>> >>> >>> #Then we define the boundary conditions >>> >>> valueLeft = 1 >>> >>> valueRight = 0 >>> >>> #The boundary conditions are represented as faces around the exterior of >>> the mesh, so we define the constraint by the given values on the left and >>> right side of the boundary using the phi.constrain() command >>> >>> phi.constrain(valueLeft, mesh.facesRight) >>> phi.constrain(valueRight, mesh.facesLeft) >>> >>> # We can also omit giving boundary conditions, then the default bc is >>> equivalent to a zero gradient. >>> >>> #At this stage we define the partial differential equation as a >>> numerical problem to be solved >>> >>> for step in range(steps): >>> for j in range(cells): >>> phi_new[j] = phi_old[j] \ >>> + (D * dt / dx**2) * (phi_old[j+1] - 2 * phi_old[j] + >>> phi_old[j-1]) >>> time += dt >>> >>> #and additional code for the boundary conditions >>> >>> eqX = TransientTerm() == ExplicitDiffusionTerm(coeff=D) >>> >>> >>> #We then want to view the results of the calculation and use the command >>> Viewer() for this >>> >>> phiAnalytical = CellVariable(name="analytical value", >>> mesh=mesh) >>> if __name__ == '__main__': >>> viewer = Viewer(vars=(phi, phiAnalytical), >>> datamin=0., datamax=1.) >>> viewer.plot() >>> >>> #If we have a semi-infinite domain, then the solution for this PDE is >>> phi=1-erf(x/2(Dt)^(0.5)). This requires to import SciPy library, so we >>> import that. >>> >>> x = mesh.cellCenters[0] >>> t = timeStepDuration * steps >>> >>> try: >>> from scipy.special import erf >>> phiAnalytical.setValue(1-erf(x / (2 * numerix.sqrt(D * t)))) >>> except ImportError: >>> print ("The Scipy Library is not avaliable to test the solution to >>> the given trasient diffusion equation") >>> >>> # The equation is then solved by repeatedly looping >>> >>> for step in range(steps): >>> eqX.solve(var=phi, >>> dt=timeStepDuration) >>> if __name__ == '__main__': >>> viewer.plot() >>> print (phi.allclose(phiAnalytical, atol = 7e-4)) >>> 1 >>> >>> if __name__ == '__main__': >>> raw_input("Explicit transient diffusion. Press <return> to >>> proceed...") >>> >>> >>> _______________________________________________ >>> fipy mailing list >>> fipy@nist.gov >>> http://www.ctcms.nist.gov/fipy >>> [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ] >>> >>> >> >> _______________________________________________ >> fipy mailing list >> fipy@nist.gov >> http://www.ctcms.nist.gov/fipy >> [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ] >> >> _______________________________________________ >> fipy mailing list >> fipy@nist.gov >> http://www.ctcms.nist.gov/fipy >> [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ] >> >> > > _______________________________________________ > fipy mailing list > fipy@nist.gov > http://www.ctcms.nist.gov/fipy > [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ] > > _______________________________________________ > fipy mailing list > fipy@nist.gov > http://www.ctcms.nist.gov/fipy > [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ] > >
_______________________________________________ fipy mailing list fipy@nist.gov http://www.ctcms.nist.gov/fipy [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]