OpenVSP API Documentation 3.51.3
Loading...
Searching...
No Matches
CFD Mesh Functions

This group of functions is used to setup and run the CFD Mesh tool through the API. Click here to return to the main page. More...

Functions

std::string vsp::GetComputationFileName (int file_type)
void vsp::ComputeCFDMesh (int set, int degenset, int file_export_types)
double vsp::GetCFDMeshVal (int type)
bool vsp::GetCFDWakeFlag (const std::string &geom_id)
int vsp::GetNumCFDSources (const std::string &geom_id)
std::string vsp::GetCFDSourceName (const std::string &geom_id, int source_index)
void vsp::SetCFDSourceName (const std::string &geom_id, int source_index, const std::string &name)
void vsp::DeleteCFDSource (const std::string &geom_id, int source_index)
std::string vsp::GetCFDSourceID (const std::string &geom_id, int source_index)
void vsp::AdjustAllCFDSourceLen (double mult)
void vsp::AdjustAllCFDSourceRad (double mult)
void vsp::AddDefaultSources ()
void vsp::AddCFDSource (int type, const std::string &geom_id, int surf_index, double l1, double r1, double u1, double w1, double l2=0, double r2=0, double u2=0, double w2=0)

Detailed Description

Function Documentation

◆ AddCFDSource()

void vsp::AddCFDSource ( int type,
const std::string & geom_id,
int surf_index,
double l1,
double r1,
double u1,
double w1,
double l2 = 0,
double r2 = 0,
double u2 = 0,
double w2 = 0 )
extern

Add a CFD Mesh default source for the indicated Geom. Note, certain input params may not be used depending on the source type

//==== Add Pod Geom ====//
string pid = AddGeom( "POD", "" );
AddCFDSource( POINT_SOURCE, pid, 0, 0.25, 2.0, 0.5, 0.5 ); // Add A Point Source
// The source lands on the Geom it was given, as the type it was given.
if ( GetNumCFDSources( pid ) != 1 || GetCFDSourceType( pid, 0 ) != POINT_SOURCE )
{
Print( "ERROR: AddCFDSource did not add a point source" );
__failure++;
}
// A source attached to a Geom that does not exist has to be rejected.
AddCFDSource( POINT_SOURCE, "NOSUCHGEOM", 0, 0.25, 2.0, 0.5, 0.5 );
if ( GetNumTotalErrors() == 0 )
{
Print( "ERROR: AddCFDSource accepted a bad Geom ID" );
__failure++;
}
// That error was raised deliberately, so take it back off the queue.
while ( GetNumTotalErrors() > 0 )
{
ErrorObj err = PopLastError();
}
void AddCFDSource(int type, const std::string &geom_id, int surf_index, double l1, double r1, double u1, double w1, double l2=0, double r2=0, double u2=0, double w2=0)
int GetNumCFDSources(const std::string &geom_id)
@ POINT_SOURCE
Definition APIDefines.h:266
std::string AddGeom(const std::string &type, const std::string &parent=std::string())
See also
CFD_MESH_SOURCE_TYPE
Parameters
[in]typeint CFD Mesh source type( i.e.BOX_SOURCE )
[in]geom_idstring Geom ID
[in]surf_indexint Main surface index
[in]l1double Source first edge length
[in]r1double Source first radius
[in]u1double Source first U location
[in]w1double Source first W location
[in]l2double Source second edge length
[in]r2double Source second radius
[in]u2double Source second U location
[in]w2double Source second W location

◆ AddDefaultSources()

void vsp::AddDefaultSources ( )
extern

Add default CFD Mesh sources for all Geoms

//==== Add Pod Geom ====//
string pid = AddGeom( "POD", "" );
AddDefaultSources(); // 3 Sources: Def_Fwd_PS, Def_Aft_PS, Def_Fwd_Aft_LS
// The three default sources arrive under the names in the comment.
if ( GetNumCFDSources( pid ) != 3 )
{
Print( "ERROR: AddDefaultSources did not add three sources" );
__failure++;
}
else
{
if ( GetCFDSourceName( pid, 0 ) != "Def_Fwd_PS" ||
GetCFDSourceName( pid, 1 ) != "Def_Aft_PS" ||
GetCFDSourceName( pid, 2 ) != "Def_Fwd_Aft_LS" )
{
Print( "ERROR: AddDefaultSources did not add the expected sources" );
__failure++;
}
// The first two are point sources and the third joins them with a line.
if ( GetCFDSourceType( pid, 0 ) != POINT_SOURCE ||
GetCFDSourceType( pid, 1 ) != POINT_SOURCE ||
GetCFDSourceType( pid, 2 ) != LINE_SOURCE )
{
Print( "ERROR: AddDefaultSources did not add the expected source types" );
__failure++;
}
}
void AddDefaultSources()
std::string GetCFDSourceName(const std::string &geom_id, int source_index)
@ LINE_SOURCE
Definition APIDefines.h:267

