📄 elmt_shell_4n.c
字号:
MatrixFreeIndirectDouble(co_coord, p->no_dimen); MatrixFreeIndirectDouble(Direction_Matrix,6);#ifdef DEBUG printf("*** leaving elmt_shell() \n");#endif return(p);}/* ============================================*//* Equivalent Load due to distributed pressure *//* for shell Belytschko element *//* in local coordinate *//* ============================================*/ARRAY *sld04(p,task)ARRAY *p;int task;{ELEMENT_LOADS *elsptr;ELOAD_LIB *elp;double *nodal_load;double Jac, x31, y31, x42, y42; double px,py,pz, mx,my,mz, bx,by,bz;int i,j,k, ii, jj, kk, n, n1,n2,n3;#ifdef DEBUG printf("**** enter sld04(): \n");#endif /* Initialize total load */ nodal_load = dVectorAlloc(p->size_of_stiff); for(i =1; i <= p->size_of_stiff ;i++) nodal_load[i-1] = 0.0;#ifdef DEBUG printf(" **** In sld04(): begin switch() \n");#endif switch(task){ case PRESSLD:#ifdef DEBUG printf(" **** In sld04(): case PRESSLD\n");#endif /* ==========================================*/ /* For distrbuted surface loading: */ /* PRESSURE OR TRACTION */ /* nodal equivalent force is calculated by : */ /* force = integral N^T*traction/pressure dA */ /* ==========================================*/ /*================================================*/ /* use one-point integration rule in surface area */ /* Ni = 1/4.0 [N] = 1/4 [I, I, I, I] */ /* [I] = 5x5 unit_matrix */ /* Let traction = [p]5x1 */ /* Integ [N]^t*traction dA = (1/4)*[p]*Jac*4.0 */ /* [p] */ /* [p] */ /* [p] */ /* [p] */ /*================================================*/ elsptr = p->elmt_load_ptr; for (j=1; j<= elsptr->no_loads_faces;j++) { elp = &elsptr->elib_ptr[j-1]; x31 = p->coord[0][2].value - p->coord[0][0].value; y31 = p->coord[1][2].value - p->coord[1][0].value; x42 = p->coord[0][3].value - p->coord[0][1].value; y42 = p->coord[1][3].value - p->coord[1][1].value; Jac = 0.5*(x31*y42-x42*y31); for(i = 1; i <= p->size_of_stiff; i++) { n = i/p->dof_per_node; k = i - n*p->dof_per_node; nodal_load[i-1] = 0.25*elp->traction[k-1].value*4.0*Jac; } } break; default: break; } for(i = 1; i <= p->size_of_stiff; i++) { p->equiv_nodal_load->uMatrix.daa[i-1][0] = nodal_load[i-1]; } free(nodal_load);#ifdef DEBUG printf("**** leaving sld04(): \n");#endif return(p);}/* ============================*//* Material matrix *//* ============================*/double **MATER_MAT_SHELL(m1, E, nu)double **m1;double E, nu;{double temp;double kk = 1.2; #ifdef DEBUG printf(" enter MATER_MAT_SHELL() \n"); printf(" E = %lf , nu = %lf \n", E, nu);#endif /* Stress : stress_x, stress_y, stress_xy, stress_yz, stress_zx */ /* Strain : strain_x, strain_y, 2strain_xy, 2strain_yz, 2strain_zx */ temp = E/(1-nu*nu); m1[0][0]= m1[1][1] = temp; m1[0][1]= m1[1][0] = nu*temp; m1[2][2]= E/2.0/(1.0+nu); m1[3][3] = m1[4][4] = E/2.0/(1.0+nu)/kk; m1[0][2] = m1[2][0] = m1[1][2] = m1[2][1] = 0.0; m1[3][0] = m1[3][1] = m1[3][2] = m1[3][4] = 0.0; m1[4][0] = m1[4][1] = m1[4][2] = m1[4][3] = 0.0;#ifdef DEBUG dMatrixPrint("m1", m1, 5, 5); printf("\n leaving MATER_MAT_SHELL() \n");#endif return (m1);}void MATER_SHELL_UPDATE(p, co_coord, E, nu, integ_pt)ARRAY *p;double **co_coord;double E, nu;int integ_pt; /* integration point */{double **m1, **mater_temp;double **stress_dev, **Norm_Transpose;double A_2, mean_stress, R, A;double temp;int i, j, k, ii, jj, kk, n;int dof, size, G;#ifdef DEBUG printf(" enter MATER_SHELL_UPDATE() \n");#endif /* Given i -state displ, stress, [C] and strain */ /* calculate i+1 state displ, stress, these i+1 */ /* state stress can be used for i+1 state [Cep] */ /* matrix */#ifdef DEBUG printf(" In MATER_SHELL_UPDATE(): calculating MATER_MAT_SHELL() \n");#endif dof = p->dof_per_node; size = p->size_of_stiff; ii = integ_pt; G = E/2.0/(1.0+nu);#ifdef DEBUG printf(" In MATER_SHELL_UPDATE(): update p->material = %s \n", p->material_name); printf(" In MATER_SHELL_UPDATE(): integ_pts = %d \n", integ_pt); printf(" In MATER_SHELL_UPDATE(): dof = %d \n", dof); printf(" In MATER_SHELL_UPDATE(): deformation state = %d \n", p->elmt_state);#endif /* Elastic material */ if(p->material_name != NULL && !strcmp(p->material_name, "ELASTIC")) { p->mater_matrix->uMatrix.daa = MATER_MAT_SHELL(p->mater_matrix->uMatrix.daa,E, nu); } /* Elastic Perfectly Plastic Materials */ if(p->material_name != NULL && !strcmp(p->material_name,"ELASTIC_PERFECTLY_PLASTIC")) { m1 = MatrixAllocIndirectDouble(p->dof_per_node, p->dof_per_node); stress_dev = MatrixAllocIndirectDouble(dof, 1); Norm_Transpose = MatrixAllocIndirectDouble(1,dof); mater_temp = MatrixAllocIndirectDouble(dof, dof); /* Elastic Deformation */ switch(p->elmt_state) { /* Elastic deformation */ case 0: p->mater_matrix->uMatrix.daa = MATER_MAT_SHELL(p->mater_matrix->uMatrix.daa,E, nu); break; case 1: /* plastic deformation */ /* Step 1: Calculate the spherical stress and */ /* deviatric stress of trial stress */ /* also the radiaus square A_2 */ mean_stress = (p->stress->uMatrix.daa[0][ii-1] - p->LC_ptr->back_stress[0][ii-1] +p->stress->uMatrix.daa[1][ii-1] - p->LC_ptr->back_stress[1][ii-1])/3.0; A_2 = 0.0; for(i = 1; i <= dof; i++) { if(i <= 2) stress_dev[i-1][0] = p->stress->uMatrix.daa[i-1][ii-1] - mean_stress - p->LC_ptr->back_stress[i-1][ii-1]; else stress_dev[i-1][0] = p->stress->uMatrix.daa[i-1][ii-1] - p->LC_ptr->back_stress[i-1][ii-1]; A_2 += stress_dev[i-1][0]*stress_dev[i-1][0]; } /* Step 2: comparision */ R = p->LC_ptr->R[ii-1]; if(A_2 <= R*R) { /* ELASTIC DEFORMATION */ p->mater_matrix->uMatrix.daa = MATER_MAT_SHELL(p->mater_matrix->uMatrix.daa,E, nu); } else { /* PLASTIC DEFORMATION */ m1 = MATER_MAT_SHELL(m1, E, nu); /* Step 3: normal direction on yield surface */ /* stored temporarily on stress_dev */ /* Norm_Direc */ for(i = 1; i <= dof; i++) { stress_dev[i-1][0] /= R; Norm_Transpose[0][i-1] = stress_dev[i-1][0]; } /* Step 4: Calculate [Cep] */ /* [Cep] = [C] -[C]*[n][n]^t */ p->mater_matrix->uMatrix.daa = dMatrixMultRep(p->mater_matrix->uMatrix.daa, stress_dev, dof,1, Norm_Transpose, 1, dof); mater_temp = dMatrixMultRep(mater_temp, m1, dof, dof, p->mater_matrix->uMatrix.daa, dof, dof); for(i = 1; i <= dof; i++) { for(j = 1; j <= dof; j++) { p->mater_matrix->uMatrix.daa[i-1][j-1] = m1[i-1][j-1] - mater_temp[i-1][j-1]; } } } /* end of else : plastic deformation */ break; default: printf(" In MATER_SHELL_UPDATE(): elmt_no = %d\n", p->elmt_no); printf(" elmt_state = 0 : Elastic_deformation \n"); 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); } /* Elastic Plastic Materials */ /* with combined strain hardening */ if(p->material_name != NULL && !strcmp(p->material_name,"ELASTIC_PLASTIC")) { m1 = MatrixAllocIndirectDouble(p->dof_per_node, p->dof_per_node); stress_dev = MatrixAllocIndirectDouble(dof, 1); Norm_Transpose = MatrixAllocIndirectDouble(1,dof); mater_temp = MatrixAllocIndirectDouble(dof, dof); switch(p->elmt_state) { /* Elastic deformation */ case 0: p->mater_matrix->uMatrix.daa = MATER_MAT_SHELL(p->mater_matrix->uMatrix.daa, E, nu); break; case 1: /* plastic deformation */ /* Step 1: Calculate the spherical stress and */ /* deviatric stress of trial stress */ /* also the radiaus square A_2 */ mean_stress = (p->stress->uMatrix.daa[0][ii-1]- p->LC_ptr->back_stress[0][ii-1] +p->stress->uMatrix.daa[1][ii-1]- p->LC_ptr->back_stress[1][ii-1])/3.0; A_2 = 0.0; for(i = 1; i <= dof; i++) { if(i <= 2) stress_dev[i-1][0] = p->stress->uMatrix.daa[i-1][ii-1] - mean_stress - p->LC_ptr->back_stress[i-1][ii-1]; A_2 += stress_dev[i-1][0]*stress_dev[i-1][0]; } A = sqrt(A_2); /* Step 2: comparision */ R = p->LC_ptr->R[ii-1]; if(A_2 <= R*R) { /* ELASTIC DEFORMATION */ p->mater_matrix->uMatrix.daa = dMatrixCopyRep(p->mater_matrix->uMatrix.daa, m1, p->dof_per_node, p->dof_per_node); } else { /* PLASTIC DEFORMATION */ m1 = MATER_MAT_SHELL(m1, E, nu); /* Step 3: normal direction on yield surface */ /* stored temporarily on stress_dev */ for(i = 1; i <= dof; i++) { stress_dev[i-1][0] /= R; /* Norm_Direc */ Norm_Transpose[0][i-1] = stress_dev[i-1][0]; } /* Step 4: Calculate [Cep] */ /* [Cep] = [C] -[C]*[n][n]^t*[C]/(2G+H*2/3) */ /* [Cep] = [C] -[C]*[n][n]^t*2G/(2G+H*2/3) */ p->mater_matrix->uMatrix.daa = dMatrixMultRep(p->mater_matrix->uMatrix.daa, stress_dev, dof,1, Norm_Transpose, 1, dof); mater_temp = dMatrixMultRep(mater_temp, m1, dof, dof, p->mater_matrix->uMatrix.daa, dof, dof);/* p->mater_matrix->uMatrix.daa = dMatrixMultRep(p->mater_matrix->uMatrix.daa, mater_temp, dof, dof, m1, dof, dof);*/ for(i = 1; i <= dof; i++) { for(j = 1; j <= dof; j++) { p->mater_matrix->uMatrix.daa[i-1][j-1] = m1[i-1][j-1]- p->mater_matrix->uMatrix.daa[i-1][j-1] *2.0*G/(2.0*G+p->LC_ptr->H[ii-1]*2.0/3.0); } } } /* end of else : plastic deformation */ break; default: printf(" In MATER_SHELL_UPDATE(): elmt_no = %d\n", p->elmt_no); printf(" elmt_state = 0 : Elastic_deformation \n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -