Beispiel #1
0
int XC::DriftRecorder::initialize(void)
  {

    initializationDone = true; // still might fail but don't want back in again

    //
    // clean up old memory
    //

    if(!theNodes.empty())
      theNodes.clear();
    free_nodes();

    //
    // check valid node ID's
    //

    if(!ndI || !ndJ)
      {
        std::cerr << "XC::DriftRecorder::initialize() - no nodal id's set\n";
        return -1;
      }

    const int ndIsize= ndI->Size();
    const int ndJsize= ndJ->Size();

    if(ndIsize == 0)
      {
        std::cerr << "XC::DriftRecorder::initialize() - no nodal id's set\n";
        return -1;
      }

    if(ndIsize != ndJsize)
      {
        std::cerr << "XC::DriftRecorder::initialize() - error node arrays differ in size"
                  << " (" << ndIsize << "!=" << ndJsize << "),\n";
        return -2;
      }

    //
    // lets loop through & determine number of valid nodes
    //


    numNodes = 0;

    for(int i=0; i<ndIsize; i++)
      {
        int ni = (*ndI)(i);
        int nj = (*ndJ)(i);

        Node *nodeI = theDomain->getNode(ni);
        if(!nodeI)
	  std::cerr << getClassName() << __FUNCTION__
	            << "; node identified by: "
                    << ni << " not found." << std::endl;
        Node *nodeJ = theDomain->getNode(nj);
        if(!nodeJ)
	  std::cerr << getClassName() << __FUNCTION__
	            << "; node identified by: "
                    << nj << " not found." << std::endl;

        if(nodeI && nodeJ )
          {
            const Vector &crdI = nodeI->getCrds();
            const Vector &crdJ = nodeJ->getCrds();

            if(crdI.Size() > perpDirn  && crdJ.Size() > perpDirn)
              if(crdI(perpDirn) != crdJ(perpDirn))
                numNodes++;
          }
      }

    if(numNodes == 0)
      {
        std::cerr << "XC::DriftRecorder::initialize() - no valid nodes or perpendicular direction\n";
        return 0;
      }

    //
    // allocate memory
    //

    int timeOffset = 0;
    if(echoTimeFlag == true)
      timeOffset = 1;

    alloc_nodes(numNodes,timeOffset);

    //
    // set node pointers and determine one over L
    //

    int counter = 0;
    int counterI = 0;
    int counterJ = 1;
    for(int j=0; j<ndIsize; j++)
      {
        int ni = (*ndI)(j);
        int nj = (*ndJ)(j);

        Node *nodeI= theDomain->getNode(ni);
        Node *nodeJ= theDomain->getNode(nj);

        if(nodeI != 0 && nodeJ != 0)
          {
            const XC::Vector &crdI = nodeI->getCrds();
            const XC::Vector &crdJ = nodeJ->getCrds();

            if(crdI.Size() > perpDirn  && crdJ.Size() > perpDirn)
              if(crdI(perpDirn) != crdJ(perpDirn))
                {
                  oneOverL(counter) = 1.0/fabs(crdJ(perpDirn) - crdI(perpDirn));
                  theNodes[counterI] = nodeI;
                  theNodes[counterJ] = nodeJ;
                  counterI+=2;
                  counterJ+=2;
                  counter++;
                }
          }
      }

    //
    // create the data description for the OutputHandler & compute length between nodes
    //

    int numDbColumns = timeOffset + numNodes;
    std::vector<std::string> dbColumns(numDbColumns);

    static std::string aColumn; // assumes a column name will not be longer than 256 characters

    if(echoTimeFlag == true)
      {
        dbColumns[0] = "time";
      }

    for(int k=0; k<numNodes; k++)
      {
        Node *nodI= theNodes[2*k];
        Node *nodJ= theNodes[2*k+1];
        int ni = nodI->getTag();
        int nj = nodJ->getTag();

        //sprintf(aColumn, "Drift%d_%d_%d", ni, nj, perpDirn);
        aColumn= "Drift_"  + boost::lexical_cast<std::string>(ni) + "_"
                           + boost::lexical_cast<std::string>(nj) + "_"
                           + boost::lexical_cast<std::string>(perpDirn);
        dbColumns[k+timeOffset] = aColumn;
      }

    //
    // call open in the handler with the data description
    //

    if(theHandler)
      theHandler->open(dbColumns);

    //
    // mark as having been done & return
    //

    return 0;
  }
