/out,rslotsta,out
! *abbr,ames,stat
/com ,  rslotsta.mac   12/25/00
!   Generates the Rectangular Slotted stator based on parameters
!    arg2 = mesh refinement, 1 is minimum number of elements, 5 is most 
!           most refinement
!    arg3 = 0  use lower order element
!         > 0  use higher order element
!    arg4 = number of stator teeth to be generated
!         = 0 (default), no action, no additional teeth are generated
!         ne 0 Build arg4 number of teeth
!    arg5 = 0 coil elements use the lower order elements
!         = 1 coil elements use the higher order elements
!    arg6 = 0 coil loads will be specified by currents 
!         = 1 coil load will be specified by voltages
!
!    component output:
!     stator   contains nodes, elements , kp, lines, areas
!     s_iron   contains just the stator iron for F_MACH.MAC
!
!

fini
/prep7
/uis,msgpop,3

_error=0
/nerr,1,1e6
*get,_mod_id,parm,stat_id,type
*if,_mod_id,eq,3,then

*if,stat_id,ne,'rslotsta',then
 /nerr,1,1e6
 /out
 *msg,error,stat_id
 The model type ( %c ) does not correspond to a slotted stator
 /out,rslotsta,out,,append
 _error=1
*endif
*else
 /out
 _error=1
*msg,error
 The model type identifier specified is not a "character" type parameter&
 or it was not specified
 /out,rslotsta,out,,append
*endif


/nerr,0,1e6
*if,_error,eq,1,:err


/nerr,1,-1
!  geometry error check

_error=0

_nm_vn=7
*set,_nm_vv
*dim,_nm_vv,,_nm_vn
_nm_vv(1)=r3,r4,r5,spc,tr1,nsp,gap
*set,_nm_v
*dim,_nm_v,char,_nm_vn
_nm_v(1)='r3','r4','r5','spc','tr1','nsp','gap'
*do,_i,1,_nm_vn
*if,_nm_vv(_i),eq,0,then
 *if,_i,ne,6,then
  *msg,error,_nm_v(_i)
  Parameter { %c }  is negative or zero.
  _error=_error+1
 *endif
*endif
*enddo
*if,_nm_vv(6),lt,0,then
 *msg,error,_nm_v(6)
 Parameter { %c }  is negative.
 _error=_error+1
*endif


*if,_error,eq,0,then
 *if,r5,lt,r4,then
   _error=_error+1
  *msg,error
  The backiron outer radius must be larger than the back&
  iron inner radius

 *endif
 *if,r4,lt,r3,then
   _error=_error+1
  *msg,error
  The backiron inner radius must be larger than the tooth&
  face radius

 *endif

 *if,r4+rs,gt,r5,then
   _error=_error+1
  *msg,error
   The backiron inner radius + rear slot radius must be&
   smaller than the outer backiron radius.

 *endif
 *if,tht1,gt,90,then
   _error=_error+1
  *msg,error
  The tooth angle (THT1) is equal to or greater than 90.

 *endif
*endif


*if,_error,eq,0,then
/nerr,0,1e4

*if,arg2,eq,0,then
 arg2=2
*endif
_cd1=1    !   radial divisons for the air space 
!             between two phases in teh same slot

!             between two phases in the same slot
*get,_elmtyp,etyp,,num,max
*if,_elmtyp,eq,0,then
 _elmtyp=1
*endif
_elctyp=_elmtyp+1

*if,arg3,eq,0,then
  et,_elmtyp,13
*else
  et,_elmtyp,53
*endif

*if,arg5,eq,0,then
  et,_elctyp,13
*else
  et,_elctyp,53
*endif

*if,arg6,eq,1,then
  et,_elctyp,53,3
*endif

*if,gen_app,eq,1,then    !  9/9/96
  ncons=1                !  9/9/96
*endif                   !  9/9/96

immed
esel,none
nsel,none
asel,none
ksel,none
lsel,none
cmsel,,stator
cedel,all,,,any
cpdel,all,,,any
ddel,all,all
acle,all
adel,all,,,1
ldel,all,,,1
kdel,all
edel,all
ndel,all
! numc,kp
!numc,line
!numc,area
numc,elem
numc,node