◆ AdjustAllCFDSourceLen()

void vsp::AdjustAllCFDSourceLen ( double mult)
extern

Scale the edge length of every CFD Mesh source in the model by a common factor. This is what the four global source length buttons on the CFD Mesh screen do, at 1/1.5, 1/1.1, 1.1 and 1.5. Sources are usually sized relative to one another, so scaling them together is how a mesh is refined or coarsened as a whole.

string pid = AddGeom( "POD", "" );
AddCFDSource( POINT_SOURCE, pid, 0, 0.25, 2.0, 0.5, 0.5 );
string src_id = GetCFDSourceID( pid, 0 );
if ( abs( GetParmVal( src_id, "SrcLen", "Source" ) - 0.5 ) > 1e-6 )
{
Print( "ERROR: AdjustAllCFDSourceLen did not scale the source" );
__failure++;
}
std::string GetCFDSourceID(const std::string &geom_id, int source_index)
void AdjustAllCFDSourceLen(double mult)
double GetParmVal(const std::string &parm_id)
See also
AdjustAllCFDSourceRad, GetCFDSourceID
Parameters
[in]multdouble Factor to scale every source length by

◆ AdjustAllCFDSourceRad()

void vsp::AdjustAllCFDSourceRad ( double mult)
extern

Scale the radius of influence of every CFD Mesh source in the model by a common factor. This is what the four global source radius buttons on the CFD Mesh screen do, at 1/1.5, 1/1.1, 1.1 and 1.5.

string pid = AddGeom( "POD", "" );
AddCFDSource( POINT_SOURCE, pid, 0, 0.25, 2.0, 0.5, 0.5 );
string src_id = GetCFDSourceID( pid, 0 );
if ( abs( GetParmVal( src_id, "SrcRad", "Source" ) - 1.0 ) > 1e-6 )
{
Print( "ERROR: AdjustAllCFDSourceRad did not scale the source" );
__failure++;
}
void AdjustAllCFDSourceRad(double mult)
See also
AdjustAllCFDSourceLen, GetCFDSourceID
Parameters
[in]multdouble Factor to scale every source radius by

◆ ComputeCFDMesh()

void vsp::ComputeCFDMesh ( int set,
int degenset,
int file_export_types )
extern

Create a CFD Mesh for the components in the set. This analysis cannot be run through the Analysis Manager.

//==== Add Pod Geometry ====//
string pid = AddGeom( "POD" );
Update();
//==== Keep the mesh coarse so the example runs quickly ====//
SetCFDMeshVal( CFD_MAX_EDGE_LEN, 1.0 );
SetCFDMeshVal( CFD_MIN_EDGE_LEN, 0.1 );
//==== CFDMesh Method Facet Export =====//
SetComputationFileName( CFD_FACET_TYPE, "TestCFDMeshFacet_API.facet" );
SetComputationFileName( CFD_STL_TYPE, "TestCFDMesh_API.stl" );
Print( "\tComputing CFDMesh..." );
ComputeCFDMesh( SET_ALL, SET_NONE, CFD_FACET_TYPE | CFD_STL_TYPE );
// CFD Mesh reports nothing through the Results Manager, so read the mesh it
// just wrote back in to prove it produced one.
string mesh_id = ImportFile( "TestCFDMesh_API.stl", IMPORT_STL, "" );
if ( mesh_id.length() == 0 || GetGeomTypeName( mesh_id ) != "Mesh" )
{
Print( "ERROR: ComputeCFDMesh did not write a readable mesh" );
__failure++;
}
else
{
DeleteGeom( mesh_id );
}
void ComputeCFDMesh(int set, int degenset, int file_export_types)
@ CFD_MIN_EDGE_LEN
Definition APIDefines.h:219
@ CFD_MAX_EDGE_LEN
Definition APIDefines.h:220
@ IMPORT_STL
@ SET_NONE
@ SET_ALL
std::string ImportFile(const std::string &file_name, int file_type, const std::string &parent)
void DeleteGeom(const std::string &geom_id)
std::string GetGeomTypeName(const std::string &geom_id)
void Update(bool update_managers=true)
See also
COMPUTATION_FILE_TYPE
Parameters
[in]setint Set index (i.e. SET_ALL)
[in]degensetint DegenSet index (i.e. SET_NONE)
[in]file_export_typesint CFD Mesh file type to export (supports XOR i.e CFD_SRF_TYPE & CFD_STL_TYPE)

