The following is an example of how to retrieve the nodes of an element and obtain the nodal values, using a user subroutine EXEDIT. The example calculates and stores the average z-coordinate of an element as the average z-location of its nodes.
The local variable arrays RVL and IVL are used for the storage of element variables as well as nodal variables. This routine highlights that a call to get_node_var in the internal loop over the eight nodes of the element overwrites/replaces the element values in the RVL array by nodal values. In order to store the time and average element z-location a new call to get_element_var is required first to retrieve the element variables in the RVL array again before a call to put_elem_var can store the new values in permanent element storage.
SUBROUTINE EXEDIT3 USE kindef USE wrapup USE mdpart USE mdvar_all USE cycvar USE mdgrid3 USE mdsolv USE cycvar USE mdstring IMPLICIT NONE ! ************************************************************************ ! THIS IS A USER SUPPLIED SUBROUTINE WHICH CAN BE USED TO PROVIDE ! SPECIAL CUSTOM EDITING. THE FREQUENCY AT WHICH THIS SUBROUTINE ! IS CALLED IS DEFINED THROUGH INPUT (GLOBAL-EDIT-USER). WHEN ! REQUESTED, IT IS CALLED BY THE EDIT PROCESSOR AT THE END OF A ! COMPUTATIONAL CYCLE. THE ROUTINE IS CALLED BEFORE ANY OTHER ! TYPES OF STANDARD EDITS ARE CALLED FOR THAT CYCLE (EG. PRINT, ! SAVE, HISTORY, DISPLAY, ETC), SO IT MAY ALSO BE USED TO SET UP ! DATA TO BE PROCESSED BY OTHER EDIT TYPES. ! ************************************************************************ INTEGER (INT4) :: NP, NE, NENUM, INTPOI, ELTYPE, I INTEGER (INT4), DIMENSION(8) :: NODENM REAL (REAL8), DIMENSION(8) :: NODE_Z_VALUE REAL (REAL8) :: ELEMENT_Z_VALUE DO NP = 1, NUM_PARTS DO NE = 1, PARTS(NP)%P%NUMELM NENUM = PARTS(NP)%P%ELEMENT_LIST(NE) INTPOI = 0 CALL GET_ELEM_VAR(NENUM,INTPOI) ELTYPE = DATA_STR(NSTRING)%P%OPT(EL_SOPT_ELEMTYPE) if(ELTYPE == ELTYPE_HEX8) then NODENM(1) = IVL(IVI_CON1) NODENM(2) = IVL(IVI_CON2) NODENM(3) = IVL(IVI_CON3) NODENM(4) = IVL(IVI_CON4) NODENM(5) = IVL(IVI_CON5) NODENM(6) = IVL(IVI_CON6) NODENM(7) = IVL(IVI_CON7) NODENM(8) = IVL(IVI_CON8) DO I=1,8 CALL GET_NODE_VAR(NODENM(I),0) NODE_Z_VALUE(I) = RVL(IVR_Z) END DO ELEMENT_Z_VALUE = SUM(NODE_Z_VALUE)/8.0 CALL GET_ELEM_VAR(NENUM,INTPOI) RVL(IVR_VAR01) = TIME RVL(IVR_VAR02) = ELEMENT_Z_VALUE end if CALL PUT_ELEM_VAR(NENUM,INTPOI) END DO END DO RETURN END SUBROUTINE EXEDIT3