!   determine the current maximum real constant set
esel,all
*get,_elmx,elem,,num,max
_rl_strt=0
*if,_elmx,ne,0,then
*set,_mskv
*dim,_mskv,,_elmx
*vget,_mskv(1),elem,1,esel
*set,_r_e
*dim,_r_e,,_elmx
*vmask,_mskv(1)
*vget,_r_e(1),elem,1,attr,real
*vmask,_mskv(1)
*vscfun,_rl_strt,max,_r_e(1)
_zz=100*nint(_rl_strt/100)
*if,_zz,lt,_rl_strt,then
  _rl_strt=_zz+51
*else
  _rl_strt=_zz
*endif
_zz=
_rl_strt=0
*set,_mskv
*set,_r_e
esel,none
*endif



!  compute locations
_mxkp=22
*set,_kp_n_
*dim,_kp_n,,_mxkp
_60=180
*set,_x
*dim,_x,,_mxkp
*set,_y
*dim,_y,,_mxkp
*afun,deg
_x(1)=r3-gap/2
_y(1)=0
!t_ht12=(180/3.141593)*(3.141593*r3/nsp-spc/2)/r3
_tht2=180/nsp
_tht4=180/nsp-asin(spc/2/r3)
_x(2)=(r3-gap/2)*cos(_tht2)
_y(2)=(r3-gap/2)*sin(_tht2)
_x(3)=r3
_y(3)=0

_x(4)=r3*cos(_tht4)
_y(4)=r3*sin(_tht4)

_x(5)=r3*cos(_tht2)
_y(5)=r3*sin(_tht2)

_x(8)=_x(4)+tr1*cos(_tht4+tht1)
_y(8)=_y(4)+tr1*sin(_tht4+tht1)

_rd8=sqrt(_x(8)**2+_y(8)**2)
_x(9)=_rd8*cos(_tht2)
_y(9)=_rd8*sin(_tht2)

_x(17)=r4*cos(_tht2)
_y(17)=r4*sin(_tht2)

_x(16)=_x(17)+sw/2*sin(_tht2)
_y(16)=_y(17)-sw/2*cos(_tht2)

_x(20)=(r4-sh)*cos(_tht2)
_y(20)=(r4-sh)*sin(_tht2)

_x(7)=_x(20)+sw/2*sin(_tht2)
_y(7)=_y(20)-sw/2*cos(_tht2)

_x(12)=(r4-sh/2-gt/2)*cos(_tht2)
_y(12)=(r4-sh/2-gt/2)*sin(_tht2)

_x(15)=(r4-sh/2+gt/2)*cos(_tht2)
_y(15)=(r4-sh/2+gt/2)*sin(_tht2)

_xq=.5*(_x(7)+_x(16))
_yq=.5*(_y(7)+_y(16))

_x(11)=_xq-gt/2*cos(_tht2)
_y(11)=_yq-gt/2*sin(_tht2)

_x(14)=_xq+gt/2*cos(_tht2)
_y(14)=_yq+gt/2*sin(_tht2)

_x(10)=_x(11)
_x(13)=_x(14)
_y(10)=0
_y(13)=0
_y(6)=0
_x(6)=_x(7)

*if,rbc,le,0,then   !   12/25/00
 rbc=r3-gap/2
*endif

_x(21)=rbc*cos(_tht4)
_y(21)=rbc*sin(_tht4)

_x(18)=r5
_y(18)=0

_x(19)=r5*cos(_tht2)
_y(19)=r5*sin(_tht2)

_x(22)=_x(16)
_y(22)=0
csys
ksel,none
*do,_ikp,1,_mxkp
/gopr
 k,,_x(_ikp),_y(_ikp)
 _kp_n(_ikp)=kp(_x(_ikp),_y(_ikp),0)
*enddo
cm,sta_k,kp

! *go,:end

