Yes I tried without kinematic boundary conditions and there is no difference ! Maybe the scheme is not stable. Other ideas ?
Fabien > Le 17 sept. 2018 à 22:27, Thibault Bridel-Bertomeu > <thibault.bridellel...@gmail.com> a écrit : > > Have you tried without the kinematic boundary conditions ? Just constrain T > and dT/dn, what happens then ? > > Le lun. 17 sept. 2018 à 22:17, fgendr01 <fabien.gend...@univ-lr.fr > <mailto:fabien.gend...@univ-lr.fr>> a écrit : > Alas, it doesn’t work :-( > I tried to change the CFL condition but there is not real differences… > 2 screenshots at t = 0 and after 20s... > > <PastedGraphic-5.png> > > If someone have the solution ? > > here is the code with last modifications : > > # -*- coding: utf-8 -*- > from fipy import * > import matplotlib.pyplot as plt > # Parameter > L = 1. > N = 100. > dL = L/N > T0 = 293. > Tmax = 303. # Temperature max > Tmin = 283. # Temperature min > alpha = 0.0002 # Thermal dilatation > lamda = 0.6 # Thermal conductivity (W/m/K) > c = 4186. # Specific Heat of sea > water (J/kg/K) > ro0 = 1023. # average density of sea water > g = 10. # Gravity (m/s2) > DT = lamda/(c*ro0) # Thermal diffusivity (m2/s) > # Mesh > mesh = Grid2D(nx=N, ny=N, dx=dL, dy=dL) > # Variables > T = CellVariable(mesh=mesh, name = 'T', value = T0) > xVelocity = CellVariable(mesh=mesh, name='Xvelocity', value = 0.) > zVelocity = CellVariable(mesh=mesh, name='Zvelocity', value = 0.) > velocity = FaceVariable(mesh=mesh, name='velocity', rank=1) > # Init Condition > T.setValue(T0) > # Boundary Conditions > T.constrain(Tmax, mesh.facesLeft) #Tmax to the > Left > T.constrain(Tmin, mesh.facesRight) #Tmin to the right > T.faceGrad.constrain(0, mesh.facesTop) #Adiabatic wall to the > Top > T.faceGrad.constrain(0, mesh.facesBottom) #Adiabatic wall to the > Bottom > xVelocity.constrain(0, mesh.facesLeft) > xVelocity.constrain(0, mesh.facesRight) > zVelocity.constrain(0, mesh.facesTop) > zVelocity.constrain(0, mesh.facesBottom) > # Viewer > viewer = None > if __name__ == '__main__': > viewer = Viewer(vars=T, datamin=Tmin, datamax=Tmax) > viewer.plot() > raw_input("<Enter to continue>...") > # Boussinesq equations > eqX = (TransientTerm(var=xVelocity) + ConvectionTerm (var=xVelocity, > coeff=velocity) == 0) > eqZ = (TransientTerm(var=zVelocity) + ConvectionTerm (var=zVelocity, > coeff=velocity) == alpha*g*(T-T0)) > eqT = (TransientTerm(var=T) + ConvectionTerm (var=T, coeff=velocity) == > DiffusionTerm(var=T, coeff=DT)) > eq = eqX & eqZ & eqT > # Solving Boussinesq equations > timeStepDuration = 0.001*dL**2/(2*DT) #CFL Condition > steps = 50 > sweeps = 5 > for step in range(steps): > for sweep in range(sweeps): > eq.sweep(dt=timeStepDuration) > velocity[0] = xVelocity.arithmeticFaceValue > velocity[1] = zVelocity.arithmeticFaceValue > velocity[..., mesh.exteriorFaces.value] = 0. > if viewer is not None: > viewer.plot() > plt.pause(0.1) > raw_input("<Enter to finish>… ") > > > Sorry for all my messages... > > Fabien > > >> Le 17 sept. 2018 à 21:52, Thibault Bridel-Bertomeu >> <thibault.bridellel...@gmail.com <mailto:thibault.bridellel...@gmail.com>> a >> écrit : >> >> Hi again Fabien, >> >> Well, I would say that physically it makes sense. With such boundary >> condition, I think the problem is well posed. Now it is all about the >> numerics. >> Have you tried ? What does the solver yield ? >> >> Cheers >> Thibault >> Le lun. 17 sept. 2018 à 21:49, fgendr01 <fabien.gend...@univ-lr.fr >> <mailto:fabien.gend...@univ-lr.fr>> a écrit : >> Thanks Thibault, >> You’re right, the top ans the bottom walls are adiabatic and I tried to put >> velocity conditions. >> What do you think about these conditions : >> >> # Boundary Conditions >> T.constrain(Tmax, mesh.facesLeft) >> T.constrain(Tmin, mesh.facesRight) >> T.faceGrad.constrain(0, mesh.facesTop) >> T.faceGrad.constrain(0, mesh.facesBottom) >> xVelocity.constrain(0, mesh.facesLeft) >> xVelocity.constrain(0, mesh.facesRight) >> zVelocity.constrain(0, mesh.facesTop) >> zVelocity.constrain(0, mesh.facesBottom) >> >> Thanks, >> >> Fabien >> >> >>> Le 17 sept. 2018 à 21:29, Thibault Bridel-Bertomeu >>> <thibault.bridellel...@gmail.com <mailto:thibault.bridellel...@gmail.com>> >>> a écrit : >>> >> >> >>> Good evening Fabien, >>> >>> I have not been following the development or the answers given to you by >>> other members, so, apologies if I stumble on something that’s already been >>> told. >>> >>> I think the figure you send with your question is the answer. From what I >>> can see, at the top and the bottom of the domain, there is some >>> extrapolation going on, or Neumann sort of boundary condition : the >>> temperature gradient is zero. In physical terms, those two walls look >>> adiabatic to me. >>> >>> I don’t have my laptop anywhere close but I would encourage you to browse >>> the examples to find an adiabatic or zero-gradient boundary condition ! >>> >>> As for the mathematical aspect of your question: when it comes to the >>> Navier-Stokes equations, you have to impose boundary conditions on all >>> boundary patches of the domain. The boundary conditions can change >>> depending on what you want to happen, but you have to have one. Also it is >>> surprising to me that only imposing the temperature on the left and right >>> patches is enough: I’m not sure about fipy core behavior, but with >>> Navier-Stokes, you gotta impose temperature and velocity to have a >>> well-posed problem ! >>> >>> Cheers and bon courage ! >>> >>> T >>> Le lun. 17 sept. 2018 à 21:09, fgendr01 <fabien.gend...@univ-lr.fr >>> <mailto:fabien.gend...@univ-lr.fr>> a écrit : >>> Hi Jon and the community, >>> >>> Since a few weeks, I develop a small code to solve a 2D problem of water >>> transport in a simple mesh. >>> My problem is the resolution of the Navier-Stokes equations with the >>> Boussinesq approximation in 2D with a thermal gradient. >>> I try to solve these equations : >>> >>> A member (Jonathan) helped me and wrote a part of the code but the code >>> seems not to be stable and I don’t know why ! >>> Can you help me ? >>> There must be a problem with the boundary conditions. >>> I want to impose a fixed temperature on the left wall (303K) and a fixed >>> temperature on the right wall (283K). Should I put a condition on the upper >>> and lower walls? >>> Here is my code : >>> >>> # -*- coding: utf-8 -*- >>> from fipy import * >>> import matplotlib.pyplot as plt >>> # Parameter >>> L = 1. >>> N = 100. >>> dL = L/N >>> T0 = 293. >>> Tmax = 303. # Temperature max >>> Tmin = 283. # Temperature min >>> alpha = 0.0002 # Thermal dilatation >>> lamda = 0.6 # Thermal conductivity (W/m/K) >>> c = 4186. # Specific Heat of sea >>> water (J/kg/K) >>> ro0 = 1023. # average density of sea water >>> g = 10. # Gravity (m/s2) >>> DT = lamda/(c*ro0) # Thermal diffusivity (m2/s) >>> # Mesh >>> mesh = Grid2D(nx=N, ny=N, dx=dL, dy=dL) >>> # Variables >>> T = CellVariable(mesh=mesh, name = 'T', value = T0) >>> xVelocity = CellVariable(mesh=mesh, name='Xvelocity', value = 0.) >>> zVelocity = CellVariable(mesh=mesh, name='Zvelocity', value = 0.) >>> velocity = FaceVariable(mesh=mesh, name='velocity', rank=1) >>> # Init Condition >>> T.setValue(T0) >>> # Boundary Conditions >>> T.constrain(Tmax, mesh.facesLeft) >>> T.constrain(Tmin, mesh.facesRight) >>> # Viewer init conditions >>> viewer = None >>> if __name__ == '__main__': >>> viewer = Viewer(vars=T, datamin=Tmin, datamax=Tmax) >>> viewer.plot() >>> raw_input("<Enter to continue>...") >>> # Boussinesq equations >>> eqX = (TransientTerm(var=xVelocity) + ConvectionTerm (var=xVelocity, >>> coeff=velocity) == 0) >>> eqZ = (TransientTerm(var=zVelocity) + ConvectionTerm (var=zVelocity, >>> coeff=velocity) == alpha*g*(T-T0)) >>> eqT = (TransientTerm(var=T) + ConvectionTerm (var=T, coeff=velocity) == >>> DiffusionTerm(var=T, coeff=DT)) >>> eq = eqX & eqZ & eqT >>> # Solving Boussinesq equations >>> timeStepDuration = 0.1*dL**2/(2*DT) >>> steps = 50 >>> sweeps = 5 >>> for step in range(steps): >>> for sweep in range(sweeps): >>> eq.sweep(dt=timeStepDuration) >>> velocity[0] = xVelocity.arithmeticFaceValue >>> velocity[1] = zVelocity.arithmeticFaceValue >>> velocity[..., mesh.exteriorFaces.value] = 0. >>> if viewer is not None: >>> viewer.plot() >>> plt.pause(0.1) >>> raw_input("<Enter to finish>… ") >>> >>> I’d like to obtain something like this : >>> >>> >>> Thanks again for your help, maybe Jon again ;-) >>> >>> Fabien >>> >>> >>>> Le 16 août 2018 à 07:20, fgendr01 <fabien.gend...@univ-lr.fr >>>> <mailto:fabien.gend...@univ-lr.fr>> a écrit : >>>> >>>> Thanks a lot Jon. >>>> I appreciate your help. >>>> I will try to apply your remarks but I will certainly still need your help >>>> again ;-) to develop the code. >>>> >>>> Thanks again. >>>> >>>> Fabien >>>> >>>>> Le 15 août 2018 à 19:46, Guyer, Jonathan E. Dr. (Fed) >>>>> <jonathan.gu...@nist.gov <mailto:jonathan.gu...@nist.gov>> a écrit : >>>>> >>>>> Fabien - >>>>> >>>>> I think the code below should get you going. >>>>> >>>>> The changes I made were: >>>>> >>>>> - `xVelocity` and `zVelocity` changed to rank-0 CellVariables. FiPy >>>>> *always* solves at cell centers. >>>>> - Created a rank-1 FaceVariable to hold the velocity. The cell components >>>>> must be interpolated and manually inserted into this field at each sweep. >>>>> - Changed the sign of the DiffusionTerm in the heat equation; it's >>>>> unconditionally unstable otherwise >>>>> - Slowed down the time steps to better see the evolution >>>>> >>>>> The result is not identical to the image you showed, but I think that's >>>>> down to boundary conditions, sign of gravity, etc. >>>>> >>>>> - Jon >>>>> >>>>> # -*- coding: utf-8 -*- >>>>> from fipy import * >>>>> import matplotlib.pyplot as plt >>>>> # Parameter >>>>> L = 1. >>>>> N = 50. >>>>> dL = L/N >>>>> alpha = 0.0002 # Thermical dilatation >>>>> landa = 0.6 # Thermical conductivity >>>>> ro0 = 1023. # Average volumic Mass >>>>> g = 10. # Gravity >>>>> # Mesh >>>>> mesh = Grid2D(nx=N, ny=N, dx=dL, dy=dL) >>>>> # Variables >>>>> dT = CellVariable(name = 'dT', mesh = mesh, value = 0.) >>>>> xVelocity = CellVariable(mesh=mesh, name='Xvelocity', value = 0.) >>>>> zVelocity = CellVariable(mesh=mesh, name='Zvelocity', value = 0.) >>>>> velocity = FaceVariable(mesh=mesh, name='velocity', rank=1) >>>>> # Init Condition >>>>> x = mesh.cellCenters[0] >>>>> dT.setValue(1.) >>>>> dT.setValue(-1., where = x > L/2) >>>>> # Viewer >>>>> viewer = None >>>>> if __name__ == '__main__': >>>>> viewer = Viewer(vars=dT, datamin=-1., datamax=1.) >>>>> viewer.plotMesh() >>>>> raw_input("<Enter to continue>...") >>>>> # Boussinesq equations >>>>> D = landa/ro0 >>>>> eqX = (TransientTerm(var=xVelocity) + ConvectionTerm (var=xVelocity, >>>>> coeff=velocity) == 0) >>>>> eqZ = (TransientTerm(var=zVelocity) + ConvectionTerm (var=zVelocity, >>>>> coeff=velocity) + alpha*g*dT == 0) >>>>> eqT = (TransientTerm(var=dT) + ConvectionTerm (var=dT, coeff=velocity) == >>>>> DiffusionTerm(var=dT, coeff=D)) >>>>> eq = eqX & eqZ & eqT >>>>> # Solving Boussinesq equations >>>>> timeStepDuration = 1 * dL**2 / (2 * D) >>>>> steps = 50 >>>>> sweeps = 5 >>>>> for step in range(steps): >>>>> for sweep in range(sweeps): >>>>> eq.sweep(dt=timeStepDuration) >>>>> velocity[0] = xVelocity.arithmeticFaceValue >>>>> velocity[1] = zVelocity.arithmeticFaceValue >>>>> velocity[..., mesh.exteriorFaces.value] = 0. >>>>> if viewer is not None: >>>>> viewer.plot() >>>>> plt.pause(0.1) >>>>> raw_input("<Enter to finsh>… ") >>>>> >>>>> >>>>>> On Aug 14, 2018, at 11:22 AM, fgendr01 <fabien.gend...@univ-lr.fr >>>>>> <mailto:fabien.gend...@univ-lr.fr>> wrote: >>>>>> >>>>>> Hello, >>>>>> >>>>>> I’m a PhD Student in La Rochelle University (France) and I’m working on >>>>>> Boussinesq Approximation. >>>>>> I’m starting with fipy and I’d like to make a little algorithm to solve >>>>>> these equations in 2D (x,z) : >>>>>> <PastedGraphic-1.png> >>>>>> In my problem T = T0 + dT. >>>>>> (ux, uz) is the velocity. >>>>>> >>>>>> So, here is my algorithm : >>>>>> # -*- coding: utf-8 -*- >>>>>> from fipy import * >>>>>> import matplotlib.pyplot as plt >>>>>> # Parameter >>>>>> L = 1. >>>>>> N = 50. >>>>>> dL = L/N >>>>>> alpha = 0.0002 # Thermical dilatation >>>>>> landa = 0.6 # Thermical conductivity >>>>>> ro0 = 1023. # Average volumic Mass >>>>>> g = 10. # Gravity >>>>>> # Mesh >>>>>> mesh = Grid2D(nx=N, ny=N, dx=dL, dy=dL) >>>>>> # Variables >>>>>> dT = CellVariable(name = 'dT', mesh = mesh, value = 0.) >>>>>> xVelocity = FaceVariable(mesh=mesh, name='Xvelocity', value = 0., rank=1) >>>>>> zVelocity = FaceVariable(mesh=mesh, name='Zvelocity', value = 0., rank=1) >>>>>> # Init Condition >>>>>> x = mesh.cellCenters[0] >>>>>> dT.setValue(1.) >>>>>> dT.setValue(-1., where = x > L/2) >>>>>> # Viewer >>>>>> viewer = None >>>>>> if __name__ == '__main__': >>>>>> viewer = Viewer(vars=dT, datamin=-1., datamax=1.) >>>>>> viewer.plotMesh() >>>>>> raw_input("<Enter to continue>...") >>>>>> # Boussinesq equations >>>>>> D = landa/ro0 >>>>>> velocity = ((xVelocity), (zVelocity)) >>>>>> eqX = (TransientTerm(var=xVelocity) + ConvectionTerm (var=xVelocity, >>>>>> coeff=velocity) == 0) >>>>>> eqZ = (TransientTerm(var=zVelocity) + ConvectionTerm (var=zVelocity, >>>>>> coeff=velocity) + alpha*g*dT == 0) >>>>>> eqT = (TransientTerm(var=dT) + ConvectionTerm (var=dT, coeff=velocity) >>>>>> == -DiffusionTerm(var=dT, coeff=D)) >>>>>> eq = eqX & eqZ & eqT >>>>>> # Solving Boussinesq equations >>>>>> timeStepDuration = 10 * dL**2 / (2 * D) >>>>>> steps = 50 >>>>>> for step in range(steps): >>>>>> eq.solve(dt=timeStepDuration) >>>>>> if viewer is not None: >>>>>> viewer.plot() >>>>>> plt.pause(0.1) >>>>>> raw_input("<Enter to finsh>… ») >>>>>> >>>>>> My error : all the input arrays must have same number of dimensions >>>>>> >>>>>> I’d like to obtain something like this : >>>>>> <PastedGraphic-3.png> >>>>>> >>>>>> If someone can help me, I will be very happy. >>>>>> >>>>>> Thanks a lot. >>>>>> >>>>>> Fabien G. >>>>>> _______________________________________________ >>>>>> fipy mailing list >>>>>> fipy@nist.gov <mailto:fipy@nist.gov> >>>>>> http://www.ctcms.nist.gov/fipy <http://www.ctcms.nist.gov/fipy> >>>>>> [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy >>>>>> <https://email.nist.gov/mailman/listinfo/fipy> ] >>>>> >>>>> >>>>> _______________________________________________ >>>>> fipy mailing list >>>>> fipy@nist.gov <mailto:fipy@nist.gov> >>>>> http://www.ctcms.nist.gov/fipy <http://www.ctcms.nist.gov/fipy> >>>>> [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy >>>>> <https://email.nist.gov/mailman/listinfo/fipy> ] >>>> >>> >>> _______________________________________________ >>> fipy mailing list >>> fipy@nist.gov <mailto:fipy@nist.gov> >>> http://www.ctcms.nist.gov/fipy <http://www.ctcms.nist.gov/fipy> >>> [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy >>> <https://email.nist.gov/mailman/listinfo/fipy> ] >> >>> <PastedGraphic-2.png><PastedGraphic-1.png><PastedGraphic-2.png>_______________________________________________ >> >>> >>> fipy mailing list >>> fipy@nist.gov <mailto:fipy@nist.gov> >>> http://www.ctcms.nist.gov/fipy <http://www.ctcms.nist.gov/fipy> >>> [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy >>> <https://email.nist.gov/mailman/listinfo/fipy> ] >> >> _______________________________________________ >> fipy mailing list >> fipy@nist.gov <mailto:fipy@nist.gov> >> http://www.ctcms.nist.gov/fipy <http://www.ctcms.nist.gov/fipy> >> [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy >> <https://email.nist.gov/mailman/listinfo/fipy> ] >> _______________________________________________ >> fipy mailing list >> fipy@nist.gov <mailto:fipy@nist.gov> >> http://www.ctcms.nist.gov/fipy <http://www.ctcms.nist.gov/fipy> >> [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy >> <https://email.nist.gov/mailman/listinfo/fipy> ] > > _______________________________________________ > fipy mailing list > fipy@nist.gov <mailto:fipy@nist.gov> > http://www.ctcms.nist.gov/fipy <http://www.ctcms.nist.gov/fipy> > [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy > <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 ]