◆ DeleteCFDSource()

void vsp::DeleteCFDSource ( const std::string & geom_id,
int source_index )
extern

Delete a single CFD Mesh source from the specified Geom

//==== Add Pod Geom ====//
string pid = AddGeom( "POD", "" );
AddDefaultSources(); // 3 Sources: Def_Fwd_PS, Def_Aft_PS, Def_Fwd_Aft_LS
string second_name = GetCFDSourceName( pid, 1 );
DeleteCFDSource( pid, 0 );
// Only the named source goes, and the rest slide down.
if ( GetNumCFDSources( pid ) != 2 )
{
Print( "ERROR: DeleteCFDSource did not remove one source" );
__failure++;
}
if ( GetCFDSourceName( pid, 0 ) != second_name )
{
Print( "ERROR: DeleteCFDSource removed the wrong source" );
__failure++;
}
// An index past the end has to be rejected.
if ( GetNumTotalErrors() == 0 )
{
Print( "ERROR: DeleteCFDSource accepted an index past the end" );
__failure++;
}
// That error was raised deliberately, so take it back off the queue.
while ( GetNumTotalErrors() > 0 )
{
ErrorObj err = PopLastError();
}
void DeleteCFDSource(const std::string &geom_id, int source_index)
See also
AddCFDSource, AddDefaultSources, DeleteAllCFDSources, GetNumCFDSources
Parameters
[in]geom_idstring Geom ID
[in]source_indexint Source index

◆ GetCFDMeshVal()

double vsp::GetCFDMeshVal ( int type)
extern

Set the value of a specific CFD Mesh option

SetCFDMeshVal( CFD_MIN_EDGE_LEN, 1.0 );
// The control types are backed by Parms in the CFD grid density container,
// so the value that was set can be read back.
string dens_id = FindContainer( "CFDGridDensity", 0 );
string min_len_id = FindParm( dens_id, "MinLen", "CFDGridDensity" );
if ( !closeTo( GetParmVal( min_len_id ), 1.0, 1e-12 ) )
{
Print( "ERROR: SetCFDMeshVal did not set CFD_MIN_EDGE_LEN" );
__failure++;
}
std::string FindContainer(const std::string &name, int index)
std::string FindParm(const std::string &parm_container_id, const std::string &parm_name, const std::string &group_name)
See also
CFD_CONTROL_TYPE
Parameters
[in]typeint CFD Mesh control type enum (i.e. CFD_GROWTH_RATIO)
[in]valdouble Value to set

Get the value of a specific CFD Mesh option

SetCFDMeshVal( CFD_MIN_EDGE_LEN, 1.0 );
if ( !closeTo( GetCFDMeshVal( CFD_MIN_EDGE_LEN ), 1.0, 1e-12 ) )
{
Print( "ERROR: GetCFDMeshVal did not report the value that was set" );
__failure++;
}
// Flags read back as zero or one.
SetCFDMeshVal( CFD_HALF_MESH_FLAG, 1.0 );
if ( !closeTo( GetCFDMeshVal( CFD_HALF_MESH_FLAG ), 1.0, 1e-12 ) )
{
Print( "ERROR: GetCFDMeshVal did not report the half mesh flag" );
__failure++;
}
// A control type that does not exist has to be rejected.
if ( GetNumTotalErrors() == 0 )
{
Print( "ERROR: GetCFDMeshVal accepted an unknown control type" );
__failure++;
}
// That error was raised deliberately, so take it back off the queue.
while ( GetNumTotalErrors() > 0 )
{
ErrorObj err = PopLastError();
}
double GetCFDMeshVal(int type)
@ CFD_HALF_MESH_FLAG
Definition APIDefines.h:226
See also
CFD_CONTROL_TYPE, SetCFDMeshVal
Parameters
[in]typeint CFD Mesh control type enum (i.e. CFD_GROWTH_RATIO)
Returns
double Value of the option

