📄 elmt_shell_8n.c
字号:
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_8Node(): 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, B1_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);
#endif
#ifdef DEBUG
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
printf(" element no = %d \n", p->elmt_no);
for (i = 1; i <= dof; i++){
printf(" total stress[%d] = %lf \n", i, stress[i-1][0]);
printf("incrmental stress[%d] = %lf \n", i, stress_incr[i-1][0]);
printf("previous stress[%d] = %lf \n", i, p->stress->uMatrix.daa[i-1][kk-1]);
}
#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;
}
} else {
for(i = 1; i <= dof; i++)
back_stress_incr[i-1][0] = 0.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.0*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
/* 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,B1_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 */
p->LC_ptr->R[kk-1] = R;
p->LC_ptr->H[kk-1] = H;
p->effect_pl_strain[kk-1] = eff_pl_strain;
p->eff_pl_strain_incr[kk-1] = eff_pl_strain - eff_pl_strainTemp;
for(i = 1; i <= dof; i++) {
p->strain_pl_incr->uMatrix.daa[i-1][kk-1]
= p->strain_pl->uMatrix.daa[i-1][kk-1] - strain_pl[i-1][0];
}
SaveRespondBuffer(p, kk);
}
break;
default:
printf(" In Stress_Update_8Node(): elmt_no \n", p->elmt_no);
printf(" elmt_state = 0 : Elastic_deformation \n");
printf(" elmt_state = 1 : plastic_deformation \n");
printf(" elmt_state = %d: p->elmt_state \n");
FatalError(" Unknown elmt state ",(char *)NULL);
break;
}
}
/* ASSIGN UNITS TO p ARRAY */
if(CheckUnits() == ON) {
switch(UNITS_TYPE) {
case SI:
dimen = DefaultUnits("Pa");
break;
case US:
dimen = DefaultUnits("psi");
break;
}
for(i = 1; i <= dof; i++)
p->stress->spRowUnits[i-1] = *DefaultUnits("psi");
free((char *) dimen->units_name);
free((char *) dimen);
}
MatrixFreeIndirectDouble(m1, dof);
MatrixFreeIndirectDouble(strain_incr, dof);
MatrixFreeIndirectDouble(stress, dof);
MatrixFreeIndirectDouble(stress_dev,dof);
MatrixFreeIndirectDouble(stress_incr,dof);
MatrixFreeIndirectDouble(back_stress_incr,dof);
#ifdef DEBUG
dMatrixPrint("p->stress in Stress_Update_8Node() leaving ",
p->stress->uMatrix.daa, p->dof_per_node, 12);
printf(" Leaving Stress_Update_8Node() \n");
#endif
}
double **B_MATRIX_8Node(B_matrix, p, shp, z_coord, J_inverse)
double **B_matrix;
ARRAY *p;
double **shp;
double z_coord;
double **J_inverse;
{
int i,j, k, ii, n;
double h;
static double **a = NULL;
static double **b = NULL;
static double **c = NULL;
static double **d = NULL;
static double **e = NULL;
static double **g = NULL;
static double **e1_ptr = NULL;
static double **e2_ptr = NULL;
static double **e3_ptr = NULL;
#ifdef DEBUG
printf(" enter B_MATRIX_8Node() \n");
#endif
a = MatrixAllocIndirectDouble(p->nodes_per_elmt,1);
b = MatrixAllocIndirectDouble(p->nodes_per_elmt,1);
c = MatrixAllocIndirectDouble(p->nodes_per_elmt,1);
d = MatrixAllocIndirectDouble(p->nodes_per_elmt,1);
e = MatrixAllocIndirectDouble(p->nodes_per_elmt,1);
g = MatrixAllocIndirectDouble(p->nodes_per_elmt,1);
e1_ptr = MatrixAllocIndirectDouble(3,p->nodes_per_elmt);
e2_ptr = MatrixAllocIndirectDouble(3,p->nodes_per_elmt);
e3_ptr = MatrixAllocIndirectDouble(3,p->nodes_per_elmt);
h = p->work_section[11].value; /* thickness of the shell */
for(i = 1; i <= p->nodes_per_elmt; i++) {
a[i-1][0] = J_inverse[0][0]*shp[0][i-1] + J_inverse[0][1]*shp[1][i-1] ;
b[i-1][0] = J_inverse[1][0]*shp[0][i-1] + J_inverse[1][1]*shp[1][i-1] ;
c[i-1][0] = J_inverse[2][0]*shp[0][i-1] + J_inverse[2][1]*shp[1][i-1] ;
d[i-1][0] = h*0.5*(a[i-1][0]*z_coord + J_inverse[0][2]*shp[2][i-1]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -