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

📄 elmt_shell_4n.c

📁 有限元分析源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
         printf(" elmt_state = 1 : Elastic-plastic_deformation \n");         printf(" elmt_state = %d: p->elmt_state \n");         FatalError(" Unknown elmt state ",(char *)NULL);       break;     }     MatrixFreeIndirectDouble(stress_dev, p->dof_per_node);     MatrixFreeIndirectDouble(Norm_Transpose, 1);     MatrixFreeIndirectDouble(m1, p->dof_per_node);     MatrixFreeIndirectDouble(mater_temp, p->dof_per_node);  }#ifdef DEBUG    printf(" Leaving MATER_SHELL_UPDATE() \n");#endif}void DISPL_UPDATE(p)ARRAY    *p;{int i,j, k;   for(i = 1; i <= p->dof_per_node; i++) {      for(j = 1; j <= p->nodes_per_elmt; j++) {          p->displ->uMatrix.daa[i-1][j-1] += p->displ_incr->uMatrix.daa[i-1][j-1];      }   } }void Stress_Update(p, co_coord, B_matrix, integ_pt)ARRAY                   *p;double          **co_coord;double          **B_matrix;int               integ_pt;{double                      H, R, fy, E, Et, nu;double          **displ_incr,**m1,**strain_incr;double          **back_stress_incr, **strain_pl;double    **stress, **stress_dev, **stress_incr;double     temp, G, A_2, A, Lambda, mean_stress;double         eff_pl_strainTemp, eff_pl_strain;double       Beta1 = 0.05, temp1, effect_stress;int                    iNo_iter_step, dof, size;int                      i, j, k, ii, jj, kk, n;DIMENSIONS                               *dimen;  /* Given i -state displ, stress mater_matrix, [Cep], */  /* and strain,  calculate i+1 state displ_incr       */  /* these i+1 state stress can be used for            */  /* i+1 state [Cep] matrix                             */#ifdef DEBUG     printf("\n enter Stress_Update(): \n");#endif  kk   = integ_pt;  dof  = p->dof_per_node;  size = p->size_of_stiff;  E    = p->work_material[0].value;  nu   = p->work_material[4].value;  fy   = p->work_material[2].value;  G    = E/(1.0+nu)/2.0;  m1         = MatrixAllocIndirectDouble(p->dof_per_node, p->dof_per_node);  m1         = MATER_MAT_SHELL(m1, E, nu);  /* Step 1: calculate strain_incremental  */  /*         from displacement incremental */  /*         at given integration point    */   displ_incr       = MatrixAllocIndirectDouble(p->size_of_stiff, 1);   strain_incr      = MatrixAllocIndirectDouble(dof,1);   strain_pl        = MatrixAllocIndirectDouble(dof,1);   stress           = MatrixAllocIndirectDouble(dof,1); /* stress or stress incremental   */   stress_dev       = MatrixAllocIndirectDouble(dof,1); /* deviatric component of stress  */   stress_incr      = MatrixAllocIndirectDouble(dof,1); /* stress incremental             */   back_stress_incr = MatrixAllocIndirectDouble(dof,1); /* back_stress stress incremental */#ifdef DEBUG      printf(" In Stress_Update(): materials_name = %s \n",p->material_name);#endif  /* ================= */  /* Elastic material  */  /* ================= */  if(p->material_name != NULL && !strcmp(p->material_name,"ELASTIC")) {     /* Transfer p->displ into vector form */     /* -----------------------------------*/     /* There is no needed to calculate    */     /* incrementally for the case of      */     /* linear elasticity                  */     /* -----------------------------------*/     for(i = 1; i <= p->dof_per_node; i++) {         for(j = 1; j <= p->nodes_per_elmt; j++) {             k = p->dof_per_node*(j-1)+i;             displ_incr[k-1][0] = p->displ->uMatrix.daa[i-1][j-1];         }     }     strain_incr = dMatrixMultRep(strain_incr, B_matrix, dof,                                  size, displ_incr, size, 1);      stress      = dMatrixMultRep(stress, m1, dof, dof,                                  strain_incr, dof, 1);     for (i = 1; i <= dof; i++){         p->stress->uMatrix.daa[i-1][kk-1] += stress[i-1][0];     }     SaveRespondBuffer(p, kk);  }  /* ====================================*/  /* Elastic Plastic & Elastic Perfectly */  /* Plastic Materials                   */  /* ====================================*/  if(p->material_name != NULL &&      (!strcmp(p->material_name, "ELASTIC_PLASTIC") ||       !strcmp(p->material_name, "ELASTIC_PERFECTLY_PLASTIC")) ) {     /* Transfer p->displ_incr into vector form */     switch(p->elmt_state) {       case 0 :       /* elastic state */         for(i = 1; i <= p->dof_per_node; i++) {             for(j = 1; j <= p->nodes_per_elmt; j++) {                 k = p->dof_per_node*(j-1)+i;                 displ_incr[k-1][0] = p->displ->uMatrix.daa[i-1][j-1];             }         }       break;       case 1 :       /* inelastic state */         for(i = 1; i <= p->dof_per_node; i++) {             for(j = 1; j <= p->nodes_per_elmt; j++) {                 k = p->dof_per_node*(j-1)+i;                 displ_incr[k-1][0] = p->displ_incr->uMatrix.daa[i-1][j-1];             }         }       break;       default:         printf("**** In Stress_Update(): elmt_no = %d\n", p->elmt_no);         printf(" elmt_state = %d: p->elmt_state \n");         FatalError("*****Undefine element state ()", (char *) NULL);       break;     }     /* Calculate stress increment */     strain_incr = dMatrixMultRep(strain_incr, B_matrix, dof,                                  size, displ_incr, size, 1);      stress      = dMatrixMultRep(stress, m1, dof, dof,                                  strain_incr, dof, 1);#ifdef DEBUG     dMatrixPrint("displ_incr", displ_incr, size, 1);     dMatrixPrint("stress", stress, dof, 1);     dMatrixPrint("strain", strain_incr, dof, 1);     printf(" \n stress before incremented \n");     for(i = 1; i <= dof; i++)         printf(" p->stress->uMatrix.daa[%d][%d]= %lf \n",               i, kk, p->stress->uMatrix.daa[i-1][kk-1]);#endif     switch(p->elmt_state) {       /* Elastic deformation */       case 0:          for(i = 1; i <= dof; i++)             p->stress->uMatrix.daa[i-1][kk-1] = stress[i-1][0];         SaveRespondBuffer(p, kk);       break;       case 1:                /* plastic deformation */       /* Step 1: Calculate the spherical stress and */       /*         deviatric stress of trial stress   */       /*         also the radiaus square A_2        */#ifdef DEBUG     for (i = 1; i <= dof; i++)         printf("incrmental stress[%d] = %lf \n", i, stress[i-1][0]);#endif         for (i = 1; i <= dof; i++) {           stress_incr[i-1][0] = stress[i-1][0];           stress[i-1][0] += p->stress->uMatrix.daa[i-1][kk-1];         }#ifdef DEBUG      for (i = 1; i <= dof; i++)         printf(" total stress[%d] = %lf \n", i, stress[i-1][0]);#endif         /* Note : sigma_z == 0 for shell elmt */                  mean_stress    = (stress[0][0] - p->LC_ptr->back_stress[0][kk-1]                          +stress[1][0] - p->LC_ptr->back_stress[1][kk-1])/3.0;         A_2  = 0.0;         for(i = 1; i <= dof; i++) {             if(i <= 2)               stress_dev[i-1][0] = stress[i-1][0] - mean_stress                                    - p->LC_ptr->back_stress[i-1][kk-1];             else               stress_dev[i-1][0] = stress[i-1][0] -                                    p->LC_ptr->back_stress[i-1][kk-1];             A_2  += stress_dev[i-1][0]*stress_dev[i-1][0];         }         A = sqrt(A_2);         R = p->LC_ptr->R[kk-1];         eff_pl_strain = p->effect_pl_strain[kk-1];       /* Step 2: comparision                        */        if(A <= R) { /* ELASTIC DEFORMATION */          for(i = 1; i <= dof; i++)              p->stress->uMatrix.daa[i-1][kk-1] = stress[i-1][0];           SaveRespondBuffer(p, kk);#ifdef DEBUG1    printf(" +++++++ ELASTIC DEFORMATION A = %lf R = %lf \n", A, R);    printf(" at elmt_no = %d, integ_pt = %d\n", p->elmt_no, kk);#endif        }        else {       /* PLASTIC DEFORMATION */               /* Step 3 Estimate number of sub-incrementations needed     */          if( ABS(p->LC_ptr->beta) < 1E-10){ /* Only for beta = 0 kinematic hardening case */       /* Step 3.1 Estimate the effective plastic strain increment */              temp = sqrt(3.0/2.0)*(A-R)/(p->LC_ptr->H[kk-1]+3.0*G);       /* Step 3.2 Estimate the back stress increment              */                         /* Estimate H' */              if(!strcmp(p->material_name, "ELASTIC_PERFECTLY_PLASTIC")) {                  H = 0.0;              }else {                  if(!strcmp(p->LC_ptr->name, "Ramberg-Osgood")) {                      effect_stress = A*sqrt(3.0/2.0);                      Load_Curve(p, &H, effect_stress, E,fy);                  }                  if(!strcmp(p->LC_ptr->name, "Bi-Linear"))                       H = p->LC_ptr->H[kk-1];             }          /* calculate the effective plastic strain incremental */             temp1 = sqrt(2.0/3.0)*(H + 3.0*G);             temp  = A/temp1 - R/temp1;            /* eff_pl_strain_incr */       /* Step 3.3: Compute Lambda  and pl_strain_incr   */       /*         Lambda = sqrt(3/2)*eff_pl_strain_incr  */       /* plastic strain incr is now stored in strain_incr */             Lambda = sqrt(3.0/2.0)*temp;             for(i = 1; i <= dof; i++)                  strain_incr[i-1][0] = Lambda*stress_dev[i-1][0]/A;          /* Step 3.4:  calculate back stress increment  */          /* beta = 0 for kinematic hardening */          /* beta = 1 for isotropic hardening */              for(i = 1; i <= dof; i++) {                  back_stress_incr[i-1][0] = H*strain_incr[i-1][0]*2.0/3.0;              }          }          mean_stress = (stress_incr[0][0] - back_stress_incr[0][0]                        +stress_incr[1][0] - back_stress_incr[1][0])/3.0;          temp   = 0.0;          for(i = 1; i <= dof; i++) {              if(i <= 2)                 stress_dev[i-1][0] = stress_incr[i-1][0] - mean_stress - back_stress_incr[i-1][0];              else                 stress_dev[i-1][0] = stress_incr[i-1][0] - back_stress_incr[i-1][0];              temp += stress_dev[i-1][0]*stress_dev[i-1][0];          }          temp = sqrt(temp);          iNo_iter_step = (int) (2*temp/R/Beta1) + 1 ;#ifdef DEBUG1    printf(" ******Plastic DEFORMATION A  = %lf, R = %lf \n", A, R);    printf(" ******Plastic DEFORMATION dA = %lf, R = %lf \n", temp, R);    printf(" at elmt_no = %d, integ_pt = %d\n", p->elmt_no, kk);    printf(" No of sub-Incremental steps = %d \n",iNo_iter_step);#endif#undef DEBUG1          /* Step 4 Start sub-incrementation  */         /* copy the plastic strain before sub-incrementation */         eff_pl_strainTemp = eff_pl_strain;         for(i = 1; i <= dof; i++)              strain_pl[i-1][0] = p->strain_pl->uMatrix.daa[i-1][kk-1];         switch(iNo_iter_step) {             case 1:                ii = 1;               Plastic_Deform(p, &H, &R, &eff_pl_strain, stress, stress_dev,                              strain_incr, E, fy, G, A, iNo_iter_step, dof, ii, kk);               SaveRespondBuffer(p, kk);#ifdef DEBUG   printf(" A= %lf R = %lf H = %lf eff_pl_strain = %lf\n", A, R, H, eff_pl_strain);#endif             break;             default:                for(i = 1; i <= p->dof_per_node; i++) {                   for(j = 1; j <= p->nodes_per_elmt; j++) {                       k = p->dof_per_node*(j-1)+i;                       displ_incr[k-1][0]                        = p->displ_incr->uMatrix.daa[i-1][j-1]/((double) iNo_iter_step);                   }               }               /* Calculate stress increment */               strain_incr = dMatrixMultRep(strain_incr,B_matrix, dof,                                             size, displ_incr, size, 1);               stress_incr = dMatrixMultRep(stress_incr, m1, dof, dof,                                            strain_incr, dof, 1);               for(ii = 1; ii <= iNo_iter_step; ii++) {                   /* Trial stress */                   if(ii == 1) {                      for(i = 1; i <= dof; i++)                           stress[i-1][0] = stress_incr[i-1][0] +                                            p->stress->uMatrix.daa[i-1][kk-1];                   }                   else                      for(i = 1; i <= dof; i++)                           stress[i-1][0] += stress_incr[i-1][0];                   mean_stress = (stress[0][0] - p->LC_ptr->back_stress[0][kk-1]                                 +stress[1][0] - p->LC_ptr->back_stress[1][kk-1])/3.0;                   A_2 = 0.0;                   for(i = 1; i <= dof; i++) {                       if(i <= 2)                          stress_dev[i-1][0] = stress[i-1][0] - mean_stress                                             - p->LC_ptr->back_stress[i-1][kk-1];                       else                          stress_dev[i-1][0] = stress[i-1][0]                                             - p->LC_ptr->back_stress[i-1][kk-1];                       A_2 += stress_dev[i-1][0]*stress_dev[i-1][0];                   }                   A = sqrt(A_2);                   if(A <= R) { /* ELASTIC DEFORMATION */                      if(i == iNo_iter_step){                         for(i = 1; i <= dof; i++)                             p->stress->uMatrix.daa[i-1][kk-1] = stress[i-1][0];                      }                   /* go to next sub incremental iteration */                   }else {   /* PLASTIC DEFORMATION */                      Plastic_Deform(p, &H, &R, &eff_pl_strain, stress,stress_dev,                                     strain_incr, E, fy, G, A, iNo_iter_step, dof, ii, kk);                   }               } /* end of sub-incremental iteration */             break;          } /* end of switch for sub incrementation */

⌨️ 快捷键说明

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