◆ GetCFDSourceID()

std::string vsp::GetCFDSourceID ( const std::string & geom_id,
int source_index )
extern

Get the ParmContainer ID of a CFD Mesh source, so its size and placement can be read and driven after the source has been created. A source's Parms live in the "Source" group and are named SrcLen, SrcRad, U_Loc and W_Loc, with SrcLen2, SrcRad2 and the numbered locations on the source types that take two ends.

string pid = AddGeom( "POD", "" );
AddCFDSource( POINT_SOURCE, pid, 0, 0.25, 2.0, 0.5, 0.5 );
string src_id = GetCFDSourceID( pid, 0 );
if ( src_id.length() == 0 )
{
Print( "ERROR: GetCFDSourceID returned no id" );
__failure++;
}
// The source was created with a length of 0.25, and is editable from here.
if ( abs( GetParmVal( src_id, "SrcLen", "Source" ) - 0.25 ) > 1e-6 )
{
Print( "ERROR: GetCFDSourceID did not reach the source" );
__failure++;
}
SetParmVal( src_id, "SrcLen", "Source", 0.5 );
double SetParmVal(const std::string &parm_id, double val)
See also
AddCFDSource, GetCFDSourceName, GetCFDSourceType
Parameters
[in]geom_idstring Geom ID
[in]source_indexint CFD Mesh source index
Returns
string ParmContainer ID for the source

◆ GetCFDSourceName()

std::string vsp::GetCFDSourceName ( const std::string & geom_id,
int source_index )
extern

Get the name of a CFD Mesh source on the specified Geom

//==== Add Pod Geom ====//
string pid = AddGeom( "POD", "" );
AddDefaultSources(); // 3 Sources: Def_Fwd_PS, Def_Aft_PS, Def_Fwd_Aft_LS
if ( GetCFDSourceName( pid, 0 ) != "Def_Fwd_PS" )
{
Print( "ERROR: GetCFDSourceName did not name the first default source" );
__failure++;
}
// Every source the Geom counts has to be nameable.
for ( int i = 0; i < GetNumCFDSources( pid ); i++ )
{
if ( GetCFDSourceName( pid, i ).length() == 0 )
{
Print( "ERROR: source " + i + " has no name" );
__failure++;
}
}
// An index past the end has to be rejected.
if ( GetNumTotalErrors() == 0 )
{
Print( "ERROR: GetCFDSourceName accepted an index past the end" );
__failure++;
}
// That error was raised deliberately, so take it back off the queue.
while ( GetNumTotalErrors() > 0 )
{
ErrorObj err = PopLastError();
}
See also
GetNumCFDSources, GetCFDSourceType
Parameters
[in]geom_idstring Geom ID
[in]source_indexint Source index
Returns
string Source name

◆ GetCFDWakeFlag()

bool vsp::GetCFDWakeFlag ( const std::string & geom_id)
extern

Activate or deactivate the CFD Mesh wake for a particular Geom. Note, the wake flag is only applicable for wing-type surfaces. Also, this function is simply an alternative to setting the value of the Parm with the available Parm setting API functions.

//==== Add Wing Geom ====//
string wid = AddGeom( "WING", "" );
SetCFDWakeFlag( wid, true );
if ( !closeTo( GetParmVal( wid, "Wake", "Shape" ), 1.0, 1e-12 ) )
{
Print( "ERROR: SetCFDWakeFlag did not activate the wake" );
__failure++;
}
SetCFDWakeFlag( wid, false );
if ( !closeTo( GetParmVal( wid, "Wake", "Shape" ), 0.0, 1e-12 ) )
{
Print( "ERROR: SetCFDWakeFlag did not deactivate the wake" );
__failure++;
}
// This is equivalent to SetParmValUpdate( wid, "Wake", "Shape", 1.0 );
// To change the scale: SetParmValUpdate( wid, "WakeScale", "WakeSettings", 10.0 );
// To change the angle: SetParmValUpdate( wid, "WakeAngle", "WakeSettings", -5.0 );
See also
SetParmVal, SetParmValUpdate
Parameters
[in]geom_idstring Geom ID
[in]flagbool True to activate, false to deactivate

