/*
 
uf_sf_types.h
File Description :

Data Definitions for the Open C API interface to Scenario.

*****************************************************************************/

#ifndef  UF_SF_TYPES__H_INCLUDED
#define  UF_SF_TYPES__H_INCLUDED

#include <uf_defs.h>
#include <string.h>
#include <uf_sf_lang_names.h>
#include <uf_cfi_types.h>
#include <uf_unit_types.h>




#define UF_SF_MIDSRF_NON_EXIST       (-1)
#define UF_SF_MIDSRF_FACEPAIR_METHOD  0
#define UF_SF_MIDSRF_OFFSET_METHOD    1
#define UF_SF_MIDSRF_USER_DEF_METHOD  2

enum UF_SFNAS_inter_output_types_e
{
       INTOUT_YES = 0,
       INTOUT_NO,
       INTOUT_ALL
};

typedef enum UF_SFNAS_inter_output_types_e UF_SFNAS_inter_output_types_t;
typedef enum UF_SFNAS_inter_output_types_e SFNAS_inter_output_types_t;

enum UF_SF_node_btype_e
{
   UF_SF_NODE_BODYINTERIOR, /* Node on the interior of a body. */
   UF_SF_NODE_EDGE,         /* Node on an edge. */
   UF_SF_NODE_FACEINTERIOR, /* Node on the interior of a face. */
   UF_SF_NODE_INTERIOR,     /* Interior node. */
   UF_SF_NODE_NO_GEOMETRY,  /* Node not on any geometry. */
   UF_SF_NODE_POINT         /* Node on point. The point could be on
                               Edge or Face, but the node on point
                               is not a part of mesh on edge/face.  */

};

typedef enum UF_SF_node_btype_e  UF_SF_node_btype_t,
                               *UF_SF_node_btype_p_t;


enum UF_SF_node_switch_e
{
   UF_SF_SWITCH_ON_BOUNDARY,  /* Switch to nodes only on the boundary. */
   UF_SF_SWITCH_IN_INTERIOR,  /* Switch to nodes only in the interior. */
   UF_SF_SWITCH_ALL           /* Switch to all nodes, independent of the
                                 location. */

};
typedef enum UF_SF_node_switch_e  UF_SF_node_switch_t,
                                *UF_SF_node_switch_p_t;

enum UF_SF_mid_node_type_e
{
   UF_SF_NODE_CORNER,    /* Node on the corner. */
   UF_SF_NODE_DISABLED,  /* Node disabled. */
   UF_SF_NODE_MID,       /* Node on the middle. */
   UF_SF_NODE_ORIENTATION /* Node with an orientation. */
};
typedef enum UF_SF_mid_node_type_e  UF_SF_mid_node_type_t,
                                  *UF_SF_mid_node_type_p_t;


/* meshdir codes associated with mesh geometry in a mesh recipe */
enum UF_SF_mesh_geom_meshdir_e
{
   UF_SF_MG_MESHDIR_UNINITIALIZED = 0, /* Uninitialized mesh direction.   */
   UF_SF_MG_MESHDIR_UNDEFINED,         /* Undefined mesh direction. */
   UF_SF_MG_MESHDIR_FROM_START,        /* Mesh direction from line start */
   UF_SF_MG_MESHDIR_FROM_END,          /* Mesh direction from line end   */
   UF_SF_MG_MESHDIR_REVERSE,           /* Reverse the mesh direction */
   UF_SF_MG_MESHDIR_DONT_REVERSE       /* Do not reverse the mesh direction. */
};
typedef enum UF_SF_mesh_geom_meshdir_e  UF_SF_mesh_geom_meshdir_t,
                                      *UF_SF_mesh_geom_meshdir_p_t;

enum UF_SF_mesh_recipe_adaptivity_e
{
   UF_SF_MESH_RECIPE_ADAPT_HELMS, /* Adaptivity of elements is H-type. */
   UF_SF_MESH_RECIPE_ADAPT_PELMS /* Adaptivity of elements is P-type. */
};
typedef enum UF_SF_mesh_recipe_adaptivity_e  UF_SF_mesh_recipe_adaptivity_t,
                                           *UF_SF_mesh_recipe_adaptivity_p_t;

enum UF_SF_elm_adaptivity_type_e
{
   UF_SF_ELEMENT_ADAPT_HELMS = (int)UF_SF_MESH_RECIPE_ADAPT_HELMS,
                               /* Adaptivity of elements is H-type. */
   UF_SF_ELEMENT_ADAPT_PELMS = (int)UF_SF_MESH_RECIPE_ADAPT_PELMS
                               /* Adaptivity of elements is P-type. */
};
typedef enum UF_SF_elm_adaptivity_type_e  UF_SF_elm_adaptivity_type_t,
                                        *UF_SF_elm_adaptivity_type_p_t;


enum UF_SF_element_type_e
{
    UF_SF_UNDEFINED = 0,/* Generic undefined type. */
    UF_SF_CMASS = 1,    /* Concentrated mass element. */
    UF_SF_BAR = 2,      /* Bar element. */
    UF_SF_BEAM = 3,     /* Beam element. */
    UF_SF_ROD = 4,      /* Rod element. */
    UF_SF_RBE2 = 5,     /* Rigid link element. */
    UF_SF_SPRING = 6,   /* Spring element. */
    UF_SF_MASS = 7,     /* Distributed mass element. */
    UF_SF_HBDY = 8,     /* Heat body element. */
    UF_SF_QUAD4 = 9,    /* Quadrilateral element with 4 nodes. */
    UF_SF_TRIA3 = 10,   /* Triangular element with 3 nodes. */
    UF_SF_QUAD8 = 11,   /* Quadrilateral element with 8 nodes. */
    UF_SF_TRIA6 = 12,   /* Triangular element with 6 nodes. */
    UF_SF_TET4 = 13,    /* Tetrahedral element with 4 nodes. */
    UF_SF_TET10 = 14,    /* Tetrahedral element with 10 nodes. */
    UF_SF_1D_CONTACT=15, /* 1D contact elements between 2 bodies. */
    UF_SF_HEX8 = 16,     /* Hexahedral element with 8 nodes. */
    UF_SF_HEX20 = 17,    /* Hexahedral element with 20 nodes. */
    UF_SF_WDG6  = 18,    /* Wedge element with 6 nodes. */
    UF_SF_WDG15 = 19,    /* Wedge element with 15 nodes. */
    UF_SF_2D_CONTACT = 20, /* 2D Contact elements between 2 faces */
    UF_SF_WELD = 21,        /* weld elements */
    UF_SF_EF_CONN = 22,  /* Edge-Face connection element */
    UF_SF_MM_FREE = 23,  /* Not an element type but useful as connection. */
    UF_SF_MM_GLUE = 24,  /* Not an element type but useful as connection. */
    UF_SF_RBE3 = 25,     /* rbe3 element with 1 core node (first node) and multiple leg nodes. */
    UF_SF_PYR5 = 26,     /* Pyramid element with 5 nodes. */
    UF_SF_PYR9 = 27,     /* Pyramid element with 9 nodes. */
    UF_SF_PYR13 = 28,    /* Pyramid element with 13 nodes. */
    UF_SF_1D_NG = 29,    /* 1D Node to Ground elements with 1 node. */
    UF_SF_1D_PLOTEL = 30,/* 1D plotel element with 2 nodes. */
    UF_SF_1D_MASS = 31,  /* 1D mass element with 2 nodes. */
    UF_SF_PYR_MIXED_ORDER = 32, /* Pyramid element mixed order. */
    UF_SF_TET_MIXED_ORDER = 33, /* Tetrahedral element mixed order. */

/*  
*/


    UF_SF_TOTAL_COUNT = 34 /* This last member represents the total
                              number of members in this enum */

};
typedef enum UF_SF_element_type_e  UF_SF_element_type_t,
                                 *UF_SF_element_type_p_t;

enum UF_SF_mesh_dimension_e
{
 UF_SF_DIMENSION_0D,    /* Element dimension is 0 - CMASS or MASS */
 UF_SF_DIMENSION_1D,    /* Element dimension is 1 - Bar, beam, rods, rigid
                           links, springs and contact elements. */

 UF_SF_DIMENSION_2D,    /* Element dimension is 2 - quad4, quad8, tri3, tri6 */
 UF_SF_DIMENSION_3D,    /* Element dimension is 3 - tet4, tet10. */
 UF_SF_DIMENSION_ANY    /* Element of any dimension. */
};
typedef enum UF_SF_mesh_dimension_e  UF_SF_mesh_dimension_t,
                                   *UF_SF_mesh_dimension_p_t;


enum UF_SF_elm_dimension_type_e
{
   UF_SF_ELEMENT_POINT = (int)UF_SF_DIMENSION_0D, /* Element type is point - CMASS
                                                     or MASS. */

   UF_SF_ELEMENT_BEAM  = (int)UF_SF_DIMENSION_1D, /* Element type is beam - Bar,
                                                     beam, rods, rigid links,
                                                     springs and contact elements.*/

   UF_SF_ELEMENT_SHELL = (int)UF_SF_DIMENSION_2D, /* Element type is shell - quad4,
                                                     quad8, tri3, tri6. */

   UF_SF_ELEMENT_SOLID = (int)UF_SF_DIMENSION_3D, /* Element type is solid - tet4,
                                                     tet10. */

   UF_SF_ELEMENT_ALL                         /* Element of any of the 4 above
                                                types. */

};
typedef enum UF_SF_elm_dimension_type_e  UF_SF_elm_dimension_type_t,
                                       *UF_SF_elm_dimension_type_p_t;

#define UF_SF_SECTION_UNINITIALIZED     -777777.
#define UF_SF_USER_DEFINED_TW_THICKNESS "USER_DEFINED_THIN_WALL_THICKNESS"

enum UF_SF_section_type_e
{
 UF_SF_SECTION_TWREC = 0,    /* Thin wall, rectangle                 */
 UF_SF_SECTION_TWCYL,        /* Thin wall, cylinder                  */
 UF_SF_SECTION_TWCHA,        /* Thin wall, channel                   */
 UF_SF_SECTION_TWHAT,        /* Thin wall, hat                       */
 UF_SF_SECTION_TWIBE,        /* Thin wall, I beam                    */
 UF_SF_SECTION_SOCYL,        /* Solid, cylinder                      */
 UF_SF_SECTION_SOREC,        /* Solid, rectangle                     */
 UF_SF_SECTION_KEYIN,        /* User defined.                        */
 UF_SF_SECTION_USER_TW,      /* User Defined TW                      */
 UF_SF_SECTION_USER_SOLID,   /* User Defined Solid                   */
 UF_SF_SECTION_NUM_TYPES
};
typedef enum UF_SF_section_type_e  UF_SF_section_type_t,
                                 *UF_SF_section_type_p_t;

/*  */
enum UF_SF_neutral_material_types_e
{
   UF_SF_MATERIAL_ISOTROPIC = 0,    /* Material is isotropic.          */
   UF_SF_MATERIAL_ORTHOTROPIC = 1,  /* Material is orthotropic.        */
   UF_SF_MATERIAL_ANISOTROPIC = 2,  /* Material is anisotropic.        */
   UF_SF_MATERIAL_FORMABILITY = 3,  /* Formability properties.         */
   UF_SF_MATERIAL_FLUID = 4,        /* Fluid material.                 */
   UF_SF_MATERIAL_HYPERELASTIC = 5  /* General Hyperelastic Material   */
};
typedef enum UF_SF_neutral_material_types_e  UF_SF_neutral_material_types_t,
                                           *UF_SF_neutral_material_types_p_t;

/* Extended material types.                                            */
enum UF_SF_matl_orient_option_e
{
   UF_SF_MATL_ORIENT_FIXED,        /* Origin/vectors option           */
   UF_SF_MATL_ORIENT_WCS           /* Create an orientation based
                                      upon the current WCS.           */

};
typedef enum UF_SF_matl_orient_option_e  UF_SF_matl_orient_option_t,
                                       *UF_SF_matl_orient_option_p_t;

/* Coordinate system type.                                              */
enum UF_SF_fem_coord_type_e
{
   UF_SF_RECT_COORD
};
typedef enum UF_SF_fem_coord_type_e  UF_SF_fem_coord_type_t,
                                   *UF_SF_fem_coord_type_p_t;

