Subversion Repositories OpenSees

Rev

Rev 2995 | Rev 3130 | 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.43 $
// $Date: 2007-10-13 20:43:57 $
// $Source: /usr/local/cvs/OpenSees/SRC/element/TclElementCommands.cpp,v $
                                                                       
// 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 <OPS_Stream.h>
#include <Domain.h>

#include <ElasticBeam2d.h>
#include <ElasticBeam3d.h>

//Zhaohui Yang (UCD)
#include <EightNodeBrick.h>
#include <TwentyNodeBrick.h>

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

#include <TclModelBuilder.h>
#include <packages.h>

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


typedef struct elementPackageCommand {
  char *funcName;
  int (*funcPtr)(ClientData clientData, Tcl_Interp *interp,  int argc,
                 TCL_Char **argv, Domain*, TclModelBuilder *);
  struct elementPackageCommand *next;
} ElementPackageCommand;

static ElementPackageCommand *theElementPackageCommands = NULL;

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

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

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

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

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

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

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

extern int
TclModelBuilder_addConstantPressureVolumeQuad(ClientData, Tcl_Interp *, int, TCL_Char **,
                                              Domain*, TclModelBuilder *);

extern int
TclModelBuilder_addJoint2D(ClientData, Tcl_Interp *, int, TCL_Char **,
                           Domain*, TclModelBuilder *);

extern int
TclModelBuilder_addJoint3D(ClientData, Tcl_Interp *, int, TCL_Char **,
                           Domain*, TclModelBuilder *);

extern int
TclModelBuilder_addEnhancedQuad(ClientData, Tcl_Interp *, int, TCL_Char **,
                                Domain*, TclModelBuilder *);

extern int
TclModelBuilder_addNineNodeMixedQuad(ClientData, Tcl_Interp *, int, TCL_Char **,
                                     Domain*, TclModelBuilder *);


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

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

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


// MHS
extern int
TclModelBuilder_addBeamWithHinges(ClientData, Tcl_Interp *, int, TCL_Char **,
                                  Domain*, TclModelBuilder *);
extern int
TclModelBuilder_addFourNodeQuad(ClientData, Tcl_Interp *, int, TCL_Char **,
                                Domain*, TclModelBuilder *);

extern int
TclModelBuilder_addDispBeamColumnInt(ClientData, Tcl_Interp *, int, TCL_Char **,
                                  Domain*, TclModelBuilder *);

extern int
TclModelBuilder_addForceBeamColumn(ClientData, Tcl_Interp *, int, TCL_Char **,
                                   Domain*, TclModelBuilder *);
                   
// NM
extern int
TclModelBuilder_addBeamColumnJoint(ClientData, Tcl_Interp *, int, TCL_Char **,
                                   Domain*, TclModelBuilder *, int);

//Boris Jeremic & Zhaohui
extern int TclModelBuilder_addEightNodeBrick(ClientData,
                                             Tcl_Interp *,  
                                             int,
                                             TCL_Char **,
                                             Domain*,
                                             TclModelBuilder *,
                                             int);
//Boris Jeremic & Zhaohui
extern int TclModelBuilder_addTwentyNodeBrick(ClientData,
                                              Tcl_Interp *,  
                                              int,
                                              TCL_Char **,
                                              Domain*,
                                              TclModelBuilder *,
                                              int);

//Boris Jeremic & Xiaoyan 01/07/2002
extern int TclModelBuilder_addEightNodeBrick_u_p_U(ClientData,
                                                   Tcl_Interp *,  
                                                   int,
                                                   TCL_Char **,
                                                   Domain*,
                                                   TclModelBuilder *,
                                                   int);
//Boris Jeremic & Xiaoyan 01/07/2002
extern int TclModelBuilder_addTwentyNodeBrick_u_p_U(ClientData,
                                                    Tcl_Interp *,  
                                                    int,
                                                    TCL_Char **,
                                                    Domain*,
                                                    TclModelBuilder *,
                                                    int);

//Boris Jeremic & Guanzhou Jie 10/30/2003
extern int TclModelBuilder_addTwentySevenNodeBrick(ClientData,
                                                   Tcl_Interp *,
                                                   int,
                                                   TCL_Char **,
                                                   Domain*,
                                                   TclModelBuilder *,
                                                   int);



//Rohit Kraul
extern int
TclModelBuilder_addElastic2dGNL(ClientData, Tcl_Interp *, int, TCL_Char **,
                                Domain *,TclModelBuilder *);
extern int
TclModelBuilder_addElement2dYS(ClientData, Tcl_Interp *, int, TCL_Char **,
                               Domain *,TclModelBuilder *);

// Zhaohui Yang
extern int
TclModelBuilder_addFourNodeQuadUP(ClientData, Tcl_Interp *, int, TCL_Char **,
                                Domain*, TclModelBuilder *);

