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

📄 code.c

📁 利用语言编写的有限元分析软件
💻 C
📖 第 1 页 / 共 5 页
字号:
        MatrixFree(d[2].m);
        MatrixFree(d[1].m);
        MatrixFree(d[0].m);
      break;

      case 5:
        d[4]  = Pop();
        d[3]  = Pop();
        d[2]  = Pop();
        d[1]  = Pop();
        d[0]  = Pop();
        d3.m = (*(MATRIX * (*)()) *pc)(d[0].m, d[1].m,d[2].m, d[3].m, d[4].m, (MATRIX *) NULL);
        MatrixFree(d[4].m);
        MatrixFree(d[3].m);
        MatrixFree(d[2].m);
        MatrixFree(d[1].m);
        MatrixFree(d[0].m);
      break;
    }

     pc = pc+1;
     Push(d3);
}

int BltinVar_Quantity()
{
DATUM d1, d[5], d3;
int no_args, i;
int UNITS_SWITCH;

    d1 = Pop();
    no_args = (int) d1.sym;

    UNITS_SWITCH = CheckUnits();
    switch(no_args) {
      case 1:
        d[0]  = Pop();
        d3.q = (*(QUANTITY * (*)()) *pc)(d[0].q, (QUANTITY *) NULL);
        if( UNITS_SWITCH == ON ) {
            free((char *) d[0].q->dimen->units_name);
            free((char *) d[0].q->dimen);
        }
        free((char *) d[0].q);
      break;
      
      case 2:
        d[1]  = Pop();
        d[0]  = Pop();
        d3.q = (*(QUANTITY * (*)()) *pc)(d[0].q, d[1].q, (QUANTITY *) NULL);
        if( UNITS_SWITCH == ON ) {
            free((char *) d[1].q->dimen->units_name);
            free((char *) d[0].q->dimen->units_name);
            free((char *) d[1].q->dimen);
            free((char *) d[0].q->dimen);
        }
        free((char *) d[1].q);
        free((char *) d[0].q);
      break;

      case 3:
        d[2]  = Pop();
        d[1]  = Pop();
        d[0]  = Pop();
        d3.q = (*(QUANTITY * (*)()) *pc)(d[0].q, d[1].q, d[2].q, (QUANTITY *) NULL);
        if( UNITS_SWITCH == ON ) {
            free((char *) d[2].q->dimen->units_name);
            free((char *) d[1].q->dimen->units_name);
            free((char *) d[0].q->dimen->units_name);
            free((char *) d[2].q->dimen);
            free((char *) d[1].q->dimen);
            free((char *) d[0].q->dimen);
        }
        free((char *) d[2].q);
        free((char *) d[1].q);
        free((char *) d[0].q);
      break;

      case 4:
        d[3]  = Pop();
        d[2]  = Pop();
        d[1]  = Pop();
        d[0]  = Pop();
        d3.q = (*(QUANTITY * (*)()) *pc)(d[0].q,d[1].q, d[2].q, d[3].q, (QUANTITY *) NULL);
        if( UNITS_SWITCH == ON ) {
            free((char *) d[3].q->dimen->units_name);
            free((char *) d[2].q->dimen->units_name);
            free((char *) d[1].q->dimen->units_name);
            free((char *) d[0].q->dimen->units_name);
            free((char *) d[3].q->dimen);
            free((char *) d[2].q->dimen);
            free((char *) d[1].q->dimen);
            free((char *) d[0].q->dimen);
        }
        free((char *) d[3].q);
        free((char *) d[2].q);
        free((char *) d[1].q);
        free((char *) d[0].q);
      break;

      case 5:
        d[4]  = Pop();
        d[3]  = Pop();
        d[2]  = Pop();
        d[1]  = Pop();
        d[0]  = Pop();
        d3.q = (*(QUANTITY * (*)()) *pc)(d[0].q, d[1].q,d[2].q, d[3].q, d[4].q, (QUANTITY *) NULL);
        if( UNITS_SWITCH == ON ) {
            free((char *) d[4].q->dimen->units_name);
            free((char *) d[3].q->dimen->units_name);
            free((char *) d[2].q->dimen->units_name);
            free((char *) d[1].q->dimen->units_name);
            free((char *) d[0].q->dimen->units_name);
            free((char *) d[4].q->dimen);
            free((char *) d[3].q->dimen);
            free((char *) d[2].q->dimen);
            free((char *) d[1].q->dimen);
            free((char *) d[0].q->dimen);
        }
        free((char *) d[4].q);
        free((char *) d[3].q);
        free((char *) d[2].q);
        free((char *) d[1].q);
        free((char *) d[0].q);
      break;
    }

     pc = pc+1;
     Push(d3);
}