struct UF_SF__fixed_s
{
   UF_SF_fem_coord_type_t  type;        /* Coordinate type. */
   double                  origin[3];   /* origin point            */
   double                  x_dir[3];    /* x direction vector      */
   double                  y_dir[3];    /* y direction vector      */
   double                  z_dir[3];    /* z direction vector      */
};
typedef struct UF_SF__fixed_s UF_SF__fixed_t;

union UF_SF_matl_orient_u
{
   UF_SF__fixed_t fixed;
};
typedef union UF_SF_matl_orient_u  UF_SF_matl_orient_t,
                                 *UF_SF_matl_orient_p_t;

enum UF_SF_multi_prop_type_e
{
   UF_SF_MULTI_PROP_TABLE,   /* Tabular form of variable material properties.*/
   UF_SF_MULTI_PROP_EXPRESSION /* Variation of material properties is through
                                  an expression. */

};
typedef enum UF_SF_multi_prop_type_e  UF_SF_multi_prop_type_t,
                                    *UF_SF_multi_prop_type_p_t;

union UF_SF_table_u
{
   double                       pair[2]; /* A pair of values for the tabular
                                            form of variable material
                                            properties. The first value is the
                                            independent variable where as the
                                            second one is dependent on the
                                            first. */

};
typedef union UF_SF_table_u  UF_SF_table_t,
                           *UF_SF_table_p_t;

struct UF_SF_table_prop_s
{
   int                          size;  /* The number of pairs in the table. */
   UF_SF_table_p_t              array_ptr; /* Pointer to the table that has
                                              the data. */

};
typedef struct UF_SF_table_prop_s  UF_SF_table_prop_t,
                                 *UF_SF_table_prop_p_t;


union UF_SF__multi_u
{
   UF_SF_table_prop_p_t     table_ptr;      /* pointer to the table property
                                               structure. */

   tag_t                    expression_tag; /* Tag of the expression if
                                               type of property is through
                                               expression. */

};
typedef union UF_SF__multi_u UF_SF__multi_t;


struct UF_SF_multi_prop_s
{
   UF_SF_multi_prop_type_t      type;          /* Type of property, tabular or through
                                                  expression. */

   UF_SF__multi_t               multi;         /* Union containing pointer to the table
                                                  and tag of the expression. */

   UF_UNIT_MEASURE_TYPE_t       measure_type;  /* Type of measure - Eg. MEASURE_FORCE, MEASURE_MASS_DENSITY..etc*/
   tag_t                        unit_type_tag; /* Tag to pointer of unit type - Eg Newton, kg/m3 ..etc */
};
typedef struct UF_SF_multi_prop_s  UF_SF_multi_prop_t,
                                 *UF_SF_multi_prop_p_t;


/* The array sizes in UF_SF_extend_matl_prop                            */
#define UF_SF_extend_matl_aniso_G1                      6
#define UF_SF_extend_matl_aniso_G2                      6
#define UF_SF_extend_matl_aniso_thermal_coeff           6
#define UF_SF_extend_matl_aniso_thermal_conduct1        3
#define UF_SF_extend_matl_aniso_thermal_conduct2        3
#define UF_SF_extend_matl_ortho_youngs_modulus          3
#define UF_SF_extend_matl_ortho_poissons_ratio          3
#define UF_SF_extend_matl_ortho_shear_modulus           3
#define UF_SF_extend_matl_ortho_thermal_coeff           3
#define UF_SF_extend_matl_ortho_thermal_conduct         3

struct UF_SF__isotropic_s
{
   UF_SF_multi_prop_t       youngs_modulus;
   UF_SF_multi_prop_t       poissons_ratio;
   UF_SF_multi_prop_t       shear_modulus;
   UF_SF_multi_prop_t       mass_density;
   UF_SF_multi_prop_t       thermal_coeff;
   UF_SF_multi_prop_t       reference_temperature;
   UF_SF_multi_prop_t       plastic_strain_ratio;
   UF_SF_multi_prop_t       thermal_conduct;
   UF_SF_multi_prop_t       specific_heat;
   UF_SF_multi_prop_t       latent_heat;
   UF_SF_multi_prop_t       phase_temperature;
   UF_SF_multi_prop_t       phase_temperature_range;
   UF_SF_multi_prop_t       phase_specific_heat;
   UF_SF_multi_prop_t       ir_scattering_coeff;
   UF_SF_multi_prop_t       solar_scattering_coeff;
   UF_SF_multi_prop_t       ir_extinction_coeff;
   UF_SF_multi_prop_t       solar_extinction_coeff;
   UF_SF_multi_prop_t       electrical_resistivity;
   UF_SF_multi_prop_t       max_stress_tension;
   UF_SF_multi_prop_t       max_stress_compression;
   UF_SF_multi_prop_t       max_in_plane_shear_stress;
   UF_SF_multi_prop_t       max_strain_tension;
   UF_SF_multi_prop_t       max_strain_compression;
   UF_SF_multi_prop_t       max_in_plane_shear_strain;
   UF_SF_multi_prop_t       tsai_wu_interaction;
   UF_SF_multi_prop_t       damping_coeff;
};
typedef struct UF_SF__isotropic_s UF_SF__isotropic_t;

struct UF_SF__anisotropic_s
{
   UF_SF_multi_prop_t       G  [6] [6];
   UF_SF_multi_prop_t       mass_density;
   UF_SF_multi_prop_t       thermal_coeff  [6];
   UF_SF_multi_prop_t       reference_temperature;
   UF_SF_multi_prop_t       thermal_conduct [3][3];
   UF_SF_multi_prop_t       specific_heat;
   UF_SF_multi_prop_t       damping_coeff;
};
typedef struct UF_SF__anisotropic_s UF_SF__anisotropic_t;

struct UF_SF__orthotropic_s
{
   UF_SF_multi_prop_t       youngs_modulus  [3];
   UF_SF_multi_prop_t       poissons_ratio  [3];
   UF_SF_multi_prop_t       mass_density;
   UF_SF_multi_prop_t       shear_modulus   [3];
   UF_SF_multi_prop_t       thermal_coeff   [3];
   UF_SF_multi_prop_t       reference_temperature;
   UF_SF_multi_prop_t       thermal_conduct [3];
   UF_SF_multi_prop_t       specific_heat;
   UF_SF_multi_prop_t       latent_heat;
   UF_SF_multi_prop_t       phase_temperature;
   UF_SF_multi_prop_t       phase_temperature_range;
   UF_SF_multi_prop_t       phase_specific_heat;
   UF_SF_multi_prop_t       ir_scattering_coeff;
   UF_SF_multi_prop_t       solar_scattering_coeff;
   UF_SF_multi_prop_t       ir_extinction_coeff;
   UF_SF_multi_prop_t       solar_extinction_coeff;
   UF_SF_multi_prop_t       electrical_resistivity;
   UF_SF_multi_prop_t       max_stress_tension[3];
   UF_SF_multi_prop_t       max_stress_compression[3];
   UF_SF_multi_prop_t       max_in_plane_shear_stress;
   UF_SF_multi_prop_t       max_strain_tension[3];
   UF_SF_multi_prop_t       max_strain_compression[3];
   UF_SF_multi_prop_t       max_in_plane_shear_strain;
   UF_SF_multi_prop_t       tsai_wu_interaction;
   UF_SF_multi_prop_t       damping_coeff;
};
typedef struct UF_SF__orthotropic_s UF_SF__orthotropic_t;

struct UF_SF__fluid_s
{
   UF_SF_multi_prop_t       mass_density;
   UF_SF_multi_prop_t       thermal_conduct;
   UF_SF_multi_prop_t       thermal_coeff;
   UF_SF_multi_prop_t       dynamic_viscosity;
   UF_SF_multi_prop_t       specific_heat_pressure;
   UF_SF_multi_prop_t       gas_constant;
   UF_SF_multi_prop_t       bulk_modulus;
   UF_SF_multi_prop_t       sound_speed;
   UF_SF_multi_prop_t       damping_coeff;
   UF_SF_multi_prop_t       molar_mass;
};
typedef struct UF_SF__fluid_s UF_SF__fluid_t;

union UF_SF_material_prop_u
{
   UF_SF__isotropic_t   isotropic;
   UF_SF__anisotropic_t anisotropic;
   UF_SF__orthotropic_t orthotropic;
   UF_SF__fluid_t       fluid;
};
typedef union UF_SF_material_prop_u  UF_SF_material_prop_t,
                                   *UF_SF_material_prop_p_t;

struct UF_SF_material_formability_s
{
   UF_SF_multi_prop_t       work_hardening;
   UF_SF_multi_prop_t       flc;
   UF_SF_multi_prop_t       stress_strain_curve;
};
typedef struct UF_SF_material_formability_s UF_SF_material_formability_prop_t,
                                          *UF_SF_material_formability_prop_p_t;

struct UF_SF_material_strength_s
{
   UF_SF_multi_prop_t       yield;
   UF_SF_multi_prop_t       ultimate_tensile;
};
typedef struct UF_SF_material_strength_s UF_SF_material_strength_prop_t,
                                       *UF_SF_material_strength_prop_p_t;
struct UF_SF_material_fatigue_s
{
   UF_SF_multi_prop_t       fatigue_strength_coef;
   UF_SF_multi_prop_t       fatigue_strength_exp;
   UF_SF_multi_prop_t       fatigue_ductility_coef;
   UF_SF_multi_prop_t       fatigue_ductility_exp;
};
typedef struct UF_SF_material_fatigue_s UF_SF_material_fatigue_prop_t,
                                       *UF_SF_material_fatigue_prop_p_t;
