This is an example of how to obtain transient data from within
a User Fortran junction box routine. In a junction box routine, it
is necessary to loop over all zones (domains). For a single domain
problem, there will be only one zone, but the approach shown is more
general, because it is possible to set a different timestep in each
domain. The code shown first obtains and prints out non-zone-specific
transient data, and then loops over all zones and obtains zone-specific
transient data. Standard CFX memory management system routines,
such as PSHDIR
, POPDIR
, PEEKI
and PEEKR
, are used to move
around the data-structures and obtain the required data.
To use these files, it will first be necessary to modify the file run.ccl so that the shared library path is set to the correct location on your filesystem. The User Fortran will then need to be compiled as follows:
cfx5mkext -name transinfo transinfo.F
The case may be run once as follows:
cfx5solve -def transient.def -ccl run.ccl.
A restart may be carried out from the first run in order to complete additional time-steps and demonstrate how the accumulated timesteps count and value operates:
cfx5solve -def transient_001.res -ccl run.ccl
This routine transinfo.F is supplied in
the
<CFXROOT>
/examples/UserFortran/ directory of your CFX installation.
#include "cfx5ext.h" dllexport(get_tstep_info) SUBROUTINE GET_TSTEP_INFO (CZ, DZ, IZ, LZ, RZ) IMPLICIT NONE C C Example of obtaining transient info for all zones C C ====================================================================== C Include directives C ====================================================================== C #include "MMS.h" #include "cfd_constants.h" C C ====================================================================== C Arguments C ====================================================================== C C Stacks CHARACTER*(1) CZ(*) DOUBLE PRECISION DZ(*) INTEGER IZ(*) LOGICAL LZ(*) REAL RZ(*) C C ====================================================================== C External functions C ====================================================================== C C Function to concatonate an integer on to the end of a string CHARACTER*(MXDNAM) CCATI EXTERNAL CCATI C C ====================================================================== C Local variables C ====================================================================== C C Result CHARACTER*4 CRESLT C Zone (domain) CHARACTER*(MXDNAM) CZONE C Path name CHARACTER*(MXPNAM) CDRNAM C C Number of zones & iterator INTEGER NZN, IZN C Number of timesteps, accumulated timesteps, coefficient loops INTEGER NTSTEP, ATSTEP, NCLOOP C C Time, accumulated time, timestep value REAL DT, TIME_DTEND, RTIME_DTEND C C ====================================================================== C Executable statements C ====================================================================== C C ---------------------------------------------------------------------- C Obtain and write non zone specific data C ---------------------------------------------------------------------- C C Obtain number of timesteps, accumulated timesteps & coefficient loops CALL PSHDIR ('/FLOW/SOLUTION', 'STOP', CRESLT) CALL PEEKI ('NTSTEP', IONE, NTSTEP, 'STOP', CRESLT, IZ) CALL PEEKI ('ATSTEP', IONE, ATSTEP, 'STOP', CRESLT, IZ) CALL PSHDIR (CCATI('TSTEP',ATSTEP), 'STOP', CRESLT) CALL PEEKI('NCLOOP', IONE, NCLOOP, 'STOP', CRESLT, IZ) CALL POPDIR ('STOP', CRESLT) CALL POPDIR ('STOP', CRESLT) C C Write to standard output WRITE(*,*) WRITE(*,*) ' TIMESTEP:', NTSTEP WRITE(*,*) 'ACCUMULATED TIMESTEP:', ATSTEP WRITE(*,*) ' COEFFICIENT LOOP:', NCLOOP C C ---------------------------------------------------------------------- C Obtain and write zone specific data C ---------------------------------------------------------------------- C C Determine the number of zones (domains) CALL PEEKI ('/FLOW/GEOMETRY/NZN', IONE, NZN, 'STOP', CRESLT, IZ) C C Loop over all zones DO IZN = 1,NZN CALL PEEKCA ('/FLOW/GEOMETRY/CZONE', & IZN, CZONE, 'STOP', CRESLT, CZ) C C Obtain time, accumulated time & timestep value for this zone CDRNAM = '/FLOW/SOLUTION/LATEST/' // CZONE CALL PSHDIR (CDRNAM, 'STOP', CRESLT) CALL PEEKR ('TIME_DTEND', IONE, TIME_DTEND, 'STOP', CRESLT, RZ) CALL PEEKR ('RTIME_DTEND',IONE,RTIME_DTEND, 'STOP', CRESLT, RZ) CALL PEEKR ('DT', IONE, DT, 'STOP', CRESLT, RZ) CALL POPDIR ('STOP', CRESLT) C C Write to standard output WRITE(*,*) ' ZONE:', IZN WRITE(*,*) ' TIME:', RTIME_DTEND WRITE(*,*) ' ACCUMULATED TIME:', TIME_DTEND WRITE(*,*) ' TIMESTEP VALUE:', DT END DO C END