On 26/04/11 16:31, Johan Hake wrote: > On Tuesday April 26 2011 08:16:29 Garth N. Wells wrote: >> On 26/04/11 16:07, Anders Logg wrote: >>> On Tue, Apr 26, 2011 at 03:59:52PM +0100, Garth N. Wells wrote: >>>> On 26/04/11 15:55, Anders Logg wrote: >>>>> On Tue, Apr 26, 2011 at 03:45:22PM +0100, Garth N. Wells wrote: >>>>>> On 26/04/11 13:51, Anders Logg wrote: >>>>>>> On Tue, Apr 26, 2011 at 02:00:50PM +0200, Anders Logg wrote: >>>>>>>> It feels good that you trust me enough to handle it. ;-) >>>>>>>> >>>>>>>> Will add it sometime this afternoon and then we can revisit the JIT >>>>>>>> compiler caching. >>>>>>> >>>>>>> I'm getting confused here... Looking at preprocess.py in UFL, I see > this: >>>>>> It is confusing. Does the function 'preprocess' do anything that the >>>>>> old FormData class didn't? It would be easier to follow if Form just >>>>>> had a member function form_data() that computes and stores data (like >>>>>> it used to), or if Form had a 'preprocess' function. Having the >>>>>> function preprocess return a new form is really confusing. >>>>> >>>>> I don't find that particularly confusing. It's the same as >>>>> >>>>> refined_mesh = refine(mesh) >>>> >>>> Which is the whole problem. By creating a new object, FormData is thrown >>>> away. The preprocessing should just compute some more data, just like we >>>> *don't* do >>>> >>>> initialised_mesh = mesh.init(0) >>>> >>>> What was wrong with Martin's original design that necessitated the >>>> change? >>> >>> As I explained, I thought it was better to have an explicit call to >>> preprocess since that makes it clear that one makes a call to a >>> function which may take some time to execute (instead of just calling >>> a member function which seems to just return some data). >>> >>> But as I say above: I added the caching back at some point (maybe even >>> the day after I removed it 2 years ago) so we don't need to discuss >>> why I removed it (as I realized myself I shouldn't have removed it and >>> added it back a long time ago). >>> >>> What has me confused now is that the caching seems to be in place but >>> we still need the extra caching in FFC/DOLFIN and I don't see why. >> >> Because preprocess returns a new form, e.g. define a form >> >> a = u*v*dx >> jit(a) >> >> Inside jit, >> >> a.form_data() is None: >> b = preprocess(a) # b now has data attached, but a doesn't >> else: >> b = a >> >> Now 'b' has been preprocessed, and has form data attached, but 'a' >> doesn't. Calling 'jit(a)' again, the code will never enter the 'else' >> part of the clause because 'a' never gets any form data. Johan has added >> some code FFC that attaches the form data of 'b' to 'a', but it is a bit >> clumsy. > > No, it was already attached. I just made ffc use it. >
Didn't you add the line form._form_data = preprocessed_form.form_data() ? Garth >> Better would be >> >> a.preprocess() >> >> or >> >> a.form_data() > > As already mentioned in a previous email, I suggest we only call form_data(). > This will return the form_data. The preprocessed form is attached to the > form_data and this is what is passed to the code generator. I am pretty sure > this is what was there from the beginning. > > It is confusing to call: > > form = preprocess(form) > > as the preprocessed form was never ment to be doing anything but being passed > to the code generator, AFAIK. > > Johan > > > >> Garth >> >>> -- >>> Anders >>> >>>> Garth >>>> >>>>>> Garth >>>>>> >>>>>>> def preprocess(form, object_names={}, common_cell=None): >>>>>>> ... >>>>>>> >>>>>>> # Check that form is not already preprocessed >>>>>>> >>>>>>> if form.form_data() is not None: >>>>>>> debug("Form is already preprocessed. Not updating form >>>>>>> data.") return form >>>>>>> >>>>>>> ... >>>>>>> >>>>>>> # Attach form data to form >>>>>>> form._form_data = form_data >>>>>>> >>>>>>> # Attach preprocessed form to form data >>>>>>> form_data._form = form >>>>>>> >>>>>>> And when I look at the blamelist (bzr annotate), it looks like I >>>>>>> added those lines, so I must have come to my senses and added it >>>>>>> back at some point (way back). So in conclusion, calling >>>>>>> preprocess() should not taking any time. >>>>>>> >>>>>>> What am I missing? >> >> _______________________________________________ >> Mailing list: https://launchpad.net/~ffc >> Post to : ffc@lists.launchpad.net >> Unsubscribe : https://launchpad.net/~ffc >> More help : https://help.launchpad.net/ListHelp _______________________________________________ Mailing list: https://launchpad.net/~ffc Post to : ffc@lists.launchpad.net Unsubscribe : https://launchpad.net/~ffc More help : https://help.launchpad.net/ListHelp