!   TITLE:  mass_calcs.mac (MANAGEMENT)
!
!
!   OBJECTIVE:
!
!   This sub-macro calculates the mass properties of a selected set of FE
!   models.
!
!
!   COMMAND SYNTAX:
!
!                       (1)         (2)       (3)
!       MASS_CALCS, 'model_name', output, relative_CS
!
!
!   ARGUMENTS:
!
!       (1) 'model_name' = character name of the model (part) to query the
!                          element masses. If left blank, the current selected
!                          set of elements are queried.
!                          [ Model name must be in single quotes ]
!
!       (2) output = output the parameters to a message window:
!
!                   0 (or blank) = DO NOT output to a message window.
!
!                   1 = output to a message window.
!
!       (3) active_CS = the active CS to measure element centroid coordinates
!                       relative to.
!
!                   0 (or blank) = Global cartesian system (default)
!
!           *** NOTE : Best to use a cartesian CS for a more consistent result.
!
!
!   DESCRIPTION:
!
!   The mass/weight is calculated from the existing elements along with the
!   overall ceneter of mass (CM). This allows for a verification of the correct
!   model weights, mass, and CG.
!
!   The CM/CG is measured relative to the input CS (argument 3). (It is
!   recommended to use acartesian system.)
!
!   The elements may be the currently selected set of elements, or the elements
!   associated with a part name may be input in (arguemtn 1).
!
!   The selected element(s) are stored in an array named: ELM_MASS. The array
!   contains 7 pieces of data for each element:
!
!       1.) element number
!       2.) element volume
!       3.) element material density
!       4.) element mass
!       5.) X-coordinate of element centroid (relative to csys = 0)
!       6.) Y-coordinate of element centroid (relative to csys = 0)
!       7.) Z-coordinate of element centroid (relative to csys = 0)
!
!   Each piece of data is stored in each column, with each row an element.
!   The array, ELM_MASS, has the following format:
!
!                                   COLUMNS
!         ROW   |   1    |  2   |    3    |  4   |  5   |   6   |   7   |
!      ------------------------------------------------------------------
!          1    |  E_#1  |  V1  |  dens1  |  M_1 |  Xc1 |  Yc1  |  Zc1  |
!          2    |  E_#2  |  V2  |  dens2  |  M_2 |  Xc2 |  Yc2  |  Zc2  |
!          3    |  E_#3  |  V3  |  dens3  |  M_2 |  Xc3 |  Yc3  |  Xc3  |
!          .    |   .    |  .   |   .     | .    |  .   |   .   |   .   |
!          .    |   .    |  .   |   .     | .    |  .   |   .   |   .   |
!          N    |  E_#N  |  VN  |  densN  |  M_N |  XcN |  YcN  |  ZcN  |
!
!
!   ------ The output parameters from this macro are::
!
!       a.)  m_tot - The total mass/weight of all the selected elements
!
!       b.)  x_cm - X-coordinate of the centroid of the total mass/weight
!
!       c.)  y_cm - Y-coordinate of the centroid of the total mass/weight
!
!       d.)  z_cm - Z-coordinate of the centroid of the total mass/weight
!
!       e.)  ELM_MASS - The array defined above. It is overwritten with
!                       each succesive run of this macro. 
!
!
!
*get,prkey_,active,0,prkey
/nopr
!
modname_=arg1
out_=arg2
actcs__=arg3
!
configuration,0
!
! Parameter type: 0=scalar, 1=array, 2=table, 3=character scalar,
!                 4=character array, -1=undefined
!
*get,argtyp_,parm,modname_,type
!
*if,argtyp_,eq,3,then
    select,modname_
*else
    modname_='Assembly'
*endif
!
*set,elm_mass(1),
!
! USER  <97>  User-defined system (default).
! SI  <97>  International system (SI or MKS; m, kg, s, K).
! CGS  <97>  CGS system (cm, g, s, °C).
! MPA  <97>  MPA system (mm, Mg, s, °C).
! BFT  <97>  British system using feet (ft, slug, s, °F).
! BIN  <97>  British system using inches (in, lbf*s2/in, s, °F).
!
! Units specified by /UNITS command:
! 0 = USER, 1 = SI, 2 = CGS, 3 = BFT, 4 = BIN, 6 = MPA
!
*get,units,active,,units
!
*if,units,eq,0,then
    g_sys=g_user
*elseif,units,eq,1,then
    g_sys=g_si
*elseif,units,eq,2,then
    g_sys=g_cgs
*elseif,units,eq,3,then
    g_sys=g_bft
*elseif,units,eq,4,then
    g_sys=g_bin
*elseif,units,eq,6,then
    g_sys=g_mpa
*endif
!
!                          (1)     (2)   (3)  (4)   (5)    (6)   (7)
!           ENTITY_ARRAY, entity, aname, typ, dir, #rows, #col, #pln
!
!
entity_array,'e','elm_mass','array',,,7
elmcnt_=ecount
!
csys,actcs__
!
*do,klm__,1,elmcnt_,1
    *get,elm_mass(klm__,2),elem,elm_mass(klm__,1),volu
    *get,nmat__,elem,elm_mass(klm__,1),attr,mat
    *get,rho__,dens,nmat__,temp,0
    !
    elm_mass(klm__,3)=rho__*g_sys
    elm_mass(klm__,4)=elm_mass(klm__,2)*elm_mass(klm__,3)
    !
    *get,elm_mass(klm__,5),elem,elm_mass(klm__,1),cent,x
    *get,elm_mass(klm__,6),elem,elm_mass(klm__,1),cent,y
    *get,elm_mass(klm__,7),elem,elm_mass(klm__,1),cent,z
*enddo
!
m_tot=elm_mass(1,4)
xcm_tot=(elm_mass(1,4))*(elm_mass(1,5))
ycm_tot=(elm_mass(1,4))*(elm_mass(1,6))
zcm_tot=(elm_mass(1,4))*(elm_mass(1,7))
!
*do,klm__,2,elmcnt_,1
    m_tot=m_tot+elm_mass(klm__,4)
    xcm_tot=xcm_tot+((elm_mass(klm__,4))*(elm_mass(klm__,5)))
    ycm_tot=ycm_tot+((elm_mass(klm__,4))*(elm_mass(klm__,6)))
    zcm_tot=zcm_tot+((elm_mass(klm__,4))*(elm_mass(klm__,7)))
*enddo
!
x_cm=xcm_tot/m_tot
!
y_cm=ycm_tot/m_tot
!
z_cm=zcm_tot/m_tot
!
*if,out_,eq,1,then
    *msg,ui,modname_,%m_tot%,%actcs__%,%x_cm%,%y_cm%,%z_cm%
    Part Name = %12S %/&
    %/&
    Total Mass = %g %/&
    %/&
    Center-of-Mass coordinates relative to:  CSYS = %i %/&
    %/&
    X_cm = %g %/&
    Y_cm = %g %/&
    Z_cm = %g %/&
    %/&
*endif
!
configuration,1
!
eplot
!
*set,elmcnt_,
*set,ecount,
*set,nmat__,
*set,rho__,
*set,units,
*set,modname_,
*set,argtyp_,
*set,out_,
*set,actcs__,
!
*if,prkey_,eq,1,then
    /go
*endif