/out,e_exten,out
*msg,info
 < e_exten Version 2/28/98 >
/gopr
!
!   e_exten.mac
!
!   Extrudes elements from area elements with out any solid model
!
!   Works on the active area elements (which the only type of elements
!   that should be active)
!
!  arg1 = csys to be made active
!  arg2 = number of layer of elements to be generated
!  arg3 = Dx in the arg1 coordinate system
!  arg4 = Dy in the arg1 coordinate system
!  arg5 = Dz in the arg1 coordinate system
!  arg6 = element type number to be used in the element generation
!  
*get,cpw1,active,,time,wall
*get,cpu1,active,,time,cpu
*set,_real   !  2/28/98
!
fini
/prep7
immed
type,arg6
cm,c_e1,elem
cm,c_e2,elem

nsle
cm,c_n1,node
*get,ndmns,node,,num,min
*get,_ecnt,elem,,count
*get,_ncnt,node,,count
alls
*get,ndmx,node,,num,max
*get,elmx,elem,,num,max

cmsel,,c_e1

*set,_in
*dim,_in,,elmx
*set,_jn
*dim,_jn,,elmx
*set,_kn
*dim,_kn,,elmx
*set,_ln
*dim,_ln,,elmx
*set,_mn
*dim,_mn,,elmx
*set,_nn
*dim,_nn,,elmx
*set,_on
*dim,_on,,elmx
*set,_pn
*dim,_pn,,elmx
*set,_er
*dim,_er,,elmx
*set,_em
*dim,_em,,elmx
*set,_mskv
*dim,_mskv,,elmx
*vget,_mskv(1),elem,1,esel
*voper,_mskv(1),_mskv(1),gt,0

nd_inc=ndmx-ndmns+1
nsle
csys,arg1
ngen,arg2+1,nd_inc,all,,,arg3,arg4,arg5

*vmask,_mskv(1)
*vget,_in(1),elem,1,node,1
*vmask,_mskv(1)
*vget,_jn(1),elem,1,node,2
*vmask,_mskv(1)
*vget,_kn(1),elem,1,node,3
*vmask,_mskv(1)
*vget,_ln(1),elem,1,node,4
*vmask,_mskv(1)
*voper,_mn(1),_in(1),add,nd_inc
*vmask,_mskv(1)
*voper,_nn(1),_jn(1),add,nd_inc
*vmask,_mskv(1)
*voper,_on(1),_kn(1),add,nd_inc
*vmask,_mskv(1)
*voper,_pn(1),_ln(1),add,nd_inc
*vmask,_mskv(1)
*vget,_em(1),elem,1,attr,mat
*vmask,_mskv(1)
*vget,_er(1),elem,1,attr,real
!   must cycle through all the different real sets in the active set of 
!   elements
/nopr
/out,e_gen,tmp
/out,e_exten,out,,append
/gopr
*set,r_arr
*dim,r_arr,,1
cm,cre1,elem
cm,cre2,elem
*do,_irel1,1,_ecnt
 /gopr
 *get,_elmx,elem,,num,max
 *if,_elmx,eq,0,exit
 *get,_real,elem,_elmx,attr,real
 r_arr(1)=_real
  esel,r,real,,_real
  *get,_eecnt,elem,,count
