mohrnac.c

Go to the documentation of this file.
00001 /*
00002 %M This modules contains the MOHR COULOMB NONASSOCIATE CONSTANT material 
00003    sub-class methods and definitions
00004 %a Joao Luiz Elias Campos.
00005 %d September 2nd, 1998.
00006 %r $Id: mohrnac.c,v 1.1 2004/06/22 05:29:59 joaoluiz Exp $
00007 %w (C) COPYRIGHT 1995-1996, Eduardo Nobre Lages.
00008    (C) COPYRIGHT 1997-1999, Joao Luiz Elias Campos.
00009    All Rights Reserved
00010    Duplication of this program or any part thereof without the express
00011    written consent of the author is prohibited.
00012 
00013    Modificacao: 28/04/2005    Alexandre A. Del Savio
00014      Foram substituídas todas as alocações dinâmicas feitas com malloc 
00015      por calloc.
00016 
00017 */
00018 
00019 /*
00020 ** ------------------------------------------------------------------------
00021 ** Global variables and symbols:
00022 */
00023 #include <stdio.h>
00024 #include <stdlib.h>
00025 #include <math.h>
00026 
00027 #include "load.h"
00028 #include "elm.h"
00029 #include "material.h"
00030 #include "node.h"
00031 #include "rio.h"
00032 
00033 
00034 /* Parent methods
00035  */
00036 void MaterialTimeStep( sMaterial *, double * );
00037 void MaterialDensity ( sMaterial *, double * );
00038 
00039 
00040 /*
00041 ** ------------------------------------------------------------------------
00042 ** Local variables and symbols:
00043 */
00044 
00045 /*
00046 %T MOHR COULOMB NONASSOCIATE CONSTANT material data definition
00047 */
00048 typedef struct _mohrnacdata
00049 {
00050  double E;             /* Young modulos       */
00051  double Nu;            /* Poisson coefficient */
00052  double C;             /* Coesion value       */
00053  double Phi;           /* Friction angle      */
00054  double Psi;           /* Dilatation angle    */
00055 } sMohrNACData;
00056 
00057 #ifndef PI
00058 #define PI 3.141592654
00059 #endif
00060 
00061 /*
00062 ** ------------------------------------------------------------------------
00063 ** Local functions:
00064 */
00065 
00066 
00067 /*
00068 ** ------------------------------------------------------------------------
00069 ** Subclass methods:
00070 */
00071 static void MohrCoulombNACNew         ( int, sMaterial ** );
00072 static void MohrCoulombNACFree        ( sMaterial * );
00073 static void MohrCoulombNACRead        ( sMaterial * );
00074 static void MohrCoulombNACEParameter  ( sMaterial *, double * );
00075 static void MohrCoulombNACNuParameter ( sMaterial *, double * );
00076 static void MohrCoulombNACCMatrix     ( sMaterial *, double [6][6] );
00077 static void MohrCoulombNACUpdateStress( sMaterial *, double, double *,
00078                                                      double *, double *,
00079                                                      double * );
00080 
00081 
00082 /*
00083 %F This method allocates memory for a MOHR COULOMB NONASSOCIATE CONSTANT 
00084    material and fills its data with the specific values.
00085 %i Material label (number)
00086 %o Material descriptor.
00087 */
00088 static void MohrCoulombNACNew( int label, sMaterial **mat )
00089 {
00090  sMohrNACData *data = 0L;
00091 
00092 /* Get memory for the material descriptor
00093  */
00094  (*mat) = (sMaterial *)calloc(1, sizeof(sMaterial));
00095 
00096 /* Get memory for the MOHR COULOMB NONASSOCIATE CONSTANT material data
00097  */
00098  data = (sMohrNACData *)calloc(1, sizeof(sMohrNACData));
00099 
00100 /* Fill MOHR COULOMB NONASSOCIATE CONSTANT material data
00101  */
00102  data->E   = 0.0;
00103  data->Nu  = 0.0;
00104  data->C   = 0.0;
00105  data->Phi = 0.0;
00106  data->Psi = 0.0;
00107 
00108 /* Fill material descriptor
00109  */
00110  (*mat)->type  = MOHR_COULOMB_NAC;
00111  (*mat)->label = label;
00112  (*mat)->Gamma = 0.0;
00113  (*mat)->data  = (void *)data;
00114 
00115 /* Add to the material list
00116  */
00117  MatList[label-1] = (*mat);
00118 
00119 } /* End of MohrCoulombNACNew */
00120 
00121 
00122 /*
00123 %F This method frees the MOHR COULOMB NONASSOCIATE CONSTANT material 
00124    data for a given material.
00125 %i Material descriptor.
00126 */
00127 static void MohrCoulombNACFree( sMaterial *mat )
00128 {
00129  sMohrNACData *data = 0L;
00130 
00131 /* Get MOHR COULOMB NONASSOCIATE CONSTANT material data
00132  */
00133  data = (sMohrNACData *)mat->data;
00134 
00135 /* Release allocated memory
00136  */
00137  free( data );
00138 
00139 /* Reset material data
00140  */
00141  mat->data = 0L;
00142 
00143 } /* End of MohrCoulombNACFree */
00144 
00145 
00146 /*
00147 %F This method reads the MOHR COULOMB NONASSOCIATE CONSTANT material 
00148    information.
00149 %i Material descriptor.
00150 */
00151 static void MohrCoulombNACRead( sMaterial *mat )
00152 {
00153  sMohrNACData *data = 0L;
00154  double        c, nu, e, phi, psi;
00155 
00156 /* Get the material data
00157  */
00158  data = (sMohrNACData *)mat->data;
00159 
00160 /* Read the material parameters
00161  */
00162  fscanf( nf, "%lf %lf %lf %lf %lf", &e, &nu, &c, &phi, &psi );
00163 
00164 /* Fill material information
00165  */
00166  data->E   = e;
00167  data->Nu  = nu;
00168  data->C   = c;
00169  data->Phi = phi;
00170  data->Psi = psi;
00171 
00172 } /* End of MohrCoulombNACRead */
00173 
00174 /*
00175 %F
00176 */
00177 static void MohrCoulombNACEParameter( sMaterial *mat, double *e )
00178 {
00179  sMohrNACData *data = 0L;
00180 
00181 /* Get material descriptor
00182  */
00183  data = (sMohrNACData *)mat->data;
00184 
00185 /* Get Young modules parameters
00186  */
00187  (*e) = data->E;
00188 
00189 } /* End of MohrCoulombNACEParameter */
00190 
00191 
00192 /*
00193 %F 
00194 */ 
00195 static void MohrCoulombNACNuParameter( sMaterial *mat, double *nu )
00196 {
00197  sMohrNACData *data = 0L;
00198 
00199 /* Get material descriptor
00200  */
00201  data = (sMohrNACData *)mat->data;
00202 
00203 /* Get Poisson coefficient parameters
00204  */
00205  (*nu) = data->Nu;
00206 
00207 } /* End of MohrCoulombNACNuParameter */
00208 
00209 
00210 /*
00211 %F This function computes the material constitutive matrix
00212 */
00213 static void MohrCoulombNACCMatrix( sMaterial *mat, double cm[6][6] )
00214 {
00215  int           i, j;
00216  sMohrNACData *data = 0L;
00217  double        e, nu;
00218 
00219 /* Intialize matrix
00220  */
00221  for( i = 0; i < 6; i++ )
00222   for( j = 0; j < 6; j++ )
00223    cm[i][j] = 0.0;
00224 
00225 /* Get material descriptor
00226  */ 
00227  data = (sMohrNACData *)mat->data;
00228 
00229 /* Get element parameters
00230  */
00231  e  = data->E;
00232  nu = data->Nu;
00233 
00234 /* Compute matrix elements
00235  */
00236  if( NDof == 3 )
00237  {
00238   cm[0][0] =
00239   cm[1][1] =
00240   cm[2][2] =  e*(nu*nu-1.0) / (nu*(nu+nu*nu)+nu*(nu*nu+nu)+nu*nu-1.0);
00241   cm[1][0] =
00242   cm[2][0] =
00243   cm[0][1] =
00244   cm[2][1] =
00245   cm[0][2] =
00246   cm[1][2] = -e*(nu*nu+nu) / (nu*(nu+nu*nu)+nu*(nu*nu+nu)+nu*nu-1.0);
00247   cm[3][3] =
00248   cm[4][4] =
00249   cm[5][5] = (e * e) / (e + e * (1.0 + 2.0 * nu));
00250  }
00251  else
00252  {
00253   cm[0][0] = cm[1][1] = (e * (1.0 - nu)) / ((1.0 + nu) * (1.0 - (2.0 * nu)));
00254   cm[0][1] = cm[1][0] = (e * nu) / ((1.0 + nu) * (1.0 - (2.0 * nu)));
00255   cm[2][2] = e / (2.0 * (1.0 + nu));
00256  }
00257 
00258 } /* End of MohrCoulombNACCMatrix */
00259 
00260 
00261 /*
00262 %F
00263 */
00264 static void MohrCoulombNACUpdateStress( sMaterial *mat, double dtime,
00265                                                         double *yield,
00266                                                         double *effdef, 
00267                                                         double *str,
00268                                                         double *def )
00269 {
00270  sMohrNACData *data = 0L;
00271  double        sig1, sig3, sig2;
00272  double        c, phi, psi, pf, mult, aldp, ni;
00273  double        cm[6][6];
00274 
00275 /* Get material data
00276  */
00277  data = (sMohrNACData *)mat->data;
00278 
00279 /* Get material contitutive matrix
00280  */
00281  MohrCoulombNACCMatrix( mat, cm );
00282  
00283 /* Get material poisson coef.
00284  */
00285  MohrCoulombNACNuParameter( mat, &ni );
00286 
00287 /* Get material plastic properties
00288  */ 
00289  c   = data->C;
00290  phi = data->Phi;
00291  psi = data->Psi;
00292 
00293 /* Computes the principal stresses (Sigma 1 and Sigma 3)
00294  */
00295  sig1 = ((str[0] + str[1]) / 2.0) -
00296         sqrt( (str[0] - str[1])*(str[0] - str[1])/4.0 + str[2] * str[2] );
00297  sig3 = ((str[0] + str[1]) / 2.0) +
00298         sqrt( (str[0] - str[1])*(str[0] - str[1])/4.0 + str[2] * str[2] );
00299  sig2 = ni * (sig1 + sig3);
00300 
00301 /* Computes the angle
00302  */
00303  phi *= PI / 180.0;
00304  phi  = (1.0 + sin(phi)) / (1.0 - sin(phi));
00305 
00306 /* Compute plastic function
00307  */
00308  (*yield) = pf = sig1 - (sig3 * phi) + (2.0 * c * sqrt(phi));
00309 
00310 /* Correct the stress if necessery
00311  */
00312  if( pf <= 0.0 )
00313  {
00314   if( sig1 == str[0]) aldp = 0.0;
00315   else                aldp = atan2( (sig1 - str[0]), str[2] );
00316 
00317   psi *= PI / 180.0;
00318   psi  = (1.0 + sin(psi)) / (1.0 - sin(psi));
00319 
00320   mult = pf / (-cm[0][0] * (1.0 + (phi*psi)) + (2.0 * psi * cm[0][1]));
00321 
00322   sig1 += mult * (cm[0][0] - (cm[0][1] * psi));
00323   sig3 += mult * (cm[0][1] - (cm[0][0] * psi));
00324   sig2 += mult * cm[0][0] * (1.0 - psi);
00325 
00326   str[0] = ((sig1 + sig3) / 2.0) + ((sig1-sig3) * cos(2.0 * aldp) / 2.0);
00327   str[1] = ((sig1 + sig3) / 2.0) - ((sig1-sig3) * cos(2.0 * aldp) / 2.0);
00328   str[2] = ((sig1 - sig3) * (sin(2.0 * aldp))) / 2.0;
00329   str[3] = sig2;
00330  }
00331 
00332 } /* End of MohrCoulombNACUpdateStress */
00333 
00334 
00335 /*
00336 ** ------------------------------------------------------------------------
00337 ** Public functions:
00338 */
00339 
00340 /*
00341 %F This function initializes the sub-class "MOHR COULOMB NONASSOCIATE CONSTANT".
00342 */
00343 void MohrCoulombNACInit( void );
00344 void MohrCoulombNACInit( void )
00345 {
00346 /* Initialize MOHR COULOMB NONASSOCIATE CONSTANT material sub-class
00347  */
00348  MatClass[MOHR_COULOMB_NAC].new       = MohrCoulombNACNew;
00349  MatClass[MOHR_COULOMB_NAC].free      = MohrCoulombNACFree;
00350  MatClass[MOHR_COULOMB_NAC].read      = MohrCoulombNACRead;
00351  MatClass[MOHR_COULOMB_NAC].epar      = MohrCoulombNACEParameter;
00352  MatClass[MOHR_COULOMB_NAC].nupar     = MohrCoulombNACNuParameter;
00353  MatClass[MOHR_COULOMB_NAC].cmatrix   = MohrCoulombNACCMatrix;
00354  MatClass[MOHR_COULOMB_NAC].updatestr = MohrCoulombNACUpdateStress;
00355  MatClass[MOHR_COULOMB_NAC].updatepar = 0L;
00356  MatClass[MOHR_COULOMB_NAC].timestep  = MaterialTimeStep;
00357  MatClass[MOHR_COULOMB_NAC].density   = MaterialDensity;
00358  MatClass[MOHR_COULOMB_NAC].vstrain   = 0L;
00359 
00360 } /* End of MohrCoulombNACInit */
00361 
00362 
00363 /* =======================================================  End of File  */
00364 

Generated on Tue Oct 23 11:23:29 2007 for Relax by  doxygen 1.5.3