00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
00035
00036 void MaterialTimeStep( sMaterial *, double * );
00037 void MaterialDensity ( sMaterial *, double * );
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 typedef struct _mohrnacdata
00049 {
00050 double E;
00051 double Nu;
00052 double C;
00053 double Phi;
00054 double Psi;
00055 } sMohrNACData;
00056
00057 #ifndef PI
00058 #define PI 3.141592654
00059 #endif
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
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
00084
00085
00086
00087
00088 static void MohrCoulombNACNew( int label, sMaterial **mat )
00089 {
00090 sMohrNACData *data = 0L;
00091
00092
00093
00094 (*mat) = (sMaterial *)calloc(1, sizeof(sMaterial));
00095
00096
00097
00098 data = (sMohrNACData *)calloc(1, sizeof(sMohrNACData));
00099
00100
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
00109
00110 (*mat)->type = MOHR_COULOMB_NAC;
00111 (*mat)->label = label;
00112 (*mat)->Gamma = 0.0;
00113 (*mat)->data = (void *)data;
00114
00115
00116
00117 MatList[label-1] = (*mat);
00118
00119 }
00120
00121
00122
00123
00124
00125
00126
00127 static void MohrCoulombNACFree( sMaterial *mat )
00128 {
00129 sMohrNACData *data = 0L;
00130
00131
00132
00133 data = (sMohrNACData *)mat->data;
00134
00135
00136
00137 free( data );
00138
00139
00140
00141 mat->data = 0L;
00142
00143 }
00144
00145
00146
00147
00148
00149
00150
00151 static void MohrCoulombNACRead( sMaterial *mat )
00152 {
00153 sMohrNACData *data = 0L;
00154 double c, nu, e, phi, psi;
00155
00156
00157
00158 data = (sMohrNACData *)mat->data;
00159
00160
00161
00162 fscanf( nf, "%lf %lf %lf %lf %lf", &e, &nu, &c, &phi, &psi );
00163
00164
00165
00166 data->E = e;
00167 data->Nu = nu;
00168 data->C = c;
00169 data->Phi = phi;
00170 data->Psi = psi;
00171
00172 }
00173
00174
00175
00176
00177 static void MohrCoulombNACEParameter( sMaterial *mat, double *e )
00178 {
00179 sMohrNACData *data = 0L;
00180
00181
00182
00183 data = (sMohrNACData *)mat->data;
00184
00185
00186
00187 (*e) = data->E;
00188
00189 }
00190
00191
00192
00193
00194
00195 static void MohrCoulombNACNuParameter( sMaterial *mat, double *nu )
00196 {
00197 sMohrNACData *data = 0L;
00198
00199
00200
00201 data = (sMohrNACData *)mat->data;
00202
00203
00204
00205 (*nu) = data->Nu;
00206
00207 }
00208
00209
00210
00211
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
00220
00221 for( i = 0; i < 6; i++ )
00222 for( j = 0; j < 6; j++ )
00223 cm[i][j] = 0.0;
00224
00225
00226
00227 data = (sMohrNACData *)mat->data;
00228
00229
00230
00231 e = data->E;
00232 nu = data->Nu;
00233
00234
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 }
00259
00260
00261
00262
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
00276
00277 data = (sMohrNACData *)mat->data;
00278
00279
00280
00281 MohrCoulombNACCMatrix( mat, cm );
00282
00283
00284
00285 MohrCoulombNACNuParameter( mat, &ni );
00286
00287
00288
00289 c = data->C;
00290 phi = data->Phi;
00291 psi = data->Psi;
00292
00293
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
00302
00303 phi *= PI / 180.0;
00304 phi = (1.0 + sin(phi)) / (1.0 - sin(phi));
00305
00306
00307
00308 (*yield) = pf = sig1 - (sig3 * phi) + (2.0 * c * sqrt(phi));
00309
00310
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 }
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343 void MohrCoulombNACInit( void );
00344 void MohrCoulombNACInit( void )
00345 {
00346
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 }
00361
00362
00363
00364