load.c

Go to the documentation of this file.
00001 /*
00002 %M This modules contains the load methods and definitions
00003 %a Joao Luiz Elias Campos.
00004 %d September 2nd, 1998.
00005 %r $Id: load.c,v 1.1 2004/06/22 05:29:59 joaoluiz Exp $
00006 %w (C) COPYRIGHT 1995-1996, Eduardo Nobre Lages.
00007    (C) COPYRIGHT 1997-1999, Joao Luiz Elias Campos.
00008    All Rights Reserved
00009    Duplication of this program or any part thereof without the express
00010    written consent of the author is prohibited.
00011 */
00012 
00013 /*
00014 ** ------------------------------------------------------------------------
00015 ** Global variables and symbols:
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 %V Load case and its numbers
00028 */
00029 int        CurrLoadCase = 0;
00030 int        NumLoadCase  = 0;
00031 sLoadCase *LoadCase     = 0L;
00032 
00033 
00034 /*
00035 ** ------------------------------------------------------------------------
00036 ** Local variables and symbols:
00037 */
00038 
00039 #ifndef ZERO
00040 #define ZERO 0.000001
00041 #endif
00042 
00043 /*
00044 ** ------------------------------------------------------------------------
00045 ** Local functions:
00046 */
00047 
00048 
00049 /*
00050 ** ------------------------------------------------------------------------
00051 ** Public functions:
00052 */
00053 
00054 /*
00055 %F This function apply the prescribed values.
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 /* Initialize prescribed values
00073  */
00074  NodeInitPrescValues( );
00075 
00076 /* Update nodal support
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 /* Apply nodal forces
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 /* Apply nodal displacement
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 /* Apply nodal velocity
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 /* Apply line distributed loads
00123  */
00124  if( NumLineForce )
00125   ElementBuildAdjacence( );
00126 
00127  for( i = 0; i < NumLineForce; i++ )
00128  {
00129 #if 0
00130  /* Check for the element id
00131   */
00132   if( LineForce[i].elem )
00133   {
00134    if( !LineForce[i].adj )
00135     continue;
00136   }
00137 
00138  /* Check for the adjacent element id
00139   */
00140   if( LineForce[i].adj )
00141   {
00142    if( !LineForce[i].elem )
00143     continue;
00144   }
00145 #endif
00146 
00147  /* Get load information
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  /* Get element address
00162   */
00163   elm = ElmList[LineForce[i].elem-1];
00164 
00165  /* Compute the element contribution
00166   */
00167   ElmLoad(elm,type,key,noi,noj,nok,0L,&q1x,&q1y,&q1z,
00168           &q2x,&q2y,&q2z,0L,0L,0L,0L,0L,0L);
00169  /* Add to the prescribed values vector
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  /* Apply area uniform loads
00194  */
00195  if( NumAreaForceUniform )
00196   ElementBuildAdjacence( );
00197 
00198  for( i = 0; i < NumAreaForceUniform; i++ )
00199  {
00200  /* Get load information
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  /* Get element address
00212   */
00213   elm = ElmList[AreaForceUniform[i].elem-1];
00214 
00215  /* Compute the element contribution
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  /* Add to the prescribed values vector
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  /* Apply area pressure loads
00262  */
00263  if( NumAreaForcePressure )
00264   ElementBuildAdjacence( );
00265 
00266  for( i = 0; i < NumAreaForcePressure; i++ )
00267  {
00268  /* Get load information
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  /* Get element address
00280   */
00281   elm = ElmList[AreaForcePressure[i].elem-1];
00282 
00283  /* Compute the element contribution
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  /* Add to the prescribed values vector
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 /* Gravitational load
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 /* Initial stress
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 /* Element internal pressure
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 } /* End of PrescribedValues */
00402 
00403 
00404 /*
00405 %F
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 /* Update rezoned element contribution to the load vector.
00419  */
00420  for( i = 0; i < NumLineForce; i++ )
00421  {
00422  /* Check for the element id
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  /* Get load information
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  /* Get element address
00443   */
00444   elm = ElmList[LineForce[i].elem-1];
00445 
00446  /* Compute the element contribution
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  /* Add to the prescribed values vector
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 /* Gravitational load
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 } /* End of UpdatePrescribedValues */
00542 
00543 
00544 /* =======================================================  End of File  */
00545 

Generated on Tue Oct 23 11:23:29 2007 for Relax by  doxygen 1.5.3