Subversion Repositories OpenSees

Rev

Rev 2 | Rev 162 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/* ****************************************************************** **
**    OpenSees - Open System for Earthquake Engineering Simulation    **
**          Pacific Earthquake Engineering Research Center            **
**                                                                    **
**                                                                    **
** (C) Copyright 1999, The Regents of the University of California    **
** All Rights Reserved.                                               **
**                                                                    **
** Commercial use of this program without express permission of the   **
** University of California, Berkeley, is strictly prohibited.  See   **
** file 'COPYRIGHT'  in main directory for information on usage and   **
** redistribution,  and for a DISCLAIMER OF ALL WARRANTIES.           **
**                                                                    **
** Developed by:                                                      **
**   Frank McKenna (fmckenna@ce.berkeley.edu)                         **
**   Gregory L. Fenves (fenves@ce.berkeley.edu)                       **
**   Filip C. Filippou (filippou@ce.berkeley.edu)                     **
**                                                                    **
** ****************************************************************** */

                                                                       
// $Revision: 1.2 $
// $Date: 2000-10-28 05:50:02 $
// $Source: /usr/local/cvs/OpenSees/SRC/element/TclElementCommands.cpp,v $
                                                                       
                                                                       
// File: ~/element/TclElementCommands.C
//
// Written: fmk
// Created: 07/99
// Revision: A
//
// Description: This file contains the implementation of the TclElementCommands.
// The file contains the routine TclElementCommands which is invoked by the
// TclModelBuilder.
//
// What: "@(#) TclModelBuilder.C, revA"

#include <stdlib.h>
#include <string.h>
#include <iostream.h>
#include <Domain.h>

#include <fElmt02.h>
#include <Truss.h>
#include <TrussSection.h>
#include <ElasticBeam2d.h>
#include <beam2d02.h>
#include <ElasticBeam3d.h>

#include <CrdTransf2d.h>
#include <CrdTransf3d.h>

#include <TclModelBuilder.h>

//
// SOME STATIC POINTERS USED IN THE FUNCTIONS INVOKED BY THE INTERPRETER
//

extern void printCommand(int argc, char **argv);

//
// THE PROTOTYPES OF THE FUNCTIONS INVOKED BY THE INTERPRETER
//

extern int
TclModelBuilder_addFeapTruss(ClientData clientData, Tcl_Interp *interp,  int argc,
                             char **argv, Domain*, TclModelBuilder *, int argStart);

extern int
TclModelBuilder_addTruss(ClientData clientData, Tcl_Interp *interp,  int argc,
                         char **argv, Domain*, TclModelBuilder *, int argStart);                     
                       
int
TclModelBuilder_addElasticBeam(ClientData clientData, Tcl_Interp *interp,  int argc,
                               char **argv, Domain*, TclModelBuilder *, int argStart);     

// GLF                         
extern int
TclModelBuilder_addZeroLength(ClientData, Tcl_Interp *, int, char **,
                              Domain*, TclModelBuilder *);

// MHS                         
extern int
TclModelBuilder_addZeroLengthSection(ClientData, Tcl_Interp *, int, char **,
                              Domain*, TclModelBuilder *);

// MHS
extern int
TclModelBuilder_addZeroLengthND(ClientData, Tcl_Interp *, int, char **,
                              Domain*, TclModelBuilder *);


// REMO
extern int
TclModelBuilder_addFrameElement(ClientData, Tcl_Interp *, int, char **,
                                Domain*, TclModelBuilder *);
                       
// MHS
extern int
TclModelBuilder_addBeamWithHinges(ClientData, Tcl_Interp *, int, char **,
                                  Domain*, TclModelBuilder *);
extern int
TclModelBuilder_addFourNodeQuad(ClientData, Tcl_Interp *, int, char **,
                                Domain*, TclModelBuilder *);
                   
