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> 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
http://www.ctcms.nist.gov/fipy
  [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]

Reply via email to