!  the tooth 
!  the tooth face
asel,none
cm,sta_a,area
lsel,none
csys,1
l,_kp_n(3),_kp_n(4)
csys
l,_kp_n(4),_kp_n(8)
l,_kp_n(7),_kp_n(8)
l,_kp_n(3),_kp_n(6)
l,_kp_n(6),_kp_n(7)
al,all
aatt,5,5,_elmtyp
cm,sta_a,area

!  the tooth shank
 asel,none
 ksel,,,,_kp_n(7)
 ksel,a,,,_kp_n(6)
 ksel,a,,,_kp_n(10)
 ksel,a,,,_kp_n(11)
 ksel,a,,,_kp_n(13)
 ksel,a,,,_kp_n(14)
 ksel,a,,,_kp_n(16)
 ksel,a,,,_kp_n(22)
 lslk,,1
 csys
 a,_kp_n(6),_kp_n(7),_kp_n(11),_kp_n(10)
 a,_kp_n(10),_kp_n(11),_kp_n(14),_kp_n(13)
 a,_kp_n(13),_kp_n(14),_kp_n(16),_kp_n(22)
 aatt,5,5,_elmtyp
 cmsel,a,sta_a
 cm,sta_a,area



ksel,all

/com, the back iron of the yoke
lsel,none
asel,none

csys,1
ksel,,,,_kp_n(16)
ksel,a,,,_kp_n(17)
ksel,a,,,_kp_n(19)
ksel,a,,,_kp_n(18)
ksel,a,,,_kp_n(22)
l,_kp_n(16),_kp_n(17)
lslk,,1
a,_kp_n(22),_kp_n(16),_kp_n(17),_kp_n(19),_kp_n(18)
aatt,5,5,_elmtyp
cmsel,a,sta_a
cm,sta_a,area


!  the coil region
lsel,none
asel,none

ksel,all
!  lower coil region
a,_kp_n(7),_kp_n(20),_kp_n(12),_kp_n(11)
*get,_armx1,area,,num,max
!  air gap between the coils
asel,none
a,_kp_n(11),_kp_n(12),_kp_n(15),_kp_n(14)
*get,_armx2,area,,num,max
asel,none
!  upper coil region
a,_kp_n(14),_kp_n(15),_kp_n(17),_kp_n(16)
*get,_armx3,area,,num,max
asel,a,,,_armx1
asel,a,,,_armx2
cmsel,a,sta_a
cm,sta_a,area

*if,ncons,eq,1,then
  !  one coil per slot
  asel,,,,_armx1
  asel,a,,,_armx2
  asel,a,,,_armx3
  aatt,6,1+_rl_strt,_elctyp
*else
  asel,,,,_armx1
  aatt,6,1+_rl_strt,_elctyp
  asel,,,,_armx3
  aatt,6,2+_rl_strt,_elctyp
*endif
asel,,,,_armx2
aatt,1,6,_elmtyp

!  the air gap 
ksel,all
asel,none
csys,1
!l,_kp_n(1),_kp_n(2) 
l,_kp_n(1),_kp_n(21)
l,_kp_n(21),_kp_n(2)
l,_kp_n(2),_kp_n(5)
l,_kp_n(5),_kp_n(4)
l,_kp_n(21),_kp_n(4)
l,_kp_n(1),_kp_n(2)
asel,none
a,_kp_n(1),_kp_n(21),_kp_n(4),_kp_n(3)
a,_kp_n(21),_kp_n(2),_kp_n(5),_kp_n(4)
*get,_argp1,area,,num,min
*get,_argp2,area,,num,max
aatt,1,6,_elmtyp
cmsel,a,sta_a
cm,sta_a,area

!  the slot at the side of the tooth face
asel,none
a,_kp_n(4),_kp_n(5),_kp_n(9),_kp_n(8)
a,_kp_n(7),_kp_n(8),_kp_n(9),_kp_n(20)
!  this is air
aatt,1,6,_elmtyp
cmsel,a,sta_a
cm,sta_a,area