Get the CFD Mesh wake flag for a particular Geom

//==== Add Wing Geom ====//
string wid = AddGeom( "WING", "" );
// A new Geom starts with its wake off.
if ( GetCFDWakeFlag( wid ) )
{
Print( "ERROR: a new Geom starts with its wake on" );
__failure++;
}
SetCFDWakeFlag( wid, true );
if ( !GetCFDWakeFlag( wid ) )
{
Print( "ERROR: GetCFDWakeFlag did not follow SetCFDWakeFlag" );
__failure++;
}
// The flag is the Wake Parm, so the two have to agree.
if ( !closeTo( GetParmVal( wid, "Wake", "Shape" ), 1.0, 1e-12 ) )
{
Print( "ERROR: the wake flag disagrees with its Parm" );
__failure++;
}
bool GetCFDWakeFlag(const std::string &geom_id)
See also
SetCFDWakeFlag
Parameters
[in]geom_idstring Geom ID
Returns
bool True if the wake is active

◆ GetComputationFileName()

std::string vsp::GetComputationFileName ( int file_type)
extern

Get the file name of a specified file type. Note, this function cannot be used to set FEA Mesh file names.

//==== Add Pod Geometry ====//
string pid = AddGeom( "POD" );
//==== Set File Name ====//
SetComputationFileName( DEGEN_GEOM_CSV_TYPE, "TestDegenScript.csv" );
//==== Run Degen Geom ====//
ComputeDegenGeom( SET_ALL, DEGEN_GEOM_CSV_TYPE );
// The degenerate representation is reported through the Results Manager as
// well as written to file. A Pod yields a surface, a plate and a stick.
if ( GetNumResults( "DegenGeom" ) != 1 )
{
Print( "ERROR: ComputeDegenGeom produced no DegenGeom result" );
__failure++;
}
if ( GetNumResults( "Degen_surf" ) < 1 || GetNumResults( "Degen_plate" ) < 1 || GetNumResults( "Degen_stick" ) < 1 )
{
Print( "ERROR: ComputeDegenGeom did not produce the component results" );
__failure++;
}
void ComputeDegenGeom(int set, int file_export_types)
int GetNumResults(const std::string &name)
See also
COMPUTATION_FILE_TYPE, SetFeaMeshFileName
Parameters
[in]file_typeint File type enum (i.e. CFD_TRI_TYPE, COMP_GEOM_TXT_TYPE)
[in]file_namestring File name

Get the file name of a specified file type. Note, this function cannot be used to get FEA Mesh file names.

//==== Set File Name ====//
SetComputationFileName( DEGEN_GEOM_CSV_TYPE, "TestDegenScript.csv" );
if ( GetComputationFileName( DEGEN_GEOM_CSV_TYPE ) != "TestDegenScript.csv" )
{
Print( "ERROR: GetComputationFileName did not report the name that was set" );
__failure++;
}
// Each file type carries its own name.
SetComputationFileName( CFD_STL_TYPE, "TestCFDMesh.stl" );
if ( GetComputationFileName( CFD_STL_TYPE ) != "TestCFDMesh.stl" ||
GetComputationFileName( DEGEN_GEOM_CSV_TYPE ) != "TestDegenScript.csv" )
{
Print( "ERROR: setting one file name disturbed another" );
__failure++;
}
std::string GetComputationFileName(int file_type)
See also
COMPUTATION_FILE_TYPE, SetComputationFileName, GetFeaMeshFileName
Parameters
[in]file_typeint File type enum (i.e. CFD_TRI_TYPE, COMP_GEOM_TXT_TYPE)
Returns
string File name

◆ GetNumCFDSources()

int vsp::GetNumCFDSources ( const std::string & geom_id)
extern

Delete all CFD Mesh sources for all Geoms

//==== Add Pod Geom ====//
string pid = AddGeom( "POD", "" );
AddCFDSource( POINT_SOURCE, pid, 0, 0.25, 2.0, 0.5, 0.5 ); // Add A Point Source
if ( GetNumCFDSources( pid ) != 1 )
{
Print( "ERROR: the source was not added" );
__failure++;
}
DeleteAllCFDSources();
if ( GetNumCFDSources( pid ) != 0 )
{
Print( "ERROR: DeleteAllCFDSources left sources behind" );
__failure++;
}

