elmt_library.c

来自「利用语言编写的有限元分析软件」· C语言 代码 · 共 558 行 · 第 1/2 页

C
558
字号
         UnitsCopy( frame->eattr[n-1].work_section[8].dimen, sap->tf.dimen );
      if(sap->depth.dimen != NULL)
         UnitsCopy( frame->eattr[n-1].work_section[9].dimen, sap->depth.dimen );

      if(sap->area.value != 0.0) {
         if(sap->area.dimen != NULL)
            UnitsCopy( frame->eattr[n-1].work_section[10].dimen, sap->area.dimen );
      }
      else {
        if(sap->depth.dimen != NULL && sap->bf.dimen !=NULL)
           UnitsMultRep( frame->eattr[n-1].work_section[10].dimen,
                         sap->bf.dimen , sap->depth.dimen );
        else if(sap->depth.dimen != NULL && sap->width.dimen !=NULL)
           UnitsMultRep( frame->eattr[n-1].work_section[10].dimen,
                         sap->width.dimen , sap->depth.dimen );
      }

      if(sap->plate_thickness.dimen != NULL)
         UnitsCopy( frame->eattr[n-1].work_section[11].dimen, sap->plate_thickness.dimen );
      if(sap->tor_const.dimen != NULL)
         UnitsCopy( frame->eattr[n-1].work_section[12].dimen, sap->tor_const.dimen );
      if(sap->rT.dimen != NULL)
         UnitsCopy( frame->eattr[n-1].work_section[13].dimen, sap->rT.dimen );
      if(sap->width.dimen != NULL)
         UnitsCopy( frame->eattr[n-1].work_section[14].dimen, sap->width.dimen );
      if(sap->tw.dimen != NULL)
         UnitsCopy( frame->eattr[n-1].work_section[15].dimen, sap->tw.dimen );

      break;
      case OFF:
      break;
      default:
      break;
    }

    if( !(strcmp(eap->elmt_type, "FIBER")) ) {  /* store hash table data to frame */
       frame->eattr[n-1].work_fiber = (FIBER_ELMT *)MyCalloc(1,sizeof(FIBER_ELMT));
       frame->eattr[n-1].work_fiber->no_fiber = fep->no_fiber+2;   /* default: 2 shear spring */
       frame->eattr[n-1].work_fiber->fiber = (FIBER_ATTR *)MyCalloc(fep->no_fiber+2,sizeof(FIBER_ATTR));
       for( i=0 ; i < fep->no_fiber+2 ; ++i ) {
	 if( i < fep->no_fiber ) {
	   frame->eattr[n-1].work_fiber->fiber[i].y.value = fep->fiber[i].y.value;
	   frame->eattr[n-1].work_fiber->fiber[i].z.value = fep->fiber[i].z.value;
	   frame->eattr[n-1].work_fiber->fiber[i].area.value = fep->fiber[i].area.value;
	   frame->eattr[n-1].work_fiber->fiber[i].Es.value = fep->fiber[i].Es.value;
	   frame->eattr[n-1].work_fiber->fiber[i].Et.value = fep->fiber[i].Et.value;
	   frame->eattr[n-1].work_fiber->fiber[i].fy.value = fep->fiber[i].fy.value;
	 }
	 else {
	   frame->eattr[n-1].work_fiber->fiber[i].y.value = 0.0;
	   frame->eattr[n-1].work_fiber->fiber[i].z.value = 0.0;

	   if( map->ks <= 0.0 )   /* default shear correction factor ks = 1.2 */
	     frame->eattr[n-1].work_fiber->fiber[i].area.value
                  = frame->eattr[n-1].work_section[10].value / 1.2;
	   else
	     frame->eattr[n-1].work_fiber->fiber[i].area.value
                  = frame->eattr[n-1].work_section[10].value / map->ks;

	   if( map->nu <= 0.0 )   /* default nu = 0.3 */
              frame->eattr[n-1].work_material[4].value  = 0.3;

	   if( map->G.value <= 0.0 )   /* G = E/2/(1+nu) */
	     frame->eattr[n-1].work_fiber->fiber[i].Es.value
		  = map->E.value/2.0/(1.0+frame->eattr[n-1].work_material[4].value);
	   else
	     frame->eattr[n-1].work_fiber->fiber[i].Es.value = map->G.value;

	   if( map->Gt.value <= 0.0 ) {
	     if( map->ET.value <= 0.0 )   /* Et not exist, assume always linear, Et=Es */
	       frame->eattr[n-1].work_fiber->fiber[i].Et.value
	            = frame->eattr[n-1].work_fiber->fiber[i].Es.value;
	     else
	       frame->eattr[n-1].work_fiber->fiber[i].Et.value
		    = map->ET.value/2.0/(1.0+frame->eattr[n-1].work_material[4].value);
	   }
	   else
	     frame->eattr[n-1].work_fiber->fiber[i].Et.value = map->Gt.value;

	   if( map->fv.value <= 0.0 )   /* use fy as shear yielding stress */
	     frame->eattr[n-1].work_fiber->fiber[i].fy.value = map->fy.value;
	   else
	     frame->eattr[n-1].work_fiber->fiber[i].fy.value = map->fv.value;
	 }

         if(UNITS_SWITCH == ON) {
	   frame->eattr[n-1].work_fiber->fiber[i].y.dimen
                = (DIMENSIONS *)MyCalloc( 1, sizeof(DIMENSIONS) );
	   frame->eattr[n-1].work_fiber->fiber[i].z.dimen
                = (DIMENSIONS *)MyCalloc( 1, sizeof(DIMENSIONS) );
	   frame->eattr[n-1].work_fiber->fiber[i].area.dimen
                = (DIMENSIONS *)MyCalloc( 1, sizeof(DIMENSIONS) );
	   frame->eattr[n-1].work_fiber->fiber[i].Es.dimen
                = (DIMENSIONS *)MyCalloc( 1, sizeof(DIMENSIONS) );
	   frame->eattr[n-1].work_fiber->fiber[i].Et.dimen
                = (DIMENSIONS *)MyCalloc( 1, sizeof(DIMENSIONS) );
	   frame->eattr[n-1].work_fiber->fiber[i].fy.dimen
                = (DIMENSIONS *)MyCalloc( 1, sizeof(DIMENSIONS) );

	   if( i < fep->no_fiber ) {
             UnitsCopy( frame->eattr[n-1].work_fiber->fiber[i].y.dimen, fep->fiber[i].y.dimen );
             UnitsCopy( frame->eattr[n-1].work_fiber->fiber[i].z.dimen, fep->fiber[i].z.dimen );
	     /*
             UnitsCopy( frame->eattr[n-1].work_fiber->fiber[i].area.dimen, fep->fiber[i].area.dimen );
             UnitsCopy( frame->eattr[n-1].work_fiber->fiber[i].Es.dimen, fep->fiber[i].Es.dimen );
             UnitsCopy( frame->eattr[n-1].work_fiber->fiber[i].Et.dimen, fep->fiber[i].Et.dimen );
             UnitsCopy( frame->eattr[n-1].work_fiber->fiber[i].fy.dimen, fep->fiber[i].fy.dimen );
	     */
	   }
	   else {
             UnitsCopy( frame->eattr[n-1].work_fiber->fiber[i].y.dimen, fep->fiber[0].y.dimen );
             UnitsCopy( frame->eattr[n-1].work_fiber->fiber[i].z.dimen, fep->fiber[0].z.dimen );

	     /*
	     UnitsCopy( frame->eattr[n-1].work_fiber->fiber[i].area.dimen, frame->eattr[n-1].work_section[10].dimen );

	     if( map->G.value <= 0.0 )
	       UnitsCopy( frame->eattr[n-1].work_fiber->fiber[i].Es.dimen, map->E.dimen );
	     else
	       UnitsCopy( frame->eattr[n-1].work_fiber->fiber[i].Es.dimen, map->G.value );

	     if( map->Gt.value <= 0.0 ) {
	       if( map->ET.value <= 0.0 )
	         UnitsCopy( frame->eattr[n-1].work_fiber->fiber[i].Et.dimen,
	                    frame->eattr[n-1].work_fiber->fiber[i].Es.dimen );
	       else
	         UnitsCopy( frame->eattr[n-1].work_fiber->fiber[i].Et.dimen, map->ET.dimen );
	     }
	     else
	       UnitsCopy( frame->eattr[n-1].work_fiber->fiber[i].Et.dimen, map->Gt.dimen );

	     if( map->fv.value <= 0.0 )
	       UnitsCopy( frame->eattr[n-1].work_fiber->fiber[i].fy.dimen, map->fy.dimen );
	     else
	       UnitsCopy( frame->eattr[n-1].work_fiber->fiber[i].fy.dimen, map->fv.dimen );
	       */
	   }
         } /* UNIT_SWITCH == ON */
       } /* i=0, i<fep->no_fiber+2 */
    } /* eap->elmt_type == FIBER */

     /* DOF of nodes in a elment */

      FLAG = FALSE;
      for (i = 0; i <= NO_ELEMENTS_IN_LIBRARY ; i++) {
          if((elmt_library[i].name) != NULL &&
             Streq(frame->eattr[n-1].elmt_type, elmt_library[i].name)) {
             no_dof   = elmt_library[i].no_dof;
             FLAG = TRUE;
             break;
          }
      }

      if(FLAG == FALSE) {
          printf(">>FATAL ERROR:  In assign_properties():\n");
          printf(">>           :  In file elmt.h : elmemt type %s is not defined \n",
                                  frame->eattr[n-1].elmt_type);
          exit(1);
      }

      for(i = 1; i <= no_dof; i++) {
        frame->eattr[n-1].map_ldof_to_gdof[i-1] = eap->map_ldof_to_gdof[i-1];
      }

    return(frame);

