Absolutely.  I am setting it up so that if there is no map_type attribute 
in the .xml file, then it assumes P1.  Everything else will be backwards 
compatible as well.  For instance, if you have a higher order mesh .xml 
file on hand, but are using a variational form that was compiled without 
implementing the curved elements, it will still run.  It will just ignore 
the extra vertex information of the mesh cells.  Eventually, there will be 
a check for compatibility between the mesh and the form that was compiled. 
If they don't match, then a warning will be printed to the screen and 
affine mapping will be assumed throughout.

- Shawn

On Wed, 20 Aug 2008, Kent-Andre Mardal wrote:

>
> Looks good to me. I guess you should implement it such that meshes
> without the map_type are P1 such that this is backwards compatible.
>
> Kent
>
> On ti., 2008-08-19 at 14:21 -0400, Shawn Walker wrote:
>> Ok, here is what I suggest.  If anyone sees anything wrong with this
>> format, please say something!
>>
>> =============== THE OLD WAY =============================
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>>
>> <dolfin xmlns:dolfin="http://www.fenics.org/dolfin/";>
>>    <mesh celltype="triangle" dim="2">
>>      <vertices size="4">
>>        <vertex index="0" x="0.0" y="0.0"/>
>>        <vertex index="1" x="1.0" y="0.0"/>
>>        <vertex index="2" x="0.0" y="1.0"/>
>>        <vertex index="3" x="-1.0" y="0.0"/>
>>      </vertices>
>>      <cells size="2">
>>        <triangle index="0" v0="0" v1="1" v2="2"/>
>>        <triangle index="1" v0="3" v1="0" v2="2"/>
>>      </cells>
>>    </mesh>
>> </dolfin>
>>
>> =============== THE NEW WAY =============================
>>
>> # for an affinely mapped mesh; note the new variable `map_type'.
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>>
>> <dolfin xmlns:dolfin="http://www.fenics.org/dolfin/";>
>>    <mesh celltype="triangle" dim="2" map_type="P1">
>>      <vertices size="4">
>>        <vertex index="0" x="0.0" y="0.0"/>
>>        <vertex index="1" x="1.0" y="0.0"/>
>>        <vertex index="2" x="0.0" y="1.0"/>
>>        <vertex index="3" x="-1.0" y="0.0"/>
>>      </vertices>
>>      <cells size="2">
>>        <triangle index="0" v0="0" v1="1" v2="2"/>
>>        <triangle index="1" v0="3" v1="0" v2="2"/>
>>      </cells>
>>    </mesh>
>> </dolfin>
>>
>> # for a piecewise quadratic mesh; here map_type="P2".
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>>
>> <dolfin xmlns:dolfin="http://www.fenics.org/dolfin/";>
>>    <mesh celltype="triangle" dim="2" map_type="P2">
>>      <vertices size="9">
>>        <vertex index="0" x="0.0"  y="0.0"/>
>>        <vertex index="1" x="1.0"  y="0.0"/>
>>        <vertex index="2" x="0.0"  y="1.0"/>
>>        <vertex index="3" x="-1.0" y="0.0"/>
>>
>>        <vertex index="4" x="0.5"  y="0.05"/>
>>        <vertex index="5" x="0.6"  y="0.6"/>
>>        <vertex index="6" x="0.0"  y="0.5"/>
>>        <vertex index="7" x="-0.5" y="0.5"/>
>>        <vertex index="8" x="-0.5" y="0.0"/>
>>      </vertices>
>>
>>      <cells size="2">
>>        <triangle index="0" affine="false" v0="0" v1="1" v2="2" v3="4"
>> v4="5" v5="6"/>
>>        <triangle index="1" affine="true"  v0="3" v1="0" v2="2" v3="8"
>> v4="6" v5="7"/>
>>      </cells>
>>    </mesh>
>> </dolfin>
>>
>> # note the variable `affine' that indicates whether the triangle is
>> actually higher order or not.
>>
>> ===============================================
>>
>> - Shawn
>>
>> On Tue, 19 Aug 2008, Anders Logg wrote:
>>
>>> On Tue, Aug 19, 2008 at 11:20:03AM -0400, Shawn Walker wrote:
>>>> I think in dolfin's mesh.xml format, I will need to put the extra
>>>> 'curved' vertices into a separate list of data.  If I put all of the (say
>>>> 2nd order polynomial mesh) vertices into the usual list of vertices, then
>>>> dolfin will think the matrix size is larger than it really is.  At least,
>>>> that is what the output looks like.  Does this seem correct.
>>>
>>> One could either break the file format and introduce a <geometry> tag
>>> that holds the geometry, or one could add a list of edge midpoints in
>>> the data section. It could just be some <array> objects named "edge
>>> midpoints x", "edge midpoints y" etc.
>>>
>>>> Also, I looked at this UFCCell.h file in Dolfin, and it looks like
>>>> quadrilaterals and hexahedrons are not implemented.  Is this true?
>>>
>>> It's not supported anywhere except for in the UFC manual. :-)
>>>
>>> --
>>> Anders
>>>
>>>
>>>> - Shawn
>>>>
>>>> On Mon, 18 Aug 2008, Kent-Andre Mardal wrote:
>>>>
>>>>> On ma., 2008-08-18 at 09:01 -0400, Shawn Walker wrote:
>>>>>> Sure, but I do want to have the option of some elements being curved and
>>>>>> others not.  This is actually practical since only the elements near the
>>>>>> boundary really need to be curved.
>>>>>
>>>>> Sure, I agree totally on this. But this requires more. Neither UFC, the
>>>>> form compilers (FFC or SFC) nor the FEM basis function generators,  FIAT
>>>>> and SyFi, support different polynomial degree at different places.
>>>>>
>>>>> Of course, in your case I guess it is only the geometrical mapping that
>>>>> changes degree throughout the mesh and this may simplify alot eg. the
>>>>> finite element basis functions will be the same throughout the mesh. The
>>>>> dofs can also be reused.
>>>>>
>>>>> I only suggest starting with the implementation of a higher-order mesh
>>>>> because it seems as a feasible first step.
>>>>>
>>>>> Kent
>>>>>
>>>>>
>>>>>>
>>>>>> Also, it is possible to evaluate some forms exactly, even if the local 
>>>>>> map
>>>>>> is a polynomial.  Of course, this can be ignored for now...
>>>>>>
>>>>>> - Shawn
>>>>>>
>>>>>> On Mon, 18 Aug 2008, Kent-Andre Mardal wrote:
>>>>>>
>>>>>>> On s., 2008-08-17 at 00:08 -0400, Shawn Walker wrote:
>>>>>>>> I think you are right.  I would propose the following:
>>>>>>>>
>>>>>>>> 1. Add a meshfunction to the mesh.xml file.  The name of it will
>>>>>>>> correspond to a new enum variable in ufc::cell.  For example, say we 
>>>>>>>> have
>>>>>>>> piecewise quadratics for the local map, so we call it "P2_map".  Maybe
>>>>>>>> later this could be made a more permanent xml data type, but for now 
>>>>>>>> this
>>>>>>>> should be ok.  The mesh function would just be a vector lagrange 2nd
>>>>>>>> order function.  And there would also be a boolean function on each 
>>>>>>>> cell
>>>>>>>> to say whether the element is straight or not.  This of course rules 
>>>>>>>> out
>>>>>>>> mixing curved types, i.e. having P3 and P2 in the same mesh.  But I am 
>>>>>>>> ok
>>>>>>>> with that for now.
>>>>>>>>
>>>>>>>> 2. In ufc::cell, we have another enum variable called "map_type":
>>>>>>>>
>>>>>>>> enum map_type {P1_map, P2_map, P3_map, etc...}
>>>>>>>>
>>>>>>>> Of course, this will only be for lagrange type polynomial maps.  But 
>>>>>>>> this
>>>>>>>> enum variable can have other types (i.e. iso-geometric).  We then 
>>>>>>>> create a
>>>>>>>> variable "map_type cell_map_type;"
>>>>>>>
>>>>>>> Yes, we probably would need one extra variable for the map.
>>>>>>>
>>>>>>> The way I see it, if one assume that all elements in the mesh has the
>>>>>>> same order, the main work would be to create a dolfin mesh containing
>>>>>>> a higher order geometry. Once this is done, you would need to ensure
>>>>>>> that the coordinates in ufc::cell follows the UFC convention locally.
>>>>>>> Finally, the computation of the Jacobian, the inverse of the Jacobian
>>>>>>> and the determinant of the Jacobian has to be moved inside the
>>>>>>> quadrature loop. This is the only modification to the form compiler, I
>>>>>>> believe. The finite elements, its derivatives, dofs etc
>>>>>>> stay the same.
>>>>>>>
>>>>>>> Hence, once a higher order mesh is up an running, there should only
>>>>>>> be minimal modifications to the form compilers and UFC.
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>> 3. When the mesh is read in, and the element is created, I think the
>>>>>>>> "coordinates" variable can store the vertex positions of the element,
>>>>>>>> including the extra ones for the curved sides.  If not, then some other
>>>>>>>> variable would need to be created to store it; actually, that may be
>>>>>>>> better.  Also, the "cell_map_type" will be set to either P1_map, or
>>>>>>>> P2_map, or etc...
>>>>>>>>
>>>>>>>> 4. The tabulate_tensor routine will have a switch to pick the correct
>>>>>>>> routine for computing the tensor coefs.  This will require modifying 
>>>>>>>> FFC
>>>>>>>> which I don't know yet.
>>>>>>>>
>>>>>>>> 5. Another thing that should change will be the basis function
>>>>>>>> evaluations.  This may be a pain.  Computing the inverse map to get the
>>>>>>>> location of the coordinates in the reference element may be 
>>>>>>>> inconvenient.
>>>>>>>> This can be ignored for now; this isn't really critical for what I 
>>>>>>>> would
>>>>>>>> like to do.
>>>>>>>>
>>>>>>>> I am a little confused on where the ufc::cell data gets set by the 
>>>>>>>> data in
>>>>>>>> the mesh.xml file.  I'm still very new to this code.  Any help would be
>>>>>>>> appreciated.  If I am totally off on this, please say so!
>>>>>>>>
>>>>>>>
>>>>>>> Have a look in UFCCell.
>>>>>>>
>>>>>>> Kent
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>
>>>>>
>>>>>
>>>
>>>
>> _______________________________________________ DOLFIN-dev mailing list 
>> [email protected] http://www.fenics.org/mailman/listinfo/dolfin-dev
>
>
_______________________________________________
DOLFIN-dev mailing list
[email protected]
http://www.fenics.org/mailman/listinfo/dolfin-dev

Reply via email to