Hello,
I recently tried to accelerate mesh refinement in my PDE toolbox Femlisp by
auto-generating the refinement code. This worked quite well, but I
observed that compilation times increase dramatically with the size of the
code (increasing dimension of the cell).
Dimension Size of code (#atoms in tree) Time (secs)
2 384 0.4
3 1524 4.0
4 5736 61.3
The refinement itself is simple sequential code. I have attached the case
n=2 (unit quadrangle) below.
Is this behaviour to be expected? Adding declarations for (OPTIMIZE SPEED)
or (OPTIMIZE COMPILATION-SPEED) did not change anything.
Thanks, Nicolas.
---------------------------------------------------------------------------
(LAMBDA (CELL SUBCELL-REFINEMENTS)
(DECLARE (TYPE SIMPLE-VECTOR SUBCELL-REFINEMENTS))
(LET ((MY-REFINEMENT (MAKE-ARRAY 9)))
(SETF (AREF SUBCELL-REFINEMENTS 0) MY-REFINEMENT)
(SETF (AREF MY-REFINEMENT 0) (MAKE-VERTEX (LOCAL->GLOBAL CELL #(0.5 0.5))))
(SETF (AREF MY-REFINEMENT 1)
(LET ((BOUNDARY (MAKE-ARRAY 2)))
(SETF (AREF BOUNDARY 0)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 0))
0))
(SETF (AREF BOUNDARY 1)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 4))
0))
(MAKE-INSTANCE #1=#<STANDARD-CLASS <1-SIMPLEX> {583060A5}>
. #2=(BOUNDARY BOUNDARY))))
(SETF (AREF MY-REFINEMENT 2)
(LET ((BOUNDARY (MAKE-ARRAY 2)))
(SETF (AREF BOUNDARY 0)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 3))
0))
(SETF (AREF BOUNDARY 1)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 0))
0))
(MAKE-INSTANCE #1# . #2#)))
(SETF (AREF MY-REFINEMENT 3)
(LET ((BOUNDARY (MAKE-ARRAY 2)))
(SETF (AREF BOUNDARY 0)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 0))
0))
(SETF (AREF BOUNDARY 1)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 2))
0))
(MAKE-INSTANCE #1# . #2#)))
(SETF (AREF MY-REFINEMENT 4)
(LET ((BOUNDARY (MAKE-ARRAY 4)))
(SETF (AREF BOUNDARY 0)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 0))
1))
(SETF (AREF BOUNDARY 1)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 2))
1))
(SETF (AREF BOUNDARY 2)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 0))
3))
(SETF (AREF BOUNDARY 3)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 4))
1))
(MAKE-INSTANCE #3=#<STANDARD-CLASS <1-1-TENSORIAL> {583061E5}>
. #2#)))
(SETF (AREF MY-REFINEMENT 5)
(LET ((BOUNDARY (MAKE-ARRAY 4)))
(SETF (AREF BOUNDARY 0)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 0))
2))
(SETF (AREF BOUNDARY 1)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 2))
2))
(SETF (AREF BOUNDARY 2)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 3))
1))
(SETF (AREF BOUNDARY 3)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 0))
3))
(MAKE-INSTANCE #3# . #2#)))
(SETF (AREF MY-REFINEMENT 6)
(LET ((BOUNDARY (MAKE-ARRAY 2)))
(SETF (AREF BOUNDARY 0)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 1))
0))
(SETF (AREF BOUNDARY 1)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 0))
0))
(MAKE-INSTANCE #1# . #2#)))
(SETF (AREF MY-REFINEMENT 7)
(LET ((BOUNDARY (MAKE-ARRAY 4)))
(SETF (AREF BOUNDARY 0)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 1))
1))
(SETF (AREF BOUNDARY 1)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 0))
1))
(SETF (AREF BOUNDARY 2)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 0))
6))
(SETF (AREF BOUNDARY 3)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 4))
2))
(MAKE-INSTANCE #3# . #2#)))
(SETF (AREF MY-REFINEMENT 8)
(LET ((BOUNDARY (MAKE-ARRAY 4)))
(SETF (AREF BOUNDARY 0)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 1))
2))
(SETF (AREF BOUNDARY 1)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 0))
2))
(SETF (AREF BOUNDARY 2)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 3))
2))
(SETF (AREF BOUNDARY 3)
(AREF (THE SIMPLE-VECTOR (AREF SUBCELL-REFINEMENTS 0))
6))
(MAKE-INSTANCE #3# . #2#)))))