00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include <OPS_Globals.h>
00037 #include <FedeasMaterial.h>
00038 #include <Vector.h>
00039 #include <ID.h>
00040 #include <Channel.h>
00041 #include <string.h>
00042 #include <stdlib.h>
00043 #include <math.h>
00044 #include <float.h>
00045
00046 FedeasMaterial::FedeasMaterial(int tag, int classTag, int nhv, int ndata)
00047 :UniaxialMaterial(tag,classTag),
00048 data(0), hstv(0), numData(ndata), numHstv(nhv),
00049 epsilonP(0.0), sigmaP(0.0), tangentP(0),
00050 epsilon(0.0), sigma(0.0), tangent(0)
00051 {
00052 if (numHstv < 0)
00053 numHstv = 0;
00054
00055 if (numHstv > 0) {
00056
00057 hstv = new double[2*numHstv];
00058 if (hstv == 0) {
00059 opserr << "FedeasMaterial::FedeasMaterial -- failed to allocate history array -- type " <<
00060 this->getClassTag() << endln;
00061 exit(-1);
00062 }
00063
00064
00065 for (int i = 0; i < 2*numHstv; i++)
00066 hstv[i] = 0.0;
00067 }
00068
00069 if (numData < 0)
00070 numData = 0;
00071
00072 if (numData > 0) {
00073
00074 data = new double[numData];
00075 if (data == 0) {
00076 opserr << "FedeasMaterial::FedeasMaterial -- failed to allocate data array -- type : " <<
00077 this->getClassTag() << endln;
00078 exit(-1);
00079 }
00080
00081
00082 for (int i = 0; i < numData; i++)
00083 data[i] = 0.0;
00084 }
00085 }
00086
00087 FedeasMaterial::~FedeasMaterial()
00088 {
00089 if (hstv != 0)
00090 delete [] hstv;
00091
00092 if (data != 0)
00093 delete [] data;
00094 }
00095
00096 int
00097 FedeasMaterial::setTrialStrain(double strain, double strainRate)
00098 {
00099
00100 if (fabs(strain-epsilon) > DBL_EPSILON) {
00101
00102 epsilon = strain;
00103
00104
00105 int ist = 1;
00106
00107
00108 return this->invokeSubroutine(ist);
00109 }
00110 return 0;
00111 }
00112
00113 int
00114 FedeasMaterial::setTrial(double strain, double &stress, double &stiff, double strainRate)
00115 {
00116 int res = 0;
00117 if (fabs(strain-epsilon) > DBL_EPSILON) {
00118
00119
00120 epsilon = strain;
00121
00122
00123 int ist = 1;
00124
00125
00126 res = this->invokeSubroutine(ist);
00127 }
00128
00129 stress = sigma;
00130 stiff = tangent;
00131
00132 return res;
00133 }
00134
00135 double
00136 FedeasMaterial::getStrain(void)
00137 {
00138 return epsilon;
00139 }
00140
00141 double
00142 FedeasMaterial::getStress(void)
00143 {
00144 return sigma;
00145 }
00146
00147 double
00148 FedeasMaterial::getTangent(void)
00149 {
00150 return tangent;
00151 }
00152
00153 int
00154 FedeasMaterial::commitState(void)
00155 {
00156
00157 for (int i = 0; i < numHstv; i++)
00158 hstv[i] = hstv[i+numHstv];
00159
00160 epsilonP = epsilon;
00161 sigmaP = sigma;
00162 tangentP = tangent;
00163
00164 return 0;
00165 }
00166
00167 int
00168 FedeasMaterial::revertToLastCommit(void)
00169 {
00170
00171 for (int i = 0; i < numHstv; i++)
00172 hstv[i+numHstv] = hstv[i];
00173
00174 epsilon = epsilonP;
00175 sigma = sigmaP;
00176 tangent = tangentP;
00177
00178 return 0;
00179 }
00180
00181 int
00182 FedeasMaterial::revertToStart(void)
00183 {
00184
00185 for (int i = 0; i < 2*numHstv; i++)
00186 hstv[i] = 0.0;
00187
00188 epsilonP = 0.0;
00189 sigmaP = 0.0;
00190 tangentP = this->getInitialTangent();
00191
00192 epsilon = 0.0;
00193 sigma = 0.0;
00194 tangent = tangentP;
00195
00196 return 0;
00197 }
00198
00199 int
00200 FedeasMaterial::sendSelf(int commitTag, Channel &theChannel)
00201 {
00202 int res = 0;
00203
00204 Vector vecData(numHstv+numData+4);
00205
00206 int i, j;
00207
00208 for (i = 0; i < numHstv; i++)
00209 vecData(i) = hstv[i];
00210
00211
00212 for (i = 0, j = numHstv; i < numData; i++, j++)
00213 vecData(j) = data[i];
00214
00215 vecData(j++) = epsilonP;
00216 vecData(j++) = sigmaP;
00217 vecData(j++) = tangentP;
00218 vecData(j++) = this->getTag();
00219
00220 res += theChannel.sendVector(this->getDbTag(), commitTag, vecData);
00221 if (res < 0)
00222 opserr << "FedeasMaterial::sendSelf() - failed to send Vector data\n";
00223
00224 return res;
00225 }
00226
00227 int
00228 FedeasMaterial::recvSelf(int commitTag, Channel &theChannel,
00229 FEM_ObjectBroker &theBroker)
00230 {
00231 int res = 0;
00232
00233 Vector vecData(numHstv+numData+4);
00234
00235 res += theChannel.recvVector(this->getDbTag(), commitTag, vecData);
00236 if (res < 0) {
00237 opserr << "FedeasMaterial::recvSelf() - failed to receive Vector data\n";
00238 return res;
00239 }
00240
00241 int i, j;
00242
00243 for (i = 0; i < numHstv; i++)
00244 hstv[i] = vecData(i);
00245
00246
00247 for (i = 0, j = numHstv; i < numData; i++, j++)
00248 data[i] = vecData(j);
00249
00250 epsilonP = vecData(j++);
00251 sigmaP = vecData(j++);
00252 tangentP = vecData(j++);
00253 this->setTag((int)vecData(j++));
00254
00255 tangent = tangentP;
00256 sigma = sigmaP;
00257 epsilon = epsilonP;
00258
00259 return res;
00260 }
00261
00262 void
00263 FedeasMaterial::Print(OPS_Stream &s, int flag)
00264 {
00265 s << "FedeasMaterial, type: ";
00266
00267 switch (this->getClassTag()) {
00268 case MAT_TAG_FedeasHardening:
00269 s << "Hardening" << endln;
00270 break;
00271 case MAT_TAG_FedeasBond1:
00272 s << "Bond1" << endln;
00273 break;
00274 case MAT_TAG_FedeasBond2:
00275 s << "Bond2" << endln;
00276 break;
00277 case MAT_TAG_FedeasConcrete1:
00278 s << "Concrete1" << endln;
00279 break;
00280 case MAT_TAG_FedeasConcrete2:
00281 s << "Concrete2" << endln;
00282 break;
00283 case MAT_TAG_FedeasConcrete3:
00284 s << "Concrete3" << endln;
00285 break;
00286 case MAT_TAG_FedeasHysteretic1:
00287 s << "Hysteretic1" << endln;
00288 break;
00289 case MAT_TAG_FedeasHysteretic2:
00290 s << "Hysteretic2" << endln;
00291 break;
00292 case MAT_TAG_FedeasSteel1:
00293 s << "Steel1" << endln;
00294 break;
00295 case MAT_TAG_FedeasSteel2:
00296 s << "Steel2" << endln;
00297 break;
00298
00299
00300 default:
00301 s << "Material identifier = " << this->getClassTag() << endln;
00302 break;
00303 }
00304 }
00305
00306
00307 #ifdef _pgCC
00308 #define hard_1__ hard1_1_
00309 #endif
00310
00311
00312
00313 #ifdef _WIN32
00314
00315 extern "C" int BOND_1(double *matpar, double *hstvP, double *hstv,
00316 double *strainP, double *stressP, double *dStrain,
00317 double *tangent, double *stress, int *ist);
00318
00319 extern "C" int BOND_2(double *matpar, double *hstvP, double *hstv,
00320 double *strainP, double *stressP, double *dStrain,
00321 double *tangent, double *stress, int *ist);
00322
00323 extern "C" int CONCRETE_1(double *matpar, double *hstvP, double *hstv,
00324 double *strainP, double *stressP, double *dStrain,
00325 double *tangent, double *stress, int *ist);
00326
00327 extern "C" int CONCRETE_2(double *matpar, double *hstvP, double *hstv,
00328 double *strainP, double *stressP, double *dStrain,
00329 double *tangent, double *stress, int *ist);
00330
00331 extern "C" int CONCRETE_3(double *matpar, double *hstvP, double *hstv,
00332 double *strainP, double *stressP, double *dStrain,
00333 double *tangent, double *stress, int *ist);
00334
00335 extern "C" int HARD_1(double *matpar, double *hstvP, double *hstv,
00336 double *strainP, double *stressP, double *dStrain,
00337 double *tangent, double *stress, int *ist);
00338
00339 extern "C" int HYSTER_1(double *matpar, double *hstvP, double *hstv,
00340 double *strainP, double *stressP, double *dStrain,
00341 double *tangent, double *stress, int *ist);
00342
00343 extern "C" int HYSTER_2(double *matpar, double *hstvP, double *hstv,
00344 double *strainP, double *stressP, double *dStrain,
00345 double *tangent, double *stress, int *ist);
00346
00347 extern "C" int STEEL_1(double *matpar, double *hstvP, double *hstv,
00348 double *strainP, double *stressP, double *dStrain,
00349 double *tangent, double *stress, int *ist);
00350
00351 extern "C" int STEEL_2(double *matpar, double *hstvP, double *hstv,
00352 double *strainP, double *stressP, double *dStrain,
00353 double *tangent, double *stress, int *ist);
00354
00355
00356
00357 #define bond_1__ BOND_1
00358 #define bond_2__ BOND_2
00359 #define concrete_1__ CONCRETE_1
00360 #define concrete_2__ CONCRETE_2
00361 #define concrete_3__ CONCRETE_3
00362 #define hard_1__ HARD_1
00363 #define hyster_1__ HYSTER_1
00364 #define hyster_2__ HYSTER_2
00365 #define steel_1__ STEEL_1
00366 #define steel_2__ STEEL_2
00367
00368 #else
00369
00370 extern "C" int bond_1__(double *matpar, double *hstvP, double *hstv,
00371 double *strainP, double *stressP, double *dStrain,
00372 double *tangent, double *stress, int *ist);
00373
00374 extern "C" int bond_2__(double *matpar, double *hstvP, double *hstv,
00375 double *strainP, double *stressP, double *dStrain,
00376 double *tangent, double *stress, int *ist);
00377
00378 extern "C" int concrete_1__(double *matpar, double *hstvP, double *hstv,
00379 double *strainP, double *stressP, double *dStrain,
00380 double *tangent, double *stress, int *ist);
00381
00382 extern "C" int concrete_2__(double *matpar, double *hstvP, double *hstv,
00383 double *strainP, double *stressP, double *dStrain,
00384 double *tangent, double *stress, int *ist);
00385
00386 extern "C" int concrete_3__(double *matpar, double *hstvP, double *hstv,
00387 double *strainP, double *stressP, double *dStrain,
00388 double *tangent, double *stress, int *ist);
00389
00390 extern "C" int hard_1__(double *matpar, double *hstvP, double *hstv,
00391 double *strainP, double *stressP, double *dStrain,
00392 double *tangent, double *stress, int *ist);
00393
00394 extern "C" int hyster_1__(double *matpar, double *hstvP, double *hstv,
00395 double *strainP, double *stressP, double *dStrain,
00396 double *tangent, double *stress, int *ist);
00397
00398 extern "C" int hyster_2__(double *matpar, double *hstvP, double *hstv,
00399 double *strainP, double *stressP, double *dStrain,
00400 double *tangent, double *stress, int *ist);
00401
00402 extern "C" int steel_1__(double *matpar, double *hstvP, double *hstv,
00403 double *strainP, double *stressP, double *dStrain,
00404 double *tangent, double *stress, int *ist);
00405
00406 extern "C" int steel_2__(double *matpar, double *hstvP, double *hstv,
00407 double *strainP, double *stressP, double *dStrain,
00408 double *tangent, double *stress, int *ist);
00409
00410
00411
00412 #endif
00413
00414
00415 int
00416 FedeasMaterial::invokeSubroutine(int ist)
00417 {
00418
00419 double dEpsilon = epsilon-epsilonP;
00420
00421 switch (this->getClassTag()) {
00422 #ifdef _WIN32
00423 case MAT_TAG_FedeasHardening:
00424 hard_1__(data, hstv, &hstv[numHstv], &epsilonP, &sigmaP, &dEpsilon,
00425 &sigma, &tangent, &ist);
00426 #else
00427 opserr << "FedeasMaterial::invokeSubroutine -- Hard1 subroutine not yet linked\n";
00428 #endif
00429 break;
00430
00431 case MAT_TAG_FedeasBond1:
00432 #ifdef _WIN32
00433 bond_1__(data, hstv, &hstv[numHstv], &epsilonP, &sigmaP, &dEpsilon,
00434 &sigma, &tangent, &ist);
00435 #else
00436 opserr << "FedeasMaterial::invokeSubroutine -- Bond1 subroutine not yet linked\n";
00437 #endif
00438 break;
00439
00440 case MAT_TAG_FedeasBond2:
00441 #ifdef _WIN32
00442 bond_2__(data, hstv, &hstv[numHstv], &epsilonP, &sigmaP, &dEpsilon,
00443 &sigma, &tangent, &ist);
00444 #else
00445 opserr << "FedeasMaterial::invokeSubroutine -- Bond2 subroutine not yet linked\n";
00446 #endif
00447 break;
00448
00449 case MAT_TAG_FedeasConcrete1:
00450 #ifdef _WIN32
00451 concrete_1__(data, hstv, &hstv[numHstv], &epsilonP, &sigmaP, &dEpsilon,
00452 &sigma, &tangent, &ist);
00453 #else
00454 opserr << "FedeasMaterial::invokeSubroutine -- Concrete1 subroutine not yet linked\n";
00455 #endif
00456 break;
00457
00458 case MAT_TAG_FedeasConcrete2:
00459 #ifdef _WIN32
00460 concrete_2__(data, hstv, &hstv[numHstv], &epsilonP, &sigmaP, &dEpsilon,
00461 &sigma, &tangent, &ist);
00462 #elif _CONCR2
00463 concrete_2__(data, hstv, &hstv[numHstv], &epsilonP, &sigmaP, &dEpsilon,
00464 &sigma, &tangent, &ist);
00465 #else
00466 opserr << "FedeasMaterial::invokeSubroutine -- Concrete2 subroutine not yet linked\n";
00467 #endif
00468 break;
00469
00470 case MAT_TAG_FedeasConcrete3:
00471 #ifdef _WIN32
00472 concrete_3__(data, hstv, &hstv[numHstv], &epsilonP, &sigmaP, &dEpsilon,
00473 &sigma, &tangent, &ist);
00474 #else
00475 opserr << "FedeasMaterial::invokeSubroutine -- Concrete3 subroutine not yet linked\n";
00476 #endif
00477 break;
00478
00479 case MAT_TAG_FedeasHysteretic1:
00480 #ifdef _WIN32
00481 hyster_1__(data, hstv, &hstv[numHstv], &epsilonP, &sigmaP, &dEpsilon,
00482 &sigma, &tangent, &ist);
00483 #else
00484 opserr << "FedeasMaterial::invokeSubroutine -- Hysteretic1 subroutine not yet linked\n";
00485 #endif
00486 break;
00487
00488 case MAT_TAG_FedeasHysteretic2:
00489 #ifdef _WIN32
00490 hyster_2__(data, hstv, &hstv[numHstv], &epsilonP, &sigmaP, &dEpsilon,
00491 &sigma, &tangent, &ist);
00492 #else
00493 opserr << "FedeasMaterial::invokeSubroutine -- Hysteretic2 subroutine not yet linked\n";
00494 #endif
00495 break;
00496
00497 case MAT_TAG_FedeasSteel1:
00498 #ifdef _WIN32
00499 steel_1__(data, hstv, &hstv[numHstv], &epsilonP, &sigmaP, &dEpsilon,
00500 &sigma, &tangent, &ist);
00501 #else
00502 opserr << "FedeasMaterial::invokeSubroutine -- Steel1 subroutine not yet linked\n";
00503 #endif
00504 break;
00505
00506 case MAT_TAG_FedeasSteel2:
00507 #ifdef _WIN32
00508 steel_2__(data, hstv, &hstv[numHstv], &epsilonP, &sigmaP, &dEpsilon,
00509 &sigma, &tangent, &ist);
00510 #elif _STEEL2
00511 steel_2__(data, hstv, &hstv[numHstv], &epsilonP, &sigmaP, &dEpsilon,
00512 &sigma, &tangent, &ist);
00513 #else
00514 opserr << "FedeasMaterial::invokeSubroutine -- Steel2 subroutine not yet linked\n";
00515 #endif
00516 break;
00517
00518
00519 default:
00520 opserr << "FedeasMaterial::invokeSubroutine -- unknown material type\n";
00521 return -1;
00522 }
00523
00524 return 0;
00525 }
00526