// Zhaohui Yang
extern int
TclModelBuilder_addBrickUP(ClientData, Tcl_Interp *, int, TCL_Char **,
                                Domain*, TclModelBuilder *);

// Zhaohui Yang
extern int
TclModelBuilder_addNineFourNodeQuadUP(ClientData, Tcl_Interp *, int, TCL_Char **,
                                Domain*, TclModelBuilder *);
// Jinchi Lu
extern int
TclModelBuilder_addTwentyEightNodeBrickUP(ClientData, Tcl_Interp *, int, TCL_Char **,
                                Domain*, TclModelBuilder *);
// Jinchi Lu
extern int
TclModelBuilder_addTwentyNodeBrick(ClientData, Tcl_Interp *, int, TCL_Char **,
                                Domain*, TclModelBuilder *);

// Boris Jeremic and Zhao Cheng
extern int
TclModelBuilder_addTLFD20nBrick(ClientData, Tcl_Interp *, int, TCL_Char **,
                                Domain*, TclModelBuilder *, int);

// Boris Jeremic and Zhao Cheng
extern int
TclModelBuilder_addTLFD8nBrick(ClientData, Tcl_Interp *, int, TCL_Char **,
                                Domain*, TclModelBuilder *, int);
                               
                               
// Boris Jeremic and Zhao Cheng
extern int
TclModelBuilder_addEightNode_LDBrick_u_p(ClientData, Tcl_Interp *, int, TCL_Char **,
                                Domain*, TclModelBuilder *, int);

