2.9. Defining Your Own Commands

To define a custom command:

  1. Insert the code for the functions you want to perform into subroutine user01 (or user02, etc.).

  2. Link the subroutine into the program.

  3. Issue the command /UCMD to define a name for a custom command that calls and executes your subroutine. Use the command format shown below:

/UCMD,Cmd,SRNUM
Cmd

The name for your new command. It can contain any number of characters, but only the first four are significant. The name you specify can not conflict with the name of any command or the names of any other commands or macros.

SRNUM

The number of the subroutine your command should call; that is, a value between 01 and 10. For example, suppose that you create and link in a user subroutine for a parabolic distribution of pressure, and you name that subroutine user01. Issuing the command shown below creates a new command, PARB, that when issued calls your parabolic pressure distribution subroutine:

/UCMD,PARB,1

To make these "custom command" subroutines available in all your sessions, include the /UCMD commands in your start-up file (START.ANS).

You also can use /UCMD to remove a custom command. To do so, simply use a blank value for Cmd, as shown below:

/UCMD,,1

This command removes the PARB command. To list all user-defined command names, issue the command /UCMD,STAT.

2.9.1. Function user01 (Defining Custom Commands)

*deck,user01                      USERDISTRIB
      function  user01()
c *** primary function:    user routine number  01

c         *** Copyright ANSYS.  All Rights Reserved.
c         *** ansys, inc.
c *** Notice - This file contains ANSYS Confidential information ***

c  /*******************************************************************\
c  | this is a user routine that may be used by users to include their |
c  | special coding.  accesss to this routine is by the command usr1.  |
c  | usr1 may be changed by the user using the command /ucmd.  the     |
c  | user may then use this routine to call his/her special routines.  |
c  | ansys routines to access information in the ansys database may be |
c  | found in the "ansys programmer's manual", available from ansys,inc|
c  | see user02 for a simple example usage.                            |
C  | routines user03 to user10 are also available.                     |
C  \*******************************************************************/

c  input arguments:  none

c  output arguments:
c     user01   (int,sc,out)      - result code (should be zero)
c                                   (which is ignored for now)

c    **************************************************************
c    Functions for accessing data on the command line
c    integer function  intinfun(iField) - gets an integer from field iField
c    double precision function dpinfun(iField) - gets double precision
c    character*4 ch4infun(iField) - gets (upper case) 4 characters
c    character*8 ch8infun(iField) - gets (mixed case) 8 characters
c    character*32  ch32infun(iField) - gets (mixed case) 32 characters
c    **************************************************************
c
#include "impcom.inc"
#include "ansysdef.inc"

      external  wrinqr
      integer   wrinqr

      integer  user01, iott

      iott = wrinqr(2)

