00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <stdio.h>
00018 #include <stdlib.h>
00019 #include <math.h>
00020
00021 #include "load.h"
00022 #include "elm.h"
00023 #include "node.h"
00024 #include "alg.h"
00025
00026
00027
00028
00029 int CurrLoadCase = 0;
00030 int NumLoadCase = 0;
00031 sLoadCase *LoadCase = 0L;
00032
00033
00034
00035
00036
00037
00038
00039 #ifndef ZERO
00040 #define ZERO 0.000001
00041 #endif
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 void PrescribedValues( void )
00058 {
00059 int i, j, node, key;
00060 int noi, noj, nok, nol, id, nnode;
00061 int inc[8];
00062 double vx, vy, vz;
00063 double q1x, q1y, q1z;
00064 double q2x, q2y, q2z;
00065 double q3x, q3y, q3z;
00066 double q4x, q4y, q4z;
00067 double intforce[24];
00068 eLoadType type;
00069 sElement *elm = 0L;
00070
00071
00072
00073
00074 NodeInitPrescValues( );
00075
00076
00077
00078 for( i = 0; i < NumNodalSupp; i++ )
00079 {
00080 id = NodalSupp[i].node - 1;
00081 if( NodalSupp[i].tx == 0 )
00082 NodeVector[id].dof.x = FORCE;
00083 if( NodalSupp[i].ty == 0 )
00084 NodeVector[id].dof.y = FORCE;
00085 if( NodalSupp[i].tz == 0 )
00086 NodeVector[id].dof.z = FORCE;
00087 }
00088
00089
00090
00091 for( i = 0; i < NumNodalForce; i++ )
00092 {
00093 node = NodalForce[i].node;
00094 vx = NodalForce[i].fx;
00095 vy = NodalForce[i].fy;
00096 vz = NodalForce[i].fz;
00097 NodeApplyForce( node, vx, vy, vz );
00098 }
00099
00100
00101
00102 for( i = 0; i < NumNodalDisp; i++ )
00103 {
00104 node = NodalDisp[i].node;
00105 vx = NodalDisp[i].dx;
00106 vy = NodalDisp[i].dy;
00107 vz = NodalDisp[i].dz;
00108 NodeApplyDisplacement( node, vx, vy, vz );
00109 }
00110
00111
00112
00113 for( i = 0; i < NumNodalVel; i++ )
00114 {
00115 node = NodalVel[i].node;
00116 vx = NodalVel[i].vx;
00117 vy = NodalVel[i].vy;
00118 vz = NodalVel[i].vz;
00119 NodeApplyVelocity( node, vx, vy, vz );
00120 }
00121
00122
00123
00124 if( NumLineForce )
00125 ElementBuildAdjacence( );
00126
00127 for( i = 0; i < NumLineForce; i++ )
00128 {
00129 #if 0
00130
00131
00132 if( LineForce[i].elem )
00133 {
00134 if( !LineForce[i].adj )
00135 continue;
00136 }
00137
00138
00139
00140 if( LineForce[i].adj )
00141 {
00142 if( !LineForce[i].elem )
00143 continue;
00144 }
00145 #endif
00146
00147
00148
00149 q1x = LineForce[i].q1x;
00150 q1y = LineForce[i].q1y;
00151 q1z = LineForce[i].q1z;
00152 q2x = LineForce[i].q2x;
00153 q2y = LineForce[i].q2y;
00154 q2z = LineForce[i].q2z;
00155 noi = LineForce[i].noi;
00156 noj = LineForce[i].noj;
00157 nok = LineForce[i].nok;
00158 key = LineForce[i].key;
00159 type = LineForce[i].type;
00160
00161
00162
00163 elm = ElmList[LineForce[i].elem-1];
00164
00165
00166
00167 ElmLoad(elm,type,key,noi,noj,nok,0L,&q1x,&q1y,&q1z,
00168 &q2x,&q2y,&q2z,0L,0L,0L,0L,0L,0L);
00169
00170
00171 if( NodeVector[noi-1].dof.x == FORCE )
00172 NodeVector[noi-1].dof.vpx += q1x;
00173 if( NodeVector[noi-1].dof.y == FORCE )
00174 NodeVector[noi-1].dof.vpy += q1y;
00175 if( NodeVector[noi-1].dof.z == FORCE )
00176 NodeVector[noi-1].dof.vpz += q1z;
00177
00178 if( NodeVector[noj-1].dof.x == FORCE )
00179 NodeVector[noj-1].dof.vpx += q2x;
00180 if( NodeVector[noj-1].dof.y == FORCE )
00181 NodeVector[noj-1].dof.vpy += q2y;
00182 if( NodeVector[noj-1].dof.z == FORCE )
00183 NodeVector[noj-1].dof.vpz += q2z;
00184
00185 if( (NDof == 3) && (NodeVector[nok-1].dof.x == FORCE) )
00186 NodeVector[nok-1].dof.vpx += q1x;
00187 if( (NDof == 3) && (NodeVector[nok-1].dof.y == FORCE) )
00188 NodeVector[nok-1].dof.vpy += q1y;
00189 if( (NDof == 3) && (NodeVector[nok-1].dof.z == FORCE) )
00190 NodeVector[nok-1].dof.vpz += q1z;
00191 }
00192
00193
00194
00195 if( NumAreaForceUniform )
00196 ElementBuildAdjacence( );
00197
00198 for( i = 0; i < NumAreaForceUniform; i++ )
00199 {
00200
00201
00202 q1x = AreaForceUniform[i].qx;
00203 q1y = AreaForceUniform[i].qy;
00204 q1z = AreaForceUniform[i].qz;
00205 noi = AreaForceUniform[i].noi;
00206 noj = AreaForceUniform[i].noj;
00207 nok = AreaForceUniform[i].nok;
00208 key = AreaForceUniform[i].key;
00209 type = AreaForceUniform[i].type;
00210
00211
00212
00213 elm = ElmList[AreaForceUniform[i].elem-1];
00214
00215
00216
00217 ElmLoad(elm,type,key,noi,noj,nok,&nol,&q1x,&q1y,&q1z,
00218 &q2x,&q2y,&q2z,&q3x,&q3y,&q3z,&q4x,&q4y,&q4z);
00219
00220
00221
00222 if( NodeVector[noi-1].dof.x == FORCE )
00223 NodeVector[noi-1].dof.vpx += q1x;
00224 if( NodeVector[noi-1].dof.y == FORCE )
00225 NodeVector[noi-1].dof.vpy += q1y;
00226 if( NodeVector[noi-1].dof.z == FORCE )
00227 NodeVector[noi-1].dof.vpz += q1z;
00228
00229 if( NodeVector[noj-1].dof.x == FORCE )
00230 NodeVector[noj-1].dof.vpx += q2x;
00231 if( NodeVector[noj-1].dof.y == FORCE )
00232 NodeVector[noj-1].dof.vpy += q2y;
00233 if( NodeVector[noj-1].dof.z == FORCE )
00234 NodeVector[noj-1].dof.vpz += q2z;
00235
00236 if( NodeVector[nok-1].dof.x == FORCE )
00237 NodeVector[nok-1].dof.vpx += q3x;
00238 if( NodeVector[nok-1].dof.y == FORCE )
00239 NodeVector[nok-1].dof.vpy += q3y;
00240 if( NodeVector[nok-1].dof.z == FORCE )
00241 NodeVector[nok-1].dof.vpz += q3z;
00242
00243 if( nol != (-1)){
00244 AreaForceUniform[NumAreaForceUniform].nol = nol;
00245 if( NodeVector[nol-1].dof.x != DISPLACEMENT ){
00246 NodeVector[nol-1].dof.x = FORCE;
00247 NodeVector[nol-1].dof.vpx += q4x;
00248 }
00249 if( NodeVector[nol-1].dof.y != DISPLACEMENT ){
00250 NodeVector[nol-1].dof.y = FORCE;
00251 NodeVector[nol-1].dof.vpy += q4y;
00252 }
00253 if( NodeVector[nol-1].dof.z != DISPLACEMENT ){
00254 NodeVector[nol-1].dof.z = FORCE;
00255 NodeVector[nol-1].dof.vpz += q4z;
00256 }
00257 }
00258
00259 }
00260
00261
00262
00263 if( NumAreaForcePressure )
00264 ElementBuildAdjacence( );
00265
00266 for( i = 0; i < NumAreaForcePressure; i++ )
00267 {
00268
00269
00270 q1x = AreaForcePressure[i].qx;
00271 q1y = AreaForcePressure[i].qy;
00272 q1z = AreaForcePressure[i].qz;
00273 noi = AreaForcePressure[i].noi;
00274 noj = AreaForcePressure[i].noj;
00275 nok = AreaForcePressure[i].nok;
00276 key = AreaForcePressure[i].key;
00277 type = AreaForcePressure[i].type;
00278
00279
00280
00281 elm = ElmList[AreaForcePressure[i].elem-1];
00282
00283
00284
00285 ElmLoad(elm,type,key,noi,noj,nok,&nol,&q1x,&q1y,&q1z,
00286 &q2x,&q2y,&q2z,&q3x,&q3y,&q3z,&q4x,&q4y,&q4z);
00287
00288
00289
00290 if( NodeVector[noi-1].dof.x == FORCE )
00291 NodeVector[noi-1].dof.vpx += q1x;
00292 if( NodeVector[noi-1].dof.y == FORCE )
00293 NodeVector[noi-1].dof.vpy += q1y;
00294 if( NodeVector[noi-1].dof.z == FORCE )
00295 NodeVector[noi-1].dof.vpz += q1z;
00296
00297 if( NodeVector[noj-1].dof.x == FORCE )
00298 NodeVector[noj-1].dof.vpx += q2x;
00299 if( NodeVector[noj-1].dof.y == FORCE )
00300 NodeVector[noj-1].dof.vpy += q2y;
00301 if( NodeVector[noj-1].dof.z == FORCE )
00302 NodeVector[noj-1].dof.vpz += q2z;
00303
00304 if( NodeVector[nok-1].dof.x == FORCE )
00305 NodeVector[nok-1].dof.vpx += q3x;
00306 if( NodeVector[nok-1].dof.y == FORCE )
00307 NodeVector[nok-1].dof.vpy += q3y;
00308 if( NodeVector[nok-1].dof.z == FORCE )
00309 NodeVector[nok-1].dof.vpz += q3z;
00310
00311 if( nol != (-1)){
00312 AreaForcePressure[NumAreaForcePressure].nol = nol;
00313 if( NodeVector[nol-1].dof.x != DISPLACEMENT ){
00314 NodeVector[nol-1].dof.x = FORCE;
00315 NodeVector[nol-1].dof.vpx += q4x;
00316 }
00317 if( NodeVector[nol-1].dof.y != DISPLACEMENT ){
00318 NodeVector[nol-1].dof.y = FORCE;
00319 NodeVector[nol-1].dof.vpy += q4y;
00320 }
00321 if( NodeVector[nol-1].dof.z != DISPLACEMENT ){
00322 NodeVector[nol-1].dof.z = FORCE;
00323 NodeVector[nol-1].dof.vpz += q4z;
00324 }
00325 }
00326
00327 }
00328
00329
00330
00331 if( (fabs(GravForce.gx) > ZERO) ||
00332 (fabs(GravForce.gy) > ZERO) ||
00333 (fabs(GravForce.gz) > ZERO) )
00334 {
00335 for( i = 0; i < NumElements; i++ )
00336 {
00337 if( ElmList[i]->rezone != NONE )
00338 continue;
00339
00340 vx = vy = vz = 0.0;
00341
00342 ElmGravity( ElmList[i], &vx, &vy, &vz );
00343 ElmConnect( ElmList[i], inc );
00344 ElmNumNodes( ElmList[i], &nnode );
00345
00346 for( j = 0; j < nnode; j++ )
00347 {
00348 if( NodeVector[inc[j]-1].dof.x == FORCE )
00349 NodeVector[inc[j]-1].dof.vpx += vx;
00350 if( NodeVector[inc[j]-1].dof.y == FORCE )
00351 NodeVector[inc[j]-1].dof.vpy += vy;
00352 if( (NDof == 3) && (NodeVector[inc[j]-1].dof.z == FORCE) )
00353 NodeVector[inc[j]-1].dof.vpz += vz;
00354 }
00355 }
00356 }
00357
00358
00359
00360 for( i = 0; i < NumElements; i++ )
00361 {
00362 if( ElmList[i]->rezone != NONE )
00363 continue;
00364
00365 for( j = 0; j < 24; j++ )
00366 intforce[j] = 0.0;
00367
00368 ElmInterForce( ElmList[i], 0L, intforce );
00369 ElmConnect( ElmList[i], inc );
00370 ElmNumNodes( ElmList[i], &nnode );
00371
00372 for( j = 0; j < nnode; j++ )
00373 {
00374 if(NodeVector[inc[j]-1].dof.x != DISPLACEMENT){
00375 NodeVector[inc[j]-1].dof.x = FORCE;
00376 NodeVector[inc[j]-1].dof.vpx += intforce[NDof*j];
00377 }
00378 if(NodeVector[inc[j]-1].dof.y != DISPLACEMENT){
00379 NodeVector[inc[j]-1].dof.y = FORCE;
00380 NodeVector[inc[j]-1].dof.vpy += intforce[NDof*j+1];
00381 }
00382 if( (NDof == 3) && (NodeVector[inc[j]-1].dof.z != DISPLACEMENT) ){
00383 NodeVector[inc[j]-1].dof.z = FORCE;
00384 NodeVector[inc[j]-1].dof.vpz += intforce[NDof*j+2];
00385 }
00386 }
00387 }
00388
00389
00390
00391 for( i = 0; i < NumElemPoten; i++ )
00392 {
00393 if( ElmList[i]->rezone != NONE )
00394 continue;
00395
00396 elm = ElmList[ElemPoten[i].elem-1];
00397
00398 ElmSetPressure( elm, ElemPoten[i].phi );
00399 }
00400
00401 }
00402
00403
00404
00405
00406
00407 void UpdatePrescribedValues( double *FVector )
00408 {
00409 int i, j, key;
00410 int noi, noj, nok, nnode;
00411 int inc[8];
00412 double vx, vy, vz;
00413 double q1x, q1y, q1z;
00414 double q2x, q2y, q2z;
00415 eLoadType type;
00416 sElement *elm = 0L;
00417
00418
00419
00420 for( i = 0; i < NumLineForce; i++ )
00421 {
00422
00423
00424 if( (ElmList[LineForce[i].elem-1]->rezone == NONE) ||
00425 ((LineForce[i].adj > 0) &&
00426 (ElmList[LineForce[i].adj-1]->rezone == NONE)) ) continue;
00427
00428
00429
00430 q1x = LineForce[i].q1x;
00431 q1y = LineForce[i].q1y;
00432 q1z = LineForce[i].q1z;
00433 q2x = LineForce[i].q2x;
00434 q2y = LineForce[i].q2y;
00435 q2z = LineForce[i].q2z;
00436 noi = LineForce[i].noi;
00437 noj = LineForce[i].noj;
00438 nok = LineForce[i].nok;
00439 key = LineForce[i].key;
00440 type = LineForce[i].type;
00441
00442
00443
00444 elm = ElmList[LineForce[i].elem-1];
00445
00446
00447
00448 ElmLoad(elm,type,key,noi,noj,nok,0L,
00449 &q1x,&q1y,&q1z,&q2x,&q2y,&q2z,
00450 0L,0L,0L,0L,0L,0L);
00451
00452
00453
00454 if( NodeVector[noi-1].dof.x == FORCE )
00455 {
00456 NodeVector[noi-1].dof.vpx -= q1x;
00457 FVector[NDof*(noi-1)] -= q1x;
00458 }
00459 if( NodeVector[noi-1].dof.y == FORCE )
00460 {
00461 NodeVector[noi-1].dof.vpy -= q1y;
00462 FVector[NDof*(noi-1)+1] -= q1y;
00463 }
00464 if( NodeVector[noi-1].dof.z == FORCE )
00465 {
00466 NodeVector[noi-1].dof.vpz -= q1z;
00467 FVector[NDof*(noi-1)+2] -= q1z;
00468 }
00469
00470 if( NodeVector[noj-1].dof.x == FORCE )
00471 {
00472 NodeVector[noj-1].dof.vpx -= q2x;
00473 FVector[NDof*(noj-1)] -= q2x;
00474 }
00475 if( NodeVector[noj-1].dof.y == FORCE )
00476 {
00477 NodeVector[noj-1].dof.vpy -= q2y;
00478 FVector[NDof*(noj-1)+1] -= q2y;
00479 }
00480 if( NodeVector[noj-1].dof.z == FORCE )
00481 {
00482 NodeVector[noj-1].dof.vpz -= q2z;
00483 FVector[NDof*(noj-1)+2] -= q2z;
00484 }
00485
00486 if( (NDof == 3) && (NodeVector[nok-1].dof.x == FORCE) )
00487 {
00488 NodeVector[nok-1].dof.vpx -= q1x;
00489 FVector[NDof*(nok-1)] -= q1x;
00490 }
00491 if( (NDof == 3) && (NodeVector[nok-1].dof.y == FORCE) )
00492 {
00493 NodeVector[nok-1].dof.vpy -= q1y;
00494 FVector[NDof*(nok-1)+1] -= q1y;
00495 }
00496 if( (NDof == 3) && (NodeVector[nok-1].dof.z == FORCE) )
00497 {
00498 NodeVector[nok-1].dof.vpz -= q1z;
00499 FVector[NDof*(nok-1)+2] -= q1z;
00500 }
00501 }
00502
00503
00504
00505 if( (fabs(GravForce.gz) > ZERO) ||
00506 (fabs(GravForce.gy) > ZERO) ||
00507 (fabs(GravForce.gz) > ZERO) )
00508 {
00509 for( i = 0; i < NumElements; i++ )
00510 {
00511 if( ElmList[i]->rezone != TODO )
00512 continue;
00513
00514 vx = vy = vz = 0.0;
00515
00516 ElmGravity( ElmList[i], &vx, &vy, &vz );
00517 ElmConnect( ElmList[i], inc );
00518 ElmNumNodes( ElmList[i], &nnode );
00519
00520 for( j = 0; j < nnode; j++ )
00521 {
00522 if( NodeVector[inc[j]-1].dof.x == FORCE )
00523 {
00524 NodeVector[inc[j]-1].dof.vpx -= vx;
00525 FVector[NDof*(inc[j]-1)] -= vx;
00526 }
00527 if( NodeVector[inc[j]-1].dof.y == FORCE )
00528 {
00529 NodeVector[inc[j]-1].dof.vpy -= vy;
00530 FVector[NDof*(inc[j]-1)+1] -= vy;
00531 }
00532 if( (NDof == 3) && (NodeVector[inc[j]-1].dof.z == FORCE) )
00533 {
00534 NodeVector[inc[j]-1].dof.vpz -= vz;
00535 FVector[NDof*(inc[j]-1)+2] -= vz;
00536 }
00537 }
00538 }
00539 }
00540
00541 }
00542
00543
00544
00545