エンティティとソルバーインターフェース
ソルバーインターフェースは、テンプレートとFE入力リーダーで構成されています。
Altair HyperMeshエンティティ
- データ名
- エンティティのデータ構造自体を構成し、エンティティに関連付けたカードイメージの有無に関係なく、そのエンティティのすべてのインスタンスで使用できます。
- Attributes
- ソルバーインターフェースのテンプレートに定義する補足データです。エンティティに関連付けたカードイメージのソルバー固有のデータを保存するために必要です。
Solver Interfaces
テンプレート
(1) | (2) | (3) | (4) | (5) | (6) | (7) | (8) | (9) | (10) |
---|---|---|---|---|---|---|---|---|---|
MAT1 | MID | E | G | NU | RHO | A | TREF | GE | |
ST | SC | SS |
HyperWorksの材料名付きエンティティには、名前とIDで名前が割り当てられています。そのため、このテンプレートでは、MAT1カードイメージを使用してOptiStructのMAT1ソルバーカード全体を定義し、HyperWorksの材料名付きエンティティに保存するために、E、G、NU、RHO、A、TREF、GE、ST、SC、およびSSの各属性を定義する必要もあります。テンプレートでは、*defineattribute()コマンドを使用して属性を定義します。以下のテンプレートコードの例では、*defineattribute()コマンドを使用して上記の各属性を定義しています。
MAT1カードイメージを使用してOptiStructのMAT1ソルバーカードをHyperWorksの材料名付きエンティティに関連付けるために、この関連付けを定義する*materials(MAT1)定義ブロックをテンプレートに記述しています。*materials(MAT1)定義ブロックで、*beginmenu()定義ブロックを使用してMAT1カードイメージを定義します。MAT1カードイメージを関連付けた材料名付きエンティティを、カードエディタを使用してHyperWorksでカード編集するたびに、この*beginmenu()定義ブロックが読み取られます。また、*materials(MAT1)定義ブロックにある*format()定義ブロックを使用して、OptiStructのMAT1ソルバーカードのエクスポートフォーマットを定義しています。MAT1カードイメージを関連付けた材料名付きエンティティを収めたHyperWorksデータベースのエクスポートを要求するたびに、この*format()定義ブロックが読み取られます。OptiStructのMAT1ソルバーカードでこれらの定義を実行するテンプレートコードの例が用意されています。
以下の例にあるテンプレートコードの例は[Install Directory]\hm\examples\templates\ExampleTemplate.tplにあります。
*codename(ExampleTemplate,100)
//MAT1 Attributes
*defineattribute(MAT1,1,integer,none)
*defineattribute(E,2,real,none)
*defineattribute(G,3,real,none)
*defineattribute(NU,4,real,none)
*defineattribute(RHO,5,real,none)
*defineattribute(A,6,real,none)
*defineattribute(TREF,7,real,none)
*defineattribute(GE,8,real,none)
*defineattribute(ST,9,real,none)
*defineattribute(SC,10,real,none)
*defineattribute(SS,11,real,none)
//Materials Named Entity - MAT1 Card Image and Export Format
*materials(MAT1)
//MAT1 Card Image
*beginmenu()
*menustring("MAT1 ")
*menufield("ID",integer,id,8)
*menufield("E",real,$E,8)
*menufield("G",real,$G,8)
*menufield("NU",real,$NU,8)
*menufield("RHO",real,$RHO,8)
*menufield("A",real,$A,8)
*menufield("TREF",real,$TREF,8)
*menufield("GE",real,$GE,8)
*menulineend()
*menustring(" ")
*menufield("ST",real,$ST,8)
*menufield("SC",real,$SC,8)
*menufield("SS",real,$SS,8)
*menulineend()
*endmenu()
//MAT1 Export Format
*format()
*string("MAT1 ")
*field(integer,id,8)
*field(real,$E,8)
*field(real,$G,8)
*field(real,$NU,8)
*field(real,$RHO,8)
*field(real,$A,8)
*field(real,$TREF,8)
*field(real,$GE,8)
*end()
*string(" ")
*field(real,$ST,8)
*field(real,$SC,8)
*field(real,$SS,8)
*end()
*output()
FE入力リーダー
FE入力リーダーは、ソルバーデックを読み取る機能を実行します。また、テンプレートによる定義に従った適切なカードイメージ、データ名、属性セットを持つ適切なエンティティに、ソルバーカードをインポートする機能を実行します。また、FE入力リーダーには、そのタスクを実行するためのテンプレート属性定義が必要です。
以下のFE入力コードにあるテンプレートコードの例は[Install Directory]\hm\examples\feinput\ExampleFEInput.cxxにあります。
#include <iostream>
#include <fstream>
#include <cstring>
#include "hmlib.h"
#include "hminlib.h"
using namespace std;
//Material Data Structure
int nummaterials;
struct materials {
char name[12];
int id;
double E;
double G;
double NU;
double RHO;
double A;
double TREF;
double GE;
double ST;
double SC;
double SS;
} material[100];
//Function Prototypes
int get_data(char *fileptr);
entityfunctionptr HM_getfunction(int function, HM_entitytype entities);
int HM_getMaterials();
int main(int argc, char *argv[])
{
/* The main function calls get_data to process the data in the solver deck,
initializes HyperMesh, sets the solver to 100 (the same number defined in
the template), reads the model and passes material data structures to HyperMesh,
and finally closes the connection between HM and the FE-input reader. */
get_data(argv[1]);
HMIN_init("ExampleFEInput", "10.0", argc, argv);
HMIN_setsolver(100);
HMIN_readmodel(HM_getfunction);
HMIN_close();
return(0);
}
int get_data(char *fileptr)
{
/* This function opens a solver deck defined as the first argument on the
input line and reads the solver deck for MAT1 cards. If a MAT1 card is found
then the MAT1 solver card is read and a material data structure is populated. */
ifstream infile;
char token[9];
char line[128];
//Open Solver Deck
infile.open(fileptr, ios::in);
if (infile.fail())
return(1);
//Read Solver Deck for MAT1 Solver Cards and Populate Material Data Structure
nummaterials = 0;
while (!infile.eof())
{
infile.get(token, 9);
if (strcmp(token, "MAT1 ") == 0)
{
//Name
strcpy_s(material[nummaterials].name, "material");
//id
infile.get(token, 9);
material[nummaterials].id = atoi(token);
//E
infile.get(token, 9);
material[nummaterials].E = atof(token);
//G
infile.get(token, 9);
material[nummaterials].G = atof(token);
//NU
infile.get(token, 9);
material[nummaterials].NU = atof(token);
//RHO
infile.get(token, 9);
material[nummaterials].RHO = atof(token);
//A
infile.get(token, 9);
material[nummaterials].A = atof(token);
//TREF
infile.get(token, 9);
material[nummaterials].TREF = atof(token);
//GE
infile.get(token, 9);
material[nummaterials].GE = atof(token);
infile.get();
//Blank Field
infile.get(token, 9);
//ST
infile.get(token, 9);
material[nummaterials].ST = atof(token);
//SC
infile.get(token, 9);
material[nummaterials].SC = atof(token);
//SS
infile.get(token, 9);
material[nummaterials].SS = atof(token);
infile.get();
nummaterials++;
}
else
infile.getline(line, sizeof(line));
}
return(0);
}
entityfunctionptr HM_getfunction(int function, HM_entitytype entities)
{
/* This user-defined function is passed into hminlib and is
used by hminlib to find all of the user-defined functions
which perform reading and information passing. Note
that if a user-defined function is not required, this function
must return NULL. */
switch (function)
{
case HMIN_OPENFUNCTION:
break;
case HMIN_ENTITYOPENFUNCTION:
break;
case HMIN_ENTITYGETFUNCTION:
switch (entities)
{
case HM_ENTITYTYPE_NULL:
break;
case HM_ENTITYTYPE_CARDS:
break;
case HM_ENTITYTYPE_SYSTCOLS:
break;
case HM_ENTITYTYPE_SYSTS:
break;
case HM_ENTITYTYPE_NODES:
break;
case HM_ENTITYTYPE_VECTORCOLS:
break;
case HM_ENTITYTYPE_VECTORS:
break;
case HM_ENTITYTYPE_MATS:
return(HM_getMaterials);
case HM_ENTITYTYPE_PROPS:
break;
case HM_ENTITYTYPE_COMPS:
break;
case HM_ENTITYTYPE_GROUPS:
break;
case HM_ENTITYTYPE_ELEMS:
break;
case HM_ENTITYTYPE_LOADCOLS:
break;
case HM_ENTITYTYPE_EQUATIONS:
break;
case HM_ENTITYTYPE_LOADS:
break;
case HM_ENTITYTYPE_GEOMETRY:
break;
case HM_ENTITYTYPE_LINES:
break;
case HM_ENTITYTYPE_SURFS:
break;
case HM_ENTITYTYPE_POINTS:
break;
case HM_ENTITYTYPE_ASSEMS:
break;
case HM_ENTITYTYPE_CURVES:
break;
case HM_ENTITYTYPE_PLOTS:
break;
case HM_ENTITYTYPE_BLOCKS:
break;
case HM_ENTITYTYPE_TITLES:
break;
case HM_ENTITYTYPE_SETS:
break;
case HM_ENTITYTYPE_OUTPUTBLOCKS:
break;
case HM_ENTITYTYPE_LOADSTEPS:
break;
case HM_ENTITYTYPE_SENSORS:
break;
case HM_ENTITYTYPE_DESIGNVARS:
break;
case HM_ENTITYTYPE_BEAMSECTCOLS:
break;
case HM_ENTITYTYPE_BEAMSECTS:
break;
case HM_ENTITYTYPE_OPTITABLEENTRS:
break;
case HM_ENTITYTYPE_OPTIFUNCTIONS:
break;
case HM_ENTITYTYPE_OPTIRESPONSES:
break;
case HM_ENTITYTYPE_DVPRELS:
break;
case HM_ENTITYTYPE_OPTICONSTRAINTS:
break;
case HM_ENTITYTYPE_DESVARLINKS:
break;
case HM_ENTITYTYPE_OBJECTIVES:
break;
case HM_ENTITYTYPE_CONTROLVOLS:
break;
case HM_ENTITYTYPE_MULTIBODIES:
break;
case HM_ENTITYTYPE_ELLIPSOIDS:
break;
case HM_ENTITYTYPE_OPTICONTROLS:
break;
case HM_ENTITYTYPE_OPTIDSCREENS:
break;
case HM_ENTITYTYPE_TAG:
break;
case HM_ENTITYTYPE_MBJOINT:
break;
case HM_ENTITYTYPE_MBPLANE:
break;
case HM_ENTITYTYPE_DOBJREFS:
break;
case HM_ENTITYTYPE_CONTACTSURFS:
break;
case HM_ENTITYTYPE_CONNECTORS:
break;
case HM_ENTITYTYPE_SYMMETRYS:
break;
case HM_ENTITYTYPE_HANDLES:
break;
case HM_ENTITYTYPE_DOMAINS:
break;
case HM_ENTITYTYPE_SHAPES:
break;
case HM_ENTITYTYPE_SOLIDS:
break;
case HM_ENTITYTYPE_MORPHCONSTRAINTS:
break;
case HM_ENTITYTYPE_HYPERCUBES:
break;
case HM_ENTITYTYPE_DDVALS:
break;
case HM_ENTITYTYPE_BAGS:
break;
case HM_ENTITYTYPE_MAX:
break;
}
break;
case HMIN_ENTITYCLOSEFUNCTION:
break;
case HMIN_NAMEFUNCTION:
break;
case HMIN_MOVEFUNCTION:
break;
case HMIN_COLORFUNCTION:
break;
case HMIN_ASSOCIATEFUNCTION:
break;
case HMIN_CEDATAFUNCTION:
break;
case HMIN_METADATAFUNCTION:
break;
case HMIN_CLOSEFUNCTION:
break;
}
return(NULL);
}
int HM_getMaterials()
{
/* This function writes each material data structure to HyperMesh. */
int i;
//Write each material data structure to HyperMesh
for (i=0; i<nummaterials; i++)
{
HMIN_material_write(material[i].id, material[i].name);
HMIN_writeattribute_int(HM_ENTITYTYPE_MATS, material[i].id, 1, 0, 1, 1);
HMIN_writeattribute_double(HM_ENTITYTYPE_MATS, material[i].id, 2, 0, 1, material[i].E);
HMIN_writeattribute_double(HM_ENTITYTYPE_MATS, material[i].id, 3, 0, 1, material[i].G);
HMIN_writeattribute_double(HM_ENTITYTYPE_MATS, material[i].id, 4, 0, 1, material[i].NU);
HMIN_writeattribute_double(HM_ENTITYTYPE_MATS, material[i].id, 5, 0, 1, material[i].RHO);
HMIN_writeattribute_double(HM_ENTITYTYPE_MATS, material[i].id, 6, 0, 1, material[i].A);
HMIN_writeattribute_double(HM_ENTITYTYPE_MATS, material[i].id, 7, 0, 1, material[i].TREF);
HMIN_writeattribute_double(HM_ENTITYTYPE_MATS, material[i].id, 8, 0, 1, material[i].GE);
HMIN_writeattribute_double(HM_ENTITYTYPE_MATS, material[i].id, 9, 0, 1, material[i].ST);
HMIN_writeattribute_double(HM_ENTITYTYPE_MATS, material[i].id, 10, 0, 1, material[i].SC);
HMIN_writeattribute_double(HM_ENTITYTYPE_MATS, material[i].id, 11, 0, 1, material[i].SS);
}
return(0);
}