A few more comments on material models (I'm trying to reduce the amount of fragmentation I see in the different components):
TrPlaneStrRot is an elements which introduced _PlaneStressRot. This introduces a penalty term associated with the drilling stiffness, which is set to the shear modulus in the linear elastic models.
I don't think this is a great idea. This penalty term isn't really part of the material model.
I would rather it be a simple membrane with a completely separate term is added by the stiffness matrix.
I use this approach with the Quad1MindlinShell3d element that I implemented. It would allow the membrane to be some nonlinear material as well, instead of being limited to linear elastic models. It would also allow for layered support and such.
Edit: I was thinking a bit more about this, and I suppose it would make sense (at least very practical) to add the penalty term for the drilling dofs as a parameter to the cross-section, and treat this similarly as we do with plates and beams.
StructuralMaterial should only be normal continuum models.
Things like cohesive zone models should use a separate base class for material models, instead of trying to force it through the same interface "giveRealStressVector". There is no advantage to using a common interface, and it forces StructuralMaterialStatus to keep try and deal with odd things like _1dInterface, even though it has nothing to do with stresses and strains.
I'm not sure what the lattice models are, but I think the same applies there. The GradDp models are however usually some extension of a normal continuum model (at least that's what the code looks like), so I guess these should as some extension.
The cross-sections should all overload "giveIPValue" and do everything related to beam and shell moments/forces.
The pipeline is already there, CrossSection::giveIPValue, but it is not properly overloaded by the existing cross-sections. I'm undecided on what i think about expanding the moments/forces to "full" form for beams and plates. It would probably be a good idea that would make post-processing easier.
MaterialStatus::printOutputAt has problems. It expands the stresses and strains (which might sometimes be generalized stresses and strains) and pads them out with zeroes.
I would rather we didn't expand at all if we are going to pad them out with values which we know are definitely false. So simply not expanding them is a possible option. It would give smaller files, and you would have, at least the most important part of the output still there so that one can check correctness in the tests suite.
The other option, to properly expand the output, would need to go through the same pipeline as giveIPValue, e.g. it should go
Element->CrossSection->Material
through some function like
"printOutputFromPointAt(FILE *file, GaussPoint *gp, TimeStep *tStep);"
where the material model should use giveIPValue to obtain the full form of the stress, strain and other internal variables for exporting.
This would be quite a lot of work to implement.