#define UF_SF_MATERIAL_LABELS                                               \
   /* Isotropic items.                                         */          \
   LABEL_TEXT i_mass_density_label      = "Mass Density";                  \
   LABEL_TEXT i_reference_temp_label    = "Reference Temperature";         \
   LABEL_TEXT i_plastic_strain_label    = "Plastic Strain Ratio";          \
   /*                    */       \
   LABEL_TEXT i_youngs_label            = "Young`s Modulus";               \
   LABEL_TEXT i_poisson_label           = "Poisson`s Ratio";               \
   LABEL_TEXT i_shear_mod_label         = "Shear Modulus";                 \
   LABEL_TEXT i_therm_coeff_label       = "Thermal Expansion Coefficient"; \
   LABEL_TEXT i_therm_conduct_label     = "Thermal Conductivity";          \
   LABEL_TEXT i_specific_heat_label     = "Specific Heat";                 \
   LABEL_TEXT i_latent_heat_label                      = "Latent Heat"; \
   LABEL_TEXT i_phase_temperature_label         = "Phase Change Temperature"; \
   LABEL_TEXT i_phase_temperature_range_label   = "Phase Change Temperature Range"; \
   LABEL_TEXT i_phase_specific_heat_label = "Specific Heat above Phase Change"; \
   LABEL_TEXT i_ir_scattering_coeff_label    = "IR Scattering Coefficient"; \
   LABEL_TEXT i_solar_scattering_coeff_label = "Solar Scattering Coefficient"; \
   LABEL_TEXT i_ir_extinction_coeff_label    = "IR Extinction Coefficient"; \
   LABEL_TEXT i_solar_extinction_coeff_label = "Solar Extinction Coefficient"; \
   LABEL_TEXT i_electrical_resistivity_label = "Electrical Resistivity";   \
   LABEL_TEXT i_yield_label                  = "Yield Strength";                \
   LABEL_TEXT i_ultimate_tensile_label       = "Ultimate Tensile Strength";              \
   LABEL_TEXT i_max_stress_tension_label     = "Max Allowable Stress in Tension";        \
   LABEL_TEXT i_max_stress_compression_label = "Max Allowable Stress in Compression";    \
   LABEL_TEXT i_max_in_plane_shear_stress_label = "Max Allowable in plane Shear Stress"; \
   LABEL_TEXT i_max_strain_tension_label     = "Max Allowable Strain in Tension";        \
   LABEL_TEXT i_max_strain_compression_label = "Max Allowable Strain in Compression";    \
   LABEL_TEXT i_max_in_plane_shear_strain_label = "Max Allowable in plane Shear Strain"; \
   LABEL_TEXT i_tsai_wu_interaction_label    = "Tsai-Wu Interaction Coefficient (F12)";     \
   LABEL_TEXT i_damping_coeff_label          = "Damping Coefficient";           \
   LABEL_TEXT i_work_harden_label            = "Work Hardening";                \
   LABEL_TEXT i_forming_limit_label          = "Forming Limit";                 \
   LABEL_TEXT i_stress_strain_label          = "Stress/Strain";                 \
   LABEL_TEXT i_fatigue_strength_coef_label  = "Fatigue Strength Coefficient";  \
   LABEL_TEXT i_fatigue_strength_exp_label   = "Fatigue Strength Exponent";     \
   LABEL_TEXT i_fatigue_ductility_coef_label = "Fatigue Ductility Coefficient"; \
   LABEL_TEXT i_fatigue_ductility_exp_label  = "Fatigue Ductility Exponent";    \
                                                                           \
   /* Orthotropic items.                                       */          \
   LABEL_TEXT o_mass_density_label      = "Mass Density";                  \
   LABEL_TEXT o_reference_temp_label    = "Reference Temperature";         \
   /*                    */       \
   LABEL_TEXT o_youngs_label            = "Young`s Modulus";               \
   LABEL_TEXT o_poisson_label           = "Poisson`s Ratio";               \
   LABEL_TEXT o_shear_mod_label         = "Shear Modulus";                 \
   LABEL_TEXT o_therm_coeff_label       = "Thermal Expansion Coefficient"; \
   LABEL_TEXT o_therm_conduct_label     = "Thermal Conductivity";          \
   LABEL_TEXT o_specific_heat_label     = "Specific Heat";                 \
   LABEL_TEXT o_latent_heat_label             = "Latent Heat";             \
   LABEL_TEXT o_phase_temperature_label       = "Phase Change Temperature"; \
   LABEL_TEXT o_phase_temperature_range_label = "Phase Change Temperature Range"; \
   LABEL_TEXT o_phase_specific_heat_label    = "Specific Heat above Phase Change"; \
   LABEL_TEXT o_ir_scattering_coeff_label    = "IR Scattering Coefficient";        \
   LABEL_TEXT o_solar_scattering_coeff_label = "Solar Scattering Coefficient";     \
   LABEL_TEXT o_ir_extinction_coeff_label    = "IR Extinction Coefficient";        \
   LABEL_TEXT o_solar_extinction_coeff_label = "Solar Extinction Coefficient";     \
   LABEL_TEXT o_electrical_resistivity_label = "Electrical Resistivity";           \
   LABEL_TEXT o_max_stress_tension_label     = "Max Stress in Tension";     \
   LABEL_TEXT o_max_stress_compression_label = "Max Stress in Compression"; \
   LABEL_TEXT o_max_in_plane_shear_stress_label = "Max in plane Shear Stress"; \
   LABEL_TEXT o_max_strain_tension_label     = "Max Strain in Tension";     \
   LABEL_TEXT o_max_strain_compression_label = "Max Strain in Compression"; \
   LABEL_TEXT o_max_in_plane_shear_strain_label = "Max in plane Shear Strain"; \
   LABEL_TEXT o_tsai_wu_interaction_label = "Tsai-Wu Interaction Coefficient (F12)";  \
   LABEL_TEXT o_damping_coeff_label = "Damping Coefficient";                          \
                                                                           \
   /* Anisotropic items.                                       */          \
   LABEL_TEXT mass_density_label        = "Mass Density";                  \
   LABEL_TEXT reference_temp_label      = "Reference Temperature";         \
   LABEL_TEXT shear_moduli_label        = "Material Moduli";               \
   LABEL_TEXT therm_expan_coeff_label   = "Thermal Expansion Coefficient"; \
   LABEL_TEXT therm_conduct_label       = "Thermal Conductivity";          \
   LABEL_TEXT specific_heat_label       = "Specific Heat";                 \
   LABEL_TEXT damping_coeff_label       = "Damping Coefficient";           \
                                                                           \
   /* Fluid items. */                                                      \
   LABEL_TEXT f_mass_density_label    = "Mass Density";                    \
   LABEL_TEXT f_therm_conduct_label   = "Thermal Conductivity";            \
   LABEL_TEXT f_therm_coeff_label     = "Thermal Expansion Coefficient";   \
   LABEL_TEXT f_dynamic_visc_label    = "Dynamic Viscosity";               \
   LABEL_TEXT f_spec_heat_press_label = "Specific Heat Constant Pressure"; \
   LABEL_TEXT f_gas_constant_label    = "Gas Constant";                    \
   LABEL_TEXT f_bulk_modulus_label    = "Bulk Modulus";                    \
   LABEL_TEXT f_sound_speed_label     = "Speed of Sound";                  \
   LABEL_TEXT f_damping_coeff_label   = "Damping Coefficient";             \
   LABEL_TEXT f_molar_mass_label      = "Molar Mass";

enum UF_SF_library_material_e
{
   UF_SF_MATL_IS_READ_ONLY,        /* User not allowed to edit in NX. */
   UF_SF_MATL_IS_EDITABLE          /* User allowed to edit within NX. */
};
typedef enum UF_SF_library_material_e  UF_SF_library_material_t,
                                     *UF_SF_library_material_p_t;

enum UF_SF_mesh_geom_usage_e
{
   UF_SF_GEOM_ANY,           /* all geometry                          */
   UF_SF_GEOM_HARD,          /* hard geometry                         */
   UF_SF_GEOM_CONNECT_A,     /* group1 geometry                       */
   UF_SF_GEOM_CONNECT_B      /* group2 geometry                       */
};
typedef enum UF_SF_mesh_geom_usage_e  UF_SF_mesh_geom_usage_t,
                                     *UF_SF_mesh_geom_usage_p_t;

enum UF_SF_edge_density_type_e
{
 UF_SF_EDGE_DENSITY_SIZE,    /* Edge density defined by elm size      */
 UF_SF_EDGE_DENSITY_NUMBER,  /* Edge density defined by number of elms. */
 UF_SF_EDGE_DENSITY_SMART = 4,  /* Edge density defined by smart option. */
 UF_SF_NOT_EDGE_DENSITY_DEFINED /* Edge density not defined. */
};
typedef enum UF_SF_edge_density_type_e  UF_SF_edge_density_type_t,
                                      *UF_SF_edge_density_type_p_t;


/* The definition method for numeric values.                            */
enum UF_SF_numeric_method_e
{
 UF_SF_NUMERIC,              /* Numeric value                        */
 UF_SF_EXPRESSION            /* Expression string used.              */
};
typedef enum UF_SF_numeric_method_e  UF_SF_numeric_method_t,
                                   *UF_SF_numeric_method_p_t;


/* The smart point definition method.                                   */
enum UF_SF_HPT_method_e
{
   UF_SF_HPT_NO_METHOD,          /* Smart point created with no method. */
   UF_SF_HPT_ON_CURVE,           /* Smart point created on curve. */
   UF_SF_HPT_BASEPT_AND_OFFSET,  /* Smart point created as offset to some base
                                    point. */

   UF_SF_HPT_CENTER_OF_CONIC,    /* Smart point created at the center of a
                                    conic. */

   UF_SF_HPT_CURVE_INTERSECTION, /* Smart point created at the intersection of
                                    two curves. */

   UF_SF_HPT_ON_SURFACE          /* Smart point created on a surface. */
};
typedef enum UF_SF_HPT_method_e  UF_SF_HPT_method_t,
                               *UF_SF_HPT_method_p_t;

/* The 0d mesher element types.                                         */
enum UF_SF_0D_element_type_e
{
   UF_SF_0D_CONMASS = (int)UF_SF_CMASS /* 0D element type - concentrated mass. */
};
typedef enum UF_SF_0D_element_type_e  UF_SF_0D_element_type_t,
                                    *UF_SF_0D_element_type_p_t;


/* The 0d mesher element density.                                       */
enum UF_SF_0D_density_type_e
{
   UF_SF_0D_EDGE_DENSITY_SIZE,     /* Edge density given as size of the
                                      elements. */

   UF_SF_0D_EDGE_DENSITY_NUMBER,   /* Edge density given as number of the
                                      elements. */

   UF_SF_0D_EDGE_DENSITY_SMART = 4
};
typedef enum UF_SF_0D_density_type_e  UF_SF_0D_density_type_t,
                                    *UF_SF_0D_density_type_p_t;

/* The 1d mesher element types.                                         */
enum UF_SF_1D_element_type_e
{
   UF_SF_1D_SPRING_TYPE = (int)UF_SF_SPRING,   /* Spring elements. */
   UF_SF_1D_BAR_TYPE = (int)UF_SF_BAR,         /* Bar elements. */
   UF_SF_1D_BEAM_TYPE = (int)UF_SF_BEAM,       /* Beam elements. */
   UF_SF_1D_ROD_TYPE = (int)UF_SF_ROD,         /* Rod elements. */
   UF_SF_1D_RIGID_TYPE = (int)UF_SF_RBE2       /* Rigid link elements. */
};
typedef enum UF_SF_1D_element_type_e  UF_SF_1D_element_type_t,
                                    *UF_SF_1D_element_type_p_t;


/* The 1d mesher element density.                                       */
enum UF_SF_1D_density_type_e
{
   UF_SF_1D_EDGE_DENSITY_SIZE,      /* Edge density given as a size of the
                                       elements. */

   UF_SF_1D_EDGE_DENSITY_NUMBER,    /* Edge density given as number of the
                                       elements. */

   UF_SF_1D_EDGE_DENSITY_SMART = 4

};
typedef enum UF_SF_1D_density_type_e  UF_SF_1D_density_type_t,
                                    *UF_SF_1D_density_type_p_t;


/* The ifndef is used because this definition is used in uf_sf_retiring.h
* because including this .h file in uf_sf_retiring.h causes massive recompile
* issues - P. Benson 11/22/2004 */

#ifndef  UF_SF_LOAD_MODE_T__H_INCLUDED
#define  UF_SF_LOAD_MODE_T__H_INCLUDED

/* The Load functions mode_type parameter.                              */
enum UF_SF_load_mode_e
{
   UF_SF_LOAD_FORCE =  1,         /* Force. */
   UF_SF_LOAD_DISTRIBUTED =  2,   /* Uniform pressure, applicable only normal
                                     to the face. */

   UF_SF_LOAD_SPACIAL =  3,
   UF_SF_LOAD_GRAVITY =  4,       /* Gravity load. */
   UF_SF_LOAD_PRESSURE =  5,      /* Pressure load, can be appied in any
                                     direction. */

   UF_SF_LOAD_MOMENT =  6,        /* Moment. */
   UF_SF_LOAD_SHEAR =  7,         /* Edge shear. */
   UF_SF_LOAD_FLUX =  8,          /* Heat flux. */
   UF_SF_LOAD_TEMPERATURE =  9,  /* Temperature load. */
   UF_SF_LOAD_CENTRIFUGAL = 10,    /* Centrifugal load. */
   UF_SF_LOAD_TORQUE = 11,         /* Torque */
   UF_SF_LOAD_BEARING = 12,         /* Bearing */

   UF_SF_LOAD_UNKNOWN_MODE = -99999   /* Unknown load mode type */
};
typedef enum UF_SF_load_mode_e  UF_SF_load_mode_t,
                              *UF_SF_load_mode_p_t;
#endif  /* UF_SF_LOAD_MODE_T__H_INCLUDED */

/* The Load functions load_class parameter.                             */
enum UF_SF_load_class_e
{
   UF_SF_LOAD_NODE_ELEMENT_CLASS = 1,  /* Load applied on a node. */
   UF_SF_LOAD_EDGE_ELEMENT_CLASS = 2,  /* Load applied on an edge. */
   UF_SF_LOAD_FACE_CLASS = 3,          /* Load applied on a face. */
   UF_SF_LOAD_PART_CLASS = 4,          /* Load applied to the whole part. */
   UF_SF_LOAD_BODY_CLASS = 5,          /* Load applied on a body. */
   UF_SF_LOAD_CURVE_CLASS = 6          /* Load applied on a curve. */
};
typedef enum UF_SF_load_class_e  UF_SF_load_class_t,
                               *UF_SF_load_class_p_t;

