00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <tcl.h>
00025 #include <stdlib.h>
00026 #include <string.h>
00027 #include <iOPS_Stream.h>
00028 #include <ErrorHandler.h>
00029
00030
00031 #include <DP_YS.h>
00032 #include <DP_PS.h>
00033 #include <CAM_YS.h>
00034 #include <CAM_PS.h>
00035 #include <VM_YS.h>
00036 #include <VM_PS.h>
00037 #include <MD_YS.h>
00038 #include <MD_PS.h>
00039
00040
00041 #include <EL_S.h>
00042 #include <EL_LEp.h>
00043 #include <EL_LEeq.h>
00044 #include <EL_NLEeq.h>
00045
00046
00047 #include <EL_T.h>
00048 #include <EL_LEij.h>
00049 #include <EL_NLEij.h>
00050
00051
00052 #include <EPState.h>
00053
00054
00055 #include <Template3Dep.h>
00056
00057
00058 YieldSurface *
00059 TclYieldSurfaceCommand(ClientData clientData, Tcl_Interp *interp,
00060 int argc, char **argv);
00061
00062 PotentialSurface *
00063 TclPotentialSurfaceCommand(ClientData clientData, Tcl_Interp *interp,
00064 int argc, char **argv);
00065
00066 EPState *
00067 TclEPStateCommand(ClientData clientData, Tcl_Interp *interp,
00068 int argc, char **argv);
00069
00070
00071 EvolutionLaw_S *
00072 TclEvolutionLawSCommand(ClientData clientData, Tcl_Interp *interp,
00073 int argc, char **argv);
00074
00075 EvolutionLaw_T *
00076 TclEvolutionLawTCommand(ClientData clientData, Tcl_Interp *interp,
00077 int argc, char **argv);
00078
00079 NDMaterial *
00080 TcladdTemplate3Dep(ClientData clientData, Tcl_Interp *interp, int argc,
00081 char **argv, Domain*theTclDomain, int startArg)
00082 {
00083 int tag;
00084 YieldSurface *YS =0;
00085 PotentialSurface *PS =0;
00086 EPState *EPS =0;
00087 EvolutionLaw_S *ELS1 =0;
00088 EvolutionLaw_S *ELS2 =0;
00089 EvolutionLaw_S *ELS3 =0;
00090 EvolutionLaw_S *ELS4 =0;
00091 EvolutionLaw_T *ELT1 =0;
00092 EvolutionLaw_T *ELT2 =0;
00093 EvolutionLaw_T *ELT3 =0;
00094 EvolutionLaw_T *ELT4 =0;
00095
00096
00097 if (Tcl_GetInt(interp, argv[startArg+1], &tag) != TCL_OK) {
00098 g3ErrorHandler->warning("invalid tag: %s for Template3Dep material",
00099 argv[startArg+1]);
00100 return 0;
00101 }
00102
00103 int endMarker = startArg+2;
00104 while (endMarker < argc) {
00105
00106 int numListArgs =0;
00107 char **listArgs =0;
00108
00109
00110 if ((strcmp(argv[endMarker],"-ys") == 0) ||
00111 (strcmp(argv[endMarker],"-YS") == 0)) {
00112
00113 endMarker++;
00114
00115 if (Tcl_SplitList(interp, argv[endMarker],
00116 &numListArgs, &listArgs) != TCL_OK) {
00117
00118 g3ErrorHandler->warning("problem splitting list: %s %s %d",
00119 argv[endMarker],
00120 "for Template3Dep material", tag);
00121 return 0;
00122 }
00123
00124 YS = TclYieldSurfaceCommand(clientData, interp, numListArgs, listArgs);
00125 if (YS == 0) {
00126 g3ErrorHandler->warning("problem splitting list: %s %s %d",
00127 argv[endMarker],
00128 "for Template3Dep material", tag);
00129 return 0;
00130 }
00131 endMarker++;
00132 }
00133
00134
00135 if ((strcmp(argv[endMarker],"-ps") == 0) ||
00136 (strcmp(argv[endMarker],"-PS") == 0)) {
00137
00138 endMarker++;
00139
00140 if (Tcl_SplitList(interp, argv[endMarker],
00141 &numListArgs, &listArgs) != TCL_OK) {
00142
00143 g3ErrorHandler->warning("problem splitting list: %s %s %d",
00144 argv[endMarker],
00145 "for Template3Dep material", tag);
00146 return 0;
00147 }
00148
00149 PS = TclPotentialSurfaceCommand(clientData, interp, numListArgs, listArgs);
00150 if (PS == 0) {
00151 g3ErrorHandler->warning("problem splitting list: %s %s %d",
00152 argv[endMarker],
00153 "for Template3Dep material", tag);
00154 return 0;
00155 }
00156 endMarker++;
00157 }
00158
00159
00160
00161 if ((strcmp(argv[endMarker],"-eps") == 0) ||
00162 (strcmp(argv[endMarker],"-EPS") == 0)) {
00163
00164 endMarker++;
00165
00166 if (Tcl_SplitList(interp, argv[endMarker],
00167 &numListArgs, &listArgs) != TCL_OK) {
00168
00169 g3ErrorHandler->warning("problem splitting list: %s %s %d",
00170 argv[endMarker],
00171 "for Template3Dep material", tag);
00172 return 0;
00173 }
00174
00175 EPS = TclEPStateCommand(clientData, interp, numListArgs, listArgs);
00176 if (PS == 0) {
00177 g3ErrorHandler->warning("problem splitting list: %s %s %d",
00178 argv[endMarker],
00179 "for Template3Dep material", tag);
00180 return 0;
00181 }
00182 endMarker++;
00183 }
00184
00185
00186 else {
00187 endMarker++;
00188 }
00189
00190 if (listArgs != 0) {
00191 Tcl_Free((char *) listArgs);
00192 }
00193 }
00194
00195 NDMaterial *theMaterial = new Template3Dep(tag,
00196 YS,
00197 PS,
00198 EPS,
00199 ELS1,
00200 ELS2,
00201 ELS3,
00202 ELS4,
00203 ELT1,
00204 ELT2,
00205 ELT3,
00206 ELT4);
00207
00208 return theMaterial;
00209 }
00210
00211
00212
00213 YieldSurface *
00214 TclYieldSurfaceCommand(ClientData clientData, Tcl_Interp *interp,
00215 int argc, char **argv)
00216 {
00217
00218 if ((strcmp(argv[0],"DruckerPrager") == 0) ||
00219 (strcmp(argv[0],"DP") == 0)) {
00220
00221 return new DPYieldSurface();
00222 }
00223
00224
00225 else if ((strcmp(argv[0],"CamClay") == 0) ||
00226 (strcmp(argv[0],"Cam") == 0)) {
00227
00228 double mp = 0.0;
00229 if (argc == 2) {
00230 if (Tcl_GetDouble(interp, argv[1], &mp) != TCL_OK) {
00231 g3ErrorHandler->warning("invalid M: %s for -PS CamClay M",
00232 argv[1]);
00233 return 0;
00234 }
00235 }
00236
00237
00238 return new CAMYieldSurface(mp);
00239 }
00240
00241
00242 else if ((strcmp(argv[0],"VonMises") == 0) ||
00243 (strcmp(argv[0],"VM") == 0)) {
00244
00245 return new VMYieldSurface();
00246
00247 }
00248
00249 else {
00250 g3ErrorHandler->warning("unkown Yield Surface type: %s\n",
00251 argv[0]);
00252 return 0;
00253 }
00254 }
00255
00256
00257
00258 PotentialSurface *
00259 TclPotentialSurfaceCommand(ClientData clientData, Tcl_Interp *interp,
00260 int argc, char **argv)
00261
00262 {
00263
00264 if ((strcmp(argv[0],"DruckerPrager") == 0) ||
00265 (strcmp(argv[0],"DP") == 0)) {
00266
00267 double a2d = 0.0;
00268 if (argc == 2) {
00269 if (Tcl_GetDouble(interp, argv[1], &a2d) != TCL_OK) {
00270 g3ErrorHandler->warning("invalid a2d: %s for -PS DruckerPrage a2d",
00271 argv[1]);
00272 return 0;
00273 }
00274 }
00275
00276
00277 return new DPPotentialSurface(a2d);
00278 }
00279
00280
00281 else if ((strcmp(argv[0],"CamClay") == 0) ||
00282 (strcmp(argv[0],"Cam") == 0)) {
00283
00284 double mp = 0.0;
00285 if (argc == 2) {
00286 if (Tcl_GetDouble(interp, argv[1], &mp) != TCL_OK) {
00287 g3ErrorHandler->warning("invalid M: %s for -PS CamClay M",
00288 argv[1]);
00289 return 0;
00290 }
00291 }
00292
00293
00294 return new CAMPotentialSurface(mp);
00295 }
00296
00297
00298 else if ((strcmp(argv[0],"VonMises") == 0) ||
00299 (strcmp(argv[0],"VM") == 0)) {
00300
00301 return new VMPotentialSurface();
00302
00303 }
00304
00305
00306 else {
00307 g3ErrorHandler->warning("unkown Potential Surface type: %s\n",
00308 argv[0]);
00309 return 0;
00310 }
00311 }
00312
00313
00314 EPState *
00315 TclEPStateCommand(ClientData clientData, Tcl_Interp *interp,
00316 int argc, char **argv)
00317 {
00318 double Eod;
00319 double Ed;
00320 double nu;
00321 double rho;
00322 stresstensor stressp;
00323 straintensor strainp;
00324 straintensor Estrainp;
00325 straintensor Pstrainp;
00326 straintensor dEstrainp;
00327 straintensor dPstrainp;
00328 int NScalarp;
00329 double Scalarp;
00330 int NTensorp;
00331 stresstensor Tensorp;
00332 tensor Eepp;
00333 stresstensor Stress_commitp;
00334 straintensor Strain_commitp;
00335 double Scalar_commitp;
00336 stresstensor Tensor_commitp;
00337 tensor Eep_commitp;
00338 stresstensor Stress_initp;
00339 straintensor Strain_initp;
00340 double Scalar_initp;
00341 stresstensor Tensor_initp;
00342 tensor Eep_initp;
00343 bool Convergedp;
00344
00345 return 0;
00346 }
00347
00348 EvolutionLaw_S *
00349 TclEvolutionLawSCommand(ClientData clientData, Tcl_Interp *interp,
00350 int argc, char **argv)
00351 {
00352 return 0;
00353 }
00354
00355 EvolutionLaw_T *
00356 TclEvolutionLawTCommand(ClientData clientData, Tcl_Interp *interp,
00357 int argc, char **argv)
00358 {
00359 return 0;
00360 }
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371