Dear Jinhyun,
Basically, our intention behind the generic property storage type was that we do not want to require our users to derive new particle classes from the base class for every possible combination of particle properties. As we have a large selection of possible properties (you mentioned some), but only a subset of properties is actually used in each computation it would be wasteful to carry around particles with all properties, and it would be cumbersome to write new classes for every different application. May I ask, which part of the current approach worries you? The performance overhead from copying the properties once per time step should be small compared to actually solving equations, and as Wolfgang mentioned you can hide the conversion process by having functions like:
Tensor<1,dim>
get_strain_tensor(const Particle<dim> &particle)
{
... do the conversion here
}
The main complication when creating child classes for particles would probably be the different memory layout. As particles get transferred a lot in parallel computation (when they move across domains, during adaptive mesh refinement steps, during checkpoints) the ParticleHandler class needs to know about their size, and how to serialize them, so if you plan to go ahead with a derived particle class this will be the most complicated step. This is where the generic particle property shines, because we can simply assume we need to store n_properties numbers, instead of figuring out the memory requirement for every particle property.
I hope that explains our reasoning behind the design. Let us know if you have ideas for how to extend the architecture, or if you have an application that absolutely requires an extension of the design.
Best,
Rene