void BeamContact2Dp::setDomain(Domain *theDomain) { Vector x_c(BC2D_NUM_DIM); mEye1.Zero(); mEye1(0,0) = 1.0; mEye1(1,1) = 1.0; mEyeS.Zero(); mEyeS(0,1) = -1.0; mEyeS(1,0) = 1.0; theNodes[0] = theDomain->getNode(mExternalNodes(0)); theNodes[1] = theDomain->getNode(mExternalNodes(1)); theNodes[2] = theDomain->getNode(mExternalNodes(2)); for (int i = 0; i < 3; i++) { if (theNodes[i] == 0) return; // don't go any further - otherwise segmentation fault } // initialize coordinate vectors mIcrd_a = theNodes[0]->getCrds(); mIcrd_b = theNodes[1]->getCrds(); mIcrd_s = theNodes[2]->getCrds(); mDcrd_a = mIcrd_a; mDcrd_b = mIcrd_b; mDcrd_s = mIcrd_s; mDisp_a_n.Zero(); mDisp_b_n.Zero(); // length of beam element mLength = (mDcrd_b - mDcrd_a).Norm(); // initialize tangent vectors at beam nodes ma_1 = (mDcrd_b - mDcrd_a)/mLength; mb_1 = ma_1; // perform projection of slave node to beam centerline mXi = ((mDcrd_b - mDcrd_s)^(mDcrd_b - mDcrd_a))/mLength; // initial assumption mXi = Project(mXi); // actual location // update contact state based on projection in_bounds = ((mXi > 0.000) && (mXi < 1.000)); inContact = (was_inContact && in_bounds); // centerline projection coordinate x_c = mDcrd_a*mShape(0) + ma_1*mLength*mShape(1) + mDcrd_b*mShape(2) + mb_1*mLength*mShape(3); // update surface tangent vector, g_xi UpdateBase(mXi); // adjust cohesion force theMaterial->ScaleCohesion(mLength); theMaterial->ScaleTensileStrength(mLength); // compute vectors Bn and Bs ComputeB(); // call the base class method this->DomainComponent::setDomain(theDomain); }
int BeamContact2Dp::update(void) // this function updates variables for an incremental step n to n+1 { double tensileStrength; Vector a1(BC2D_NUM_DIM); Vector b1(BC2D_NUM_DIM); Vector a1_n(BC2D_NUM_DIM); Vector b1_n(BC2D_NUM_DIM); Vector disp_a(3); Vector disp_b(3); Vector disp_L(BC2D_NUM_DIM); double rot_a; double rot_b; Vector x_c(BC2D_NUM_DIM); // update slave node coordinates mDcrd_s = mIcrd_s + theNodes[2]->getTrialDisp(); // update nodal coordinates disp_a = theNodes[0]->getTrialDisp(); disp_b = theNodes[1]->getTrialDisp(); for (int i = 0; i < 2; i++) { mDcrd_a(i) = mIcrd_a(i) + disp_a(i); mDcrd_b(i) = mIcrd_b(i) + disp_b(i); } // compute incremental rotation from step n to step n+1 rot_a = disp_a(2) - mDisp_a_n(2); rot_b = disp_b(2) - mDisp_b_n(2); // get tangent vectors from last converged step a1_n = Geta1(); b1_n = Getb1(); // linear update of tangent vectors a1 = a1_n + rot_a*mEyeS*a1_n; b1 = b1_n + rot_b*mEyeS*b1_n; // update centerline projection coordinate x_c = mDcrd_a*mShape(0) + a1*mLength*mShape(1) + mDcrd_b*mShape(2) + b1*mLength*mShape(3); // update penetration function mGap = (mNormal^(mDcrd_s - x_c)) - mRadius; if (mGap < 0.0 && in_bounds) { inContact = true; } else { mGap = 0.0; inContact = false; } // update normal contact force if (was_inContact) { mLambda = mPenalty*mGap; } else { mLambda = 0.0; } // get tensile strength from contact material tensileStrength = theMaterial->getTensileStrength(); // determine trial strain vector based on contact state if (inContact) { Vector strain(3); double slip; Vector c1n1(2); Vector c2n1(2); // tangent at the centerline projection in step n+1 c1n1 = mDshape(0)*mDcrd_a + mDshape(1)*mLength*ma_1 + mDshape(2)*mDcrd_b + mDshape(3)*mLength*mb_1; // update vector c2 for step n+1 c2n1 = (mDcrd_s - x_c)/((mDcrd_s - x_c).Norm()); // update vector c2 for step n+1 c2n1(0) = -c1n1(1); c2n1(1) = c1n1(0); // compute the slip slip = mg_xi^(mDcrd_s - x_c - mrho*c2n1); // set the strain vector strain(0) = mGap; strain(1) = slip; strain(2) = -mLambda; theMaterial->setTrialStrain(strain); } else { Vector strain(3); // set the strain vector strain(0) = mGap; strain(1) = 0.0; strain(2) = -mLambda; theMaterial->setTrialStrain(strain); } return 0; }
int main(int argc, char *argv[]) { int i; NekDouble cr = 0; if(argc !=3) { fprintf(stderr,"Usage: ./ExtractCriticalLayer meshfile fieldfile \n"); exit(1); } //------------------------------------------------------------ // Create Session file. LibUtilities::SessionReaderSharedPtr vSession = LibUtilities::SessionReader::CreateInstance(argc, argv); //----------------------------------------------------------- //------------------------------------------------------------- // Read in mesh from input file SpatialDomains::MeshGraphSharedPtr graphShPt = SpatialDomains::MeshGraph::Read(vSession); //------------------------------------------------------------ //------------------------------------------------------------- // Define Streak Expansion MultiRegions::ExpListSharedPtr streak; streak = MemoryManager<MultiRegions::ExpList2D> ::AllocateSharedPtr(vSession,graphShPt); //--------------------------------------------------------------- //---------------------------------------------- // Import field file. string fieldfile(argv[argc-1]); vector<LibUtilities::FieldDefinitionsSharedPtr> fielddef; vector<vector<NekDouble> > fielddata; LibUtilities::Import(fieldfile,fielddef,fielddata); //---------------------------------------------- //---------------------------------------------- // Copy data from field file string streak_field("w"); for(unsigned int i = 0; i < fielddata.size(); ++i) { streak->ExtractDataToCoeffs(fielddef [i], fielddata[i], streak_field, streak->UpdateCoeffs()); } //---------------------------------------------- int npts; vSession->LoadParameter("NumCriticalLayerPts",npts,30); Array<OneD, NekDouble> x_c(npts); Array<OneD, NekDouble> y_c(npts); NekDouble trans; vSession->LoadParameter("WidthOfLayers",trans,0.1); Computestreakpositions(streak,x_c, y_c,cr,trans); cout << "# x_c y_c" << endl; for(i = 0; i < npts; ++i) { fprintf(stdout,"%12.10lf %12.10lf \n",x_c[i],y_c[i]); //cout << x_c[i] << " " << y_c[i] << endl; } }