elmt_library.c
来自「利用语言编写的有限元分析软件」· C语言 代码 · 共 558 行 · 第 1/2 页
C
558 行
/*
* =============================================================================
* ALADDIN Version 1.0 :
* elmt_library.c : Utility Functions for Element Library
*
* Copyright (C) 1995 by Mark Austin, Xiaoguang Chen, and Wane-Jang Lin
* Institute for Systems Research,
* University of Maryland, College Park, MD 20742
*
* This software is provided "as is" without express or implied warranty.
* Permission is granted to use this software for any on any computer system
* and to redistribute it freely, subject to the following restrictions:
*
* 1. The authors are not responsible for the consequences of use of
* this software, even if they arise from defects in the software.
* 2. The origin of this software must not be misrepresented, either
* by explicit claim or by omission.
* 3. Altered versions must be plainly marked as such, and must not
* be misrepresented as being the original software.
* 4. This notice is to remain intact.
*
* Written by: Mark Austin, Xiaoguang Chen, and Wane-Jang Lin December 1995
* =============================================================================
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "defs.h"
#include "units.h"
#include "matrix.h"
#include "fe_database.h"
#include "symbol.h"
#include "fe_functions.h"
#include "elmt.h"
#include "miscellaneous.h"
#define Streq(s1, s2) (strcmp(s1, s2) == 0)
extern ARRAY *array;
extern EFRAME *frame;
#ifdef __STDC__
ARRAY *elmlib(ARRAY *p, int isw)
#else
ARRAY *elmlib(p, isw)
ARRAY *p;
int isw;
#endif
{
int i,l,m,k;
static int FLAG;
/* Check for element no errors */
#ifdef DEBUG
printf(" enter elmlib() \n");
printf(" elmt_type = %s \n", p->elmt_type);
printf(" elmt_no = %d \n", p->elmt_no);
#endif
/* For selected element tasks, zero stiffness matrix */
/* PROPTY=1, CHERROR=2, STIFF=3, STRESS=4, MASS_MATRIX=5, LOAD_MATRIX=6 */
/* PRESSLD=7, STRESS_LOAD=8, EQUIV_NODAL_LOAD=9 */
if(isw >= 3 && isw <= 6) {
k = p->size_of_stiff;
if(isw >= STIFF) {
for(i=1; i <= k; i++) {
for(m=1; m <= k; m++)
p->stiff->uMatrix.daa[i-1][m-1] = 0.0;
}
if( CheckUnits()==ON ) {
for(i = 1; i <= k; i++) {
ZeroUnits( &(p->stiff->spRowUnits[i-1]) );
ZeroUnits( &(p->stiff->spColUnits[i-1]) );
p->stiff->spRowUnits[i-1].units_type = SI_US;
p->stiff->spColUnits[i-1].units_type = SI_US;
}
}
}
}
/* Switch to element tasks() */
FLAG = FALSE;
for(i = 0; i <= NO_ELEMENTS_IN_LIBRARY; i++){
if(elmt_library[i].name != NULL && Streq(p->elmt_type, elmt_library[i].name)) {
p = (*(ARRAY * (*) ()) (elmt_library[i].elmt_lib_func))(p, isw);
FLAG = TRUE;
break;
}
}
if(FLAG == FALSE) {
printf("FATAL ERROR >> In elmtlib(): \n");
printf("FATAL ERROR >> elmt_type = %s is not defined in element library: elmt.h \n", p->elmt_type);
exit(1);
}
return(p);
#ifdef DEBUG
printf(" Leaving elmtlib() \n");
#endif
}
/* ============================================================== */
/* Assign Properties */
/* Print material and element information */
/* ============================================================== */
#ifdef __STDC__
EFRAME *assign_properties(EFRAME *frame, ELEMENT_ATTR *eap, MATERIAL_ATTR *map, SECTION_ATTR *sap, FIBER_ELMT *fep, int elmt_no, int n)
#else
EFRAME *assign_properties(frame, eap, map, sap, fep, elmt_no, n)
EFRAME *frame;
ELEMENT_ATTR *eap;
MATERIAL_ATTR *map;
SECTION_ATTR *sap;
FIBER_ELMT *fep;
int elmt_no;
int n; /* elmt attr no. */
#endif
{
int no_dof, i, j;
int length;
int UNITS_SWITCH;
static int FLAG;
SYMBOL *slp;
int iInPlaneIntegPts;
int iThicknessIntegPts;
int iNO_INTEG_pts;
#ifdef DEBUG
printf(" enter assign_properties\n");
#endif
UNITS_SWITCH = CheckUnits();
slp = lookup("InPlaneIntegPts"); /* number of integration pts in plane/surface */
if(slp == NULL)
iInPlaneIntegPts = 2*2; /* 2x2 as default */
else
iInPlaneIntegPts = (int) slp->u.q->value;
slp = lookup("ThicknessIntegPts"); /* number of integration pts in thickness direction*/
if(slp == NULL)
iThicknessIntegPts = 2; /* 2 as default */
else
iThicknessIntegPts = (int) slp->u.q->value;
iNO_INTEG_pts = iInPlaneIntegPts*iThicknessIntegPts;
/* material property */
if(map->LC_ptr->name != (char *)NULL) {
frame->element[elmt_no-1].LC_ptr->name = SaveString(map->LC_ptr->name);
frame->element[elmt_no-1].LC_ptr->alpha = map->LC_ptr->alpha;
frame->element[elmt_no-1].LC_ptr->n = map->LC_ptr->n;
frame->element[elmt_no-1].LC_ptr->beta = map->LC_ptr->beta;
} else {
frame->element[elmt_no-1].LC_ptr->name = (char *)NULL;
frame->element[elmt_no-1].LC_ptr->alpha = 0.0;
frame->element[elmt_no-1].LC_ptr->n = 0.0;
frame->element[elmt_no-1].LC_ptr->beta = 0.0;
}
frame->element[elmt_no-1].LC_ptr->ialph = map->LC_ptr->ialph;
frame->element[elmt_no-1].LC_ptr->pen = map->LC_ptr->pen;
frame->element[elmt_no-1].LC_ptr->load[0] = map->LC_ptr->load[0];
frame->element[elmt_no-1].LC_ptr->load[1] = map->LC_ptr->load[1];
frame->element[elmt_no-1].LC_ptr->load[2] = map->LC_ptr->load[2];
frame->element[elmt_no-1].LC_ptr->load[3] = map->LC_ptr->load[3];
frame->element[elmt_no-1].LC_ptr->load[4] = map->LC_ptr->load[4];
frame->element[elmt_no-1].LC_ptr->load[5] = map->LC_ptr->load[5];
for(j = 1; j <= iNO_INTEG_pts; j++) {
frame->element[elmt_no-1].LC_ptr->H[j-1] = map->LC_ptr->H[j-1];
frame->element[elmt_no-1].LC_ptr->R[j-1] = map->LC_ptr->R[j-1];
for(i = 1; i <= 6; i++) {
frame->element[elmt_no-1].LC_ptr->back_stress[i-1][j-1]
= map->LC_ptr->back_stress[i-1][j-1];
}
}
frame->eattr[n-1].work_material[0].value = map->E.value;
frame->eattr[n-1].work_material[1].value = map->G.value;
frame->eattr[n-1].work_material[2].value = map->fy.value;
frame->eattr[n-1].work_material[3].value = map->ET.value;
frame->eattr[n-1].work_material[4].value = map->nu;
frame->eattr[n-1].work_material[5].value = map->density.value;
frame->eattr[n-1].work_material[6].value = map->fu.value;
frame->eattr[n-1].work_material[7].value = map->alpha_thermal[0].value;
frame->eattr[n-1].work_material[8].value = map->alpha_thermal[1].value;
frame->eattr[n-1].work_material[9].value = map->alpha_thermal[2].value;
frame->eattr[n-1].work_material[10].value = map->Gt.value;
frame->eattr[n-1].work_material[11].value = map->ks;
frame->eattr[n-1].work_material[12].value = map->fv.value;
switch(UNITS_SWITCH) {
case ON:
if(map->E.dimen != NULL)
UnitsCopy( frame->eattr[n-1].work_material[0].dimen, map->E.dimen );
if(map->G.dimen != NULL)
UnitsCopy( frame->eattr[n-1].work_material[1].dimen, map->G.dimen );
if(map->fy.dimen != NULL)
UnitsCopy( frame->eattr[n-1].work_material[2].dimen, map->fy.dimen );
if(map->ET.dimen != NULL)
UnitsCopy( frame->eattr[n-1].work_material[3].dimen, map->ET.dimen );
ZeroUnits( frame->eattr[n-1].work_material[4].dimen );
if(map->density.dimen != NULL)
UnitsCopy( frame->eattr[n-1].work_material[5].dimen, map->density.dimen );
if(map->fu.dimen != NULL)
UnitsCopy( frame->eattr[n-1].work_material[6].dimen, map->fu.dimen );
if(map->alpha_thermal[0].dimen != NULL)
UnitsCopy( frame->eattr[n-1].work_material[7].dimen, map->alpha_thermal[0].dimen );
if(map->alpha_thermal[1].dimen != NULL)
UnitsCopy( frame->eattr[n-1].work_material[8].dimen, map->alpha_thermal[1].dimen );
if(map->alpha_thermal[2].dimen != NULL)
UnitsCopy( frame->eattr[n-1].work_material[9].dimen, map->alpha_thermal[2].dimen );
if(map->Gt.dimen != NULL)
UnitsCopy( frame->eattr[n-1].work_material[10].dimen, map->Gt.dimen );
ZeroUnits( frame->eattr[n-1].work_material[11].dimen );
if(map->fv.dimen != NULL)
UnitsCopy( frame->eattr[n-1].work_material[12].dimen, map->fv.dimen );
break;
case OFF:
break;
default:
break;
}
/* section property */
frame->eattr[n-1].work_section[0].value = sap->Ixx.value;
frame->eattr[n-1].work_section[1].value = sap->Iyy.value;
frame->eattr[n-1].work_section[2].value = sap->Izz.value;
frame->eattr[n-1].work_section[3].value = sap->Ixy.value;
frame->eattr[n-1].work_section[4].value = sap->Ixz.value;
frame->eattr[n-1].work_section[5].value = sap->Iyz.value;
frame->eattr[n-1].work_section[6].value = sap->weight.value;
frame->eattr[n-1].work_section[7].value = sap->bf.value;
frame->eattr[n-1].work_section[8].value = sap->tf.value;
frame->eattr[n-1].work_section[9].value = sap->depth.value;
if(sap->area.value != 0.0)
frame->eattr[n-1].work_section[10].value = sap->area.value;
else
if( sap->bf.value != 0 )
frame->eattr[n-1].work_section[10].value = sap->bf.value*sap->depth.value;
else
frame->eattr[n-1].work_section[10].value = sap->width.value*sap->depth.value;
frame->eattr[n-1].work_section[11].value = sap->plate_thickness.value;
frame->eattr[n-1].work_section[12].value = sap->tor_const.value;
frame->eattr[n-1].work_section[13].value = sap->rT.value;
frame->eattr[n-1].work_section[14].value = sap->width.value;
frame->eattr[n-1].work_section[15].value = sap->tw.value;
switch(UNITS_SWITCH) {
case ON:
if(sap->Ixx.dimen != NULL)
UnitsCopy( frame->eattr[n-1].work_section[0].dimen, sap->Ixx.dimen );
if(sap->Iyy.dimen != NULL)
UnitsCopy( frame->eattr[n-1].work_section[1].dimen, sap->Iyy.dimen );
if(sap->Izz.dimen != NULL)
UnitsCopy( frame->eattr[n-1].work_section[2].dimen, sap->Izz.dimen );
if(sap->Ixy.dimen != NULL)
UnitsCopy( frame->eattr[n-1].work_section[3].dimen, sap->Ixy.dimen );
if(sap->Ixz.dimen != NULL)
UnitsCopy( frame->eattr[n-1].work_section[4].dimen, sap->Ixz.dimen );
if(sap->Iyz.dimen != NULL)
UnitsCopy( frame->eattr[n-1].work_section[5].dimen, sap->Iyz.dimen );
if(sap->weight.dimen != NULL)
UnitsCopy( frame->eattr[n-1].work_section[6].dimen, sap->weight.dimen );
if(sap->bf.dimen != NULL)
UnitsCopy( frame->eattr[n-1].work_section[7].dimen, sap->bf.dimen );
if(sap->tf.dimen != NULL)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?