! *msg,info,_real
!   writing out data for real set:________ %g
! *msg,info,_eecnt
!  Number of elements in this real set:__ %g
 *set,_mskv    !  complete mask vector for these elements which have the real
 !  set constant of _real
 *dim,_mskv,,elmx
 *vget,_mskv(1),elem,1,esel
 *voper,_mskv(1),_mskv(1),gt,0
 !  obtain the array of the elements with esys
 *set,_e_esys
 *dim,_e_esys,,elmx
 *vmask,_mskv(1)
 *vget,_e_esys(1),elem,1,attr,esys
 *vmask,_mskv(1)
 *vscfun,_esysx,max,_e_esys(1)
 *if,_esysx,gt,0,then
  /com, logic for the elements which have esys
  *set,e_arr
  *dim,e_arr,,1
  cm,cre3,elem  !    cre3=elements with this real      
  cm,cre4,elem  !    cre4=elements with this real      
  *do,_irel2,1,_ecnt
   /gopr
   *msg,info,_irel2
   cycle in _irel2: %i
   *get,_elmx1,elem,,num,max
   *if,_elmx1,eq,0,exit
   *get,_cesys,elem,_elmx1,attr,esys
   *if,_cesys,lt,11,then
     /com,even though this is the esys logic branch, this set of elements
     /com,have no esys.
     esel,u,esys,,11,_esysx
   *else
     esel,r,esys,,_cesys
   *endif
     *set,_mskve1      !  identifies elements having the esys = 0 , no esys
     *dim,_mskve1,,elmx
     *vget,_mskve1(1),elem,1,esel
     *voper,_mskve1(1),_mskve1(1),gt,0
     e_arr(1)=_cesys
     /nopr
     /out,e_gen,tmp,,append
     *if,_cesys,ge,11,then
      *vwrite,r_arr(1),e_arr(1)
      ('real,',f6.0,'  $  esys,',f6.0)
     *else
      *vwrite,r_arr(1)
      ('real,',f6.0)
     *endif
     *vmask,_mskve1(1)
     !*vwrite,_er(1),_em(1),_in(1),_jn(1),_kn(1),_ln(1),_mn(1),_nn(1),_on(1),_pn(1)
     !('real,',f4.0,'$mat,',f4.0,'$e',8(',',f6.0))
     *vwrite,_em(1),_in(1),_jn(1),_kn(1),_ln(1),_mn(1),_nn(1),_on(1),_pn(1)
     ('mat,',f4.0,'$e',8(',',f7.0))
     /out,e_exten,out,,append
     /gopr
     cm,cre5,elem
     cmsel,,cre3
     cmsel,u,cre5
     cm,cre3,elem
     *get,_eecnt,elem,,count
     *msg,info,_irel2,_eecnt,e_arr(1)
     Number of elements at end of %i cycle: %g for ESYS of %i
   *enddo
   cmsel,,cre4
 *else
  /com, logic for real set in which there is no ESYS
  /nopr
  /out,e_gen,tmp,,append
  *vwrite,r_arr(1)
  ('real,',f6.0)
  *vmask,_mskv(1)
  !*vwrite,_er(1),_em(1),_in(1),_jn(1),_kn(1),_ln(1),_mn(1),_nn(1),_on(1),_pn(1)
  !('real,',f4.0,'$mat,',f4.0,'$e',8(',',f6.0))
  *vwrite,_em(1),_in(1),_jn(1),_kn(1),_ln(1),_mn(1),_nn(1),_on(1),_pn(1)
  ('mat,',f4.0,'$e',8(',',f7.0))
  /out,e_exten,out,,append
  /gopr
 *endif   ! end of logic for handling esys        
 cmsel,,c_e2
 esel,u,real,,_real
 cm,c_e2,elem
*enddo

/out,e_exten,out,,append
!real,nn $ mat,nn $ e,nnnnnn,nnnnnn,nnnnnn,nnnnnn,nnnnnn,nnnnnn,nnnnnn,nnnnnn
/nopr
/inp,e_gen,tmp
/gopr

*if,arg2,gt,1,then
   egen,arg2,nd_inc,all
*endif

!   parsav,all,temp,par
*get,cpu2,active,,time,cpu
dcpu=cpu2-cpu1
*get,cpw2,active,,time,wall
dcpw=3600*(cpw2-cpw1)
/out
*msg,info
 e_exten macro
*msg,info,dcpu
 CPU time (sec) to generate the elements:_______________ %g
*msg,info,dcpw
 Wall clock time (sec) to generate the elements:________ %g

 csys