Jonathan, I have just a few follow up questions. Namely, regarding to working within cylindrical coordinates. If I switch the mesh to cylindrical, it seems the temperature profile never changes, unless I go to extremely small time steps. That strikes me as odd. What do you think?
Also, the shifting profile seems to reverse, with the left boundary condition dropping to ~300K over time while in Cartesian coordinates, the temperature rises to 600K over time (a result I would expect). I've included a copy of the work with the changes you've suggested previously. If you look at lines 23/24, you can toggle the cylindrical grid on and off, and in lines 30-34, I've included options for the time steps that work for each respective coordinate system. Do you have any suggestions? Finally, in reference to the velocity I would like to incorporate, I understand the difference between Cell Variables and Face Variables, but why is the rank of the velocity -1? What does the Face Variable rank indicate? Thank you, Dan On Thu, Apr 11, 2019 at 8:14 AM Guyer, Jonathan E. Dr. (Fed) via fipy < fipy@nist.gov> wrote: > > > > On Apr 10, 2019, at 4:42 PM, Daniel DeSantis <desan...@gmail.com> wrote: > > > > 1) Set a different Cp, rho, and k in just the PCM domain when the > temperature in that domain crosses over a certain melt temperature (350K). > I tried an if statement inside the solving loop and I think that has > worked, based on some print testing I did in the loop. I just wanted to get > your opinion and see if that was the right way to go. > > Seems reasonable, as long as you're calling `.setValue()` and not > redefining Cp, rho, and k. > > In fact, I wouldn't use an `if`: > > >>> for step in range(steps): > ... T.updateOld() > ... eq.solve(dt=dt) > ... rho.setValue(rho_melt, where=PCM & (T > 350)) > > > > 2) I'd like to move this to cylindrical coordinates with the lengths > being radii. I'm not sure if the cylindrical grid is working though. And if > it isn't, is there a way to convert the diffusion equation into something > that would solve the problem in Cartesian? More specifically, how would you > write an appropriate equation for the heat transfer of a radial system in > Cartesian coordinates? In short, how would you write this: > > <image.png> > > in FiPy? > > The CylindricalGrids work fine, except for taking the gradient of the > field, which is an unusual need. > > > > > 3) Ideally, I would move this to a 2D system which is the most confusing > to me. In a 2D system, heat would be transmitted radially while air would > be flowing axially. The air would cool as it passes through the tube. The > diffusion term in the axial direction would be significantly lower than the > convection term. Can I use the same heat transfer equation you've suggested > slightly modified? I would guess the equation to be something like this: > > > > eq = TransientTerm(coeff = rho*Cp,var = T) + > PowerLawConvectionTerm(coeff=rho*Cp*v,var = T) == DiffusionTerm(coeff=k,var > = T) > > > > s.t. v = velocity of the air. > > Looks OK > > > I would also think that I would have to set the value of v to 0 at the > wall and beyond, which means v would be a CellVariable like rho and k. > > Actually, v should be a rank-1 FaceVariable. > > Anisotropic diffusion is supported in FiPy (see > https://www.ctcms.nist.gov/fipy/examples/diffusion/generated/examples.diffusion.anisotropy.html), > but are you really sure you have lower axial diffusivity? It seems to me > more likely that transport is simply dominated by axial flow. > > > I also guess this equation would be subject to any changes that would be > made in question 2, regarding writing a cylindrical equation in a cartesian > system. What do you think? > > Use a CylindricalGrid and don't change the equation at all. > > > Again, thank you so much for your help and I hope I haven't taken up too > much of your time. > > Happy to help. > > > _______________________________________________ > fipy mailing list > fipy@nist.gov > http://www.ctcms.nist.gov/fipy > [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ] > -- Daniel DeSantis
# -*- coding: utf-8 -*- """ Created on Tue Apr 2 15:14:40 2019 @author: ddesantis """ from fipy import * import numpy as np import matplotlib.pyplot as plt #%% - Mesh nx = 100 L = 0.061 #m Ly = 1 #m L1 = 0.035 # m, Length of air channel t_w = 1./1000. # m, wall thickness L2 = L1+t_w # m, interface between PCM and wall L3 = L # m, Total Length mesh = Grid1D(Lx=L,nx=nx) #mesh = CylindricalGrid1D(Lr = L,nr=nx) x = mesh.cellCenters[0] #%% - Steps # Cartesian coordinates time step dt = 0.25 #s,time step for sweeps # Cylindrical coordinates time step #dt = 0.00005 #s,time step for sweeps steps = 150 #%% Universal Constants MW = 2.02 #g H2 mol^-1 R = 8.314e-3 # kj mol^-1 K^-1 #%% - air Properties T_in = 600. # K P_in = 1. # bar v = 0.5 # m s^-2 k_air = 44.41/1000./1000. # kJ s^-1 m^-1 K^-1 (air at ~600K) Cp_air = 1.051 # kJ kg ^-1 K^-1 rho_air = 0.6 # kg m^-3, At 600K Re = 1150. # Reynolds Number, dimensionless Pr = 0.727 # Prandlt Number, dimensionless Nu = 1.86 # Nusselt Number, dimensionless #%% - Wall properties #I'm assuming the wall is steel rho_w = 8050. # kg m^-3 Cp_w = 0.5 # kJ K^-1 kg^-1 k_w = 16.3/1000. # kJ s^-1 m^-1 K^-1 T_w_initial = (T_in+293)/2 #%% PCM Properties T_init = 293. #K T_melt = 300. #K H_fus = 206. #kJ kg^-1 k_s = 0.18 #W m^-1 K^-1 k_l = 0.19 #W m^-1 K^-1 k_PCM = k_s Cp_s = 1.8 #kJ kg^-1 K^-1 Cp_l = 2.4 #kJ kg^-1 K^-1 Cp_PCM = Cp_s # I assume they want solid and liquid presented the same way again? rho_s = 789. # kg m^-3 rho_l = 750. # kg m^-3 #%% - Domain air = x<= L1 wall = (x>L1) & (x<=L2) PCM = x > L2 #%% Equation Variables T = CellVariable(name = 'Temp', mesh = mesh, hasOld = True) T.setValue(T_in, where = air) T.setValue(T_w_initial, where = wall) T.setValue(T_init, where = PCM) rho = CellVariable(name = 'rho',mesh=mesh) rho.setValue(rho_air,where = air) rho.setValue(rho_w,where = wall) rho.setValue(rho_s,where = PCM) Cp = CellVariable(name = 'Cp',mesh=mesh) Cp.setValue(Cp_air,where = air) Cp.setValue(Cp_w,where = wall) Cp.setValue(Cp_s,where = PCM) k = CellVariable(name = 'k',mesh=mesh) k.setValue(rho_air,where = air) k.setValue(rho_w,where = wall) k.setValue(rho_s,where = PCM) #%% Boundary Conditions T.constrain(T_in,mesh.facesLeft) #%% - Equations eq = TransientTerm(coeff = rho*Cp,var = T) == DiffusionTerm(coeff=k,var = T) #%% - Steps viewer = Viewer(vars=(T),datamin = 50.,datamax = 700.) viewer.plot() T_array = np.zeros((steps+1,nx)) T_array[0,:]=T.value H_array = np.zeros((steps+1,nx)) for step in range(steps): T.updateOld() eq.solve(dt=dt) rho.setValue(rho_l,where = PCM & (T>350) ) k.setValue(k_l,where = PCM & (T>350)) Cp.setValue(Cp_l,where = PCM & (T>350)) T_array[step+1,:] = T.value H_array[step+1,:] = T.value*Cp.value print(T.value) viewer.plot() percent_complete = float(step)/float(steps) #print('percent complete: {:0.0f}%'.format(100.*percent_complete)) #print('step {} of {}'.format(step, steps)) #print('elapsed fill time: {:0.2f}s'.format(step*dt))
_______________________________________________ fipy mailing list fipy@nist.gov http://www.ctcms.nist.gov/fipy [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]