Beispiel #2
0
// check if limit state surface has been reached
int
ShearCurve::checkElementState(double springForce)
{
  DummyStream dummy;
	// find associated beam-column elementon first visit
	if (theElement == 0)
	{
		theElement = theDomain->getElement(eleTag);

		if (theElement == 0) {
//			g3ErrorHandler->fatal("WARNING ShearCurve - no element with tag %i exists in Domain",eleTag);
		}
		// find length between nodes if drift is desired
		if (defType == 2)
		{
			Node *nodeI = theDomain->getNode(ndI);
			Node *nodeJ = theDomain->getNode(ndJ);

			const Vector &crdI = nodeI->getCrds();
			const Vector &crdJ = nodeJ->getCrds();

			if (crdI(perpDirn) == crdJ(perpDirn)) {
//				g3ErrorHandler->warning("%s -- Nodal projection has zero component along chosen direction",
//						"AxialCurve::AxialCurve");

				oneOverL = 0.0;
			}
			else 
				oneOverL = 1.0/fabs(crdJ(perpDirn) - crdI(perpDirn));
		}
	}

	double deform;	// value of deformation parameter from element
	double force;	// value of force parameter from element
	int result;		//junk variable


	// Based on "defType" and "forType" calculate 
	// the desired response parameters "deform" and "force"
	if (defType == 1) // maximum chord rotations
	{

		Response *theRotations =0; // integer element returns in setResponse

		const char *r[1] = {"basicDeformations"}; // must be implemented in element

		Vector *rotVec; //vector of chord rotations at beam-column ends

		// set type of beam-column element response desired
		theRotations = theElement->setResponse(r, 1, dummy);

		// put element response in the vector of "myInfo"
		result = theRotations->getResponse();

		// access the myInfo vector containing the response (new for Version 1.2)
		Information &theInfo = theRotations->getInformation();
		rotVec = (theInfo.theVector);

		deform = (fabs((*rotVec)(1)) > fabs((*rotVec)(2))) ? 
			fabs((*rotVec)(1)) : fabs((*rotVec)(2));  //use larger of two end rotations
	}
	else if (defType == 2) // interstory drift
	{
		// find associated nodes 
		Node *nodeI = theDomain->getNode(ndI);
		Node *nodeJ = theDomain->getNode(ndJ);


		// get displacements
		const Vector &dispI = nodeI->getTrialDisp();
		const Vector &dispJ = nodeJ->getTrialDisp();

//opserr << "Drift ndI: " << dispI(dof) << endln;
//opserr << "Drift ndJ: " << dispJ(dof) << endln;

		
		// calc drift
		double dx = fabs(dispJ(dof)-dispI(dof));
		deform = dx*oneOverL;
	}
	else {
//		g3ErrorHandler->fatal("WARNING ShearCurve - deformation type flag %i not implemented",defType);
	}

		Response *theForces =0;

		const char *f[1] = {"localForce"}; // does not include influence of P-delta
								     // for P-delta use forType = 0

		Vector *forceVec; //vector of basic forces from beam column

		// set type of beam-column element response desired
		theForces    = theElement->setResponse(f, 1, dummy);

		// put element response in the vector of "myInfo"
		result += theForces->getResponse();

		// access the myInfo vector containing the response (new for Version 1.2)
		Information &theInfo = theForces->getInformation();
		forceVec = (theInfo.theVector);

	// Local forces (assuming no element loads)
	if (forType == 0)
		force = fabs(springForce);    // force in associated LimitState material
	else if (forType == 1) 
		force = fabs((*forceVec)(1)); // shear
	else if (forType == 2) 
		force = fabs((*forceVec)(0)); // axial
	else {
//		g3ErrorHandler->fatal("WARNING ShearCurve - force type flag %i not implemented",forType);
	}

	P = fabs((*forceVec)(0));

	// Determine if (deform,force) is outside limit state surface.
	// 
	// Use absolute value of deform and force
	double forceSurface = findLimit(deform); // force on surface at deform

//	double deformSurface = findLimit(force); // deform on surface at force	SDK


//opserr << "The shear force in the element is: " << force << endln;


//opserr << "State flag............................:" << stateFlag << endln;
//opserr << "Shear force in the column.........: " << force << endln;
//opserr << "forceSurface: " << forceSurface << endln;

	if (stateFlag == 0) //prior to failure
	{
		if (force >= forceSurface) // on/outside failure surface
	//	  if (deform >= deformSurface) // on/outside failure surface	SDK

		{	
			stateFlag = 1;
			setDegSlope(force, deform);
//			g3ErrorHandler->warning("ShearCurve - failure detected at deform = %f (Kdeg = %f) ", deform, Kdeg);
//opserr << "*********************" << endln;
        opserr << "ShearCurve - failure detected....."<< endln;//SDK

       // opserr << "deformSurface: " << deformSurface << endln; //SDK
  
      



//opserr << "Capacity: " << forceSurface << endln;
//opserr << "*********************" << endln;
		}
		else // inside failure surface
		{
			stateFlag = 0;
		}
	}
	else //after failure
	{
		if (force >= forceSurface) // on/outside failure surface
		//  if (deform >= deformSurface) // on/outside failure surface SDK
		{	
			stateFlag = 2;
		}
		else // inside failure surface
		{
			stateFlag = 3;
		}
	}

	return stateFlag;
}