int BltinVar_String()
{
DATUM d1, d[5], d3;
int no_args, i;

    d1 = Pop();
    no_args = (int) d1.sym;

    switch(no_args) {
      case 1:
        d[0]  = Pop();
        d3.q = (*(QUANTITY * (*)()) *pc)((char *) d[0].sym, (char *) NULL);
        free((char *) d[0].sym);
      break;
      
      case 2:
        d[1]  = Pop();
        d[0]  = Pop();
        d3.q = (*(QUANTITY * (*)()) *pc)((char *) d[0].sym, (char *) d[1].sym, (char *) NULL);
        free((char *) d[1].sym);
        free((char *) d[0].sym);
      break;

      case 3:
        d[2]  = Pop();
        d[1]  = Pop();
        d[0]  = Pop();
        d3.q = (*(QUANTITY * (*)()) *pc)((char *) d[0].sym, (char *) d[1].sym,(char *) d[2].sym, (char *) NULL);
        free((char *) d[2].sym);
        free((char *) d[1].sym);
        free((char *) d[0].sym);
      break;

      case 4:
        d[3]  = Pop();
        d[2]  = Pop();
        d[1]  = Pop();
        d[0]  = Pop();
        d3.q = (*(QUANTITY * (*)()) *pc)((char *) d[0].sym, (char *) d[1].sym, (char *) d[2].sym,
                            (char *) d[3].sym, (char *) NULL);
        free((char *) d[3].sym);
        free((char *) d[2].sym);
        free((char *) d[1].sym);
        free((char *) d[0].sym);
      break;

      case 5:
        d[4]  = Pop();
        d[3]  = Pop();
        d[2]  = Pop();
        d[1]  = Pop();
        d[0]  = Pop();
        d3.q = (*(QUANTITY * (*)()) *pc)((char *) d[0].sym,(char *) d[1].sym, (char*) d[2].sym,
                            (char *) d[3].sym,(char *) d[4].sym, (char *) NULL);
        free((char *) d[4].sym);
        free((char *) d[3].sym);
        free((char *) d[2].sym);
        free((char *) d[1].sym);
        free((char *) d[0].sym);
      break;
    }
     pc = pc+1;
     Push(d3);
}


/* 
 * ------------------------------------
 * Functions for Engineering Dimensions
 * ------------------------------------
 */ 

/* Push_Dimension() pushes a data type Datum onto the 
   interpreter stack. Increment the pointer to prog. */

int Push_Dimension()
{
DATUM    d;
int length;

    d.q        = (QUANTITY *) MyCalloc(1,sizeof(QUANTITY));
    switch(CheckUnits()) {
      case ON:
         d.q->dimen = (DIMENSIONS *) MyCalloc(1,sizeof(DIMENSIONS));
         UnitsCopy( d.q->dimen, ((SYMBOL *) *pc)->u.q->dimen );
         break;
      case OFF:
         d.q->dimen = (DIMENSIONS *)NULL; 
         break;
      default:          
         FatalError("In Push_Dimension() : CheckUnits is not ON or OFF",(char *)NULL);
         break;
    }
    pc = pc + 1;
    Push(d);
}

int Push_Dimensionless()
{
DATUM d;

    d.q        = (QUANTITY *) MyCalloc(1,sizeof(QUANTITY));
    if(CheckUnits() == ON ) {
        d.q->dimen = (DIMENSIONS *) MyCalloc(1,sizeof(DIMENSIONS));
        d.q->dimen->units_name   = (char *)NULL;
        d.q->dimen->units_type   = SI_US; /* A NUMBER is default as SI_US for now */
        d.q->dimen->scale_factor = 1.0;
        d.q->dimen->length_expnt = 0.0;
        d.q->dimen->mass_expnt   = 0.0;
        d.q->dimen->time_expnt   = 0.0;
        d.q->dimen->temp_expnt   = 0.0;
    }
    else
        d.q->dimen = (DIMENSIONS *)NULL;

    Push(d);
}

int Dimension_Eval()
{
DATUM    d1, d2;
int      length;
int   UnitsType;

    d1 = Pop();   /* quantity number, d1.q */
    d2 = Pop();   /* dimensions     , d2.q */

    switch(CheckUnits()) {
      case ON:
         UnitsType = CheckUnitsType();
         if( (d2.q->dimen->units_type != UnitsType) &&
             (d2.q->dimen->units_type != SI_US    ) &&
             (!strcmp(d2.q->dimen->units_name, "deg_C") ||
              !strcmp(d2.q->dimen->units_name, "deg_F")) ) {

            d2.q->value = d1.q->value*d2.q->dimen->scale_factor;
            d2.q->value = ConvertTempUnits(d2.q->dimen->units_name, d2.q->value, UnitsType);
            d1.q->value = d2.q->value;

         } else
            d1.q->value = d1.q->value*d2.q->dimen->scale_factor;

         UnitsSimplify( d2.q->dimen );
         UnitsCopy( d1.q->dimen, d2.q->dimen );

         free((char *) d2.q->dimen->units_name);
         free((char *) d2.q->dimen);
         free((char *) d2.q);
         Push(d1);
         break;
      case OFF:
         free((char *) d2.q);
         Push(d1);
         break;
      default:          
         FatalError("In Dimension_Eval() : CheckUnits is not ON or OFF",(char *)NULL);
         break;
    }
}