/* The BC functions class parameter.                                    */
enum UF_SF_bc_class_e
{
   UF_SF_BC_ERROR_CLASS = -1, /* To indicate error */
   UF_SF_BC_NODE_ELEMENT_CLASS = 1, /* BC applied on a node. */
   UF_SF_BC_EDGE_ELEMENT_CLASS = 2, /* BC applied on an edge. */
   UF_SF_BC_FACE_CLASS = 3,         /* BC applied on a face. */
   UF_SF_BC_CURVE_CLASS = 4         /* BC applied on a curve. */
};
typedef enum UF_SF_bc_class_e  UF_SF_bc_class_t,
                             *UF_SF_bc_class_p_t;


/* The Load functions load_disp_symbol parameter.                       */
enum UF_SF_load_disp_symbol_e
{
   UF_SF_LOAD_SINGLE_HEADED_ARROW = 1,
   UF_SF_LOAD_DOUBLE_HEADED_ARROW = 2,
   UF_SF_LOAD_HALF_ARROW = 3,
   UF_SF_LOAD_Q_ARROW = 4,
   UF_SF_BC_PYRAMID = 101,
   UF_SF_BC_ARROW = 102,
   UF_SF_BC_DOUBLE_HEADED_ARROW = 103,
   UF_SF_BC_SMALL_CIRCLE = 104,
   UF_SF_BC_SMALL_ARROW = 105,
   UF_SF_BC_S_ON_ENTITY = 106,
   UF_SF_BC_M_ON_ENTITY = 107
};
typedef enum UF_SF_load_disp_symbol_e  UF_SF_load_disp_symbol_t,
                                     *UF_SF_load_disp_symbol_p_t;



/* The ifndef is used because this definition is used in uf_sf_retiring.h
* because including this .h file in uf_sf_retiring.h causes massive recompile
* issues - P. Benson 11/22/2004  */

#ifndef  UF_SF_LBC_COMPONENT_TYPE_T__H_INCLUDED
#define  UF_SF_LBC_COMPONENT_TYPE_T__H_INCLUDED

/* The Load functions component_type parameter.                         */
enum UF_SF_LBC_component_type_e
{
   UF_SF_NULL_COMP = -1,
   UF_SF_LBC_XYZ = 0,   /* Having XYZ components - rectangular coordinates. */
   UF_SF_LBC_RTZ,       /* Having RTZ components - Cylindrical coordinates. */
   UF_SF_LBC_RTP,       /* Having RTP components - Spherical coordinates. */
   UF_SF_LBC_NORMAL_TO, /* Applicable normal to a face only. */
   UF_SF_LBC_EDGE_CSYS  /* Applicable along an edge only. */
};
typedef enum UF_SF_LBC_component_type_e  UF_SF_LBC_component_type_t,
                                       *UF_SF_LBC_component_type_p_t;
#endif  /* UF_SF_LBC_COMPONENT_TYPE_T__H_INCLUDED */

enum UF_SF_load_dimension_e
{
   UF_SF_NULL_LOAD = 0,    /* Load value is 0. */
   UF_SF_SCALAR_LOAD,      /* Load is a scalar - temperature. */
   UF_SF_VECTOR_LOAD,      /* Having RTP components - Spherical coordinates. */
   UF_SF_AXIS_LOAD         /* Applicable normal to a face only. */
};
typedef enum UF_SF_load_dimension_e  UF_SF_load_dimension_t,
                                   *UF_SF_load_dimention_p_t;

/* The ifndef is used because this definition is used in uf_sf_retiring.h
* because including this .h file in uf_sf_retiring.h causes massive recompile
* issues - P. Benson 11/22/2004 */

#ifndef  UF_SF_BC_MODE_T__H_INCLUDED
#define  UF_SF_BC_MODE_T__H_INCLUDED

/* The BC functions mode parameter.                                     */
enum UF_SF_bc_mode_e
{
   UF_SF_BC_CONSTRAINT = 1,            /* Both linear displacement and rotation
                                          are available. */

   UF_SF_BC_DISPLACEMENT = 2,          /* Only displacement is available,
                                          rotation is free. */

   UF_SF_BC_ROTATION = 3,              /* Only rotation is available,
                                          displacement is free. */

   UF_SF_BC_TEMPERATURE = 4,           /* Temperature BC is available. */
   UF_SF_BC_CONVECTION_COEFFICIENT = 5,/* Convection coefficient BC is
                                          available. */


   UF_SF_BC_UNKNOWN_MODE = -99999      /* Unknown BC mode type */
};
typedef enum UF_SF_bc_mode_e  UF_SF_bc_mode_t,
                            *UF_SF_bc_mode_p_t;
#endif  /* UF_SF_BC_MODE_T__H_INCLUDED */

/* The Durability Event mode parameter.                                     */
enum UF_SF_dur_event_mode_e
{
   UF_SF_DUR_EVENT_STATIC = 1    /* Currently we only have Static Durability Events */
};
typedef enum UF_SF_dur_event_mode_e  UF_SF_dur_event_mode_t,
                            *UF_SF_dur_event_mode_p_t;

/* geometry types */
enum UF_SF_mesh_geometry_types_e
{
   UF_SF_GEOM_OTHER,  /* Geometry does not fall into any of the categories
                         listed below. */

   UF_SF_GEOM_ASSEM,  /* Geometry is an assembly. */
   UF_SF_GEOM_COMPON, /* Geometry is a component. */
   UF_SF_GEOM_OCC,    /* Geometry is an occurrence. */
   UF_SF_GEOM_BODY,   /* Geometry is a body. */
   UF_SF_GEOM_FACE,   /* Geometry is a face. */
   UF_SF_GEOM_EDGE,   /* Geometry is an edge. */
   UF_SF_GEOM_SURF ,   /* Geometry is a surface. */
   UF_SF_GEOM_CURVE,   /* Geometry is a curve. */
   UF_SF_GEOM_POINT,  /* Geometry is a point. */
   UF_SF_GEOM_VERTEX,  /* Geometry is a vertex. */
   UF_SF_GEOM_COMPOSITE_BODY, /* Geometry is a composite body */
   UF_SF_GEOM_COMPOSITE_FACE, /* Geometry is a composite face */
   UF_SF_GEOM_COMPOSITE_EDGE  /* Geometry is a composite edge */
};
typedef enum UF_SF_mesh_geometry_types_e  UF_SF_mesh_geometry_types_t,
                                        *UF_SF_mesh_geometry_types_p_t;


/* Names of each type shown to the user. */
#define UF_SF_LANG_ANALYSIS_STRUCTURAL_STR              "Structural"
#define UF_SF_LANG_ANALYSIS_THERMAL_STR                 "Thermal"
#define UF_SF_LANG_ANALYSIS_FLOW_STR                    "Flow"
#define UF_SF_LANG_ANALYSIS_COUPLED_STR                 "Coupled"
#define UF_SF_LANG_ANALYSIS_MAPPING_STR                 "Mapping"

enum UF_SF_LANG_analysis_type_e
{
   UF_SF_LANG_ANALYSIS_UNKNOWN    = 0,     /* unknown language type */
   UF_SF_LANG_ANALYSIS_STRUCTURAL = 1,     /* Structural analysis */
   UF_SF_LANG_ANALYSIS_THERMAL = 2,        /* Thermal analysis */
   UF_SF_LANG_ANALYSIS_FLOW = 3,           /* CFD analysis */
   UF_SF_LANG_ANALYSIS_COUPLED = 4,        /* Flow-Thermal analysis */
   UF_SF_LANG_ANALYSIS_MAPPING = 5         /* Mapping analysis */
};
typedef enum UF_SF_LANG_analysis_type_e  UF_SF_LANG_analysis_type_t,
                                       *UF_SF_LANG_analysis_type_p_t;

/* Names of each type shown to the user. */
#define UF_SF_LANG_ANALYSIS_SIMPLE_STR          "Simple"
#define UF_SF_LANG_ANALYSIS_AXISYM_STR          "Axisymmetric"

enum UF_SF_LANG_problem_abstract_e
{
   UF_SF_LANG_SIMPLE_PROB_ABSTRACT = 1,
   UF_SF_LANG_AXISYM_PROB_ABSTRACT = 2
};
typedef enum UF_SF_LANG_problem_abstract_e  UF_SF_LANG_problem_abstract_t,
                                          *UF_SF_LANG_problem_abstract_p_t;

/* Names of each type shown to the user. */
#define UF_SF_LANG_ANALYSIS_LINEAR_STR          "Linear"
#define UF_SF_LANG_ANALYSIS_NONLINEAR_STR       "Non-Linear"

enum UF_SF_LANG_linearity_e
{
   UF_SF_LANG_LINEAR_LINEARITY = 1,
   UF_SF_LANG_NONLINEAR_LINEARITY = 2
};
typedef enum UF_SF_LANG_linearity_e  UF_SF_LANG_linearity_t,
                                   *UF_SF_LANG_linearity_p_t;

/* Names of each type shown to the user. */
#define UF_SF_LANG_ANALYSIS_STEADY_STR          "Steady-state"

enum UF_SF_LANG_time_depend_e
{
   UF_SF_LANG_STEADY_TIME_DEPEND = 1  /* Analysis will be steady-state. */
};
typedef enum UF_SF_LANG_time_depend_e  UF_SF_LANG_time_depend_t,
                                     *UF_SF_LANG_time_depend_p_t;


#define  UF_SF__MAX_EXP_TAGS 10

/***********************************************************************
      This Structure contains the data required to define/describe
      a beam/bar section.  Sections are define in the YZ plane.
**********************************************************************/

struct UF_SF_section_data_s
{
   UF_SF_section_type_t type; /* indicates the type of section described,
                                 UF_SF_SECTION_TWREC = Thin wall, rectangle
                                 UF_SF_SECTION_TWCYL = Thin wall, cylinder
                                 UF_SF_SECTION_TWCHA = Thin wall, channel
                                 UF_SF_SECTION_TWHAT = Thin wall, hat
                                 UF_SF_SECTION_TWIBE = Thin wall, I beam
                                 UF_SF_SECTION_SOCYL = Solid, cylinder
                                 UF_SF_SECTION_SOREC = Solid, rectangle
                                 UF_SF_SECTION_KEYIN = User defined
                                 UF_SF_SECTION_USER_TW
                                                     = User Defined TW
                                 UF_SF_SECTION_USER_SOLID
                                                     = User Defined Solid*/

   double origin[3]; /* Location of section origin */
   double x_dir[3]; /* Orientation of sections x directions (along elm) */
   double y_dir[3]; /* Orientation of sections y directions
                       z_dir = x_dir X y_dir */

   logical offset_set[3]; /* Indicates if the coresponding offset was
                             set (TRUE) or was given the default (FALSE).
                            [0] == x offset of section, always = FALSE */

   double offset[3]; /* (y,z) offset of section
                        [0] == x offset of section, always = 0.0 */

   tag_t geometry;     /* Tag of geometry on which section is defined
                            (i.e the curve tag along which beams are defined
                            in the case where elements are created between
                            geometry "geometry" will be the mesh_recipe. */

   tag_t exp_tag[UF_SF__MAX_EXP_TAGS]; /* An array of tags to Expression
                                          defining the sections dimension or
                                          section properties depending on
                                          the type of section */

};
typedef struct UF_SF_section_data_s  UF_SF_section_data_t,
                                   *UF_SF_section_data_p_t;

/************************************************************************
      This Structure contains the data required to define the edge
      density for a curve/edge object
************************************************************************/

struct UF_SF_edge_density_data_s
{
   UF_SF_edge_density_type_t type; /* indicates the type of density (size or
                                      number). */

   double size; /* The number of elements on the edge/curve is calculated
                   automatically from the length of the edge/curve and the
                   element size. If this option is set, the value of number
                   is disregarded. */

   int number; /* The number of elements on the edge/curve is calculated
                  automatically from the length of the edge/curve and the
                  element size. If this option is set, the value of number is
                  disregarded. */

};
typedef struct UF_SF_edge_density_data_s  UF_SF_edge_density_data_t,
                                        *UF_SF_edge_density_data_p_t;

/**************************************************************************
      This structure contains the data required to define/describe
      a smart point.
**************************************************************************/