int
TclModelBuilderElementCommand(ClientData clientData, Tcl_Interp *interp,
                              int argc, char **argv,
                              Domain *theTclDomain, TclModelBuilder *theTclBuilder)
{
  // ensure the destructor has not been called -
  if (theTclBuilder == 0) {
    cerr << "WARNING builder has been destroyed\n";    
    return TCL_ERROR;
  }

  // check at least two arguments so don't segemnt fault on strcmp  
  if (argc < 2) {
    cerr << "WARNING need to specify an element type\n";
    cerr << "Want: element eleType <specific element args>\n";
    cerr << "Valid types: truss, elasticBeamColumn, nonlinearBeamColumn\n";
    return TCL_ERROR;
  }

  if (strcmp(argv[1],"fTruss") == 0) {
    int eleArgStart = 1;
    int result = TclModelBuilder_addFeapTruss(clientData, interp, argc, argv,
                                              theTclDomain, theTclBuilder, eleArgStart);
    return result;
  } else if (strcmp(argv[1],"truss") == 0) {
    int eleArgStart = 1;
    int result = TclModelBuilder_addTruss(clientData, interp, argc, argv,
                                              theTclDomain, theTclBuilder, eleArgStart);
    return result;
  }else if (strcmp(argv[1],"elasticBeamColumn") == 0) {
    int eleArgStart = 1;
    int result = TclModelBuilder_addElasticBeam(clientData, interp, argc, argv,
                                              theTclDomain, theTclBuilder, eleArgStart);    
    return result;
  } else if (strcmp(argv[1],"nonlinearBeamColumn") == 0) {
    int result = TclModelBuilder_addFrameElement(clientData, interp, argc, argv,
                                                 theTclDomain, theTclBuilder);
    return result;
  } else if (strcmp(argv[1],"beamWithHinges") == 0) {
          int result = TclModelBuilder_addBeamWithHinges(clientData, interp, argc, argv,
                                                 theTclDomain, theTclBuilder);
    return result;
  } else if (strcmp(argv[1],"quad") == 0) {
          int result = TclModelBuilder_addFourNodeQuad(clientData, interp, argc, argv,
                                                       theTclDomain, theTclBuilder);
          return result;
  } else if (strcmp(argv[1],"zeroLength") == 0) {
    int result = TclModelBuilder_addZeroLength(clientData, interp, argc, argv,
                                               theTclDomain, theTclBuilder);
    return result;
  } else if (strcmp(argv[1],"zeroLengthSection") == 0) {
    int result = TclModelBuilder_addZeroLengthSection(clientData, interp, argc, argv,
                                               theTclDomain, theTclBuilder);
    return result;
  } else if (strcmp(argv[1],"zeroLengthND") == 0) {
    int result = TclModelBuilder_addZeroLengthND(clientData, interp, argc, argv,
                                               theTclDomain, theTclBuilder);
    return result;
  } else {
    cerr << "WARNING unknown element type: " <<  argv[1];
    cerr << "Valid types: truss, elasticBeamColumn, nonlinearBeamColumn, beamWithHinges, zeroLength\n";
    return TCL_ERROR;
  }
}



//
// command for the beam2d and beam3d elements
//