int Dimension_Mult()
{
DATUM d1, d2, d3;
int       length;

   if(CheckUnits() == OFF)
      FatalError("You should set units on to use this function",
                 "Fail to set units on in Dimension_Mult()",(char *)NULL);

   d2 = Pop();
   d1 = Pop();
   d3.q = (QUANTITY *) MyCalloc(1,sizeof(QUANTITY));
   d3.q->value = d1.q->value * d2.q->value;
   d3.q->dimen = UnitsMult( d1.q->dimen, d2.q->dimen );
   free((char *) d1.q->dimen->units_name);
   free((char *) d1.q->dimen);
   free((char *) d1.q);
   free((char *) d2.q->dimen->units_name);
   free((char *) d2.q->dimen);
   free((char *) d2.q);
   Push(d3);
}

int Dimension_Div()
{
DATUM d1, d2, d3;
int       length;

   if(CheckUnits() == OFF)
      FatalError("You should set units on to use this function",
                 "Fail to set units on Dimension_Div()",(char *)NULL);

   d2 = Pop();
   d1 = Pop();
   d3.q = (QUANTITY *) MyCalloc(1,sizeof(QUANTITY));
   d3.q->value = d1.q->value/d2.q->value;
   d3.q->dimen = UnitsDiv( d1.q->dimen, d2.q->dimen, NO );
   free((char *) d1.q->dimen->units_name);
   free((char *) d1.q->dimen);
   free((char *) d1.q);
   free((char *) d2.q->dimen->units_name);
   free((char *) d2.q->dimen);
   free((char *) d2.q);
   Push(d3);
}

int Dimension_Power()
{
DATUM d1, d2, d3;
double      temp;
int       length;

   if(CheckUnits() == OFF)
      FatalError("You should set units on to use this function",
                 "Fail to set units on in Dimension_Power()",(char *)NULL);

   d2 = Pop();  /* power value */
   d1 = Pop();  /* dimension */
   d3.q = (QUANTITY *) MyCalloc(1,sizeof(QUANTITY));
   d3.q->value = pow(d1.q->value, d2.q->value);
   d3.q->dimen = UnitsPower( d1.q->dimen, d2.q->value, NO );
   free((char *) d1.q->dimen->units_name);
   free((char *) d1.q->dimen);
   free((char *) d1.q);
   free((char *) d2.q->dimen->units_name);
   free((char *) d2.q->dimen);
   free((char *) d2.q);
   Push(d3);
}

/* 
 *  ------------------------
 *  Builtin Matrix Functions 
 *  ------------------------
 */ 

int Bltin_Matrix_Add()
{
DATUM d1, d2, d3;

   d2 = Pop();
   d1 = Pop();
   d1.m = MatrixAddReplace(d1.m, d2.m);
   MatrixFree(d2.m);
   Push(d1);
}

int Bltin_Matrix_Sub()
{
DATUM d1, d2, d3;

   d2 = Pop();
   d1 = Pop();
   d1.m = MatrixSubReplace(d1.m, d2.m);
   MatrixFree(d2.m);
   Push(d1);
}

int Bltin_Matrix_Mult()
{
DATUM d1, d2, d3;

   d2 = Pop();
   d1 = Pop();
   d3.m = MatrixMult(d1.m, d2.m);
   MatrixFree( d1.m );
   MatrixFree( d2.m );
   Push(d3);
}

int Bltin_Matrix_Quan_Mult()
{
DATUM d1, d2, d3;

   d1 = Pop();      /* quantity */
   d2 = Pop();      /* matrix   */
   d3.m = MatrixQuanMult(d1.q,d2.m);
   MatrixFree(d2.m);
   if( CheckUnits() == ON ) {
     free((char *) d1.q->dimen->units_name);
     free((char *) d1.q->dimen);
   }
   free((char *) d1.q);
   Push(d3);
}

int Bltin_Quan_Matrix_Mult() 
{
DATUM d1, d2, d3;

   d2 = Pop();      /* matrix   */
   d1 = Pop();      /* quantity */
   d3.m = MatrixQuanMult(d1.q,d2.m);
   MatrixFree(d2.m);
   if( CheckUnits() == ON ) {
     free((char *) d1.q->dimen->units_name);
     free((char *) d1.q->dimen);
   }
   free((char *) d1.q);
   Push(d3);
}

int Bltin_Matrix_Quan_Div()
{
DATUM d1, d2, d3;

   d1 = Pop();      /* quantity */
   d2 = Pop();      /* matrix   */
   d3.m = MatrixQuanDiv(d2.m, d1.q);
   MatrixFree(d2.m);
   if( CheckUnits() == ON ) {
     free((char *) d1.q->dimen->u

⌨️ 快捷键说明

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