Marc, Attached is a fixed script. I did two things. One was to make
sure that nx and ny are set as integers. I think they were floats,
which was causing some subtle issue or other. I thought we auto cast
them to ints internally, but who knows. That fixed the IndexError. I
also added a pylab.figure() statement as you already had a plot. The
second plot didn't seem to show up and adding the statement opened up
a new window. Seems to at least do something now. No idea if it's what
you want though. Good luck.

On Thu, May 19, 2011 at 10:34 AM, Marc Saudreau
<marc.saudr...@clermont.inra.fr> wrote:
> I've got float64 in both cases !!
> May my *.py file help you ?
>
>  Thanks
>
>   Marc
>
> Daniel Wheeler <daniel.wheel...@gmail.com> a écrit :
>
>>
>> What do you get if you print numerix.array(S).dtype?
>>
>> On Thu, May 19, 2011 at 9:13 AM, Marc Saudreau
>> <marc.saudr...@clermont.inra.fr> wrote:
>>>
>>> Hi Daniel,
>>>
>>>  thanks a lot. Your example works fine when I use it alone. But when I
>>> want
>>> to use it in
>>> my code, an error occurs with the instruction v([S, S], order=1) :
>>>    __call__    C:\FiPy-2.1.2\fipy\variables\cellVariable.py    205
>>> IndexError: arrays used as indices must be of integer (or boolean) type
>>>
>>> I tried to get the solution by myself but to be honest this one is a
>>> little
>>> bit disturbing.
>>> Any solution ?
>>>
>>>  Thanks again for your help and time
>>>
>>>    Marc
>>>
>>>
>>> Daniel Wheeler <daniel.wheel...@gmail.com> a écrit :
>>>
>>>>
>>>> Hi Marc,
>>>>
>>>> CellVariable's __call__ method extracts data. So you can do the
>>>> following:
>>>>
>>>> from fipy import *
>>>> import pylab
>>>>
>>>> L = 1.
>>>> n = 10
>>>> m = Grid2D(nx=n, ny=n, dx=L / n, dy=L / n)
>>>> x, y = m.cellCenters
>>>> v = CellVariable(mesh=m, value = x * y)
>>>> N = 50
>>>> S = numerix.arange(N) / float(N - 1) * L
>>>> pylab.plot(S, v([S, S], order=1))
>>>> pylab.show()
>>>> raw_input('stopped')
>>>>
>>>> Basically, you can extract any data from "v" with "v([x, y])" where
>>>> "x" and "y" define a set of coordinates.
>>>>
>>>> Cheers
>>>>
>>>> On Tue, May 17, 2011 at 4:47 AM, Marc Saudreau
>>>> <marc.saudr...@clermont.inra.fr> wrote:
>>>>>
>>>>> Hi everyone,
>>>>>
>>>>>  I'm trying to use Fipy to solve a 2D heat transfer problem, and I need
>>>>> to
>>>>> extract from my 2D grid, some 1D profiles. For instance I need to plot
>>>>> temperature versus y axis for x given.
>>>>> I had a look at Fipy examples but I did not find any way to do it.
>>>>> Thanks a lot for any help.
>>>>>
>>>>>  Best regards,
>>>>>
>>>>>   Marc
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Daniel Wheeler
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>>
>>
>>
>>
>> --
>> Daniel Wheeler
>>
>>
>>
>
>



-- 
Daniel Wheeler
#-------------------------------------------------------------------------------
# Name:        module1
# Purpose:
#
# Author:      msaudreau
#
# Created:     15/05/2011
# Copyright:   (c) msaudreau 2011
# Licence:     <your licence>
#-------------------------------------------------------------------------------
#!/usr/bin/env python

def main():
    import fipy
    from fipy import *
    import pylab
    import numpy

#Define plotting function
    dataMin = 24.
    dataMax = 26.

#Define geometrical attributes
    #Grid dimension (m)
    Lx = 1
    Ly = 0.5
    #Grid spatial step
    dx = 0.02
    dy = 0.01
    #Grid points
    nx = int(Lx/dx)
    ny = int(Ly/dy)

    mesh = fipy.Grid2D(nx=nx, ny=ny, dx=dx, dy=dy)


