Hi,
Thanks for your proposed 1D solution. It bears part of the correct
solution which should look like :
from X=-L/2 the temperature increases to 2.5 deg C at X = 0; then there
is a temperature jump to 3.5 deg C and the temperature increases
linearly to 6 deg C at the X=L/2 boundary.
So I'm a bit puzzled as to why for X from -L/2 to 0 the temperature is
0. : it should increase linearly to 2.5 deg C.
Aside from that the rest of the solution appears just offset by this 2.5
deg C (1 deg C jump at X=0 and a linear increase by 2.5 deg C in region
2)
For your (and other users convenience) I tried to translate your
solution to a 2D formulation. I could not do this in a straight forward
manner as some FiPy methods did not appear to function in the same way
for the 2D problem :
1) I could not make the thermal conductance, K, a Face variable because
if so I could not assign a value for K in a "Physical Surface" of the
mesh for regions 1 and 2
2) but as a consequence of making K a cell variable I could not zero-it
on the "thermal contact" boundary (Physical Line).
Unfortunately the solution it returns is not correct not even the jump
and the linear rise in region 2 come out.
Also I noticed that for this 2D formulation the solution is not
stationary (as in : if I sweep more the solution still varies).
So, in brief : why is the 1D solution wrong in Region 1 and how to
formulate this for a 2D problem ?
Many thanks for any help or insight on these.
"""
test FiPy
"""
import fipy as fp, numpy as np, pylab as pl, os, time
# geometry parameters
L = 1. # lenght of the slab
W = 0.4 # width of the slab
dx = 0.005 * L # thickness of the thermal layer
cellSize = 0.01 * L # cellSize function of problem
# define the geometry
geo = """
cellSize = %(cellSize)g;
L = %(L)g;
W = %(W)g;
dx = %(dx)g;
// 5 4
// 6 <-------- 5 <-------- 4
// | ^ ^
// | Region 1 | Region 2 |
// 6 | | | 3
// | 7| |
// v | |
// 1 --------> 2 --------> 3
// 1 2
Point(1) = {- L/2, 0, 0, cellSize};
Point(2) = { 0, 0, 0, cellSize}; Line(1) = {1,2};
Point(3) = { L/2, 0, 0, cellSize}; Line(2) = {2,3};
Point(4) = { L/2, W, 0, cellSize}; Line(3) = {3,4};
Point(5) = { 0, W, 0, cellSize}; Line(4) = {4,5};
Point(6) = { -L/2, W, 0, cellSize}; Line(5) = {5,6};
Line(6) = {6,1};
Line(7) = {2,5};
Line Loop(1) = {1,7,5,6};
Line Loop(2) = {2,3,4,-7};
Plane Surface(1) = {1};
Plane Surface(2) = {2};
Physical Surface('Region 1') = {1};
Physical Surface('Region 2') = {2};
Physical Line('Boundary 1') = {6};
Physical Line('Boundary 2') = {3};
Physical Line('No transfer bottom') = {1,2};
Physical Line('No transfer top') = {4,5};
Physical Line('thermal contact') = {7};
""" % locals()
# print geo
# produce the mesh
mesh = fp.Gmsh2D(geo)
# physics parameters
# we want a thermal contact with a value of hc = 1E3 :
# so the equivalent thermal conduction in the region of the
# thermal contact which is dx wide should be Kc = hc * dx
hc = 1E3 # [W/(m^2.K)] thermal contact conductance
Kc = hc * dx # [W/(m.K) thermal conduction of the material representing
# the contact
K1 = 200. # [W/(m.K) thermal conduction in region 1
K2 = 200. # [W/(m.K) thermal conduction in region 2
# 1 kW/m^2 on boundary 2
Ps = 1E3
print 'delta T = %7.3f (Region 1)' % (Ps/K1*L/2)
print ' + %7.3f (thermal contact)' % (Ps/hc)
print ' + %7.3f (Region 2)' % (Ps/K2*L/2)
print ' = %7.3f (total)' % (Ps/K1*L/2+Ps/hc+Ps/K2*L/2)
# define the thermal conduction over the mesh
# K needs to be a cell variable if one want to set the values for
# Physical Surfaces
K = fp.CellVariable(name='Conductance', mesh = mesh, value = 0.)
K.setValue(K1, where = mesh.physicalCells['Region 1'])
K.setValue(K2, where = mesh.physicalCells['Region 2'])
# but then I could not set K to 0. on the 'thermal contact' boundary
# the boundary does not appear in the mesh.physicalFaces.keys()
#
# K.setValue(0., where = mesh.physicalFaces['thermal contact'])
# define the heath transfer coeff. as a variable
hc_coef = fp.FaceVariable(name='thermal contact conductance',
mesh=mesh, value=0., rank=1)
hc_coef.setValue(hc * mesh._faceNormals,
where=mesh.physicalFaces['thermal contact'])
# define the variable T and boundary conditions
T = fp.CellVariable(name='Temperature', mesh = mesh, value = 0.)
# fixed temperature for boundary 1
T.constrain(0., where = mesh.physicalFaces['Boundary 1'])
# 1 kW/m^2 on boundary 2
T.getFaceGrad().constrain(Ps/K2 * mesh._faceNormals,
where=mesh.physicalFaces['Boundary 2'])
# no heat exchange with the sides
T.getFaceGrad().constrain(0. * mesh._faceNormals,
where=mesh.physicalFaces['No transfer top'])
T.getFaceGrad().constrain(0. * mesh._faceNormals,
where=mesh.physicalFaces['No transfer
bottom'])
pl.figure(1)
X, Y = mesh.faceCenters()
faces = mesh.physicalFaces['No transfer bottom']
# equation to solve the heat diffusion problem
eq = fp.DiffusionTerm(coeff=K) +
fp.ImplicitSourceTerm(coeff=hc_coef.divergence)
# solve and plot the intermediate results
for sweep in range(10) :
eq.solve(var=T)
sol = sorted([(x,t) for x, t, face in zip(X,
T.arithmeticFaceValue(), faces)
if face ])
pl.plot([x for x, t in sol], [t for x, t in sol],
'rgbcm'[sweep % 5]+['-','-.',':','--'][(sweep/5)%4],
label = 'sweep %d' % (sweep+1))
# plot the theoretical solution
pl.plot([-L/2,0.,0.,L/2],
[0.,Ps/K1*L/2,Ps/K1*L/2+Ps/hc,Ps/K1*L/2+Ps/hc+Ps/K1*L/2],
'k--', label = 'theory')
pl.xlabel('length along the bottom side [m]')
pl.ylabel('temperature [C]')
pl.legend(loc='best')
pl.show()
On Mon, 2013-05-13 at 12:12 -0400, Jonathan Guyer wrote:
> On May 10, 2013, at 2:11 AM, Frederic Durodie
<[email protected]> wrote:
>
> > could you help me with how to implement a thermal contact, hc
> > [W/(m^2.K)], between two regions : so there is like a discontinuity
in
> > the temperature between the two regions.
>
>
> I don't know whether the following is the solution you want (it
doesn't look like the solutions from your script at all), but it
satisfies the external boundary conditions and gives exactly 1 K jump at
the internal boundary.
>
> I've solved it on a Grid1D because I didn't feel like ginning up a new
Gmsh, but everything should apply to a Gmsh mesh.
>
> If the flux at the thermal contact is to be -\vec{hc} \Delta T, then
we want to add a term
>
> \nabla\cdot(hc T^+) - \nabla\cdot(hc T^-)
>
> to the diffusion equation and zero out the diffusivity at that
boundary.
>
> Since we don't know the values immediately at the jump condition, we
take the value at the nearest cell centers:
>
> T^+ \nabla\cdot(\vec{hc}) - T^- \nabla\cdot(\vec{hc})
>
> which we can write as an ImplicitSourceTerm and the divergence in the
coefficient takes care of the subtraction.
>
>
>
>
> """
> test FiPy
> """
>
> import fipy as fp, numpy as np, pylab as pl
>
> # geometry parameters
>
> L = 1. # lenght of the slab
> W = 0.4 # width of the slab
> dx = 0.005 * L # thickness of the thermal layer
>
> cellSize = 0.01 * L # cellSize function of problem
>
> # define the geometry
>
>
> # produce the mesh
>
> mesh = (fp.Grid1D(Lx=L/2., dx=cellSize) + [[-L/2.]]) +
fp.Grid1D(Lx=L/2., dx=cellSize)
>
> X = mesh.faceCenters[0]
>
> # physics parameters
>
> # we want a thermal contact with a value of hc = 1E4 :
> # so the equivalent thermal conduction in the region of the
> # thermal contact which is dx wide should be Kc = hc * dx
>
> hc = 1E3 # [W/(m^2.K)] thermal contact conductance
> Kc = hc * dx # [W/(m.K) thermal conduction of the material
representing the contact
>
> K1 = 200. # [W/(m.K) thermal conduction in region 1
> K2 = 200. # [W/(m.K) thermal conduction in region 2
>
> # define the thermal conduction over the mesh
> K = fp.FaceVariable(name='Conductance', mesh = mesh)
> K.setValue(K1, where=X < 0.)
> K.setValue(K2, where=X > 0.)
> K.setValue(0., where=X == 0.)
>
> hc_coeff = fp.FaceVariable(name='thermal contact conductance',
mesh=mesh, value=0., rank=1)
> hc_coeff.setValue(hc * mesh._faceNormals, where=X == 0.)
>
> # define the variable T and boundary conditions
>
> T = fp.CellVariable(name='Temperature', mesh = mesh, value = 0.)
>
> # fixed temperature for boundary 1
> T.constrain(0., where = mesh.facesLeft)
>
> # 1 kW/m^2 on boundary 2
> Ps = 1E3
> T.getFaceGrad().constrain(Ps/K2 * mesh._faceNormals,
> where=mesh.facesRight)
>
> vw = fp.Viewer(vars=T)
>
> # solve the heat diffusion equation
> eq = fp.DiffusionTerm(coeff=K) +
fp.ImplicitSourceTerm(coeff=hc_coeff.divergence)
>
> # ImplicitSourceTerm can only be semi-implicit, so we sweep twice
> for sweep in range(2):
> eq.solve(var=T)
>
> print T([cellSize/2.]) - T([-cellSize/2.])
> print Ps/K2, T.faceGrad[..., mesh.facesRight.value]
>
> # plot the results
>
> fp.Viewer(vars=T).plot()
>
>
> _______________________________________________
> fipy mailing list
> [email protected]
> http://www.ctcms.nist.gov/fipy
> [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]
_______________________________________________
fipy mailing list
[email protected]
http://www.ctcms.nist.gov/fipy
[ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]