// Boris Jeremic and Zhao Cheng
extern int
TclModelBuilder_addEightNode_Brick_u_p(ClientData, Tcl_Interp *, int, TCL_Char **,
                                Domain*, TclModelBuilder *, int);

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

  // check at least two arguments so don't segemnt fault on strcmp  
  if (argc < 2) {
    opserr << "WARNING need to specify an element type\n";
    opserr << "Want: element eleType <specific element args> .. see manual for valid eleTypes & arguments\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 || strcmp(argv[1],"corotTruss") == 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_addNLBeamColumn(clientData, interp, argc, argv,
                                                 theTclDomain, theTclBuilder);
    return result;
  } else if (strcmp(argv[1],"dispBeamColumn") == 0) {
    int result = TclModelBuilder_addDispBeamColumn(clientData, interp, argc, argv,
                                                   theTclDomain, theTclBuilder);
    return result;

  }
  */

  else if (strcmp(argv[1],"dispBeamColumnInt") == 0) {
    int result = TclModelBuilder_addDispBeamColumnInt(clientData, interp, argc, argv,
                                                   theTclDomain, theTclBuilder);
    return result;

  } else if (strcmp(argv[1],"forceBeamColumn") == 0 || strcmp(argv[1],"dispBeamColumn") == 0 || strcmp(argv[1],"elasticForceBeamColumn") == 0 || strcmp(argv[1],"nonlinearBeamColumn") == 0) {
    int result = TclModelBuilder_addForceBeamColumn(clientData, interp, argc, argv,
                                                    theTclDomain, theTclBuilder);
    return result;
  } else if (strstr(argv[1],"beamWithHinges") != 0) {
          int result = TclModelBuilder_addBeamWithHinges(clientData, interp, argc, argv,
                                                 theTclDomain, theTclBuilder);
    return result;
  } else if ((strcmp(argv[1],"quad") == 0) || (strcmp(argv[1],"stdQuad") == 0)) {
    int result = TclModelBuilder_addFourNodeQuad(clientData, interp, argc, argv,
                                                 theTclDomain, theTclBuilder);
          return result;
  } else if (strcmp(argv[1],"enhancedQuad") == 0) {
    int result = TclModelBuilder_addEnhancedQuad(clientData, interp, argc, argv,
                                                 theTclDomain, theTclBuilder);
    return result;
  } else if ((strcmp(argv[1],"bbarQuad") == 0) || (strcmp(argv[1],"mixedQuad") == 0)) {
    int result = TclModelBuilder_addConstantPressureVolumeQuad(clientData, interp,
                                                               argc, argv,
                                                               theTclDomain,
                                                               theTclBuilder);
    return result;
  } else if ((strcmp(argv[1],"nineNodeMixedQuad") == 0)
             || (strcmp(argv[1],"nineNodeQuad") == 0)) {
    int result = TclModelBuilder_addNineNodeMixedQuad(clientData, interp,
                                                      argc, argv,
                                                      theTclDomain,
                                                      theTclBuilder);
    return result;
  } else if (strcmp(argv[1],"quadUP") == 0) {
          int result = TclModelBuilder_addFourNodeQuadUP(clientData, interp, argc, argv,
                                                       theTclDomain, theTclBuilder);
          return result;
  } else if (strcmp(argv[1],"brickUP") == 0) {
          int result = TclModelBuilder_addBrickUP(clientData, interp, argc, argv,
                                                       theTclDomain, theTclBuilder);
          return result;
  } else if (strcmp(argv[1],"9_4_QuadUP") == 0) {
          int result = TclModelBuilder_addNineFourNodeQuadUP(clientData, interp, argc, argv,
                                                       theTclDomain, theTclBuilder);
          return result;
  } else if (strcmp(argv[1],"20_8_BrickUP") == 0) {
          int result = TclModelBuilder_addTwentyEightNodeBrickUP(clientData, interp, argc, argv,
                                                       theTclDomain, theTclBuilder);
          return result;
  } else if (strcmp(argv[1],"20NodeBrick") == 0) {
          int result = TclModelBuilder_addTwentyNodeBrick(clientData, interp, argc, argv,
                                                       theTclDomain, theTclBuilder);
          return result;
  } else if ((strcmp(argv[1],"shell") == 0) || (strcmp(argv[1],"shellMITC4") == 0) ||
             (strcmp(argv[1],"Shell") == 0) || (strcmp(argv[1],"ShellMITC4") == 0)) {


    int eleArgStart = 1;
    int result = TclModelBuilder_addShellMITC4(clientData, interp,
                                               argc, argv,
                                               theTclDomain,
                                               theTclBuilder,
                                               eleArgStart);
    return result;
  }

  //Boris Jeremic & Zhaohui
  else if (strcmp(argv[1],"Brick8N") == 0) {

    int eleArgStart = 1;
    int result = TclModelBuilder_addEightNodeBrick(clientData,
                                                   interp,
                                                   argc,
                                                   argv,
                                                   theTclDomain,
                                                   theTclBuilder,
                                                   eleArgStart);
    return result;
  }

  //Boris Jeremic & Zhaohui
  else if (strcmp(argv[1],"Brick20N") == 0) {
    int eleArgStart = 1;
    int result = TclModelBuilder_addTwentyNodeBrick(clientData,
                                                    interp,
                                                    argc,
                                                    argv,
                                                    theTclDomain,
                                                    theTclBuilder,
                                                    eleArgStart);
    return result;
  }

  //Boris Jeremic & Guanzhou Jie
  else if (strcmp(argv[1],"Brick27N") == 0)
    {
      int eleArgStart = 1;
      int result = TclModelBuilder_addTwentySevenNodeBrick(clientData,
                                                           interp,
                                                           argc,
                                                           argv,
                                                           theTclDomain,
                                                           theTclBuilder,
                                                           eleArgStart);
                                                           return result;
    }


  // Boris jeremic & Zhao Cheng
  else if (strcmp(argv[1],"TLFD20nBrick") == 0) {
    int eleArgStart = 1;
    int result = TclModelBuilder_addTLFD20nBrick(clientData,
                                                   interp,
                                                   argc,
                                                   argv,
                                                   theTclDomain,
                                                   theTclBuilder,
                                                   eleArgStart);
    return result;
  }

  // Boris jeremic & Zhao Cheng
  else if (strcmp(argv[1],"TLFD8nBrick") == 0) {
    int eleArgStart = 1;
    int result = TclModelBuilder_addTLFD8nBrick(clientData,
                                                   interp,
                                                   argc,
                                                   argv,
                                                   theTclDomain,
                                                   theTclBuilder,
                                                   eleArgStart);
    return result;
  }
 
  //Boris Jeremic & Zhaohui  
  else if (strcmp(argv[1],"Brick8N_u_p_U") == 0) {
    int eleArgStart = 1;
    int result = TclModelBuilder_addEightNodeBrick_u_p_U(clientData,
                                                         interp,
                                                         argc,
                                                         argv,
                                                         theTclDomain,
                                                         theTclBuilder,
                                                         eleArgStart);
    return result;
  }
  //Boris Jeremic & Zhaohui  
  else if (strcmp(argv[1],"Brick20N_u_p_U") == 0) {
    int eleArgStart = 1;
    int result = TclModelBuilder_addTwentyNodeBrick_u_p_U(clientData,
                                                          interp,
                                                          argc,
                                                          argv,
                                                          theTclDomain,
                                                          theTclBuilder,
                                                          eleArgStart);
    return result;
  }

  // Boris Jeremic & Zhao Cheng
  else if (strcmp(argv[1],"EightNode_LDBrick_u_p") == 0) {
    int eleArgStart = 1;
    int result = TclModelBuilder_addEightNode_LDBrick_u_p(clientData,
                                                   interp,
                                                   argc,
                                                   argv,
                                                   theTclDomain,
                                                   theTclBuilder,
                                                   eleArgStart);
    return result;
  }
 
  // Boris Jeremic & Zhao Cheng
  else if (strcmp(argv[1],"EightNode_Brick_u_p") == 0) {
    int eleArgStart = 1;
    int result = TclModelBuilder_addEightNode_Brick_u_p(clientData,
                                                   interp,
                                                   argc,
                                                   argv,
                                                   theTclDomain,
                                                   theTclBuilder,
                                                   eleArgStart);
    return result;
  }
   

  else if (strcmp(argv[1],"stdBrick") == 0) {
    int eleArgStart = 1;
    int result = TclModelBuilder_addBrick(clientData, interp, argc, argv,
                                          theTclDomain, theTclBuilder, eleArgStart);
    return result;
  } else if (strcmp(argv[1],"bbarBrick") == 0) {
    int eleArgStart = 1;
    int result = TclModelBuilder_addBrick(clientData, interp, argc, argv,
                                          theTclDomain, theTclBuilder, eleArgStart);
    return result;
  } else if (strcmp(argv[1],"flBrick") == 0) {
    int eleArgStart = 1;
    int result = TclModelBuilder_addBrick(clientData, interp, argc, argv,
                                          theTclDomain, theTclBuilder, eleArgStart);
    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) {
    opserr << "element zeroLengthND is no longer available, please use "
         << "the zeroLengthSection element instead" << endln;
    return TCL_ERROR;
  } else if ((strcmp(argv[1],"Joint2D") == 0) ||
             (strcmp(argv[1],"Joint2d") == 0)) {
    int result = TclModelBuilder_addJoint2D(clientData, interp, argc, argv,
                                            theTclDomain, theTclBuilder);
    return result;
  } else if ((strcmp(argv[1],"Joint3D") == 0) ||
             (strcmp(argv[1],"Joint3d") == 0)) {
    int result = TclModelBuilder_addJoint3D(clientData, interp, argc, argv,
                                            theTclDomain, theTclBuilder);
    return result;
  } else if ((strcmp(argv[1], "inelastic2dYS01")== 0) ||
             (strcmp(argv[1], "inelastic2dYS02")== 0) ||
             (strcmp(argv[1], "inelastic2dYS03")== 0) ||
             (strcmp(argv[1], "inelastic2dYS04")== 0) ||
             (strcmp(argv[1], "inelastic2dYS05")== 0)) {
    int result = TclModelBuilder_addElement2dYS (clientData, interp,
                                                 argc, argv,
                                                 theTclDomain, theTclBuilder);
    return result;     
  } else if ((strcmp(argv[1],"element2dGNL") == 0) ||
             (strcmp(argv[1],"elastic2dGNL") == 0)) {
    int result = TclModelBuilder_addElastic2dGNL(clientData, interp, argc, argv,
                                                 theTclDomain, theTclBuilder);
    return result;
  }

  else if (strcmp(argv[1],"beamColumnJoint") == 0) {
    int eleArgStart = 1;
    int result = TclModelBuilder_addBeamColumnJoint(clientData, interp,
                                                    argc, argv, theTclDomain,
                                                    theTclBuilder, eleArgStart);
    return result;
  }

  else {

    //
    // maybe element in a package
    //

    // try existing loaded packages

    ElementPackageCommand *eleCommands = theElementPackageCommands;
    bool found = false;
    while (eleCommands != NULL && found == false) {
      if (strcmp(argv[1], eleCommands->funcName) == 0) {
        int result = (*(eleCommands->funcPtr))(clientData, interp, argc, argv, theTclDomain, theTclBuilder);
        return result;
      } else
        eleCommands = eleCommands->next;
    }

    // load new package
    void *libHandle;
    int (*funcPtr)(ClientData clientData, Tcl_Interp *interp,  int argc,
                   TCL_Char **argv, Domain*, TclModelBuilder *);      
    int eleNameLength = strlen(argv[1]);
    char *tclFuncName = new char[eleNameLength+12];
    strcpy(tclFuncName, "TclCommand_");
    strcpy(&tclFuncName[11], argv[1]);    

    int res = getLibraryFunction(argv[1], tclFuncName, &libHandle, (void **)&funcPtr);

    delete [] tclFuncName;

    if (res == 0) {

      char *eleName = new char[eleNameLength+1];
      strcpy(eleName, argv[1]);
      ElementPackageCommand *theEleCommand = new ElementPackageCommand;
      theEleCommand->funcPtr = funcPtr;
      theEleCommand->funcName = eleName;       
      theEleCommand->next = theElementPackageCommands;
      theElementPackageCommands = theEleCommand;
     
      int result = (*funcPtr)(clientData, interp,
                              argc, argv,
                              theTclDomain, theTclBuilder);    
      return result;
    }

    // element type not recognized
    opserr << "WARNING unknown element type: " <<  argv[1] << " :check the manual\n";
    return TCL_ERROR;
  }    
}