Hello khobani,
GETVRM routine is used in Abaqus/Standard with USDFLD subroutine.
VGETVRM routine is used in Abaqus/Explicit with VUSDFLF subroutine.
Both routines are used to get results data from element's integration points,
unfortunately they work in different way, data read by these routines are stored in different way.
1. Abaqus/Standard
Abaqus calls GETVRM routine separately for each integration point (or section point).
With "noel", "npt", "kspt" dummy arguments you can control for which element/integration point/section point Abaqus read material data.
The routine saves all data after one call into "array" table. The components for a request are written as follows:
Single index components (and requests without components) are returned in positions 1, 2, 3, etc.
Double index components are returned in the order 11, 22, 33, 12, 13, 23 for symmetric tensors,
followed by 21, 31, 32 for unsymmetric tensors (deformation gradient).
For instance with 3d stress symmetric tensor we get:
array(1) - S11, array(2) - S22, array(3) - S33
array(4) - S12, array(5) - S13, array(6) - S23
What about rest of the "array" table?
We have 15 elements there (for default declaration). If not used other elements are set to zero.
These "array" positions can be use for different outputs, for instance if we will use GETVRM routine with "PE" output keyword in position 1-6
we get plastic strain tensor and array(7) will be use to save equivalent plastic strain (PEEQ).
As you can see order of results in "array" table depend on results data (stress, strains, ...) and elements types (3d or 2d).
Please remember whole "array" table will be lost between subroutine calls.
Abaqus will get data for one integration point and during next GETVRM call all previous data stored in "array" will be lost.
You can save these data between calls if necessary. With state variables.
2. Abaqus/Explicit
VGETVRM routine works in different way. All results data from integration points are save into "rData" table.
Abaqus/Explicit call VGETVRM routine for whole block of elements (not for one element like Abaqus/Standard) and save all requested data in one "rData" table.
Abaqus save one component for whole block and after it next component for the same elements block.
Data in "rData" table are saved in following way:
rData(1) - S11 for element 1, rData(4) - S22 for element 1, rData(7) - S33 for element 1
rData(2) - S11 for element 2, rData(5) - S22 for element 2, rData(8) - S33 for element 2
rData(3) - S11 for element 3, rData(6) - S22 for element 3, rData(9) - S33 for element 3
...
rData(10) - S12 for element 1, rData(13) - S13 for element 1, rData(16) - S23 for element 1
rData(11) - S12 for element 2, rData(14) - S13 for element 2, rData(17) - S23 for element 2
rData(12) - S12 for element 3, rData(15) - S13 for element 3, rData(18) - S23 for element 3
So, is it correct to say if there are 100 elements and there are 6 stress components, the dimension of this array will be (600,1)?
It is not true for Abaqus/Standard since we have "one" array for each integration point.
I am not sure for Abaqus/Explicit. With default declaration "rData" size is (maxblk*nrData) where maxblk=544 (it comes from vaba_param.inc file) so in this case your idea sounds resonable.
But the table is one dimension not two as in your post.
I will try get more information about this.
If you already checkd this please let me know.
Thanks and Regards,
Bartosz