00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include <Block3D.h>
00034
00035
00036
00037 Block3D::Block3D(int numx, int numy, int numz,
00038 const ID& nodeID,
00039 const Matrix& coorArray )
00040 :
00041 coor(3),
00042 element(8)
00043 {
00044 this->nx = numx;
00045 this->ny = numy;
00046 this->nz = numz;
00047
00048 this->setUpXl( nodeID, coorArray );
00049 }
00050
00051
00052
00053 Block3D::~Block3D( )
00054 { }
00055
00056
00057
00058 void Block3D::setUpXl( const ID &nodeID, const Matrix &coorArray )
00059 {
00060
00061 int i, j;
00062
00063 for ( i=0; i<8; i++ ){
00064 if ( nodeID(i) == -1 ) {
00065 opserr << "Warning : in Block3D, block node "
00066 << i
00067 << " is not defined. No Generation will take place."
00068 << endln;
00069 break;
00070 }
00071 }
00072
00073
00074
00075 for ( i=0; i<3; i++ ) {
00076 for (j=0; j<27; j++ )
00077 xl[i][j] = coorArray(j,i);
00078 }
00079
00080
00081 if ( nodeID(8) == -1 ) {
00082 for ( i=0; i<3; i++ )
00083 xl[i][8] = 0.5*( xl[i][0] + xl[i][4] );
00084 }
00085
00086 if ( nodeID(9) == -1 ) {
00087 for ( i=0; i<3; i++ )
00088 xl[i][9] = 0.5*( xl[i][1] + xl[i][5] );
00089 }
00090
00091 if ( nodeID(10) == -1 ) {
00092 for ( i=0; i<3; i++ )
00093 xl[i][10] = 0.5*( xl[i][2] + xl[i][6] );
00094 }
00095
00096 if ( nodeID(11) == -1 ) {
00097 for ( i=0; i<3; i++ )
00098 xl[i][11] = 0.5*( xl[i][3] + xl[i][7] );
00099 }
00100
00101
00102 if ( nodeID(12) == -1 ) {
00103 for ( i=0; i<3; i++ )
00104 xl[i][12] = 0.5*( xl[i][0] + xl[i][1] );
00105 }
00106
00107 if ( nodeID(13) == -1 ) {
00108 for ( i=0; i<3; i++ )
00109 xl[i][13] = 0.5*( xl[i][1] + xl[i][2] );
00110 }
00111
00112 if ( nodeID(14) == -1 ) {
00113 for ( i=0; i<3; i++ )
00114 xl[i][14] = 0.5*( xl[i][2] + xl[i][3] );
00115 }
00116
00117 if ( nodeID(15) == -1 ) {
00118 for ( i=0; i<3; i++ )
00119 xl[i][15] = 0.5*( xl[i][0] + xl[i][3] );
00120 }
00121
00122
00123 if ( nodeID(16) == -1 ) {
00124 for ( i=0; i<3; i++ )
00125 xl[i][16] = 0.25*( xl[i][0] + xl[i][1] + xl[i][2] + xl[i][3] );
00126 }
00127
00128
00129 if ( nodeID(17) == -1 ) {
00130 for ( i=0; i<3; i++ )
00131 xl[i][17] = 0.5*( xl[i][4] + xl[i][5] );
00132 }
00133
00134 if ( nodeID(18) == -1 ) {
00135 for ( i=0; i<3; i++ )
00136 xl[i][18] = 0.5*( xl[i][5] + xl[i][6] );
00137 }
00138
00139 if ( nodeID(19) == -1 ) {
00140 for ( i=0; i<3; i++ )
00141 xl[i][19] = 0.5*( xl[i][6] + xl[i][7] );
00142 }
00143
00144 if ( nodeID(20) == -1 ) {
00145 for ( i=0; i<3; i++ )
00146 xl[i][20] = 0.5*( xl[i][4] + xl[i][7] );
00147 }
00148
00149
00150 if ( nodeID(21) == -1 ) {
00151 for ( i=0; i<3; i++ )
00152 xl[i][21] = 0.25*( xl[i][4] + xl[i][5] + xl[i][6] + xl[i][7] );
00153 }
00154
00155
00156 if ( nodeID(22) == -1 ) {
00157 for ( i=0; i<3; i++ )
00158 xl[i][22] = 0.25*( xl[i][0] + xl[i][1] + xl[i][5] + xl[i][4] );
00159 }
00160
00161 if ( nodeID(23) == -1 ) {
00162 for ( i=0; i<3; i++ )
00163 xl[i][23] = 0.25*( xl[i][1] + xl[i][2] + xl[i][6] + xl[i][5] );
00164 }
00165
00166
00167 if ( nodeID(24) == -1 ) {
00168 for ( i=0; i<3; i++ )
00169 xl[i][24] = 0.25*( xl[i][3] + xl[i][2] + xl[i][6] + xl[i][7] );
00170 }
00171
00172 if ( nodeID(25) == -1 ) {
00173 for ( i=0; i<3; i++ )
00174 xl[i][25] = 0.25*( xl[i][0] + xl[i][3] + xl[i][7] + xl[i][4] );
00175 }
00176
00177
00178
00179 if ( nodeID(26) == -1 ) {
00180 for ( i=0; i<3; i++ )
00181 xl[i][26] = 0.125*( xl[i][0] + xl[i][1] + xl[i][2] + xl[i][3] +
00182 xl[i][4] + xl[i][5] + xl[i][6] + xl[i][7] );
00183 }
00184
00185 return;
00186 }
00187
00188
00189
00190 const Vector&
00191 Block3D::getNodalCoords( int i, int j, int k )
00192 {
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203 double hx = 2.0 / nx;
00204
00205 double hy = 2.0 / ny;
00206
00207 double hhz = 2.0 / nz;
00208
00209 double x = -1.0 + (i*hx);
00210
00211 double y = -1.0 + (j*hy);
00212
00213 double z = -1.0 + (k*hhz);
00214
00215 coor(0) = x;
00216 coor(1) = y;
00217 coor(2) = z;
00218
00219 this->transformNodalCoordinates( );
00220
00221 return coor;
00222 }
00223
00224
00225
00226 const ID&
00227 Block3D::getElementNodes( int i, int j, int k )
00228 {
00229
00230 int nenx = nx + 1;
00231
00232 int neny = ny + 1;
00233
00234 int nInXYplane = nenx * neny;
00235
00236
00237 int node1, node2, node3, node4;
00238 int node5, node6, node7, node8;
00239
00240
00241 node1 = i + (j*nenx) + (k*nInXYplane);
00242 node2 = node1 + 1;
00243 node3 = node2 + nenx;
00244 node4 = node1 + nenx;
00245
00246 node5 = node1 + nInXYplane;
00247 node6 = node2 + nInXYplane;
00248 node7 = node3 + nInXYplane;
00249 node8 = node4 + nInXYplane;
00250
00251 element(0) = node1;
00252 element(1) = node2;
00253 element(2) = node3;
00254 element(3) = node4;
00255
00256 element(4) = node5;
00257 element(5) = node6;
00258 element(6) = node7;
00259 element(7) = node8;
00260
00261 return element;
00262 }
00263
00264
00265
00266
00267 void Block3D::transformNodalCoordinates( )
00268 {
00269
00270 static double shape[27];
00271
00272 static double natCoor[3];
00273
00274 int j, dim;
00275
00276 natCoor[0] = coor(0);
00277 natCoor[1] = coor(1);
00278 natCoor[2] = coor(2);
00279
00280 coor.Zero( );
00281
00282 this->shape3d( natCoor[0], natCoor[1], natCoor[2], shape );
00283
00284 for ( j=0; j<27; j++ ) {
00285
00286 for ( dim=0; dim<3; dim++ )
00287 coor(dim) += shape[j]*xl[dim][j];
00288
00289 }
00290
00291 return;
00292
00293 }
00294
00295
00296
00297
00298 void Block3D::shape3d( double r, double s, double t,
00299 double shape[27] )
00300 {
00301
00302 static const int ri[] = {-1, 1, 1,-1, -1, 1, 1,-1, -1, 1, 1,-1, 0, 1, 0,-1, 0, 0, 1, 0,-1, 0, 0, 1, 0,-1, 0};
00303
00304 static const int si[] = {-1,-1, 1, 1, -1,-1, 1, 1, -1,-1, 1, 1, -1, 0, 1, 0, 0, -1, 0, 1, 0, 0, -1, 0, 1, 0, 0};
00305
00306 static const int ti[] = {-1,-1,-1,-1, 1, 1, 1, 1, 0, 0, 0, 0, -1,-1,-1,-1,-1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0};
00307
00308
00309 static const double d1 = 1.0;
00310 static const double d2 = 0.5;
00311 static const double d4 = 0.25;
00312 static const double d8 = 0.125;
00313
00314
00315 double rr = r*r;
00316 double ss = s*s;
00317 double tt = t*t;
00318
00319 double r0, s0, t0;
00320 int k, kk;
00321
00322
00323 for ( k=1; k<=27; k++ ) {
00324
00325 kk = k-1;
00326
00327 r0 = r*ri[kk];
00328 s0 = s*si[kk];
00329 t0 = t*ti[kk];
00330
00331
00332 if ( k>=1 && k<=8 )
00333 shape[kk] = d8*(rr+r0) *(ss+s0) *(tt+t0);
00334
00335
00336 if ( k>=9 && k<=12 )
00337 shape[kk] = d4*(rr+r0) *(ss+s0) *(d1-tt);
00338
00339
00340 if ( k==13 || k==15 || k==18 || k==20 )
00341 shape[kk] = d4*(d1-rr)*(ss+s0) *(tt+t0);
00342
00343
00344 if ( k==14 || k==16 || k==19 || k==21 )
00345 shape[kk] = d4*(rr+r0) *(d1-ss)*(tt+t0);
00346
00347
00348 if ( k==23 || k==25 )
00349 shape[kk] = d2*(d1-rr)*(ss+s0) *(d1-tt);
00350
00351
00352 if ( k==24 || k==26 )
00353 shape[kk] = d2*(rr+r0) *(d1-ss)*(d1-tt);
00354
00355
00356 if ( k==17 || k==22 )
00357 shape[kk] = d2*(d1-rr)*(d1-ss)*(tt+t0);
00358
00359 if ( k==27 )
00360 shape[kk] = (d1-rr)*(d1-ss)*(d1-tt);
00361
00362 }
00363
00364 return;
00365 }
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430