int
TclModelBuilder_addElasticBeam(ClientData clientData, Tcl_Interp *interp, int argc,
                               char **argv, Domain *theTclDomain, TclModelBuilder *theTclBuilder,
                               int eleArgStart)
{
  // ensure the destructor has not been called -
  if (theTclBuilder == 0) {
    cerr << "WARNING builder has been destroyed - elasticBeamColumn \n";    
    return TCL_ERROR;
  }

  int ndm = theTclBuilder->getNDM();
  int ndf = theTclBuilder->getNDF();

  Element *theBeam = 0;

  if (ndm == 2) {
    // check plane frame problem has 3 dof per node
    if (ndf != 3) {
      cerr << "WARNING invalid ndf: " << ndf;
      cerr << ", for plane problem need 3 - elasticBeamColumn \n";    
      return TCL_ERROR;
    }

    // check the number of arguments
    if ((argc-eleArgStart) < 8) {
      cerr << "WARNING bad command - want: elasticBeamColumn beamId iNode jNode A E I transTag\n";
      printCommand(argc, argv);
      return TCL_ERROR;
    }    

    // get the id, end nodes, and section properties
    int beamId, iNode, jNode, transTag;
    double A,E,I;
    if (Tcl_GetInt(interp, argv[1+eleArgStart], &beamId) != TCL_OK) {
      cerr << "WARNING invalid beamId: " << argv[1+eleArgStart];
      cerr << " - elasticBeamColumn beamId iNode jNode A E I\n";
      return TCL_ERROR;
    }
    if (Tcl_GetInt(interp, argv[2+eleArgStart], &iNode) != TCL_OK) {
      cerr << "WARNING invalid iNode - elasticBeamColumn " << beamId << " iNode jNode A E I\n";
      return TCL_ERROR;
    }
    if (Tcl_GetInt(interp, argv[3+eleArgStart], &jNode) != TCL_OK) {
      cerr << "WARNING invalid jNode - elasticBeamColumn " << beamId << " iNode jNode A E I\n";
      return TCL_ERROR;
    }

    if (Tcl_GetDouble(interp, argv[4+eleArgStart], &A) != TCL_OK) {
      cerr << "WARNING invalid A - elasticBeamColumn " << beamId << " iNode jNode A E I\n";
      return TCL_ERROR;
    }
    if (Tcl_GetDouble(interp, argv[5+eleArgStart], &E) != TCL_OK) {
      cerr << "WARNING invalid E - elasticBeam " << beamId << " iNode jNode A E I\n";
      return TCL_ERROR;
    }
   
    if (Tcl_GetDouble(interp, argv[6+eleArgStart], &I) != TCL_OK) {
      cerr << "WARNING invalid I - elasticBeamColumn " << beamId << " iNode jNode A E I\n";
      return TCL_ERROR;
    }  
    if (Tcl_GetInt(interp, argv[7+eleArgStart], &transTag) != TCL_OK) {
      cerr << "WARNING invalid transTag - elasticBeamColumn " << beamId << " iNode jNode A E I\n";
      return TCL_ERROR;
    }
   
    CrdTransf2d *theTrans = theTclBuilder->getCrdTransf2d(transTag);
   
    if (theTrans == 0) {
        cerr << "WARNING transformation object not found - elasticBeamColumn " << beamId;
        return TCL_ERROR;
    }
   
    // now create the beam and add it to the Domain
    theBeam = new ElasticBeam2d (beamId,A,E,I,iNode,jNode, *theTrans);
   
    if (theBeam == 0) {
      cerr << "WARNING ran out of memory creating beam - elasticBeamColumn ";  
      cerr << beamId << " iNode jNode A E I\n";
      return TCL_ERROR;
    }
  }

  else if (ndm == 3) {
    // check space frame problem has 6 dof per node
    if (ndf != 6) {
      cerr << "WARNING invalid ndof: " << ndf;
      cerr << ", for 3d problem  need 6 - elasticBeamColumn \n";    
      return TCL_ERROR;
    }

    // check the number of arguments
    if ((argc-eleArgStart) < 11) {
      cerr << "WARNING bad command - want: elasticBeamColumn beamId iNode jNode";
      cerr << " A E G Jx Iy Iz transTag" << endl;
      printCommand(argc, argv);
      return TCL_ERROR;
    }    

    // get the id, end nodes, and section properties
    int beamId, iNode, jNode, transTag;
    double A,E,G,Jx,Iy,Iz;
    if (Tcl_GetInt(interp, argv[1+eleArgStart], &beamId) != TCL_OK) {
      cerr << "WARNING invalid beamId: " << argv[1+eleArgStart];
      cerr << " - elasticBeamColumn beamId iNode jNode A E G Jx Iy Iz\n ";
      return TCL_ERROR;
    }
    if (Tcl_GetInt(interp, argv[2+eleArgStart], &iNode) != TCL_OK) {
      cerr << "WARNING invalid iNode - elasticBeamColumn " << beamId;
      cerr << " iNode jNode A E G Jx Iy Iz\n";
      return TCL_ERROR;
    }
    if (Tcl_GetInt(interp, argv[3+eleArgStart], &jNode) != TCL_OK) {
      cerr << "WARNING invalid jNode - elasticBeamColumn " << beamId;
      cerr << " iNode jNode A E G Jx Iy Iz\n";
      return TCL_ERROR;
    }

    if (Tcl_GetDouble(interp, argv[4+eleArgStart], &A) != TCL_OK) {
      cerr << "WARNING invalid A - elasticBeamColumn " << beamId;
      cerr << " iNode jNode A E G Jx Iy Iz\n";
      return TCL_ERROR;
    }
    if (Tcl_GetDouble(interp, argv[5+eleArgStart], &E) != TCL_OK) {
      cerr << "WARNING invalid E - elasticBeamColumn " << beamId;
      cerr << " iNode jNode A E G Jx Iy Iz\n";
      return TCL_ERROR;
    }
    if (Tcl_GetDouble(interp, argv[6+eleArgStart], &G) != TCL_OK) {
      cerr << "WARNING invalid G - elasticBeamColumn " << beamId;
      cerr << " iNode jNode A E G Jx Iy Iz\n";
      return TCL_ERROR;
    }  
    if (Tcl_GetDouble(interp, argv[7+eleArgStart], &Jx) != TCL_OK) {
      cerr << "WARNING invalid Jx - elasticBeamColumn " << beamId;
      cerr << " iNode jNode A E G Jx Iy Iz\n";
      return TCL_ERROR;
    }  
    if (Tcl_GetDouble(interp, argv[8+eleArgStart], &Iy) != TCL_OK) {
      cerr << "WARNING invalid Iy - elasticBeamColumn " << beamId;
      cerr << " iNode jNode A E G Jx Iy Iz\n";
      return TCL_ERROR;
    }  
    if (Tcl_GetDouble(interp, argv[9+eleArgStart], &Iz) != TCL_OK) {
      cerr << "WARNING invalid Iz - elasticBeamColumn " << beamId;
      cerr << " iNode jNode A E G Jx Iy Iz\n";
      return TCL_ERROR;
    }  
    if (Tcl_GetInt(interp, argv[10+eleArgStart], &transTag) != TCL_OK) {
      cerr << "WARNING invalid transTag - elasticBeamColumn " << beamId;
      cerr << " iNode jNode A E G Jx Iy Iz\n";
      return TCL_ERROR;
    }      

    CrdTransf3d *theTrans = theTclBuilder->getCrdTransf3d(transTag);
   
    if (theTrans == 0) {
        cerr << "WARNING transformation object not found - elasticBeamColumn " << beamId;
        return TCL_ERROR;
    }
   
    // now create the beam and add it to the Domain
    theBeam = new ElasticBeam3d (beamId,A,E,G,Jx,Iy,Iz,iNode,jNode, *theTrans);
   
    if (theBeam == 0) {
      cerr << "WARNING ran out of memory creating beam - elasticBeamColumn ";  
      cerr << beamId << " iNode jNode A E G Jx Iy Iz\n";
      return TCL_ERROR;
    }
   
  }

  else {
    cerr << "WARNING elasticBeamColumn command only works when ndm is 2 or 3, ndm: ";
    cerr << ndm << endl;
    return TCL_ERROR;
  }

  // now add the beam to the domain
  if (theTclDomain->addElement(theBeam) == false) {
    cerr << "WARNING TclModelBuilder - addBeam - could not add beam to domain ";
    cerr << *theBeam;
    delete theBeam; // clean up the memory to avoid leaks
    return TCL_ERROR;
  }

  // if get here we have sucessfully created the node and added it to the domain
  return TCL_OK;
}