!   set meshing divisions
!   number divisions in the radial gap
*set,_gapd
*dim,_gapd,,5
_gapd(1)=1,2,3,4,5
!   aspect ratio of tooth along the tooth face
*set,_asprg
*dim,_asprg,,5
_asprg(1)=3,2,1,1,1
!  factor applied to kesize for keypoints at the back of the tooth face
!  based on the gap/_gapd(arg2) value
*set,_kpz1
*dim,_kpz1,,5
_kpz1(1)=3,2.5,1.5,1.2,1
!  factor applied to kesize for keypoints at the back of the tooth shank
*set,_kpz2
*dim,_kpz2,,5
_kpz2(1)=7,6,5,3,2
!  factor applied to kesize for keypoints at the back of the iron
*set,_kpz3
*dim,_kpz3,,5
_kpz3(1)=10,8,4,2,2
*set,_kpz4
*dim,_kpz4,,5
_kpz3(1)=3,1.4,1.2,1.,.8

/gopr
/com, line size adjustment #
ksel,,,,_kp_n(1)
ksel,a,,,_kp_n(21)
!kesi,_kp_n(1),gap/(_gapd(arg2)+1)    !  6/28/96
!kesi,_kp_n(21),gap/(_gapd(arg2)+1)    !  6/28/96
lslk,,1
! lesi,all,.5*_asprg(arg2)*gap/_gapd(arg2)    
lesi,all,1*_asprg(arg2)*gap/_gapd(arg2)
*get,_lsmx1,line,,num,max
*get,_ldv1,line,_lsmx1,attr,ndiv
*get,_lnga,line,_lsmx1,leng
_se_gp=_lnga/_ldv1
/com, llis 1
llis    !  2/17/96
ksel,,,,_kp_n(2)   !  10/5/96
ksel,a,,,_kp_n(21)  !  10/5/96
lslk,,1             !  10/5/96
lesi,all,.5*_asprg(arg2)*gap/_gapd(arg2)
*get,_lsmx2,line,,num,max
*get,_ldv2,line,_lsmx2,attr,ndiv


ksel,,,,_kp_n(4)   !  10/5/96
ksel,a,,,_kp_n(3)  !  10/5/96
lslk,,1             !  10/5/96
lesi,all,,,_ldv1
!lesi,all,,,_ldv1,,1 !  10/5/96
ksel,,,,_kp_n(4)   !  10/5/96
ksel,a,,,_kp_n(5)  !  10/5/96
lslk,,1             !  10/5/96
lesi,all,,,_ldv2,,1

!  radial air gap divisions
ksel,,,,_kp_n(1)   !  10/5/96
ksel,a,,,_kp_n(3)  !  10/5/96
lslk,,1             !  10/5/96
lesi,all,,,_gapd(arg2),,1
ksel,,,,_kp_n(21)   !  10/5/96
ksel,a,,,_kp_n(4)  !  10/5/96
lslk,,1             !  10/5/96
lesi,all,,,_gapd(arg2),,1
ksel,,,,_kp_n(2)   !  10/5/96
ksel,a,,,_kp_n(5)  !  10/5/96
lslk,,1             !  10/5/96
lesi,all,,,_gapd(arg2),,1

!  side of tooth
ksel,,,,_kp_n(9)   !  10/5/96
ksel,a,,,_kp_n(10)  !  10/5/96
lslk,,1             !  10/5/96
lesi,all,_asprg(arg2)*gap/_gapd(arg2)
ksel,,,,_kp_n(9)   !  10/5/96
ksel,a,,,_kp_n(5)  !  10/5/96
lslk,,1             !  10/5/96
lesi,all,_asprg(arg2)*gap/_gapd(arg2)
ksel,,,,_kp_n(4)   !  10/5/96
ksel,a,,,_kp_n(10)  !  10/5/96
lslk,,1             !  10/5/96
lesi,all,_asprg(arg2)*gap/_gapd(arg2)