struct UF_SF_HPT_location_data_s
{
   UF_SF_HPT_method_t method; /* Indicates the how the smart point is defined.
                                 UF_SF_HPT_ON_CURVE
                                 UF_SF_HPT_BASEPT_AND_OFFSET
                                 UF_SF_HPT_CENTER_OF_CONIC
                                 UF_SF_HPT_CURVE_INTERSECTION
                                 UF_SF_HPT_ON_SURFACE */

   UF_SF_section_type_t type; /* How the base is defined:
                                 UF_SF_numeric_method_t. */

   double origin[3]; /* Location of base point
                        when baseMethod = UF_SF_NUMERIC. */

   double x_dir[3]; /* when baseMethod = UF_SF_EXPRESSION. */
   double y_dir[3]; /* How the offset is defined:
                       when method = SFEM_HPT_BASEPT_AND_OFFSET */

   logical offset_set[3]; /* Offset vector,
                             when baseMethod = UF_SF_NUMERIC. */

   double offset[3]; /* Offset vector, when baseMethod = UF_SF_EXPRESSION. */
   tag_t geometry; /* First object tag.
                      Curve tag when method = SFEM_HPT_ON_CURVE
                      First curve tag when method = SFEM_HPT_CURVE_INTERSECTION
                      Conic tag when method = SFEM_HPT_CENTER_OF_CONIC */

   tag_t exp_tag[UF_SF__MAX_EXP_TAGS]; /* Seconde curve tag when method
                                            = SFEM_HPT_CURVE_INTERSECTION */

};
typedef struct UF_SF_HPT_location_data_s  UF_SF_HPT_location_data_t,
                                        *UF_SF_HPT_location_data_p_t;

/*  Element types supported by Auto Solid Mesher  */
enum UF_SF_asm_element_types_e
{
   UF_SF_ASM_SYSTEM_DEFAULT_TYPE = 0,  /* System default. */
   UF_SF_ASM_TETRA,                    /* Elements are tetrahedral. */
   UF_SF_ASM_TETRA_10                  /* Elements are tetrahedral with 10
                                          nodes. */

};
typedef enum UF_SF_asm_element_types_e UF_SF_asm_element_types_t;


/*  Auto Solid Mesher contact types  */
enum UF_SF_contact_types_e
{
   UF_SF_ASM_FIXED = 0,
   UF_SF_ASM_FREE
};
typedef enum UF_SF_contact_types_e UF_SF_contact_types_t;


/*********************** ASM attributes and parameters ************************/

/* Mesh attributes related to model geometry */
struct  UF_SF_asm_mesh_attributes_data_s
{
   double              max_elem_size;  /*  Maximum Element Size        */
   double              min_elem_size;  /*  Minimum Element Size        */
   int                 check_aspect_ratio;     /*  0 = OFF  , 1 = ON   */
   double              aspect_ratio;   /*  Aspect ratio value > 0.     */
   int                 curvature_control;      /*  0 = OFF  , 1 = ON   */
   double              curvature_factor;       /*  Curvature value > 0.*/
   int                 small_feature_control;  /*  0 = OFF  , 1 = ON   */
   double              small_feature_factor;   /*  Feature factor value > 0. */
   UF_SF_contact_types_t  contact_type;        /*  FIXED or FREE       */
};
typedef struct  UF_SF_asm_mesh_attributes_data_s
                                            UF_SF_asm_mesh_attributes_data_t,
                                           *UF_SF_asm_mesh_attributes_data_p_t;

/* Parameters unique to the Auto Solid Mesher */
struct UF_SF_asm_mesh_parameters_data_s
{
   UF_SF_asm_element_types_t  element_type;    /*  TETRA or TETRA_10   */
   double              def_elem_size;          /*  Default Element Size*/
   int                 model_augmentation;     /*  0 = OFF  , 1 = ON   */
   int                 surface_smoothing;      /*  0 = OFF  , 1 = ON   */
   int                 explicit_smoothing;     /*  0 = OFF  , 1 = ON   */
   int                 midnode_snapping;       /*  0 = OFF  , 1 = ON   */
};
typedef struct UF_SF_asm_mesh_parameters_data_s
                                            UF_SF_asm_mesh_parameters_data_t,
                                           *UF_SF_asm_mesh_parameters_data_p_t;

/* Mesh attributes and parameters structure */
struct UF_SF_asm_mesh_data_s
{
   UF_SF_asm_mesh_attributes_data_p_t  attribs;
   UF_SF_asm_mesh_parameters_data_p_t  params;

};
typedef struct UF_SF_asm_mesh_data_s  UF_SF_asm_mesh_data_t,
                                    *UF_SF_asm_mesh_data_p_t;

/*  Element types supported by Aries Tet Mesher  */
enum UF_SF_atm_element_types_e
{
   UF_SF_ATM_SYSTEM_DEFAULT_TYPE = 0, /* Element will be system default,
                                         either tet4 or tet10, depending on the
                                         enviroment. */

   UF_SF_ATM_TETRA,                   /* Element will be tetrahedral, with 4
                                         nodes. */

   UF_SF_ATM_TETRA_10                 /* Element will be tetrahedral, with 10
                                         nodes. */

};
typedef enum UF_SF_atm_element_types_e UF_SF_atm_element_types_t;

/*  Aries Tet Mesher edge shapes  */
enum UF_SF_atm_edge_shape_types_e
{
   UF_SF_ATM_LINEAR = 0, /* Type of element is linear. */
   UF_SF_ATM_CURVED,     /* Type of element is curved. */
   UF_SF_ATM_MIXED       /* Both curved and linear elements can form. */
};
typedef enum UF_SF_atm_edge_shape_types_e UF_SF_atm_edge_shape_types_t;



/********************************* ATM parameters *****************************/


struct UF_SF_atm_mesh_parameters_data_s
{
   UF_SF_atm_element_types_t     element_type;   /*  TETRA or TETRA_10   */
   UF_SF_atm_edge_shape_types_t  edge_shape;     /*  LINEAR, CURVED or MIXED */
   double                      def_elem_size;    /*  Default Element Size*/
   double                      target_angle;     /*  0. < ang <= 90.     */
   int                         curvature_scaling;/*  1 = OFF  , 0 = ON   */
   int                         auto_constraining;/*  1 = OFF  , 0 = ON   */
   tag_t                       elem_desc_tag; /* element descri(p)tor tag*/
};
typedef struct UF_SF_atm_mesh_parameters_data_s
                                            UF_SF_atm_mesh_parameters_data_t,
                                           *UF_SF_atm_mesh_parameters_data_p_t;

enum UF_SF_sfqm_elem_type_e
{
 UF_SF_SFQM_QUAD4,
 UF_SF_SFQM_TRIA3,
 UF_SF_SFQM_QUAD8,
 UF_SF_SFQM_TRIA6
};
typedef enum UF_SF_sfqm_elem_type_e  UF_SF_sfqm_elem_type_t,
                                   *UF_SF_sfqm_elem_type_p_t;

struct UF_SF_sfqm_param_data_s
{
   double    edge_match_tol; /* Distance tolerance value used to find the
                                matched edges. The distance is measured from
                                the mid point location of one edge to the mid
                                point of the other edge.  The default value
                                is 0.02. */

   double    node_uniq_tol;  /* Specifies the maximum distance allowed between
                                nodes before they are merged when uniqueness
                                testing is active.  The default is 0.0001. */

   double    smooth_tol;     /* Distance in model units from old position to
                                new position for the node moved the farthest
                                during one iteration of the smoothing
                                algorithm.  The default value is 0.01. */

   double    on_surf_tol;    /* Controls the maximum distance in model units
                                that a node created during Scenario Shell
                                Mesher may lie from its closest point on the
                                surface.  The default value is 0.001. */

   int       trans_rows;     /* Allows to control the number of rows that will
                                be used to bridge the gap between elements of
                                different sizes.  The default value is 3. */

};
typedef struct UF_SF_sfqm_param_data_s  UF_SF_sfqm_param_data_t,
                                      *UF_SF_sfqm_param_data_p_t;

struct UF_SF_sfqm_mesh_data_s
{
   UF_SF_sfqm_elem_type_t     elem_type;  /* The type of element chosen. */
   double                  elem_size;     /* The size of the element. */
   int                     smart_edge_seeding;
   UF_SF_sfqm_param_data_p_t  mesh_param_data_p; /* Pointer to the mesh
                                        parameter data structure, containing
                                        the values for the given parameters. */

   int                     format_mesh;  /* 0 = OFF  , 1 = ON      */
   int                     mapped_mesh;         /* 0 = OFF  , 1 = ON      */
   int                     mesh_transition;  /* 0 = OFF  , 1 = ON      */
   int                     mesh_method;  /* 0 = Automatic, 1 = Paver   */
};
typedef struct UF_SF_sfqm_mesh_data_s  UF_SF_sfqm_mesh_data_t,
                                     *UF_SF_sfqm_mesh_data_p_t;

struct UF_SF_1d_mesh_data_s
{
   UF_SF_1D_element_type_t  element_type; /* Type of element for solid meshing.
                                             The following tetrahedral elements
                                             are supported:
                                               UF_SF_ATM_SYSTEM_DEFAULT_TYPE
                                               UF_SF_ATM_TETRA
                                               UF_SF_ATM_TETRA_10 */

   UF_SF_1D_density_type_t  density_type; /* Type of edge density
                                               UF_SF_1D_EDGE_DENSITY_NUMBER
                                               UF_SF_1D_EDGE_DENSITY_SIZE
                                               UF_SF_1D_EDGE_DENSITY_SMART
                                          */

   double                     edge_density; /* Value of edge density. */
   int                        merge_node_option; /* 0 - OFF, 1 - ON */
   double                     node_unique_tol; /* Value of node unique
                                                  tolerance. */

};
typedef struct UF_SF_1d_mesh_data_s  UF_SF_1d_mesh_data_t,
                                   *UF_SF_1d_mesh_data_p_t;

struct UF_SF_ef_conn_info_s
{
   tag_t                element_des_tag; /* Set to NULL_TAG */
   UF_SF_1D_density_type_t  density_type; /* Type of edge density
                                               UF_SF_1D_EDGE_DENSITY_NUMBER
                                               UF_SF_1D_EDGE_DENSITY_SIZE
                                               UF_SF_1D_EDGE_DENSITY_SMART
                                          */

   double               edge_density; /* Value of edge density. */
   int                  mesh_option; /* 0 for Glue mesh
                                        1 for Match mesh */

   int                  num_edges; /* Number of edges */
   tag_p_t              edge_tags; /*  Edge tags array */
   int                  num_faces; /* Number of faces */
   tag_p_t              face_tags; /*  Face tags array */
};
typedef struct UF_SF_ef_conn_info_s UF_SF_ef_conn_info_t,
                                   *UF_SF_ef_conn_info_p_t;


struct UF_SF_contact_mesh_data_s
{
   char  *element_name;                 /* refer to uf_sf_lang_names.h */
   tag_t element_descritor_tag;         /* Set it to NULL_TAG */
   tag_t orient_vector_tag;             /* Set it to NULL_TAG */
   int align_target_edge_node;        /* 0 - Equal Distance
                                          1 - Minimum Distance or Normal To */

   int target_edge_node_align_method; /* 0 - Minimum Distance
                                          1 - Normal To */

   int number_of_elms;                 /* required */
   int gap_tol_option;                 /* 0 - Do not apply tol
                                          1 - Apply gap tolerance */

   double gap_tolerance;               /* Gap tolerance option
                                          0: Don't apply tolerance
                                          1: Apply tolerance
                                       */

   tag_t contact_edge;                 /* Tag of the contact edge. */
   UF_SF_mesh_geom_meshdir_t  contact_edge_mesh_dir;
                                       /* Direction of the mesh for the
                                          contact edge:
                                             UF_SF_MG_MESHDIR_FROM_START
                                             UF_SF_MG_MESHDIR_FROM_END
                                       */

   double contact_edge_start_limit;    /* Limit of edge starting for the
                                          contact edge. */

   double contact_edge_end_limit;      /* Limit of edge ending for the contact
                                          edge. */

   tag_t  target_edge;                 /* Tag of the target edge. */
   UF_SF_mesh_geom_meshdir_t  target_edge_mesh_dir;
                                       /* Direction of the mesh for the target
                                          edge:
                                            UF_SF_MG_MESHDIR_FROM_START
                                            UF_SF_MG_MESHDIR_FROM_END
                                       */

