FedeasMaterial.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.20 $
00022 // $Date: 2006/01/03 23:52:45 $
00023 // $Source: /usr/local/cvs/OpenSees/SRC/material/uniaxial/FedeasMaterial.cpp,v $
00024                                                                         
00025 // Written: MHS
00026 // Created: Jan 2001
00027 //
00028 // Description: This file contains the class definition for 
00029 // FedeasMaterial. FedeasMaterial provides a FORTRAN interface
00030 // for programming uniaxial material models, using the subroutine
00031 // interface from the FEDEAS ML1D library, developed by F.C. Filippou.
00032 //
00033 // For more information visit the FEDEAS web page:
00034 //    http://www.ce.berkeley.edu/~filippou/Research/fedeas.htm
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     // Allocate history array
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     // Initialize to zero
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     // Allocate material parameter array
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     // Initialize to zero
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     // Store the strain
00102     epsilon = strain;
00103     
00104     // Tells subroutine to do normal operations for stress and tangent
00105     int ist = 1;
00106     
00107     // Call the subroutine
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     // Store the strain
00120     epsilon = strain;
00121     
00122     // Tells subroutine to do normal operations for stress and tangent
00123     int ist = 1;
00124     
00125     // Call the subroutine
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   // Set committed values equal to corresponding trial values
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   // Set trial values equal to corresponding committed values
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   // Set all trial and committed values to zero
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   // Copy only the committed history variables into vector
00208   for (i = 0; i < numHstv; i++)
00209     vecData(i) = hstv[i];
00210   
00211   // Copy material properties into vector
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   // Copy committed history variables from vector
00243   for (i = 0; i < numHstv; i++)
00244     hstv[i] = vecData(i);
00245   
00246   // Copy material properties from vector
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     // Add more cases as needed
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 // Add more declarations as needed
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 // Add more declarations as needed
00411 
00412 #endif
00413 
00414 
00415 int
00416 FedeasMaterial::invokeSubroutine(int ist)
00417 {
00418   // Compute strain increment
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     // Add more cases as needed
00519   default:
00520     opserr << "FedeasMaterial::invokeSubroutine -- unknown material type\n";
00521     return -1;
00522   }
00523   
00524   return 0;
00525 }
00526 

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