/com, small radial air gap between coil regions
ksel,,,,_kp_n(13)   !  10/5/96
ksel,a,,,_kp_n(10)  !  10/5/96
lslk,,1             !  10/5/96
lesi,all,,,1,,1
ksel,,,,_kp_n(11)   !  10/5/96
ksel,a,,,_kp_n(14)  !  10/5/96
lslk,,1             !  10/5/96
lesi,all,,,1,,1
ksel,,,,_kp_n(12)   !  10/5/96
ksel,a,,,_kp_n(15)  !  10/5/96
lslk,,1             !  10/5/96
lesi,all,,,1,,1

cmsel,,sta_a
lsla
ksll
kesi,_kp_n(6),_se_gp*_kpz1(arg2)
kesi,_kp_n(7),_se_gp*_kpz1(arg2)
kesi,_kp_n(9),_se_gp*_kpz1(arg2)
kesi,_kp_n(20),_se_gp*_kpz1(arg2)
kesi,_kp_n(10),_se_gp*_kpz1(arg2)*1.2
kesi,_kp_n(11),_se_gp*_kpz1(arg2)*1.2
kesi,_kp_n(12),_se_gp*_kpz1(arg2)*1.2
kesi,_kp_n(13),_se_gp*_kpz1(arg2)
kesi,_kp_n(14),_se_gp*_kpz1(arg2)
kesi,_kp_n(15),_se_gp*_kpz1(arg2)
kesi,_kp_n(16),_se_gp*_kpz1(arg2)*2
kesi,_kp_n(17),_se_gp*_kpz1(arg2)
kesi,_kp_n(18),_se_gp*_kpz1(arg2)*2.5
kesi,_kp_n(19),_se_gp*_kpz1(arg2)*2.5
kesi,_kp_n(22),_se_gp*_kpz1(arg2)*2
_gap_d=gap/_gapd(arg2)

/com,mesh the air gap

esha
/com,  mesh the lower order elements first
cmsel,,sta_a
  _alrms=0
*if,arg3,eq,0,then
  asel,,,_argp1
  asel,a,,,_argp2
  esha,2
  ames,all
  esha
  _alrms=1
  cmsel,,sta_a
  esha
  asel,r,type,,_elmtyp
  ames,all
*endif
*if,arg5,eq,0,then
  asel,r,type,,_elctyp
  ames,all
*endif
cmsel,,sta_a
*if,_alrms,eq,0,then
 asel,,,_argp1
 asel,a,,,_argp2
 esha,2
 ames,all
*endif
esha
ames,all

cmsel,,sta_a
esla
nsle
lsla
ksll
cm,sta_l,line
cm,sta_e,elem
cm,sta_n,node
cmgrp,stator,sta_e,sta_n,sta_a,sta_l,sta_k
dsys
esel,r,mat,,6
cm,s_coil,elem
cmsel,,stator


!  *go,:end



*if,arg4,ne,0,then
!          1       2      3     4 5    6     7   8
  polegen,arg4,gen_app,'s_coil',0,1,'stator',2,ggeom        !  9/9/96
*endif

!   apply az at outer nodes
cmsel,,stator
csys,1
nsel,,ext
*get,_rdmx,node,,mxloc,x
nsel,r,loc,x,_rdmx-.0001,_rdmx+.0001
d,all,az
/pbc,a,1
cmsel,,stator

!    _rtorq=ggeom*((r3-rbc)/2+rbc)
!   This parameter is calculated in POLEGEN.MAC
!

csys
*get,_xmn,node,,mnloc,x
*get,_xmx,node,,mxloc,x
*get,_ymn,node,,mnloc,y
*get,_ymx,node,,mxloc,y
_dify=_ymx-_ymn
_difx=_xmx-_xmn
_eify=_ymx+_ymn
_eifx=_xmx+_xmn
_rmx=_dify
*if,_difx,gt,_dify,then
   _rmx=_difx
*endif

/foc,1,_eifx/2,_eify/2
/dis,1,1.05*_rmx/2

_xmn= $ _xmx= $ _ymn= $ _ymx= $ _dify=
_difx= $ _eifx= $ _eify=

/pnum,mat,1
/num,1
eplo
immed,1

cmsel,,stator
esel,r,mat,,5
cm,s_iron,elem
cmsel,,stator

! *endif


:end
:err

/out