⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 elmt_psps.c

📁 利用语言编写的有限元分析软件
💻 C
📖 第 1 页 / 共 4 页
字号:
/*
 *  ============================================================================= 
 *  ALADDIN Version 1.0 :
 *          elmt_psps.c : Plane Stress Plane Strain Element
 *                                                                     
 *  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 <math.h>
#include "defs.h"
#include "units.h"
#include "matrix.h"
#include "vector.h"
#include "fe_database.h"
#include "symbol.h"
#include "fe_functions.h"

/*
#define DEBUG
*/
#define Streq(s1, s2) (strcmp(s1, s2) == 0)


/* ============================================================== */
/*   Element01                                                    */
/*   2D   Actions on Plane Stress/Plane Strain Element            */
/*        For Properties, see note below.                         */
/* ============================================================== */

save_actions_elmt01(ep,p)
ELEMENT *ep;
ARRAY    *p;
{
   /* ADD DETAILS LATER */
}


/* ================================================ */
/*   Plane-stress and plane strain Element          */
/*   elements: PLANE_STRAIN; PLANE_STRESS           */
/*   Plane Linear Elastic Element                   */
/* ================================================ */
/*    p->work_material[0] = E;
      p->work_material[1] = G;
      p->work_material[2] = fy;
      p->work_material[3] = ET;
      p->work_material[4] = nu;
      p->work_material[5] = density;
      p->work_material[6] = fu;
      p->work_material[7] = alpha_thermal[0];
      p->work_material[8] = alpha_thermal[1];

      p->work_section[0] = Ixx;
      p->work_section[1] = Iyy;
      p->work_section[2] = Izz;
      p->work_section[3] = Ixy;
      p->work_section[4] = Ixz;
      p->work_section[5] = Iyz;
      p->work_section[6] = weight;
      p->work_section[7] = bf;
      p->work_section[8] = tf;
      p->work_section[9] = depth;
      p->work_section[10] = area;                                  */
/* ============================================================== */


