20 static void ItoA(
int i,
char *s) { sprintf(s,
"%d", i); }
22 static int mesh_dof = 3;
24 static bool check_mesh_for_fstr(
CHECData &hec) {
25 bool fg_dof[4] = {
false,
false,
false,
false};
26 int dof_tbl[4] = {1, 2, 3, 6};
27 vector<CHECDataBlock *>::iterator iter;
29 for (iter = hec.
DB.begin(); iter != hec.
DB.end(); iter++) {
58 for (
int i = 0; i < 4; i++) {
61 mesh_dof = dof_tbl[i];
66 printf(
"### FrontSTR does not permit plural DOF\n");
82 cbitem(
int id = -1,
double v = 0) : nid(id), value(v) {}
112 static void set_boundary_node_by_506(set<cbitem> *bitem,
int dof_n,
113 vector<CNFDB_506::cconst_item> &item,
115 vector<CNFDB_506::cconst_item>::iterator iter;
117 for (iter = item.begin(); iter != item.end(); iter++) {
118 for (
int i = 0; i < dof_n; i++) {
120 bitem[i].insert(
cbitem(iter->ID));
128 static void set_boundary_node_by_507(
129 set<cbitem> *bitem, vector<CNFDB_507::cstructural_load_rec> &item,
131 const int load_dof = 3;
132 const int FEA_load_nDisplacement = 3;
133 vector<cbitem> new_bitem[load_dof];
134 vector<CNFDB_507::cstructural_load_rec>::iterator iter;
136 for (iter = item.begin(); iter != item.end(); iter++) {
137 if (iter->loadtype != FEA_load_nDisplacement)
continue;
139 set<cbitem>::iterator biter;
141 for (
int i = 0; i < load_dof; i++) {
144 for (biter = bitem[i].begin(); biter != bitem[i].end(); biter++) {
145 if (biter->nid == iter->loadID)
break;
148 if (biter == bitem[i].end())
continue;
150 bitem[i].erase(biter);
151 new_bitem[i].push_back(
cbitem(iter->loadID, iter->value[i]));
155 for (
int i = 0; i < load_dof; i++) {
156 vector<cbitem>::iterator biter;
158 for (biter = new_bitem[i].begin(); biter != new_bitem[i].end(); biter++) {
159 bitem[i].insert(*biter);
166 const int max_dof_n = 6;
167 set<cbitem> bitem[max_dof_n];
168 int dof_n = mesh_dof;
171 vector<CNFDB_506 *>::iterator iter;
173 for (iter = neu.DB_506.begin(); iter != neu.DB_506.end(); iter++) {
175 set_boundary_node_by_506(bitem, dof_n, p->
const_nodes, hec);
180 vector<CNFDB_507 *>::iterator iter;
182 for (iter = neu.DB_507.begin(); iter != neu.DB_507.end(); iter++) {
191 for (
int i = 0; i < dof_n; i++) {
192 set<cbitem>::iterator iter;
194 for (iter = bitem[i].begin(); iter != bitem[i].end(); iter++) {
196 ItoA(iter->nid, name);
204 hec.
DB.push_back(bc);
217 const int load_dof = 3;
218 const int FEA_load_nForce = 1;
220 if (neu.DB_507.size() == 0)
return;
223 vector<CNFDB_507 *>::iterator iter;
225 for (iter = neu.DB_507.begin(); iter != neu.DB_507.end(); iter++) {
227 vector<CNFDB_507::cstructural_load_rec>::iterator siter;
231 if (siter->loadtype != FEA_load_nForce)
continue;
233 for (
int i = 0; i < load_dof; i++) {
234 if (siter->dof_face[i] == 0)
continue;
237 ItoA(siter->loadID, name);
246 hec.
DB.push_back(cload);
262 dir[0] = block->
grav[0];
263 dir[1] = block->
grav[1];
264 dir[2] = block->
grav[2];
265 g = dir[0] * dir[0] + dir[1] * dir[1] + dir[2] * dir[2];
275 item.param[1] = dir[0];
276 item.param[2] = dir[1];
277 item.param[3] = dir[2];
286 dir[0] = block->
omega[0];
287 dir[1] = block->
omega[1];
288 dir[2] = block->
omega[2];
289 omega = dir[0] * dir[0] + dir[1] * dir[1] + dir[2] * dir[2];
291 if (omega == 0)
return;
298 item.param[0] = omega;
299 item.param[1] = block->
origin[0];
300 item.param[2] = block->
origin[1];
301 item.param[3] = block->
origin[2];
302 item.param[4] = dir[0];
303 item.param[5] = dir[1];
304 item.param[6] = dir[2];
309 const int FEA_load_ePressure = 42;
311 if (neu.DB_507.size() == 0)
return;
314 vector<CNFDB_507 *>::iterator iter;
316 for (iter = neu.DB_507.begin(); iter != neu.DB_507.end(); iter++) {
318 set_dload_grav(p, dload);
319 set_dload_cent(p, dload);
320 vector<CNFDB_507::cstructural_load_rec>::iterator siter;
324 if (siter->loadtype != FEA_load_ePressure)
continue;
326 int eid = siter->loadID;
327 int surf_no = siter->dof_face[0];
330 if (hec_e_type == 0)
continue;
335 double load = fg_front ? siter->value[0] : -siter->value[0];
337 ItoA(siter->loadID, name);
339 item.param[0] = load;
345 hec.
DB.push_back(dload);
373 static void set_temp_node(vector<CNFDB_507::ctemp_load_rec> &tload,
374 set<cnode_temp> &nt) {
375 vector<CNFDB_507::ctemp_load_rec>::iterator iter;
377 for (iter = tload.begin(); iter != tload.end(); iter++) {
383 static void set_temp_elem(
CHECData &hec,
384 vector<CNFDB_507::ctemp_load_rec> &tload,
385 set<cnode_temp> &nt) {
386 vector<CNFDB_507::ctemp_load_rec>::iterator iter;
388 for (iter = tload.begin(); iter != tload.end(); iter++) {
393 for (
int i = 0; i < elem->
node_n; i++) {
401 if (neu.DB_507.size() == 0)
return;
404 vector<CNFDB_507 *>::iterator iter;
406 for (iter = neu.DB_507.begin(); iter != neu.DB_507.end(); iter++) {
414 hec.
DB.push_back(temp);
423 if (neu.DB_507.size() == 0)
return;
427 vector<CNFDB_507 *>::iterator iter;
429 for (iter = neu.DB_507.begin(); iter != neu.DB_507.end(); iter++) {
435 hec.
DB.push_back(reftemp);
445 if (!check_mesh_for_fstr(hec))
throw;
447 SetBoundary(neu, hec);
450 SetTemperature(neu, hec);
451 SetReftemp(neu, hec);