Hi Dr. Guyer, I updated my code with your changes. It now matches the analytical solution pretty well, after several grid refinements. This is of course not a comprehensive test.
The Python script: https://github.com/cashTangoTangoCash/Convection2DFiPyExample01/blob/master/ConvectionTestProblem2D_01_20181215Version.py A report showing agreement between FiPy and analytical solution: https://github.com/cashTangoTangoCash/Convection2DFiPyExample01/blob/master/Report20181216.pdf The README.md of my repo has been updated to provide a better explanation of what is going on. I apologize for not learning git/github well enough to have github properly track changes between us as we went along. Instead, I put comments at the top of my scripts to document how I was looking at your code and documentation. Thanks On Fri, Dec 14, 2018 at 8:20 PM Guyer, Jonathan E. Dr. (Fed) via fipy < fipy@nist.gov> wrote: > Drew - > > I had found the same sign error in the denominator. You're also correct > that the units didn't agree. Multiplying by the face areas is redundant to > taking the divergence. > > I've updated our notes: > > > https://github.com/usnistgov/fipy/blob/dd3420fb71884d74850051ad2280bff525301824/documentation/USAGE.rst > > and your latest code: > > > https://github.com/guyer/Convection2DFiPyExample01/commit/ca59e8955319545f9965705c8fadfcbb5abd5951 > > With these changes, the results look much more plausible. > > - Jon > > > On Dec 12, 2018, at 1:22 PM, Drew Davidson <davidson...@gmail.com> > wrote: > > > > Hi Dr. Guyer, > > > > I looked over your more recent documentation: > > > https://github.com/usnistgov/fipy/blob/70b72b7abb267c85ada47886b8b3573e1819fffc/documentation/USAGE.rst > > > > I am embarrassed I did not understand how to choose values for a and b > in the Robin condition before. > > > > I also cloned your repo to my local computer and ran it: > > https://github.com/guyer/Convection2DFiPyExample01 > > > > When I run the code in your repo, the viewer does show a variation in T > with respect to r, but the size of that variation is extremely tiny. > Essentially, the solution is pinned at the initial temperature. The > variation also has the wrong sign (solid object is warming up), as the > ambient air is colder than the solid object (T_infinity < T_initial), and > the solid object should be cooling down. Maybe this is due to confusion I > sowed by having var be T minus T_infinity; sorry. > > > > I tried another script in my repo: > > > > > https://github.com/cashTangoTangoCash/Convection2DFiPyExample01/blob/master/ConvectionTestProblem2D_01_20181211Version.py > > > > This script is upgraded in that now, the log file contains information > about the solution (max and min temperatures). I obtain max and min > temperatures using var.value.min() and var.value.max() in order to rule out > goof-ups in my get_solution_along_ray function. > > > > The solution variable var is now exactly the temperature, in order to > get rid of the previous source of confusion in which var was T minus > T_infinity. > > > > The solution in my script is still pinned at the initial temperature. > This persists even if I crank up the convection coefficient to a huge value > (keep multiplying it by 1000 over and over and still seeing solution pinned > at initial condition). > > > > I made handwritten notes on top of a pdf I made via Kile Editor of your > more recent documentation: > > > > > https://github.com/cashTangoTangoCash/Convection2DFiPyExample01/blob/master/RobinBoundaryConditionsFiPyUsage20181211_Annot_CTTC.pdf > > > > It seems to me that the units of the source terms should match the units > of the terms in the partial differential equation for heat conduction. I > thought that is how it worked from the FiPy examples, but I haven’t gone > back and made sure. I find that for the first source term RobinCoeff*g, the > units don’t seem to match the units of the terms in the PDE for heat > conduction (I didn’t check the 2nd source term since it should be the same > situation). I did this in kind of a hurry so maybe I am goofing up. I have > not studied the finite volume method, and am just going on a hunch. > > > > It also seemed to me that there might be a minus sign missing in the > RobinCoeff. The solution I get is still pinned at initial condition > regardless of a minus sign or no minus sign there. > > > > Thanks > > > > On Fri, Dec 7, 2018 at 6:05 PM Guyer, Jonathan E. Dr. (Fed) via fipy < > fipy@nist.gov> wrote: > > Drew - > > > > > > Thanks to your notes, I found a couple of errors in our Robin > discussion. As you noted, the units don't work for the conversion of the > divergence of gamma grad phi to the sum over faces (midway on page 1 of > your notes). The left hand side should be integrated over volume. That line > is expressing the discretization of the divergence theorem. > > > > I also discovered that the .divergence operator in FiPy doesn't work > reliably on scalars. There's no real reason it should, but I thought I had > convinced myself that it did. As a result, everything in the Robin terms > needs to be multiplied by the surface normal > > > > Those changes to the FiPy documentation are [here]( > https://github.com/usnistgov/fipy/pull/615) for now. > > > > Beyond addition that, there are some changes necessary to put your > boundary condition into Robin form. The point of the Robin condition is > that it ties the gradient of the field to the value of the field. > > So, g isn't h(T - T_inf) / (-k); it's just -h T_inf / (-k). > > Likewise, \vec{a} isn't zero. Rather, \hat{n}\cdot\vec{a} = h/(-k). > > > > Here are the changes I made to your script to reflect these changes: > > > https://github.com/cashTangoTangoCash/Convection2DFiPyExample01/compare/master...guyer:master > > > > I think I got your normalized temperature accounted for properly, and > put the thermal diffusivity and convection coefficient in the proper > places, but it's worth checking through. > > > > With these changes, the temperature field is now rotationally symmetric > (it wasn't before, which is why I had to multiply by the normal before > taking the divergence). > > > > Heat seems to be fluxing in from the outside, so I probably have the > sign wrong. > > > > I don't have Octave, so I have no idea how this compares with your > analytical solution. > > > > - Jon > > > > > On Dec 4, 2018, at 2:34 PM, Drew Davidson <davidson...@gmail.com> > wrote: > > > > > > Hi Dr. Guyer, > > > > > > First I tried getting rid of the square brackets in > ConvectionTestProblem2D_01.py (commit ‘changed square brackets to > parenthesis in convection BC, but get same…’), but results are the same > (still wrong). > > > > > > Next: > > > As you directed, I took a look at: > > > > https://github.com/usnistgov/fipy/blob/develop/documentation/USAGE.rst#applying-robin-boundary-conditions > > > > > > Firefox was showing me raw latex rather than human-readable equations > at that web address, so I made a version I could read using the kile editor: > > > > https://github.com/cashTangoTangoCash/Convection2DFiPyExample01/blob/master/RobinBoundaryConditionsFiPyUsage.pdf > > > > > > That material is rather challenging for me. I took a stab at it, > resulting in: > > > commit: ‘made a first attempt at a formulation in view of suggestions > by fipy …’ > > > > > > ConvectionTestProblem2D_01_2ndTry.py > > > > https://github.com/cashTangoTangoCash/Convection2DFiPyExample01/blob/fb47960548650c994eb0c6f990e0db297566e174/ConvectionTestProblem2D_01_2ndTry.py > > > > > > a few handwritten notes indicating what I was thinking: > > > > https://github.com/cashTangoTangoCash/Convection2DFiPyExample01/blob/master/RobinBoundaryConditionsFiPyUsageConvectionBC.pdf > > > > > > Here is a bit of the code: > > > > > > #ref: > https://github.com/usnistgov/fipy/blob/develop/documentation/USAGE.rst#applying-robin-boundary-conditions > > > > > > #warning: avoid confusion between convectionCoeff in that fipy > documentation, which refers to terms involving "a", and convectionCoeff > here, which refers to a heat transfer convection coefficient at a boundary > > > > > > Gamma0=D_thermal > > > > > > Gamma = FaceVariable(mesh=mesh, value=Gamma0) > > > > > > mask=surfaceFaces > > > > > > Gamma.setValue(0., where=mask) > > > > > > dPf = FaceVariable(mesh=mesh, value=mesh._faceToCellDistanceRatio * > mesh.cellDistanceVectors) > > > > > > Af = FaceVariable(mesh=mesh, value=mesh._faceAreas) > > > > > > #RobinCoeff = (mask * Gamma0 * Af / (dPf.dot(a) + b)).divergence #a is > zero in our case > > > > > > b=1. > > > > > > RobinCoeff = (mask * Gamma0 * Af / b).divergence #a is zero in our case > > > > > > #eq = (TransientTerm() == DiffusionTerm(coeff=Gamma) + RobinCoeff * g > - ImplicitSourceTerm(coeff=RobinCoeff * mesh.faceNormals.dot(a))) #a is > zero in our case > > > > > > # g in this formulation is -convectionCoeff/k*var, where > var=T-T_infinity > > > > > > eq = (TransientTerm() == DiffusionTerm(coeff=Gamma) + > ImplicitSourceTerm(RobinCoeff * -convectionCoeff/k)) > > > > > > > > > Now the solution variable remains stuck at the initial condition, as > if the boundary condition is not being applied. I am sort of out of my > depth at this point. I was guessing that an ImplicitSourceTerm was the > right thing to do, since 'g' in the Robin condition depends on the solution > variable. I did mess around a little in IPython seeing if any terms are > coming out all zeros. > > > > > > Again, I put everything at > https://github.com/cashTangoTangoCash/Convection2DFiPyExample01. > > > > > > Thanks > > > > > > On Mon, Dec 3, 2018 at 4:21 PM Guyer, Jonathan E. Dr. (Fed) via fipy < > fipy@nist.gov> wrote: > > > Drew - > > > > > > Apologies for the delayed reply. > > > > > > There are a couple of issues here: > > > > > > `-convectionCoeff/k*(var.faceValue-T_infinity)` describes a FiPy > FaceVariable. > > > > > > `[-convectionCoeff/k*(var.faceValue-T_infinity)]` is a single element > Python list that contains a FiPy FaceVariable. > > > > > > Multiplying that list by other elements has rather unpredictable > results. > > > > > > In short, get rid of the square brackets. We do our best to treat > Python lists like FiPy vector fields, but there's only so much we can do. A > list that holds a numpy array is not a vector field. > > > > > > > > > Beyond that, what you've described looks like a Robin boundary > condition to me. Our best recommendation for Robin conditions is covered at: > > > > > > > https://github.com/usnistgov/fipy/blob/develop/documentation/USAGE.rst#applying-robin-boundary-conditions > > > > > > Please don't hesitate to ask for more clarification if this doesn't > get you where you need. > > > > > > - Jon > > > > > > > > > > > > > On Nov 16, 2018, at 11:55 PM, Drew Davidson <davidson...@gmail.com> > wrote: > > > > > > > > Hello, > > > > > > > > I am stuck in how to correctly apply a simple convection boundary > condition in FiPy, in the context of simple transient heat conduction in 2D. > > > > > > > > Is this correct: > > > > > var.faceGrad.constrain([-convectionCoeff/k*(var.faceValue-T_infinity)]*mesh.faceNormals,where=surfaceFaces) > > > > > > > > I have a 2D mesh generated in gmsh. The convection boundary > condition is applied to a curved boundary. > > > > > > > > The code and results are found at: > > > > > https://github.com/cashTangoTangoCash/Convection2DFiPyExample01/tree/master > > > > > > > > The project appears to have a heap of files, but It’s a really just > a simple 2D problem with a comparison to an analytical solution. The basic > script is ConvectionTestProblem2D_01.py. Report20181116.pdf shows current > results, which are clearly wrong. > > > > > > > > Am I correctly applying the convection boundary condition in terms > of the FiPy syntax/language for this 2D problem with a gmsh mesh and a > curved boundary? > > > > > > > > Thanks > > > > _______________________________________________ > > > > 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 ] > > > > > > _______________________________________________ > > 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 ] >
_______________________________________________ fipy mailing list fipy@nist.gov http://www.ctcms.nist.gov/fipy [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]