#Define physical attributes
    #Air
    Tair = 20.      #Temperature (Celsius)
    Cpair = 1.2     #heat capacity
    rhoair = 1.2    #density

    #Material
    Tmat =  25.        #Temperature (Celsius)
    Cpleaf = 2700       #heat capacity (J/kgK)
    rholeaf = 1000      #density (kg/m3) The product rhoCp equals 2.7MJ/Km3 for a leaf (see Bajon et al., 2005, Infrared Physics & Techn.)
    kleaf = 0.0762      #heat conductivity (W/mK) (see Casada et al., 1989, Ame. Soc. Agri. Eng.)
    aleaf = kleaf/(Cpleaf*rholeaf)  #heat diffusivity

    Cpmat = 1400       #heat capacity (J/kgK)
    rhomat = 1000      #density (kg/m3)
    kmat = 20.      #heat conductivity (W/mK)
    amat = kmat/(Cpmat*rhomat)  #heat diffusivity

    print "Material heat diffusivity:",amat,"m2/s"
    print "Material diffusion time L*L/diffusivity coeff. y axis", Ly*Ly/amat,' seconds'
    print "Material diffusion time L*L/diffusivity coeff. x axis", Lx*Lx/amat,' seconds'
##    raw_input("Press <return> to proceed...")

#Test the diffusion process
#Heat fluxes are set to zero (adiabatic conditions). Initial temperature field To is
#constant in x direction and linear in the y direction.
#The steady-state temperature value should be the average of To

#Define the initial temperature field
    x, y = mesh.getCellCenters()
    T1 = CellVariable(name ="Temperature", mesh=mesh,hasOld=True, value = Tmat + 2*(y-Ly/2)/Ly)
    print T1.getGlobalValue()
    viewer1 = MatplotlibViewer(vars=T1, name ="Temperature", datamin=dataMin, datamax=dataMax)
    viewer1.plot()
    raw_input("Press <return> to proceed...")

#Plot 1D profile
    #Variable to plot
    v = CellVariable(mesh=mesh, value = T1 )
    N = 100
    S = numpy.arange(N) / float(N - 1)*Ly
    print numpy.array(S).dtype
    print v
    print S
    pylab.figure()
    pylab.plot(S, v([S, S], order=1))
    pylab.show()


#Define heat fluxes / Boundary conditions
    #y = 0  | Adiabatic wall
    BottomFlux = 0.
    #y = Ly | Adiabatic wall
    TopFluxValue = 0    #W/m2
    #x = 0  | Adiabatic wall
    LeftFlux = 0.   #W/m2
    #x = Lx | Adaibatic wall
    RightFlux = 0.  #W/m2

    LeftBC = FixedFlux(faces=mesh.getFacesLeft(), value=LeftFlux)
    RightBC = FixedFlux(faces=mesh.getFacesRight(), value=RightFlux)
    BottomBC = FixedFlux(faces=mesh.getFacesBottom(), value=BottomFlux)
    TopBC = FixedFlux(faces=mesh.getFacesTop(), value=TopFluxValue)
    BCs = (LeftBC, RightBC, BottomBC,TopBC)

#Find steady state solution by solving the transient equation
    eqn = ImplicitDiffusionTerm(coeff=kmat) == TransientTerm(coeff = rhomat*Cpmat)

#Define time step
    timestep = 100*dy*dy/amat
    timemax = Ly*Ly/amat
    steps = int32(floor(timemax/timestep))+1
    print "time step", timestep
    print "time max", timemax
    print "step number", steps

    raw_input("Time step defined. Press <return> to proceed...")

    for step in range(steps):
        T1.updateOld()
        res = 1
        while res > 1e-6:
            res = eqn.sweep(T1, boundaryConditions=BCs, dt=timestep)
        print "step, residual :", step, res
        viewer1.plot()

    print "min(T), max(T):", min(T1), max(T1)
    print "T =",T1
    print "Tmat", Tmat

    raw_input("Transient equation solved. Press <return> to proceed...")


if __name__ == '__main__':
    main()

Reply via email to