   double target_edge_start_limit;     /* set start limits to 0 and end limits
                                          to 1 to build contact mesh between
                                          entire length of the edges. */

   double target_edge_end_limit;       /* Limit of edge ending for the target
                                          edge. */


};
typedef struct UF_SF_contact_mesh_data_s  UF_SF_contact_mesh_data_t,
                                        *UF_SF_contact_mesh_data_p_t;

struct UF_SF_orientation_data_s
{
   tag_t face_tag;      /* tag of a solid face.
                        The y vector will be defined normal to this face.
                        If this is a NULL_TAG use origin, x_dir, and y_dir
                        to create csys and use it to define y orientation. */

   double origin[3];    /* origin info */
   double x_dir[3];     /* x direction vector */
   double y_dir[3];     /* y direction vector */
};
typedef struct UF_SF_orientation_data_s  UF_SF_orientation_data_t,
                                       *UF_SF_orientation_data_p_t;

struct  UF_SF_section_prop_list_s
{
  int      section_type; /* Type of section:
                              UF_SF_SECTION_TWREC for Thin wall, rectangle
                              UF_SF_SECTION_TWCYL for Thin wall, cylinder
                              UF_SF_SECTION_TWCHA for Thin wall, channel
                              UF_SF_SECTION_TWHAT for Thin wall, hat
                              UF_SF_SECTION_TWIBE for  Thin wall, I beam
                              UF_SF_SECTION_SOCYL for Solid, cylinder
                              UF_SF_SECTION_SOREC for  Solid, rectangle
                              UF_SF_SECTION_KEYIN  for User defined.
                              UF_SF_SECTION_USER_TW forUser Defined TW
                              UF_SF_SECTION_USER_SOLID for User Defined Solid
                          */

  double   bcenter;      /* Breadth of section.                        */
  double   hcenter;      /* Height of section.                         */
  double   thicknesst;   /* Thickness of section.                      */
  double   b1center;     /* Flange breadth of hat & ibeam sections.    */
  double   thicknesstw;  /* Web thickness of ibeam section.            */
  double   radius;       /* Radius of TWCYL and SOCYL sections.        */
  double   area;         /* Area of section.                           */
  double   Izz;          /* Moment of Inertia about x-axis.            */
  double   Iyy;          /* Moment of Inertia about y-axis.            */
  double   Izy;          /* Moment of Inertia about xy-axis.           */
  double   torsion;      /* Torsional coefficient.                     */
  double   warp;         /* Warping coefficient.                       */
  double   y_eccentricity; /* Y Eccentricity.                          */
  double   z_eccentricity; /* Z Eccentricity.                          */
  double   hydro_diameter; /* Hydraulic Diameter of section.           */
  double   perimeter;      /* Perimeter of section.                    */
  double   wall_thickness; /* Wall Thickness of section.               */
};
typedef struct UF_SF_section_prop_list_s  UF_SF_section_prop_list_t,
                                        *UF_SF_section_prop_list_p_t;



  /* General properties of 1D Element Sections.
     First are the numeric values, followed by corresponding expressions
     tags, when any property has an expression.
     If there is no expression, then the tag is NULL_TAG.
   */

struct  UF_SF_section_properties_s
{
  int      section_type; /* Type of section:
                              UF_SF_SECTION_TWREC for Thin wall, rectangle
                              UF_SF_SECTION_TWCYL for Thin wall, cylinder
                              UF_SF_SECTION_TWCHA for Thin wall, channel
                              UF_SF_SECTION_TWHAT for Thin wall, hat
                              UF_SF_SECTION_TWIBE for  Thin wall, I beam
                              UF_SF_SECTION_SOCYL for Solid, cylinder
                              UF_SF_SECTION_SOREC for  Solid, rectangle
                              UF_SF_SECTION_KEYIN  for User defined.
                              UF_SF_SECTION_USER_TW forUser Defined TW
                              UF_SF_SECTION_USER_SOLID for User Defined Solid
                          */

  double   bcenter;      /* Breadth of section.                        */
  double   hcenter;      /* Height of section.                         */
  double   thicknesst;   /* Thickness of section.                      */
  double   b1center;     /* Flange breadth of hat & ibeam sections.    */
  double   thicknesstw;  /* Web thickness of ibeam section.            */
  double   radius;       /* Radius of TWCYL and SOCYL sections.        */
  double   area;         /* Area of section.                           */
  double   Izz;          /* Moment of Inertia about x-axis.            */
  double   Iyy;          /* Moment of Inertia about y-axis.            */
  double   Izy;          /* Moment of Inertia about xy-axis.           */
  double   torsion;      /* Torsional coefficient.                     */
  double   warp;         /* Warping coefficient.                       */
  double   y_eccentricity; /*Y Eccenctricity                           */
  double   z_eccentricity; /*Z Eccenctricity                           */
  double   hydro_diameter; /*Hydraulic Diameter of section.            */
  double   perimeter;      /*Perimeter of section.                     */
  double   wall_thickness; /*Wall Thickness of section.                */
  tag_t    bcenter_exp;  /* Breadth of section.                        */
  tag_t    hcenter_exp;  /* Height of section.                         */
  tag_t    thicknesst_exp; /* Thickness of section.                    */
  tag_t    b1center_exp; /* Flange breadth of hat & ibeam sections.    */
  tag_t    thicknesstw_exp; /* Web thickness of ibeam section.         */
  tag_t    radius_exp;   /* Radius of TWCYL and SOCYL sections.        */
  tag_t    area_exp;     /* Area of section.                           */
  tag_t    Izz_exp;      /* Moment of Inertia about x-axis.            */
  tag_t    Iyy_exp;      /* Moment of Inertia about y-axis.            */
  tag_t    Izy_exp;      /* Moment of Inertia about xy-axis.           */
  tag_t    torsion_exp;  /* Torsional coefficient.                     */
  tag_t    warp_exp;     /* Warping coefficient.                       */
  tag_t    y_eccentricity_exp; /*Y Eccentricity                        */
  tag_t    z_eccentricity_exp; /*Z Eccentricity                        */
  tag_t    hydro_diameter_exp; /*Hydraulic Diameter of section.        */
  tag_t    perimeter_exp;      /*Perimeter of section.                 */
  tag_t    wall_thickness_exp; /*Wall Thickness of section.            */
  tag_t    sketch_tag;   /* For user defined thin wall.                */
  tag_t    face_tag;     /* For user defined solid.                    */
  tag_t    vector_tag;   /* For user defined solid horizonal direction.*/
};
typedef struct UF_SF_section_properties_s  UF_SF_section_properties_t,
                                        *UF_SF_section_properties_p_t;

  /* Properties unique to user defined sections which are
     not passed to the FEA solver. These are user feedback
     only.
   */

struct  UF_SF_user_defined_section_properties_s
{
  double   principal_angle;   /* Principal angle in degrees.           */
  double   principal_mom_inertia[2]; /*Principal Moment of Inertia.    */
  double   centroid[2];  /* Centroid location in global coordinates.   */
  double   shear_center[2]; /* Shear center in global coordinates.     */

};
typedef struct UF_SF_user_defined_section_properties_s
              UF_SF_user_defined_section_properties_t,
             *UF_SF_user_defined_section_properties_p_t;


struct UF_SF_section_src_list_s
{
  double     C1;  /* Y location of the first stress recovery point.    */
  double     C2;  /* Z location of the first stress recovery point.    */
  double     D1;  /* Y location of the second stress recovery point.   */
  double     D2;  /* Z location of the second stress recovery point.   */
  double     E1;  /* Y location of the third stress recovery point.    */
  double     E2;  /* Z location of the third stress recovery point.    */
  double     F1;  /* Y location of the fourth stress recovery point.   */
  double     F2;  /* Z location of the fourth stress recovery point.   */
};
typedef struct UF_SF_section_src_list_s  UF_SF_section_src_list_t,
                                       *UF_SF_section_src_list_p_t;

  /* Stress recovery locations of 1D Element Sections.
     First are the numeric values, followed by corresponding expressions
     tags, when any location has an expression.
     If there is no expression, then the tag is NULL_TAG.
   */

struct UF_SF_section_src_properties_s
{
  double     C1;  /* Y location of the first stress recovery point.    */
  double     C2;  /* Z location of the first stress recovery point.    */
  double     D1;  /* Y location of the second stress recovery point.   */
  double     D2;  /* Z location of the second stress recovery point.   */
  double     E1;  /* Y location of the third stress recovery point.    */
  double     E2;  /* Z location of the third stress recovery point.    */
  double     F1;  /* Y location of the fourth stress recovery point.   */
  double     F2;  /* Z location of the fourth stress recovery point.   */
  tag_t    C1_exp; /* Y location of the first stress recovery point.   */
  tag_t    C2_exp; /* Z location of the first stress recovery point.   */
  tag_t    D1_exp; /* Y location of the second stress recovery point.  */
  tag_t    D2_exp; /* Z location of the second stress recovery point.  */
  tag_t    E1_exp; /* Y location of the third stress recovery point.   */
  tag_t    E2_exp; /* Z location of the third stress recovery point.   */
  tag_t    F1_exp; /* Y location of the fourth stress recovery point.  */
  tag_t    F2_exp; /* Z location of the fourth stress recovery point.  */
};
typedef struct UF_SF_section_src_properties_s  UF_SF_section_src_properties_t,
                                       *UF_SF_section_src_properties_p_t;


/****************************************************************************
* Structure defining mesh visualization attributes.                        *
****************************************************************************/

struct UF_SF_mesh_visuals_s
{
   int       color;              /* Primary element color */
   int       shade_mode;         /* Different modes of shading:
                                      0 - never shade
                                      1 - shade when any shade mode is on
                                      2 - shade when partial shaded mode is on
                                      3 - shade when fully shaded mode is on */

   int       shade_edge_color;   /* Element edge color when shaded */
   int       shrink_factor;      /* Element shrink percentage  0 -> 100
                                        0 - no shrinking
                                      100 - shrinks elements to a point  */

   int       normals;            /* Valid for 2D elements
                                      0 - no element normals
                                      1 - element directional tails
                                      2 - element vectors */

   int       normals_color;      /* Normal display color */
   int       edge_visibility_sw; /* Element edge visibility switch:
                                      0 - do not show elemement edges
                                      1 - show element edges  */

   int       text_display_sw;    /* Element text display switch:
                                      0 - do not show text
                                      1 - show text  */


   /* The following only apply to meshes created by a call to UF_SF_create_disp_mesh */
   int       show_analysis;      /* Show analysis results or not
                                  * 0 - do not show analysis results
                                  * 1 - show analysis results  */

   int       show_deformed;      /* Show deformation or not .
                                  * 0 - do not show deformed results
                                  * 1 - show deformed results  */

   double    deformed_scale;     /* Scale value for the deformation magnitude
                                  * if show deformation is requested */

};
typedef struct UF_SF_mesh_visuals_s UF_SF_mesh_visuals_t, *UF_SF_mesh_visuals_p_t;

typedef struct  UF_SF_AMM_mesh_parameters_s  *UF_SF_AMM_mesh_parameters_p_t;

/* The ifndef is used because this definition is used in uf_sf_retiring.h
* because including this .h file in uf_sf_retiring.h causes massive recompile
* issues - P. Benson 11/22/2004 */

#ifndef  UF_SF_DIST_TYPE_T__H_INCLUDED
#define  UF_SF_DIST_TYPE_T__H_INCLUDED

/* Distribution type */

enum UF_SF_dist_type_t
{
  UF_SF_SINUSOIDAL = 0,
  UF_SF_PARABOLIC
};
#endif  /* UF_SF_DIST_TYPE_T__H_INCLUDED */


/* Mating Type */
enum UF_SF_mate_type_e
{
   UF_SF_NOT_SUPPORT_MATE_TYPE = 0,
   UF_SF_ASSEMBLY_MESH
};
typedef enum UF_SF_mate_type_e  UF_SF_mate_type_t,
                              *UF_SF_mate_type_p_t;

