void FormPBJacobian(PetscInt i,PetscInt j,PetscInt k,Field *ex,CoordField *ec,Field *ef,PetscScalar *ej,AppCtx *user) { PetscReal vol; PetscScalar J[9]; PetscScalar invJ[9]; PetscScalar F[9],S[9],dF[9],dS[9],dFS[9],FdS[9],FS[9]; PetscReal scl; PetscInt l,ll,qi,qj,qk,m; PetscInt idx = i + j*NB + k*NB*NB; PetscScalar lgrad[3]; if (ej) for (l = 0; l < 9; l++) ej[l] = 0.; if (ef) for (l = 0; l < 1; l++) {ef[l][0] = 0.;ef[l][1] = 0.;ef[l][2] = 0.;} /* loop over quadrature */ for (qk = 0; qk < NQ; qk++) { for (qj = 0; qj < NQ; qj++) { for (qi = 0; qi < NQ; qi++) { PetscInt bidx = NEB*idx + qi + NQ*qj + NQ*NQ*qk; QuadraturePointGeometricJacobian(ec,qi,qj,qk,J); InvertTensor(J,invJ,&vol); TensorVector(invJ,&grad[3*bidx],lgrad); scl = vol*wts[qi]*wts[qj]*wts[qk]; DeformationGradient(ex,qi,qj,qk,invJ,F); SaintVenantKirchoff(user->lambda,user->mu,F,S); /* form the function */ if (ef) { TensorTensor(F,S,FS); for (m=0;m<3;m++) { ef[0][m] += scl* (lgrad[0]*FS[3*m + 0] + lgrad[1]*FS[3*m + 1] + lgrad[2]*FS[3*m + 2]); } ef[0][1] -= scl*user->loading*vals[bidx]; } /* form the jacobian */ if (ej) { for (l=0;l<3;l++) { DeformationGradientJacobian(qi,qj,qk,i,j,k,l,invJ,dF); SaintVenantKirchoffJacobian(user->lambda,user->mu,F,dF,dS); TensorTensor(dF,S,dFS); TensorTensor(F,dS,FdS); for (m=0;m<9;m++) dFS[m] += FdS[m]; for (ll=0; ll<3;ll++) { ej[ll + 3*l] += scl* (lgrad[0]*dFS[3*ll + 0] + lgrad[1]*dFS[3*ll + 1] + lgrad[2]*dFS[3*ll+2]); } } } } } /* end of quadrature points */ } }
// // Strain displacement operator // void FSDielectricElastomer2DT::Set_B_C(const dArray2DT& DNaX, dMatrixT& B_C) { const int nsd = NumSD(); const int nen = NumElementNodes(); const int StrainDim = dSymMatrixT::NumValues(nsd); const int nnd = DNaX.MinorDim(); assert(nen == nnd); B_C.Dimension(StrainDim, nsd * nen); const dMatrixT F = DeformationGradient(); for (int ij = 0; ij < StrainDim; ++ij) { int i; int j; dSymMatrixT::ExpandIndex(nsd, ij, i, j); for (int a = 0; a < nen; ++a) { for (int k = 0; k < nsd; ++k) { const int ak = a * nsd + k; B_C(ij, ak) = DNaX(i, a) * F(k, j) + DNaX(j, a) * F(k, i); // Shear components doubled to conform with Voigt // convention - HSP - not sure if this is correct if (ij >= nsd) { B_C(ij, ak) *= 2.0; } } } } }
void FormElementJacobian(Field *ex,CoordField *ec,Field *ef,PetscScalar *ej,AppCtx *user) { PetscReal vol; PetscScalar J[9]; PetscScalar invJ[9]; PetscScalar F[9],S[9],dF[9],dS[9],dFS[9],FdS[9],FS[9]; PetscReal scl; PetscInt i,j,k,l,ii,jj,kk,ll,qi,qj,qk,m; if (ej) for (i = 0; i < NPB*NPB; i++) ej[i] = 0.; if (ef) for (i = 0; i < NEB; i++) {ef[i][0] = 0.;ef[i][1] = 0.;ef[i][2] = 0.;} /* loop over quadrature */ for (qk = 0; qk < NQ; qk++) { for (qj = 0; qj < NQ; qj++) { for (qi = 0; qi < NQ; qi++) { QuadraturePointGeometricJacobian(ec,qi,qj,qk,J); InvertTensor(J,invJ,&vol); scl = vol*wts[qi]*wts[qj]*wts[qk]; DeformationGradient(ex,qi,qj,qk,invJ,F); SaintVenantKirchoff(user->lambda,user->mu,F,S); /* form the function */ if (ef) { TensorTensor(F,S,FS); for (kk=0;kk<NB;kk++){ for (jj=0;jj<NB;jj++) { for (ii=0;ii<NB;ii++) { PetscInt idx = ii + jj*NB + kk*NB*NB; PetscInt bidx = NEB*idx + qi + NQ*qj + NQ*NQ*qk; PetscScalar lgrad[3]; TensorVector(invJ,&grad[3*bidx],lgrad); /* mu*F : grad phi_{u,v,w} */ for (m=0;m<3;m++) { ef[idx][m] += scl* (lgrad[0]*FS[3*m + 0] + lgrad[1]*FS[3*m + 1] + lgrad[2]*FS[3*m + 2]); } ef[idx][1] -= scl*user->loading*vals[bidx]; } } } } /* form the jacobian */ if (ej) { /* loop over trialfunctions */ for (k=0;k<NB;k++){ for (j=0;j<NB;j++) { for (i=0;i<NB;i++) { for (l=0;l<3;l++) { PetscInt tridx = l + 3*(i + j*NB + k*NB*NB); DeformationGradientJacobian(qi,qj,qk,i,j,k,l,invJ,dF); SaintVenantKirchoffJacobian(user->lambda,user->mu,F,dF,dS); TensorTensor(dF,S,dFS); TensorTensor(F,dS,FdS); for (m=0;m<9;m++) dFS[m] += FdS[m]; /* loop over testfunctions */ for (kk=0;kk<NB;kk++){ for (jj=0;jj<NB;jj++) { for (ii=0;ii<NB;ii++) { PetscInt idx = ii + jj*NB + kk*NB*NB; PetscInt bidx = 8*idx + qi + NQ*qj + NQ*NQ*qk; PetscScalar lgrad[3]; TensorVector(invJ,&grad[3*bidx],lgrad); for (ll=0; ll<3;ll++) { PetscInt teidx = ll + 3*(ii + jj*NB + kk*NB*NB); ej[teidx + NPB*tridx] += scl* (lgrad[0]*dFS[3*ll + 0] + lgrad[1]*dFS[3*ll + 1] + lgrad[2]*dFS[3*ll+2]); } } } } /* end of testfunctions */ } } } } /* end of trialfunctions */ } } } } /* end of quadrature points */ }