TclGeomTransfCommand.cpp

Go to the documentation of this file.
00001 /* ****************************************************************** **
00002 **    Opensees - Open System for Earthquake Engineering Simulation    **
00003 **          Pacific Earthquake Engineering Research Center            **
00004 **                                                                    **
00005 **                                                                    **
00006 ** (C) Copyright 1999, The Regents of the University of California    **
00007 ** All Rights Reserved.                                               **
00008 **                                                                    **
00009 ** Commercial use of this program without express permission of the   **
00010 ** University of California, Berkeley, is strictly prohibited.  See   **
00011 ** file 'COPYRIGHT'  in main directory for information on usage and   **
00012 ** redistribution,  and for a DISCLAIMER OF ALL WARRANTIES.           **
00013 **                                                                    **
00014 ** Developed by:                                                      **
00015 **   Frank McKenna (fmckenna@ce.berkeley.edu)                         **
00016 **   Gregory L. Fenves (fenves@ce.berkeley.edu)                       **
00017 **   Filip C. Filippou (filippou@ce.berkeley.edu)                     **
00018 **                                                                    **
00019 ** ****************************************************************** */
00020                                                                         
00021 // $Revision: 1.4 $
00022 // $Date: 2003/04/02 22:02:34 $
00023 // $Source: /usr/local/cvs/OpenSees/SRC/coordTransformation/TclGeomTransfCommand.cpp,v $
00024 #include <string.h>
00025 #include <TclModelBuilder.h>
00026 
00027 #include <LinearCrdTransf2d.h>
00028 #include <LinearCrdTransf3d.h>
00029 #include <PDeltaCrdTransf2d.h>
00030 #include <PDeltaCrdTransf3d.h>
00031 #include <CorotCrdTransf2d.h>
00032 #include <CorotCrdTransf3d.h>
00033 
00034 static Domain *theTclModelBuilderDomain = 0;
00035 static TclModelBuilder *theTclModelBuilder = 0;
00036 
00037 // 
00038 // to create a coordinate transformation 
00039 //
00040 int
00041 TclModelBuilder_addGeomTransf(ClientData clientData, Tcl_Interp *interp,
00042                               int argc, TCL_Char **argv,
00043                               Domain *theDomain,
00044                               TclModelBuilder *theBuilder)
00045   
00046 {
00047   // Make sure there is a minimum number of arguments
00048   if (argc < 2) {
00049     opserr << "WARNING insufficient number of geomTransf arguments\n";
00050     opserr << "Want: geomTransf type? tag? <specific transf args>" << endln;
00051     return TCL_ERROR;
00052   }   
00053         
00054   theTclModelBuilderDomain = theDomain;
00055   theTclModelBuilder = theBuilder;
00056     
00057   int NDM, NDF;
00058      
00059   NDM = theTclModelBuilder->getNDM();   // dimension of the structure (1d, 2d, or 3d)
00060   NDF = theTclModelBuilder->getNDF();   // number of degrees of freedom per node
00061 
00062   // create 2d coordinate transformation
00063   if (NDM == 2 && NDF == 3) {
00064 
00065     int crdTransfTag;
00066     Vector jntOffsetI(2), jntOffsetJ(2);
00067          
00068     if (argc < 3) {
00069       opserr << "WARNING insufficient arguments - want: geomTransf type? tag? <-jntOffset dXi? dYi? dXj? dYj?>\n"; 
00070       return TCL_ERROR;
00071     }
00072             
00073     int argi = 2;  
00074     if (Tcl_GetInt(interp, argv[argi++], &crdTransfTag) != TCL_OK) {    
00075       opserr << "WARNING invalid tag - want: geomTransf type? tag? <-jntOffset dXi? dYi? dXj? dYj?>\n";
00076       return  TCL_ERROR;
00077     }
00078 
00079     // allow additional options at end of command
00080     int i;
00081     
00082     while (argi != argc) {
00083       if (strcmp(argv[argi],"-jntOffset") == 0) {
00084         argi++;
00085         for (i = 0; i < 2; i++) {
00086           if (argi == argc || Tcl_GetDouble(interp, argv[argi++], &jntOffsetI(i)) != TCL_OK) {
00087             opserr << "WARNING invalid jntOffset value - want: geomTransf type? tag? <-jntOffset dXi? dYi? dXj? dYj?>\n";
00088             return TCL_ERROR;
00089           }
00090         }
00091  
00092         for (i = 0; i < 2; i++) {
00093           if (argi == argc || Tcl_GetDouble(interp, argv[argi++], &jntOffsetJ(i)) != TCL_OK) {
00094             opserr << "WARNING invalid jntOffset value - want: geomTransf type? tag? <-jntOffset dXi? dYi? dXj? dYj?>\n";
00095             return TCL_ERROR;
00096           }
00097         }
00098       }
00099       
00100       else {
00101         opserr << "WARNING bad command - want: geomTransf type? tag? <-jntOffset dXi? dYi? dXj? dYj?>\n";
00102         opserr << "invalid: " << argv[argi] << endln;
00103         return TCL_ERROR;
00104       }
00105     }
00106 
00107     // construct the transformation object
00108     
00109     CrdTransf2d *crdTransf2d;
00110     
00111     if (strcmp(argv[1],"Linear") == 0)
00112       crdTransf2d = new LinearCrdTransf2d(crdTransfTag, jntOffsetI, jntOffsetJ);
00113     
00114     else if (strcmp(argv[1],"PDelta") == 0 || strcmp(argv[1],"LinearWithPDelta") == 0)
00115       crdTransf2d = new PDeltaCrdTransf2d(crdTransfTag, jntOffsetI, jntOffsetJ);
00116     
00117 #ifdef _COROTATIONAL
00118     else if (strcmp(argv[1],"Corotational") == 0)
00119       crdTransf2d = new CorotCrdTransf2d(crdTransfTag, jntOffsetI, jntOffsetJ);
00120 #endif
00121     else {
00122       opserr << "WARNING TclElmtBuilder - addGeomTransf - invalid Type\n";
00123       opserr << argv[1] << endln;
00124       return TCL_ERROR;
00125     }
00126     
00127     if (crdTransf2d == 0) {
00128       opserr << "WARNING TclElmtBuilder - addGeomTransf - ran out of memory to create geometric transformation object\n";
00129       return TCL_ERROR;
00130     }
00131     
00132     // add the transformation to the modelBuilder
00133     if (theTclModelBuilder->addCrdTransf2d(*crdTransf2d)) {
00134       opserr << "WARNING TclElmtBuilder - addGeomTransf  - could not add geometric transformation to model Builder\n";
00135       return TCL_ERROR;
00136     }
00137   }
00138 
00139   else if  (NDM == 3 && NDF == 6) {
00140     int crdTransfTag;
00141     Vector vecxzPlane(3);                  // vector that defines local xz plane
00142     Vector jntOffsetI(3), jntOffsetJ(3);   // joint offsets in global coordinates
00143     
00144     if (argc < 6) {
00145       opserr << "WARNING insufficient arguments - want: geomTransf type? tag? vecxzPlaneX? vecxzPlaneY? vecxzPlaneZ?  <-jntOffset dXi? dYi? dZi? dXj? dYj? dZj? >\n";
00146       return TCL_ERROR;
00147     }
00148     
00149     int argi = 2;  
00150     if (Tcl_GetInt(interp, argv[argi++], &crdTransfTag) != TCL_OK) {    
00151       opserr << "WARNING invalid tag - want: geomTransf type? tag? vecxzPlaneX? vecxzPlaneY? vecxzPlaneZ?  <-jntOffset dXi? dYi? dZi? dXj? dYj? dZj? >\n";
00152       return  TCL_ERROR;
00153     }
00154     
00155     if (Tcl_GetDouble(interp, argv[argi++], &vecxzPlane(0)) != TCL_OK) {
00156       opserr << "WARNING invalid vecxzPlaneX - want: geomTransf type? tag? vecxzPlaneX? vecxzPlaneY? vecxzPlaneZ?  <-jntOffset dXi? dYi? dZi? dXj? dYj? dZj? >\n";
00157       return TCL_ERROR;
00158     }
00159     
00160     if (Tcl_GetDouble(interp, argv[argi++], &vecxzPlane(1)) != TCL_OK) {
00161       opserr << "WARNING invalid vecxzPlaneY - want: geomTransf type? tag? vecxzPlaneX? vecxzPlaneY? vecxzPlaneZ?  <-jntOffset dXi? dYi? dZi? dXj? dYj? dZj? >\n";
00162       return TCL_ERROR;
00163     }
00164     
00165     if (Tcl_GetDouble(interp, argv[argi++], &vecxzPlane(2)) != TCL_OK) {
00166       opserr << "WARNING invalid vecxzPlaneZ - want: geomTransf type? tag? vecxzPlaneX? vecxzPlaneY? vecxzPlaneZ?  <-jntOffset dXi? dYi? dZi? dXj? dYj? dZj? >\n";
00167       return TCL_ERROR;
00168     }
00169     
00170     // allow additional options at end of command
00171     int i;
00172     
00173     while (argi != argc) {
00174       if (strcmp(argv[argi],"-jntOffset") == 0) {
00175         argi++;
00176         for (i = 0; i < 3; i++) {
00177           if (argi == argc || Tcl_GetDouble(interp, argv[argi++], &jntOffsetI(i)) != TCL_OK) {
00178             opserr << "WARNING invalid jntOffset value - want: geomTransf type? tag? vecxzPlaneX? vecxzPlaneY? vecxzPlaneZ?  <-jntOffset dXi? dYi? dZi? dXj? dYj? dZj? >\n"; 
00179             return TCL_ERROR;
00180           }
00181         }
00182         
00183         for (i = 0; i < 3; i++) {
00184           if (argi == argc || Tcl_GetDouble(interp, argv[argi++], &jntOffsetJ(i)) != TCL_OK) {
00185             opserr << "WARNING invalid jntOffset value - want: geomTransf type? tag? vecxzPlaneX? vecxzPlaneY? vecxzPlaneZ?  <-jntOffset dXi? dYi? dZi? dXj? dYj? dZj? >\n";  
00186             return TCL_ERROR;
00187           }
00188         }
00189       }
00190       else {
00191         opserr << "WARNING bad command - want: geomTransf type? tag? vecxzPlaneX? vecxzPlaneY? vecxzPlaneZ?  <-jntOffset dXi? dYi? dZi? dXj? dYj? dZj? > "; 
00192         opserr << "invalid: " << argv[argi] << endln;
00193         return TCL_ERROR;
00194       }
00195     }
00196     
00197     // construct the transformation object
00198     
00199     CrdTransf3d *crdTransf3d;
00200     
00201     if (strcmp(argv[1],"Linear") == 0)
00202       crdTransf3d = new LinearCrdTransf3d(crdTransfTag, vecxzPlane, jntOffsetI, jntOffsetJ);
00203     
00204     else if (strcmp(argv[1],"PDelta") == 0 || strcmp(argv[1],"LinearWithPDelta") == 0)
00205       crdTransf3d = new PDeltaCrdTransf3d(crdTransfTag, vecxzPlane, jntOffsetI, jntOffsetJ);
00206     
00207 #ifdef _COROTATIONAL
00208     else if (strcmp(argv[1],"Corotational") == 0)
00209       crdTransf3d = new CorotCrdTransf3d(crdTransfTag, vecxzPlane, jntOffsetI, jntOffsetJ);
00210 #endif
00211     
00212     else {
00213       opserr << "WARNING TclElmtBuilder - addGeomTransf - invalid Type\n";
00214       return TCL_ERROR;
00215     }
00216     
00217     if (crdTransf3d == 0) {
00218       opserr << "WARNING TclElmtBuilder - addGeomTransf - ran out of memory to create geometric transformation object\n";
00219       return TCL_ERROR;
00220     }
00221     
00222     // add the transformation to the modelBuilder
00223     if (theTclModelBuilder->addCrdTransf3d(*crdTransf3d)) {
00224       opserr << "WARNING TclElmtBuilder - addGeomTransf  - could not add geometric transformation to model Builder\n";
00225       return TCL_ERROR;
00226     }
00227   }
00228   else {
00229     opserr << "WARNING NDM = " << NDM << " and NDF = " << NDF << "is imcompatible with available frame elements\n";
00230     return TCL_ERROR;
00231   }
00232   
00233   //  Tcl_Free ((char *)argv);
00234   
00235   // if get here we have sucessfully created the element and added it to the domain
00236   
00237   return TCL_OK;
00238 }

Generated on Mon Oct 23 15:05:00 2006 for OpenSees by doxygen 1.5.0