/* Assembly Mesh Type */
enum UF_SF_assembly_type_e
{
   UF_SF_NOT_SUPPORT_ASSEM_TYPE = 0,
   UF_SF_ASSEM_BY_GLUE,
   UF_SF_ASSEM_BY_SLIDE_CONTACT,
   UF_SF_ASSEM_BY_GAP_CONTACT,
   UF_SF_ASSEM_FREE
};
typedef enum UF_SF_assembly_type_e  UF_SF_assembly_type_t,
                                  *UF_SF_assembly_type_p_t;

enum UF_SF_edge_matching_type_e
{
   UF_SF_EDGE_MATCHING_TYPE_ND,
   UF_SF_EDGE_MATCHING_BY_LOCATION,
   UF_SF_EDGE_MATCHING_BY_ESIZE,
   UF_SF_EDGE_MATCHING_BY_COLLAPSE,
   UF_SF_EDGE_MATCHING_MM_GLUE,
   UF_SF_EDGE_MATCHING_MM_FREE,
   UF_SF_EDGE_MATCHING_ANY
};

typedef enum UF_SF_edge_matching_type_e  UF_SF_edge_matching_type_t,
                                       *UF_SF_edge_matching_type_p_t;


/* Idealize types */
typedef void *UF_SF_idealize_parms_p_t;
typedef void *UF_SF_idealize_region_p_t;

/*****************************************************************************
 Structure defining the parameters of a defeature feature.
******************************************************************************/

struct  UF_SF_defeature_parms_s
{
   int                 num_ret_faces;        /* Number of retained faces in the
                                                retained_faces array.  Can be 0
                                             */

   tag_t              *retained_faces;       /* Array of retained faces.
                                                Will be NULL if  num_ret_faces == 0
                                             */

   int                 num_rem_faces;        /* Number of removed faces in the
                                                removed_faces array.  Can be 0
                                             */

   tag_t              *removed_faces;        /*  Array of removed faces.
                                                 Will be NULL if num_rem_faces == 0
                                             */


   UF_SF_idealize_region_p_t region_parms_p; /* Pointer to an instance of
                                                UF_SF_idealize_region_t structure
                                                that defines a region on the
                                                body or NULL.
                                             */

};
typedef struct  UF_SF_defeature_parms_s UF_SF_defeature_parms_t, * UF_SF_defeature_parms_p_t;


enum UF_SF_idealize_parm_exp_t
{
    UF_SF_IDEALIZE_HOLE_DIAMETER,
    UF_SF_IDEALIZE_BLEND_RADIUS,
    UF_SF_IDEALIZE_TINY_FACE_AREA,
    UF_SF_IDEALIZE_THIN_FACE_WIDTH,
    UF_SF_IDEALIZE_FACE_COLLECTOR,
    UF_SF_IDEALIZE_SCREEN_SELECTED_FACE
};


enum UF_SF_idealize_parm_face_t
{
    UF_SF_IDEALIZE_RETAINED_FACES,
    UF_SF_IDEALIZE_REMOVED_FACES
};

enum UF_SF_face_subdiv_status_e
{
  UF_SF_IDENTICAL_FACES_EQ_EDGES,  /* Both faces identical with eq. num of edges   */
  UF_SF_IDENTICAL_FACES_UNEQ_EDGES,/* Both faces identical with uneq. num of edges */
  UF_SF_NOT_IDENTICAL,             /* Both faces are not identical                 */
  UF_SF_OVERLAPPING_FACES,         /* Both faces overlapping                       */
  UF_SF_SEPERATE_FACES             /* Both faces are seperate                      */
};

typedef enum UF_SF_face_subdiv_status_e UF_SF_face_subdiv_status_t,
                                       *UF_SF_face_subdiv_status_p_t;

struct UF_SF_resulting_face_pairs_s
{
  tag_t                        face1;
  tag_t                        face2;
  UF_SF_face_subdiv_status_t   relative_status;
};

typedef struct UF_SF_resulting_face_pairs_s  UF_SF_resulting_face_pairs_t,
                                            *UF_SF_resulting_face_pairs_p_t;

struct UF_SF_SURFACE_CONTACT_ANS_data_s {
   int                  closed_stiff_opt;  /* closed stiffness option */
   double               closed_stiff;      /* closed stiffness */
   int                  open_stiff_opt;    /* open   stiffness option */
   double               open_stiff;        /* open stiffness */
   int                  init_closure_opt;  /* initial closure option  */
   double               init_closure;      /* initial closure */
   int                  norm_toler_opt;    /* normal tolerance option */
   double               norm_toler;        /* normal tolerance */
   double               surf_cont_offset;  /* surface contact offset  */
   double               mu;                /* Coefficient of friction */
   int                  cont_type;         /* Contact type Standard,Rough*/

} ;

typedef struct UF_SF_SURFACE_CONTACT_ANS_data_s UF_SF_SURFACE_CONTACT_ANS_data_t,
                                               *UF_SF_SURFACE_CONTACT_ANS_data_p_t;

struct UF_SF_SURFACE_CONTACT_NAS_data_s {

   double               pre_load;       /* pre load */
   double               closed_stiff;   /* closed stiffness */
   double               open_stiff;     /* open stiffness */
   double               kinetic_fric;   /* kenetic friction coefficient */
   double               static_fric;    /* static friction coefficient  */
   double               max_pen;        /* maximum peneration           */
   int                  cont_type;      /* Contact type - Standard,Rough*/
} ;

typedef struct UF_SF_SURFACE_CONTACT_NAS_data_s UF_SF_SURFACE_CONTACT_NAS_data_t,
                                        *UF_SF_SURFACE_CONTACT_NAS_data_p_t;


struct UF_SF_SURFACE_CONTACT_UGFEA_data_s{

   double               pre_load;
   double               closed_stiff;
   double               open_stiff;
   double               kinetic_fric;
   double               static_fric;
   double               max_pen;
   int                  cont_type;
};

typedef struct UF_SF_SURFACE_CONTACT_UGFEA_data_s UF_SF_SURFACE_CONTACT_UGFEA_data_t,
                                          *UF_SF_SURFACE_CONTACT_UGFEA_data_p_t;

/* Defines are left for campatability
  Please use UF_SFANS_algorithm_t instead */

#define   FRONTAL_SOLVER    0
#define   PCG_SOLVER        1
#define   JCG_SOLVER        2
#define   SPARSE_SOLVER     3
#define   JCG_PCG_SOLVER    4
#define   JCG_FRONTAL_SOLVER 5
#define   SUBSPACE_MODOPT    6
#define   LANCZOS_MODOPT     7
#define   POWERDYN_MODOPT    8


enum UF_SFANS_algorithm_t
{
   UF_SFANS_NULL_SOLVER = -1,
   UF_SFANS_FRONTAL_SOLVER = 0,
   UF_SFANS_PCG_SOLVER,
   UF_SFANS_JCG_SOLVER,
   UF_SFANS_SPARSE_SOLVER,
   UF_SFANS_JCG_PCG_SOLVER,
   UF_SFANS_JCG_FRONTAL_SOLVER,
   UF_SFANS_SUBSPACE_MODOPT_SOLVER,
   UF_SFANS_LANCZOS_MODOPT_SOLVER,
   UF_SFANS_POWERDYN_MODOPT_SOLVER,
   UF_SFANS_NUM_ALGORITHM_TYPES
};
typedef enum UF_SFANS_algorithm_t, *UF_SFANS_algorithm_p_t;


enum UF_SFFEA_algorithm_t
{
   UF_SFFEA_AUTOMATIC                               = -1,
   UF_SFFEA_DIRECT_IN_CORE                          = 0,
   UF_SFFEA_DIRECT_OUT_OF_CORE                      = 2,
   UF_SFFEA_ITERATIVE_IN_CORE                       = 6,
   UF_SFFEA_ITERATIVE_OUT_OF_CORE                   = 8,
   UF_SFFEA_SPARSE                                  = 10,
   UF_SFFEA_ITERATIVE                               = 11
};
typedef enum UF_SFFEA_algorithm_t, *UF_SFFEA_algorithm_p_t;
#define  UF_SFFEA_ALGORITHM_NUM_TYPES   5

/* The ifndef is used because this definition is used in uf_sf_retiring.h
* because including this .h file in uf_sf_retiring.h causes massive recompile
* issues - P. Benson 11/22/2004 */

#ifndef  UF_SFANS_SOLVER_DATA_T__H_INCLUDED
#define  UF_SFANS_SOLVER_DATA_T__H_INCLUDED
struct UF_SFANS_solver_data_s
{
   int formatChoice;
   int algoChoice;
   int num_roots;
   double upper_limit;
   double lower_limit;
   double temperature;
};
typedef struct UF_SFANS_solver_data_s UF_SFANS_solver_data_t, *UF_SFANS_solver_data_p_t;
#endif  /* UF_SFANS_SOLVER_DATA_T__H_INCLUDED */


enum UF_SFOPT_solver_type_t
{
   UF_SFOPT_NULL_SOLVER_TYPE = -1,
   UF_SFOPT_GENERIC_SOLVER_TYPE = 0,
   UF_SFOPT_SENSITIVITY_SOLVER_TYPE = 1,
   UF_MAX_NUM_SOLVER_TYPES = 2
};
typedef enum UF_SFOPT_solver_type_t, *UF_SFOPT_solver_type_p_t;



struct UF_SFAS_solver_data_s
{
   int algolChoice;
   int typeChoice;
   int codeChoice;
   int echoChoice;
   int num_roots;
   int densityChoice;
   int formatChoice;
   int job_time;
   double temperature;
   tag_t  temperature_unit_tag;
   double upper_limit;
   int    max_iter;
   double err_tol_percent;
   int    min_pvalue;
   int    max_pvalue;
   double lower_limit;
   double sol_tol_val ;
   char jobname[UF_CFI_MAX_PATH_NAME_LEN];
   char titlestring[UF_CFI_MAX_PATH_NAME_LEN];
   char scratch_path[UF_CFI_MAX_PATH_NAME_LEN];
   int  memory_requested ;
   int  num_design_cycles;
   int  frequency_mode_number;
   int  optimizationChoice;
   int  AdaptOpt; /* Added to handle Opt in Adaptivity */
   int  OptTypeChoice;
   UF_SFOPT_solver_type_t solver_types[(int)UF_MAX_NUM_SOLVER_TYPES];
   int  reset_node_elm_id_Choice;
   int  save_after_reset_Choice;
   int  prt_displacements;
   int  prt_stresses;
   int  prt_strains;
   int  prt_strain_energies;
   int  prt_elforces;
   int  prt_reactforces;
   int  prt_applied_loads;
   int  prt_fluxes;
   int  prt_temps;
   double plate_stiffness;
   int inrelChoice;
   int inrel_support_node_id[3];
   SFNAS_inter_output_types_t  intout_flag;
   int componentChoice ;
   int nl_ninc;
   int adaptChoice;
   int adapt_max_itr;
   double adapt_per_error;
   double adapt_dev_error;
   double adapt_elem_size;
   int  PrintOutputLevel;
   int start_elem_id;
   int start_node_id;
   int largeDispChoice;
   logical thermstruct;
   /* Flag set to indicate whether thermostruct env.. this is needed since during solution time
   the env will be changed to structures and then to thermal */

   int     modeChoice;
   int     fatigueChoice;
   int     fatigue_analysis;
   int     fatigue_stress_crit;
   int     fatigue_stress_type;
   int     fatigue_fatigue_crit;
   int     fatigue_cycles;
   double  fatigue_k_factor;
   int     fatigue_life_crit;

};
typedef struct UF_SFAS_solver_data_s UF_SFAS_solver_data_t, *UF_SFAS_solver_data_p_t;

/* The Load functions mode_type parameter.                              */
enum UF_SF_lv_function_mode_e
{
   UF_SF_HALF_UNIT_CYCLE =  0,   /* Half Unit Cycle */
   UF_SF_FULL_UNIT_CYCLE =  1    /* Full Unit Cycle */
};
typedef enum UF_SF_lv_function_mode_e  UF_SF_lv_function_mode_t,
                                     *UF_SF_lv_function_mode_p_t;





enum UF_SFAS_mode_type_t
{
   UF_MODE_TYPE = 0,
   UF_MODE_AND_FREQUENCY_RANGE_TYPE,
   UF_FREQUENCY_RANGE_TYPE,
   UF_SFAS_MAX_MODE_CHOICES
};
typedef enum UF_SFAS_mode_type_t, *UF_SFAS_mode_type_p_t;


enum UF_SF_scenario_info_t
{
   UF_SF_mesh_info = 0,                  /* export info about meshes */
   UF_SF_load_info = 1,                  /* export info about loads */
   UF_SF_solution_info = 2,              /* export info about solutions */
   UF_SF_step_info = 3,                  /* export info about steps */
   UF_SF_boundary_condition_info = 4,    /* export info about boundary
                                            conditions. */

   UF_SF_material_info = 5,              /* export info about materials
                                            Assigned to a specified entity. */

   UF_SF_section_info = 6,               /* export info about sections */
   UF_SF_mesh_mating_condition_info = 7, /* export info about a mesh mating
                                            condition. */

   UF_SF_fea_summary_info = 8,           /* export a summary including all
                                            fea entities. */

   UF_SF_dur_event_info = 9,             /* export a summary including all
                                            load variations for the event. */

   UF_SF_load_case_info = 10,            /* export info about load cases */
   UF_SF_sim_summary_info = 11           /* export a summary of simulation
                                            entities. */

};

/*****************************************************************************
 Structure defining the parameters of a user defined midsurface feature.
******************************************************************************/

struct UF_SF_midsrf_user_parms_s
{
  tag_t   solid_body;       /* Tag of the target solid body. */
  int     num_sheet_bodies; /* Number of sheet bodies.           */
  tag_t  *sheet_bodies_a;   /*   Array of sheet body tags that will define the
                               midsurface of the selected target solid body.
                               The size of the array is num_sheet_bodies */

  double  thickness;        /* Thickness value to be used at formatting time
                                whenever the automatic thickness extraction fails. */

  double  const_thickness;  /* Constant thickness of all nodes of the midsurface.
                               If this is provided by the user then this is will be
                               the value used for all nodes at format time in which
                               case the value of the thickness field will be unused.
                               This field is not currently used.  */

};
typedef struct UF_SF_midsrf_user_parms_s UF_SF_midsrf_user_parms_t, *UF_SF_midsrf_user_parms_p_t;

/* FEM Property types. */

#define UF_SF_LANG_NIL_VAL_TYPE                   0
#define UF_SF_LANG_INT_VAL_TYPE                   1
#define UF_SF_LANG_SCALAR_VAL_TYPE                2
#define UF_SF_LANG_TEXT_VAL_TYPE                  3
#define UF_SF_LANG_ENUM_VAL_TYPE                  4
#define UF_SF_LANG_COORD_VAL_TYPE                 5
#define UF_SF_LANG_MATERIAL_VAL_TYPE              6
#define UF_SF_LANG_SECTION_VAL_TYPE               7
#define UF_SF_LANG_VECTOR_VAL_TYPE                8
#define UF_SF_LANG_TABLE_VAL_TYPE                 9
#define UF_SF_LANG_LOAD_VAL_TYPE                 10
#define UF_SF_LANG_BNDCOND_VAL_TYPE              11
#define UF_SF_LANG_BOOL_VAL_TYPE                 12
#define UF_SF_LANG_MULTI_STRING_VAL_TYPE         13
#define UF_SF_LANG_FILENAME_VAL_TYPE             14
#define UF_SF_LANG_DIRPATH_VAL_TYPE              15
#define UF_SF_LANG_SSMO_VAL_TYPE                 16
#define UF_SF_LANG_FIELD_VAL_TYPE                17
#define UF_SF_LANG_AXIS_VAL_TYPE                 18
#define UF_SF_LANG_DOF_VAL_TYPE                  19
#define UF_SF_LANG_POINT_VAL_TYPE                20
#define UF_SF_LANG_NODESET_VAL_TYPE              21
#define UF_SF_LANG_ELEMSET_VAL_TYPE              22
#define UF_SF_LANG_MULTI_STRING_ITI_VAL_TYPE     23
#define UF_SF_LANG_CAE_SECTION_VAL_TYPE          24
#define UF_SF_LANG_EDGES_ON_FACE_VAL_TYPE        25
#define UF_SF_LANG_SFEM_VECTOR_VAL_TYPE          26
#define UF_SF_LANG_SCALAR_ARRAY_VAL_TYPE         27
#define UF_SF_LANG_ACTION_VAL_TYPE               28
#define UF_SF_LANG_PPT_VAL_TYPE                  29
#define UF_SF_LANG_SSMO_ARRAY_VAL_TYPE           30
#define UF_SF_LANG_TIME_VAL_TYPE                 31
#define UF_SF_LANG_PLYMAT_VAL_TYPE               32
#define UF_SF_LANG_INT_ARRAY_VAL_TYPE            33
#define UF_SF_LANG_EXT_MENU_VAL_TYPE             34
#define UF_SF_LANG_CATALOG_VAL_TYPE              35
#define UF_SF_LANG_GENERAL_FIELD_VAL_TYPE        36
#define UF_SF_LANG_SCALAR_FIELD_VAL_TYPE         37
#define UF_SF_LANG_VECTOR_FIELD_VAL_TYPE         38
#define UF_SF_LANG_MATRIX_VAL_TYPE               39

/* FEM Property type parameter. */


enum UF_SF_fem_value_type_t
{
   UF_SF_FEM_VALUE_NIL               = UF_SF_LANG_NIL_VAL_TYPE,
   UF_SF_FEM_VALUE_INT               = UF_SF_LANG_INT_VAL_TYPE,
   UF_SF_FEM_VALUE_SCALAR            = UF_SF_LANG_SCALAR_VAL_TYPE,
   UF_SF_FEM_VALUE_TEXT              = UF_SF_LANG_TEXT_VAL_TYPE,
   UF_SF_FEM_VALUE_ENUM              = UF_SF_LANG_ENUM_VAL_TYPE,
   UF_SF_FEM_VALUE_COORD             = UF_SF_LANG_COORD_VAL_TYPE ,
   UF_SF_FEM_VALUE_MATERIAL          = UF_SF_LANG_MATERIAL_VAL_TYPE,
   UF_SF_FEM_VALUE_SECTION           = UF_SF_LANG_SECTION_VAL_TYPE,
   UF_SF_FEM_VALUE_VECTOR            = UF_SF_LANG_VECTOR_VAL_TYPE,
   UF_SF_FEM_VALUE_TABLE             = UF_SF_LANG_TABLE_VAL_TYPE,
   UF_SF_FEM_VALUE_LOAD              = UF_SF_LANG_LOAD_VAL_TYPE,
   UF_SF_FEM_VALUE_BNDCOND           = UF_SF_LANG_BNDCOND_VAL_TYPE,
   UF_SF_FEM_VALUE_BOOL              = UF_SF_LANG_BOOL_VAL_TYPE,
   UF_SF_FEM_VALUE_MULTI_STRING      = UF_SF_LANG_MULTI_STRING_VAL_TYPE,
   UF_SF_FEM_VALUE_MULTI_STRING_ITI  = UF_SF_LANG_MULTI_STRING_ITI_VAL_TYPE,
   UF_SF_FEM_VALUE_FILENAME_VAL_TYPE = UF_SF_LANG_FILENAME_VAL_TYPE,
   UF_SF_FEM_VALUE_DIRPATH_VAL_TYPE  = UF_SF_LANG_DIRPATH_VAL_TYPE,
   UF_SF_FEM_VALUE_SSMO_VAL_TYPE     = UF_SF_LANG_SSMO_VAL_TYPE ,
   UF_SF_FEM_VALUE_PPT_VAL_TYPE      = UF_SF_LANG_PPT_VAL_TYPE ,
   UF_SF_FEM_VALUE_PLYMAT_VAL_TYPE   = UF_SF_LANG_PLYMAT_VAL_TYPE ,
   UF_SF_FEM_VALUE_FIELD_VAL_TYPE    = UF_SF_LANG_FIELD_VAL_TYPE ,
   UF_SF_FEM_VALUE_AXIS_VAL_TYPE     = UF_SF_LANG_AXIS_VAL_TYPE ,
   UF_SF_FEM_VALUE_DOF_VAL_TYPE      = UF_SF_LANG_DOF_VAL_TYPE ,
   UF_SF_FEM_VALUE_POINT_VAL_TYPE    = UF_SF_LANG_POINT_VAL_TYPE,
   UF_SF_FEM_VALUE_NODESET_VAL_TYPE  = UF_SF_LANG_NODESET_VAL_TYPE,
   UF_SF_FEM_VALUE_ELEMSET_VAL_TYPE  = UF_SF_LANG_ELEMSET_VAL_TYPE,
   UF_SF_FEM_VALUE_EDGES_ON_FACE     = UF_SF_LANG_EDGES_ON_FACE_VAL_TYPE,
   UF_SF_FEM_VALUE_SCALAR_ARRAY      = UF_SF_LANG_SCALAR_ARRAY_VAL_TYPE,
   UF_SF_FEM_VALUE_ACTION            = UF_SF_LANG_ACTION_VAL_TYPE,
   UF_SF_FEM_VALUE_SSMO_ARRAY        = UF_SF_LANG_SSMO_ARRAY_VAL_TYPE,
   UF_SF_FEM_VALUE_TIME              = UF_SF_LANG_TIME_VAL_TYPE,
   UF_SF_FEM_VALUE_INT_ARRAY         = UF_SF_LANG_INT_ARRAY_VAL_TYPE,
   UF_SF_FEM_VALUE_EXT_MENU          = UF_SF_LANG_EXT_MENU_VAL_TYPE,
   UF_SF_FEM_VALUE_CATALOG           = UF_SF_LANG_CATALOG_VAL_TYPE,
   UF_SF_FEM_VALUE_GENERAL_FIELD     = UF_SF_LANG_GENERAL_FIELD_VAL_TYPE,
   UF_SF_FEM_VALUE_SCALAR_FIELD      = UF_SF_LANG_SCALAR_FIELD_VAL_TYPE,
   UF_SF_FEM_VALUE_VECTOR_FIELD      = UF_SF_LANG_VECTOR_FIELD_VAL_TYPE,
   UF_SF_FEM_VALUE_MATRIX            = UF_SF_LANG_MATRIX_VAL_TYPE

};
typedef enum UF_SF_fem_value_type_t, * UF_SF_fem_value_type_p_t;

/* Durability Solution type parameter. */


enum UF_SF_dursol_stress_criterion_t
{
   UF_SF_ULTIMATE_STRENGTH = 0,
   UF_SF_YIELD_STRENGTH = 1

};
typedef enum UF_SF_dursol_stress_criterion_t, * UF_SF_dursol_stress_criterion_p_t;


enum UF_SF_dursol_stress_type_t
{
   UF_SF_VON_MISES = 0,
   UF_SF_TRESCA = 1,
   UF_SF_MAXIMUM_PRINCIPLE = 2,
   UF_SF_MINIMUM_PRINCIPLE = 3

};
typedef enum UF_SF_dursol_stress_type_t, * UF_SF_dursol_stress_type_p_t;


enum UF_SF_dursol_design_life_criterion_t
{
   UF_SF_INFINITE_LIFE = 0,
   UF_SF_CYCLES_TO_FAILURE = 1

};
typedef enum UF_SF_dursol_design_life_criterion_t, * UF_SF_design_life_criterion_p_t;


enum UF_SF_dursol_fatigue_life_criterion_t
{
   UF_SF_SMITH_WATSON_TOPPER = 0,
   UF_SF_STRAIN_LIFE_MAX_PRINCIPLE = 1,
   UF_SF_STRAIN_LIFE_MAX_SHEAR = 2,
   UF_SF_STRESS_LIFE = 3

};
typedef enum UF_SF_dursol_fatigue_life_criterion_t, * UF_SF_dursol_fatigue_life_criterion_p_t;


struct UF_SF_geom_options_s
{
   logical     fSyncPoints;
   logical     fSyncCsys;
   logical     fSyncLines;
   logical     fSyncArcs;
   logical     fSyncSplines;
   logical     fSyncSketchCurves;
};
typedef struct UF_SF_geom_options_s  UF_SF_geom_options_t, *UF_SF_geom_options_p_t;

#define UF_SF_MAX_STRING_LEN 133



#endif  /*    UF_SF_TYPES__H_INCLUDED                                   */