c          *****  USER'S CODE IS INSERTED HERE *****
      write (iott,2000)
 2000 format (//' *****  CALL TO ANSYS,INC DUMMY USER01  *****'//)

c          *****  do not return this result code in a real user routine
      user01 = -654321
c         *****  instead return a zero   *****
c     user01 = 0

      return
      end

2.9.2. Function user02 (Demonstrates Offsetting Selected Nodes)

*deck,user02                      USERDISTRIB
      function  user02()
c *** primary function:    user routine number  02
c      --- This demonstration offsets selected nodes with the command:
c              usr2,dx,dy,dz

c         *** Copyright ANSYS.  All Rights Reserved.
c         *** ansys, inc.
c *** Notice - This file contains ANSYS Confidential information ***

c  /*******************************************************************\
c  | see user01 for additional information on user routines            |
c  \*******************************************************************/

c  input arguments:  none

c  output arguments:
c     user02   (int,sc,out)      - result code (should be zero)
c                                   (which is ignored for now)

c    **************************************************************
c    Functions for accessing data on the command line
c    integer function  intinfun(iField) - gets an integer from field iField
c    double precision function dpinfun(iField) - gets double precision
c    character*4 ch4infun(iField) - gets (upper case) 4 characters
c    character*8 ch8infun(iField) - gets (mixed case) 8 characters
c    character*32  ch32infun(iField) - gets (mixed case) 32 characters
c    **************************************************************
c
#include "impcom.inc"
#include "ansysdef.inc"

      external  wrinqr,ndnext,ndgxyz,ndpxyz,erhandler, dpinfun
      integer   wrinqr,ndnext,ndgxyz
      double precision  dpinfun

      integer  user02, iott, i ,ksel
      double precision  xyz(3), offset(3)


c          *****  get the desired offsets from the command line  *****
      offset(1) = dpinfun(2)
      offset(2) = dpinfun(3)
      offset(3) = dpinfun(4)

      i = 0
  10  i = ndnext(i)
      if (i .gt. 0) then
          ksel = ndgxyz (i,xyz(1))
          if (ksel .eq. 1) then
             xyz(1) = xyz(1) + offset(1)
             xyz(2) = xyz(2) + offset(2)
             xyz(3) = xyz(3) + offset(3)
             call ndpxyz (i,xyz(1))
          endif
      goto 10
      endif

c          *****  write to output file  *****
      iott = wrinqr(WR_OUTPUT)
      write (iott,2000)
 2000 format (/'  NODE OFFSET COMPLETE  '/)

c         *****  write to GUI window  *****
      call erhandler ('user02',3000,
     x             2,'NODE OFFSET COMPLETE',0.0d0,' ')

c          *****  required return value  *****
      user02 = 0

      return
      end


2.9.3. Function user03 (Demonstrates Using Memory)

*deck,user03                      USERDISTRIB
      function  user03()
c *** primary function:    user routine number 03. Gives example of 
c                          ANSYS Memory usage

c         *** Copyright ANSYS.  All Rights Reserved.
c         *** ansys, inc.
c *** Notice - This file contains ANSYS Confidential information ***

c  /*******************************************************************\
c  | see user01 for additional information on user routines            |
c  \*******************************************************************/

c  input arguments:  none

c  output arguments:
c     user03   (int,sc,out)      - result code (should be zero)
c                                   (which is ignored for now)

c    **************************************************************
c    Functions for accessing data on the command line
c    integer function  intinfun(iField) - gets an integer from field iField
c    double precision function dpinfun(iField) - gets double precision
c    character*4 ch4infun(iField) - gets (upper case) 4 characters
c    character*8 ch8infun(iField) - gets (mixed case) 8 characters
c    character*32  ch32infun(iField) - gets (mixed case) 32 characters
c    **************************************************************

#include "impcom.inc"
#include "ansysdef.inc"

      external  wrinqr, ndinqr, ndgxyz, ndnext, fAnsMemAlloc,
     x          fAnsMemFree,erhandler, parreturn, parstatus
      integer   wrinqr, ndinqr, ndgxyz, ndnext
      PTRFTN    fAnsMemAlloc

      integer   user03, iott, i, ksel, numnp, node, istat
      double precision  xyz(3), xmean, ymean, zmean, stdxyz(3),
     x          sodx, sody, sodz

c  pointers:
      pointer (pdXnodeL,Xnode)
      pointer (pdYnodeL,Ynode)
      pointer (pdZnodeL,Znode)
      double precision  Xnode(*), Ynode(*), Znode(*)


c     *** Get nodal xyz locations and calculate standard deviation of
c     *** x coordinates, y coordinates, & z coordinates


c     *** get number of currently selected nodes
      numnp = ndinqr(0,DB_NUMSELECTED)

      istat = 1 
      if (numnp .le. 0) go to 999

c     *** allocate memory for x, y, & z coordinates of nodes
      pdXnodeL = fAnsMemAlloc(numnp,MEM_DOUBLE,'XCoords ')
      pdYnodeL = fAnsMemAlloc(numnp,MEM_DOUBLE,'YCoords ')
      pdZnodeL = fAnsMemAlloc(numnp,MEM_DOUBLE,'ZCoords ')

c     *** loop through all selected nodes
      i = 1
      node = 0
      xmean = 0.0d0
      ymean = 0.0d0
      zmean = 0.0d0

 10   node = ndnext(node)

      if (node .gt. 0) then

c         *** get xyz coordinates
          ksel = ndgxyz(node,xyz(1))

c         *** store this node's xyz coordinates
          Xnode(i) = xyz(1)
          Ynode(i) = xyz(2)
          Znode(i) = xyz(3)

c         *** while we're looping, accumulate sums to calculate means
          xmean = xmean + xyz(1)
          ymean = ymean + xyz(2)
          zmean = zmean + xyz(3)

c         *** increment index
          i = i + 1

c         *** loop back up for next selected node
          goto 10

      endif

c     *** node = 0, at the end of node list

c     *** calculate mean of xyz coordinates
      xmean = xmean / numnp
      ymean = ymean / numnp
      zmean = zmean / numnp

c     *** calculate standard deviation for xyz coordinates
      sodx = 0
      sody = 0
      sodz = 0
      do  i = 1, numnp
         sodx = sodx + (Xnode(i) - xmean)**2
         sody = sody + (Ynode(i) - ymean)**2
         sodz = sodz + (Znode(i) - zmean)**2
      enddo

      stdxyz(1) = sqrt(sodx / (numnp-1))
      stdxyz(2) = sqrt(sody / (numnp-1))
      stdxyz(3) = sqrt(sodz / (numnp-1))

c     *****  write to output file  *****
      iott = wrinqr(WR_OUTPUT)
      write (iott,2000) xmean,ymean,zmean,
     x                  stdxyz(1),stdxyz(2),stdxyz(3)
 2000 format (/' MEAN FOR X COORDINATES:',G12.5/
     x         ' MEAN FOR Y COORDINATES:',G12.5/
     x         ' MEAN FOR Z COORDINATES:',G12.5/
     x         ' STD  FOR X COORDINATES:',G12.5/
     x         ' STD  FOR Y COORDINATES:',G12.5/
     x         ' STD  FOR Z COORDINATES:',G12.5)

c     *****  write to GUI window  *****
      call erhandler ('user03',5000,2,
     x 'STD  FOR X COORDINATES: %G %/
     x  STD  FOR Y COORDINATES: %G %/
     x  STD  FOR Z COORDINATES: %G',stdxyz(1),' ')

c      *****  set _STATUS to 0 for success  *****
      istat = 0

c     *** release dynamically allocated memory
      call fAnsMemFree (pdZnodeL)
      call fAnsMemFree (pdYnodeL)
      call fAnsMemFree (pdXnodeL)

c     *****  required return value  *****
 999  user03 = 0

c     *****  set _RETURN  to number of nodes processed  *****
      call parreturn (dble(numnp))

c     *****  set _STATUS for success (0) or no nodes (1)  *****
      call parstatus (istat)

      return
      end

2.9.4. Function user04 (Demonstrates Getting a List of Nodes)

*deck,user04                      USERDISTRIB
      function  user04()
c *** primary function:   user routine number  04; demonstrates gettting a
c                         list of nodes attached to a keypoint, line, or area

c         *** Copyright ANSYS.  All Rights Reserved.
c         *** ansys, inc.
c *** Notice - This file contains ANSYS Confidential information ***

c  /*******************************************************************\
c  | see user01 for additional information on user routines            |
c  \*******************************************************************/

c  input arguments:  none

c  output arguments:
c     user04   (int,sc,out)      - result code (should be zero)
c                                   (which is ignored for now)

c    **************************************************************
c    Functions for accessing data on the command line
c    integer function  intinfun(iField) - gets an integer from field iField
c    double precision function dpinfun(iField) - gets double precision
c    character*4 ch4infun(iField) - gets (upper case) 4 characters
c    character*8 ch8infun(iField) - gets (mixed case) 8 characters
c    character*32  ch32infun(iField) - gets (mixed case) 32 characters
c    **************************************************************
c
#include "impcom.inc"
#include "ansysdef.inc"


      external  ndkpnt

      external  wrinqr, ndline, ndarea, intinfun
      integer   wrinqr, ndline, ndarea, intinfun
      external     ch4infun
      character*4  ch4infun

      integer  user04,   iott, listk(20),listl(20),lista(20), listin(1),
     x           i, num,ktype, nkpnts, nlines, nareas
      character*4  type, lab2
        

      iott = wrinqr (WR_OUTPUT)

c     --- setup with:  /UCMD,GNSME,4
c        !gnsme,group,num,type
c        ! group = kp, ln, or ar
c        ! num   = entity number of kp, ln, or ar
c        ! type = interior, or all
c         ---- see input deck dv-5805s

      lab2 = ch4infun(2)
      write (iott,2010) lab2 
 2010 format(/' group name (type of entity) = ',a4)

      num = intinfun(3)
      write (iott,2020) num
 2020 format (' entity number =',i4)
      listin(1) = num

      if (lab2 .ne. 'KP  ' ) then
         type = ch4infun(4)
         if (type .eq. 'INTE') then
            write (iott,2030) 
 2030       format (' interior nodes only ')
            ktype = 0
         elseif (type .eq. 'ALL ') then
            write (iott,2040)
 2040       format (' all (interior and edge/end) nodes ')
            ktype = 1
         else
            write (iott,2050)
 2050       format ('Only INTE or ALL are acceptable in last field',
     x       ' on user-written gnsme command')
         endif
      endif
        
      if (lab2 .eq. 'KP  ' ) then
         nkpnts = 0
         call ndkpnt (1,listin(1),nkpnts,listk(1))
         write (iott,2110) nkpnts
 2110    format (' number of nodes on keypoint = ',i4)
         write (iott,2115) (listk(i),i=1,nkpnts)
 2115    format (' node on keypoint = ',i4)

      elseif (lab2 .eq. 'LN  ' ) then
         nlines = ndline (num,ktype,listl(1))
         write (iott,2120) nlines
 2120    format (' number of nodes on line = ',i4)
         write (iott,2125) (listl(i),i=1,nlines)
 2125    format (' list of nodes on line'/(3x,i4))

      elseif (lab2 .eq. 'AR  ' ) then
         nareas = ndarea (num,ktype,lista(1))
         write (iott,2130)  nareas
 2130    format (' number of nodes on area = ',i4)
         write (iott,2135) (lista(i),i=1,nareas)
 2135    format (' list of nodes on area'/(3x,i4))
 
      else
         write (iott,2150)
 2150    format (' Only KP, LN, or AR are acceptable on user-written ',
     x    'gnsme command')
      endif
      
      user04 = 0

      return
      end

2.9.5. Functions user05 through user10

The source code for user subroutines user05, user06, user07, user08, user09, and user10 is identical to function user01 shown above.