Get the number of CFD Mesh sources on the specified Geom

//==== Add Pod Geom ====//
string pid = AddGeom( "POD", "" );
if ( GetNumCFDSources( pid ) != 0 )
{
Print( "ERROR: a new Geom starts with sources" );
__failure++;
}
AddCFDSource( POINT_SOURCE, pid, 0, 0.25, 2.0, 0.5, 0.5 ); // Add A Point Source
if ( GetNumCFDSources( pid ) != 1 )
{
Print( "ERROR: GetNumCFDSources did not count the source that was added" );
__failure++;
}
AddDefaultSources(); // 3 Sources: Def_Fwd_PS, Def_Aft_PS, Def_Fwd_Aft_LS
if ( GetNumCFDSources( pid ) != 4 )
{
Print( "ERROR: GetNumCFDSources did not count the default sources" );
__failure++;
}
DeleteAllCFDSources();
if ( GetNumCFDSources( pid ) != 0 )
{
Print( "ERROR: DeleteAllCFDSources left sources behind" );
__failure++;
}
See also
AddCFDSource, AddDefaultSources, DeleteCFDSource, DeleteAllCFDSources
Parameters
[in]geom_idstring Geom ID
Returns
int Number of CFD Mesh sources on the Geom

◆ SetCFDSourceName()

void vsp::SetCFDSourceName ( const std::string & geom_id,
int source_index,
const std::string & name )
extern

Get the type of a CFD Mesh source on the specified Geom

//==== Add Pod Geom ====//
string pid = AddGeom( "POD", "" );
AddCFDSource( POINT_SOURCE, pid, 0, 0.25, 2.0, 0.5, 0.5 ); // Add A Point Source
if ( GetCFDSourceType( pid, 0 ) != POINT_SOURCE )
{
Print( "ERROR: GetCFDSourceType did not report the type that was added" );
__failure++;
}
// A source of a different type reports differently.
AddCFDSource( LINE_SOURCE, pid, 0, 0.25, 2.0, 0.5, 0.5, 0.25, 2.0, 0.75, 0.75 );
if ( GetCFDSourceType( pid, 1 ) != LINE_SOURCE )
{
Print( "ERROR: GetCFDSourceType did not report the second source" );
__failure++;
}
// An index past the end has to be rejected.
GetCFDSourceType( pid, GetNumCFDSources( pid ) );
if ( GetNumTotalErrors() == 0 )
{
Print( "ERROR: GetCFDSourceType accepted an index past the end" );
__failure++;
}
// That error was raised deliberately, so take it back off the queue.
while ( GetNumTotalErrors() > 0 )
{
ErrorObj err = PopLastError();
}
See also
CFD_MESH_SOURCE_TYPE, GetNumCFDSources, GetCFDSourceName
Parameters
[in]geom_idstring Geom ID
[in]source_indexint Source index
Returns
int CFD Mesh source type enum (i.e. POINT_SOURCE)

Set the name of a CFD Mesh source on the specified Geom

//==== Add Pod Geom ====//
string pid = AddGeom( "POD", "" );
AddCFDSource( POINT_SOURCE, pid, 0, 0.25, 2.0, 0.5, 0.5 ); // Add A Point Source
SetCFDSourceName( pid, 0, "ExampleSource" );
if ( GetCFDSourceName( pid, 0 ) != "ExampleSource" )
{
Print( "ERROR: SetCFDSourceName did not take" );
__failure++;
}
// An index past the end has to be rejected.
SetCFDSourceName( pid, GetNumCFDSources( pid ), "ExampleSource" );
if ( GetNumTotalErrors() == 0 )
{
Print( "ERROR: SetCFDSourceName accepted an index past the end" );
__failure++;
}
// That error was raised deliberately, so take it back off the queue.
while ( GetNumTotalErrors() > 0 )
{
ErrorObj err = PopLastError();
}
void SetCFDSourceName(const std::string &geom_id, int source_index, const std::string &name)
See also
GetCFDSourceName, GetNumCFDSources
Parameters
[in]geom_idstring Geom ID
[in]source_indexint Source index
[in]namestring Source name