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