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
00026 #include "load.h"
00027 #include "elm.h"
00028 #include "material.h"
00029 #include "node.h"
00030 #include "rio.h"
00031
00032
00033
00034
00035 void MaterialTimeStep( sMaterial *, double * );
00036 void MaterialDensity ( sMaterial *, double * );
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 typedef struct _isodata
00048 {
00049 double E;
00050 double Et;
00051 double Nu;
00052 double C;
00053 double Phi;
00054 double Rf;
00055 double N;
00056 double Pa;
00057 double Kh;
00058 } sHiperData;
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 static void HiperbolicNew ( int, sMaterial ** );
00072 static void HiperbolicFree ( sMaterial * );
00073 static void HiperbolicRead ( sMaterial * );
00074 static void HiperbolicEParameter ( sMaterial *, double * );
00075 static void HiperbolicNuParameter( sMaterial *, double * );
00076 static void HiperbolicCMatrix ( sMaterial *, double [6][6] );
00077
00078
00079
00080
00081
00082
00083
00084
00085 static void HiperbolicNew( int label, sMaterial **mat )
00086 {
00087 sHiperData *data = 0L;
00088
00089
00090
00091 (*mat) = (sMaterial *)calloc(1, sizeof(sMaterial));
00092
00093
00094
00095 data = (sHiperData *)calloc(1, sizeof(sHiperData));
00096
00097
00098
00099 data->E = 0.0;
00100 data->Et = 0.0;
00101 data->Nu = 0.0;
00102 data->C = 0.0;
00103 data->Phi = 0.0;
00104 data->Rf = 0.0;
00105 data->N = 0.0;
00106 data->Pa = 0.0;
00107 data->Kh = 0.0;
00108
00109
00110
00111 (*mat)->type = HIPERBOLIC;
00112 (*mat)->label = label;
00113 (*mat)->Gamma = 0.0;
00114 (*mat)->data = (void *)data;
00115
00116
00117
00118 MatList[label-1] = (*mat);
00119
00120 }
00121
00122
00123
00124
00125
00126
00127 static void HiperbolicFree( sMaterial *mat )
00128 {
00129 sHiperData *data = 0L;
00130
00131
00132
00133 data = (sHiperData *)mat->data;
00134
00135
00136
00137 free( data );
00138
00139
00140
00141 mat->data = 0L;
00142
00143 }
00144
00145
00146
00147
00148
00149
00150 static void HiperbolicRead( sMaterial *mat )
00151 {
00152 sHiperData *data = 0L;
00153 double e, nu, c, phi;
00154 double rf, n, pa, kh;
00155
00156
00157
00158 data = (sHiperData *)mat->data;
00159
00160
00161
00162 fscanf( nf, "%lf %lf %lf %lf", &e, &nu, &c, &phi );
00163 fscanf( nf, "%lf %lf %lf %lf", &rf, &n, &pa, &kh );
00164
00165
00166
00167 data->E = e;
00168 data->Nu = nu;
00169 data->C = c;
00170 data->Phi = phi;
00171 data->Rf = rf;
00172 data->N = n;
00173 data->Pa = pa;
00174 data->Kh = kh;
00175
00176 }
00177
00178
00179
00180
00181
00182 static void HiperbolicEParameter( sMaterial *mat, double *e )
00183 {
00184 sHiperData *data = 0L;
00185
00186
00187
00188 data = (sHiperData *)mat->data;
00189
00190
00191
00192 (*e) = data->Et;
00193
00194 }
00195
00196
00197
00198
00199
00200 static void HiperbolicNuParameter( sMaterial *mat, double *nu )
00201 {
00202 sHiperData *data = 0L;
00203
00204
00205
00206 data = (sHiperData *)mat->data;
00207
00208
00209
00210 (*nu) = data->Nu;
00211
00212 }
00213
00214
00215
00216
00217
00218 static void HiperbolicCMatrix( sMaterial *mat, double cm[6][6] )
00219 {
00220 int i, j;
00221 sHiperData *data = 0L;
00222 double e, nu;
00223
00224
00225
00226 for( i = 0; i < 6; i++ )
00227 for( j = 0; j < 6; j++ )
00228 cm[i][j] = 0.0;
00229
00230
00231
00232 data = (sHiperData *)mat->data;
00233
00234
00235
00236 e = data->Et;
00237 nu = data->Nu;
00238
00239
00240
00241 if( NDof == 3 )
00242 {
00243 cm[0][0] =
00244 cm[1][1] =
00245 cm[2][2] = e*(nu*nu-1.0) / (nu*(nu+nu*nu)+nu*(nu*nu+nu)+nu*nu-1.0);
00246 cm[1][0] =
00247 cm[2][0] =
00248 cm[0][1] =
00249 cm[2][1] =
00250 cm[0][2] =
00251 cm[1][2] = -e*(nu*nu+nu) / (nu*(nu+nu*nu)+nu*(nu*nu+nu)+nu*nu-1.0);
00252 cm[3][3] =
00253 cm[4][4] =
00254 cm[5][5] = (e * e) / (e + e * (1.0 + 2.0 * nu));
00255 }
00256 else
00257 {
00258 cm[0][0] = cm[1][1] = (e * (1.0 - nu)) / ((1.0 + nu) * (1.0 - (2.0 * nu)));
00259 cm[0][1] = cm[1][0] = (e * nu) / ((1.0 + nu) * (1.0 - (2.0 * nu)));
00260 cm[2][2] = e / (2.0 * (1.0 + nu));
00261 }
00262
00263 }
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274 void HiperbolicInit( void );
00275 void HiperbolicInit( void )
00276 {
00277
00278
00279 MatClass[HIPERBOLIC].new = HiperbolicNew;
00280 MatClass[HIPERBOLIC].free = HiperbolicFree;
00281 MatClass[HIPERBOLIC].read = HiperbolicRead;
00282 MatClass[HIPERBOLIC].epar = HiperbolicEParameter;
00283 MatClass[HIPERBOLIC].nupar = HiperbolicNuParameter;
00284 MatClass[HIPERBOLIC].cmatrix = HiperbolicCMatrix;
00285 MatClass[HIPERBOLIC].updatestr = 0L;
00286 MatClass[HIPERBOLIC].updatepar = 0L;
00287 MatClass[HIPERBOLIC].timestep = MaterialTimeStep;
00288 MatClass[HIPERBOLIC].density = MaterialDensity;
00289 MatClass[HIPERBOLIC].vstrain = 0L;
00290
00291 }
00292
00293
00294
00295