#ifdef DEBUG
       printf("*** Leave assign_properties()\n");
#endif
}

#ifdef __STDC__
void print_property(EFRAME *frp, int i)
#else
void print_property(frp, i)
EFRAME    *frp;
int          i;                 /* elmt_attr_no */
#endif
{
int     UNITS_SWITCH;
ELEMENT_ATTR    *eap;

#ifdef DEBUG
       printf("*** Enter print_property()\n");
#endif

     UNITS_SWITCH = CheckUnits();
     eap = &frp->eattr[i-1];

     if(frp->no_dof == 3 || frp->no_dof == 2) { 
        printf("             ");
        printf("         : gdof [0] = %4d : gdof[1] = %4d : gdof[2] = %4d\n",
                        eap->map_ldof_to_gdof[0],
                        eap->map_ldof_to_gdof[1],
                        eap->map_ldof_to_gdof[2]);
     }

     if(frp->no_dof == 6) { /* 3d analysis */
        printf("             ");
        printf("         : dof-mapping : gdof[0] = %4d : gdof[1] = %4d : gdof[2] = %4d\n",
                        eap->map_ldof_to_gdof[0],
                        eap->map_ldof_to_gdof[1],
                        eap->map_ldof_to_gdof[2]);
        printf("             ");
        printf("                         gdof[3] = %4d : gdof[4] = %4d : gdof[5] = %4d\n",
                        eap->map_ldof_to_gdof[3],
                        eap->map_ldof_to_gdof[4],
                        eap->map_ldof_to_gdof[5]);
     } 

     switch(UNITS_SWITCH) {
       case ON:
        UnitsSimplify( eap->work_material[0].dimen );
        UnitsSimplify( eap->work_material[2].dimen );
        UnitsSimplify( eap->work_material[5].dimen );
        UnitsSimplify( eap->work_section[2].dimen );
        UnitsSimplify( eap->work_section[10].dimen );
	if( eap->work_material[0].dimen->units_name != NULL ) {
           printf("             ");
           printf("         : Young's Modulus =  E = %16.3e %s\n",
                           eap->work_material[0].value/eap->work_material[0].dimen->scale_factor,
                           eap->work_material[0].dimen->units_name);
	}
	if( eap->work_material[4].value != 0.0 ) {
           printf("             ");
           printf("         : Poisson's ratio = nu = %16.3e   \n", eap->work_material[4].value);
	}
	if( eap->work_material[2].dimen->units_name != NULL ) {
          printf("             ");
          printf("         : Yielding Stress = fy = %16.3e %s\n",
                           eap->work_material[2].value/eap->work_material[2].dimen->scale_factor,
                           eap->work_material[2].dimen->units_name);
	}
	if( eap->work_material[5].dimen->units_name != NULL ) {
          printf("             ");
          printf("         : Density         = %16.3e %s\n",
                           eap->work_material[5].value/eap->work_material[5].dimen->scale_factor,
                           eap->work_material[5].dimen->units_name);
	}
	if( eap->work_section[2].dimen->units_name != NULL ) {
          printf("             ");
          printf("         : Inertia Izz     = %16.3e %s\n",
                           eap->work_section[2].value/eap->work_section[2].dimen->scale_factor,
                           eap->work_section[2].dimen->units_name);
	}
	if( eap->work_section[10].dimen->units_name != NULL ) {
          printf("             ");
          printf("         : Area            = %16.3e %s\n",
                           eap->work_section[10].value/eap->work_section[10].dimen->scale_factor,
                           eap->work_section[10].dimen->units_name);
	}
       break;
       case OFF:
         printf("             ");
         printf("         : Young's Modulus =  E = %16.3e\n",
                            eap->work_material[0].value);
         printf("             ");
         printf("         : Yielding Stress = fy = %16.3e\n",
                            eap->work_material[2].value);
         printf("             ");
         printf("         : Poisson's ratio = nu = %16.3e   \n", eap->work_material[4].value);
         printf("             ");
         printf("         : Density         = %16.3e\n",
                            eap->work_material[5].value);
         printf("             ");
         printf("         : Inertia Izz     = %16.3e\n",
                            eap->work_section[2].value);
         printf("             ");
         printf("         : Area            = %16.3e\n",
                            eap->work_section[10].value);
        break;
        default:
        break;
     }
#ifdef DEBUG
       printf("*** Leave print_property()\n");
#endif
}

⌨️ 快捷键说明

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