ARRAY *elmt_psps(p,isw)
ARRAY *p;
int isw;
{
static QUANTITY fy, G, E, ET, density, lambda;
double nu;
double temperature, *alpha_thermal;

char *elmt_type;
int no_integ_pts, no_stress_pts;
int l, k, i, j,j1, k1, lint, kk;

double sg[17],tg[17],wg[17],sig[7],
       jacobain,w11,w12,w21,w22, xx, yy, dv, wd[3];
double **B_matrix;
double **B_Transpose;
double **stiff;
double **Mater_matrix;
double **body_force;
double **strain;
double **stress;
double **temp_change;
double **load;
double **displ;
double **nodal_load;
double **shp;
double **temp_matrix;

int             dof_per_elmt;
int          length1, length;
int             UNITS_SWITCH;
double         *sum_row, sum;
DIMENSIONS        *dp_stress;
DIMENSIONS     *d1, *d2, *d3;

#ifdef DEBUG
       printf("*** enter elmt_psps()\n");
#endif

    UNITS_SWITCH = CheckUnits();
    dof_per_elmt  = p->nodes_per_elmt*p->dof_per_node;  

   /* Allocation for matrices */

    alpha_thermal = dVectorAlloc(2);
    strain        = MatrixAllocIndirectDouble(3, 1);
    stress        = MatrixAllocIndirectDouble(3, 1);
    displ         = MatrixAllocIndirectDouble(dof_per_elmt, 1);
    stiff         = MatrixAllocIndirectDouble(dof_per_elmt, dof_per_elmt);
    load          = MatrixAllocIndirectDouble(dof_per_elmt, 1);
    nodal_load    = MatrixAllocIndirectDouble(dof_per_elmt, 1);
    B_matrix      = MatrixAllocIndirectDouble(3, dof_per_elmt);
    shp           = MatrixAllocIndirectDouble(3, p->nodes_per_elmt);
    sum_row       = dVectorAlloc(dof_per_elmt);

    B_Transpose   = MatrixAllocIndirectDouble(dof_per_elmt, 3);
    temp_matrix   = MatrixAllocIndirectDouble(dof_per_elmt, 3);
    body_force    = MatrixAllocIndirectDouble(3, 1);
/*
   Mater_matrix  = MatrixAllocIndirectDouble(3, 3);
   temp_change   = MatrixAllocIndirectDouble(3, 1);
*/

            E.value       =  p->work_material[0].value; 
            fy.value      =  p->work_material[2].value;
            ET.value      =  p->work_material[3].value;
            nu            =  p->work_material[4].value; 
            density.value =  p->work_material[5].value;

            if(UNITS_SWITCH == ON) {
               E.dimen       =  p->work_material[0].dimen; 
               fy.dimen      =  p->work_material[2].dimen;
               ET.dimen      =  p->work_material[3].dimen;
               density.dimen =  p->work_material[5].dimen;
            }

            alpha_thermal[0] = p->work_material[7].value; /* thermal expansion coeff. in x-dirct */
            alpha_thermal[1] = p->work_material[8].value; /* thermal expansion coeff. in y-direc */

            if(p->nodes_per_elmt == 4) no_integ_pts  =  2;/* 4-node element */
            if(p->nodes_per_elmt == 8) no_integ_pts  =  3;/* 8-node element */

            no_stress_pts = no_integ_pts;                 /* stress points, subject to change later */

            elmt_type  = p->elmt_type;          

            if(Streq("PLANE_STRAIN", elmt_type)) {
               E.value  = p->work_material[0].value = E.value /(1+nu)/(1-nu);
               nu = p->work_material[4].value = nu * E.value;
               G.value  = p->work_material[1].value = E.value/2/(1+nu);
               for (i = 1; i <= 2; i++)
               alpha_thermal[i-1]  =  alpha_thermal[i-1]*(1.0 + nu);
            }

   switch(isw) {
       case PROPTY:  /* input material properties */

            lint = 0;
            break;
       case CHERROR:
            break;
       case STIFF:

#ifdef DEBUG
       printf("*** in elmt_psps() : start case STIFF \n");
#endif

            for(i = 1; i <= dof_per_elmt; i++) 
                for(j = 1; j<= dof_per_elmt; j++)
                    stiff[i-1][j-1] = 0.0;

            if(no_integ_pts*no_integ_pts != lint)
               pgauss(no_integ_pts,&lint,sg,tg,wg);

            /* start gaussian integration  */

            for(l = 1; l<= lint; l++) { 
               shape(sg[l-1],tg[l-1],p->coord,shp,&jacobain,p->no_dimen,p->nodes_per_elmt, p->node_connect,FALSE);
            /* output:                                    */
            /*     shp[0][i-1] = dN_i/dx                  */
            /*     shp[1][i-1] = dN_i/dy                  */
            /*     compute [B] matrix at each Gaussian    */
            /*     integration point                      */

            /*****************************************************/
            /*  Derivative matrix                                */
            /*     (B_i)3x2; B_i[0][0] = dNi/dx, B_i[0][1] = 0   */
            /*     B_i[1][0] = 0,      B_i[1][1] = dNi/dy        */
            /*     B_i[2][0] = dNi/dy, B_i[2][2] = dNi/dx        */
            /*     [B] = [B_1, B_2, B_3, B_4, ..., B_n]          */
            /*       n = no of node                              */ 
            /*****************************************************/
            
            /* material matrix */
            Mater_matrix = MATER_MAT_PLANE(E.value, nu);

            /* Form [B] matrix */
            
            for(j = 1; j <= p->nodes_per_elmt; j++) { 
               k = 2*(j-1);
               B_matrix[0][k]   = shp[0][j-1];
               B_matrix[1][k+1] = shp[1][j-1];
               B_matrix[2][k]   = shp[1][j-1];
               B_matrix[2][k+1] = shp[0][j-1];
            }
           
           /* muti. Jacobain determinant with weight coefficents and mater matrix */
          
            jacobain = jacobain* wg[l-1];

            for( i = 1; i <=3 ; i++ ) 
              for (j = 1; j <= 3; j++)  
                 Mater_matrix[i-1][j-1]  *= jacobain;

           /* Transpose [B] matrix */

            for(i = 1; i <= 3; i++)
                for(j = 1; j <= dof_per_elmt; j++) 
                    B_Transpose[j-1][i-1] = B_matrix[i-1][j-1];

           /* [a] [B]^T * [Mater]  and save in [B]^T    */

           temp_matrix = dMatrixMultRep(temp_matrix, B_Transpose, dof_per_elmt, 3, Mater_matrix, 3, 3);

           /* [b] calculate stiffness : integral of [B]^T * [Mater] * [B] */

           stiff = dMatrixMultRep(stiff, temp_matrix, dof_per_elmt, 3, B_matrix, 3, dof_per_elmt);

           for (i = 1; i <= dof_per_elmt; i++) 
             for (j = 1; j <= dof_per_elmt; j++) 
                 p->stiff->uMatrix.daa[i-1][j-1]  += stiff[i-1][j-1];
           }

#ifdef DEBUG
       dMatrixPrint("element stiffness matrix", p->stiff->uMatrix.daa, dof_per_elmt, dof_per_elmt);

      /* check element stiffness : sum of row of K = 0 */

       for (i = 1; i <= dof_per_elmt; i++) 
          sum_row[i-1] =  0.0;

       for (i = 1; i <= dof_per_elmt; i++) 
          for (j = 1; j <= dof_per_elmt; j++) 
            sum_row[i-1] +=  p->stiff->uMatrix.daa[i-1][j-1]; 

       for (i = 1; i <= dof_per_elmt; i++) 
         printf(" Stiffness K_e : sum of row[%d] = %lf \n", i, sum_row[i-1]); 

#endif

     /**************************************************/
     /* Assign Units to Stiffness Matrix               */
     /**************************************************/

       /* Initiation of Stiffness Units Buffer                      */
     
       switch(UNITS_SWITCH) {
         case ON:
           if(UNITS_TYPE == SI) {
              d1 = DefaultUnits("Pa");
              d2 = DefaultUnits("m");
           }
           else {
              d1 = DefaultUnits("psi");
              d2 = DefaultUnits("in");
           }

           /* node 1 */
           UnitsMultRep( &(p->stiff->spColUnits[0]), d1, d2 );
           UnitsCopy( &(p->stiff->spColUnits[1]), &(p->stiff->spColUnits[0]) );

           /* node i  i > 1*/
           for(i = 2; i <= p->nodes_per_elmt; i++) {
                for(j = 1; j <= p->dof_per_node; j++) {
                    k  = p->dof_per_node*(i-1) + j;
                    UnitsCopy( &(p->stiff->spColUnits[k-1]), &(p->stiff->spColUnits[0]) );
                }
           }
           free((char *) d1->units_name);
           free((char *) d1);
           free((char *) d2->units_name);
           free((char *) d2);

           for( i=1 ; i<=p->size_of_stiff ; i++ )
               ZeroUnits( &(p->stiff->spRowUnits[i-1]) );

         break;
         case OFF:
         break;
         default:
         break;
       }
     
#ifdef DEBUG
       printf("*** in elmt_psps() : leaving case STIFF\n");
#endif
       
      break;
      case EQUIV_NODAL_LOAD:
      /* calculate the equivalent nodal load */
      /* due to distributed loading          */
           
#ifdef DEBUG
       printf("*** in elmt_psps() : start case EQUIV_NODAL_LOAD: \n");
#endif
      /* initilize nodal_load */
      
      for(i = 1; i <= dof_per_elmt; i++) {
          p->equiv_nodal_load->uMatrix.daa[i-1][0] = 0.0;
          nodal_load[i-1][0] = 0.0;
          load[i-1][0]= 0.0;
      }
 
     for(i = 1; i<= no_integ_pts*no_integ_pts; i++) {
         sg[i-1] = 0.0;
         tg[i-1] = 0.0;
         wg[i-1] = 0.0;
     }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -