This will be a long reply. IMO, FLAME and the mentioned frameworks take different approaches towards implementing high performance code.
I will try to describe the differences with an analogy.
Let us imagine the process of implementing/optimizing a high performance code as a tree where the root is the unoptimized version, the intermediate nodes are different decision/optimization points, and the leaves are different codes obtained from applying those decision/optimizations on the path from the root to the leaf. In addition, let us assume that the tree describes all code paths attainable through the classical loop transformations (tiling, permuting etc).
The above-mentioned frameworks (among many others) can be viewed as performing a depth-first search through the tree to find an optimal solution. A path from root to leaf is chosen and an implementation is generated and evaluated against a predefined metric (energy, power, performance) and then the process of choosing a different path is repeated. Different frameworks use different heuristics and techniques to more effectively search the tree for an optimized implementation.
The FLAME methodology is different in that every derived FLAME algorithm is either a subtree or a segment of a path. Picking a loop invariant in the FLAME methodology means that a sequence of one or more decisions/optimizations have been picked. Therefore, if an algorithm is needed to have a high amount of parallelism in order to map it to PEs, then it is a matter of picking the appropriate loop invariant(s) that will yield algorithm with that desired performance characteristic. Different FLAME algorithms can be composed together to obtain a path (or paths) from the root to different implementations. This means that one algorithm can be used to optimize for the number of PEs, another algorithm may be layered (thereby creating a tiled algorithm) where this newer algorithm may be chosen to reduce memory traffic from different layers of the memory hierarchy.