Página Principal | Lista Alfabética | Lista de Componentes | Lista de Arquivos | Componentes Membros | Arquivos Membros

crs.c

Vá para a documentação deste arquivo.
00001 
00044 /*
00045 ** ---------------------------------------------------------------
00046 ** Definições globais:
00047 */
00048 #include <stdio.h>
00049 #include <stdlib.h>
00050 #include <math.h>
00051 
00052 #include "crs.h"
00053 
00054 /*
00055 ** ---------------------------------------------------------------
00056 ** Definições e variáveis locais:
00057 */
00058 
00061 typedef struct _crsmember {
00063  int node0;
00065  int node1;
00067  int rotlib0;
00069  int rotlib1;
00071  double E;
00073  double I;
00076  double q;
00079  double m0;
00082  double m1;
00083 } CrsMember;
00084 
00087 typedef struct _crsadjmember {
00089  struct _crsadjmember *next;
00091  int id;
00093  double distr;
00095  double trans;
00096 } CrsAdjMember;
00097 
00100 typedef struct _crsnode {
00102  double x;
00104  double y;
00106  int rotlib;
00108  struct _crsadjmember *adj_head;
00109 } CrsNode;
00110 
00113 typedef struct _crsmodel {
00115  int n_member;
00117  CrsMember *member;
00119  int max_members;
00121  int n_node;
00123  CrsNode *node;
00125  int max_nodes;
00128   double mom_tol;
00129 } CrsModel;
00130 
00133 static CrsModel *crs = NULL;
00134 
00135 /*
00136 ** ---------------------------------------------------------------
00137 ** Funções locais: 
00138 */
00139 
00140 /*========================  _crsBuildNodeMemberAdj  =======================*/
00141 
00150 static void _crsBuildNodeMemberAdj( void )
00151 {
00152  CrsAdjMember *adjmember;  /* aponta para uma barra adjacente a um nó */
00153  int          i;           /* índice de uma barra no vetor de barras */
00154 
00155  for( i = 0; i < crs->n_member; i++ )
00156  {
00157   /* Aloca memoria para um registro de barra adjacente para o primeiro
00158    * nó da barra.  Atribui o índice a barra corrente neste registro.  
00159    * Inicializa como nulos os valores dos coeficientes de distribuição
00160    * e transmissão de momentos deste registro.  Insere o registro 
00161    * no início da lista encadeada de barras adjacentes do primeiro nó
00162    * da barra.
00163    */
00164 /**** COMPLETE AQUI: 001 ****/
00165 
00166   /* Aloca memoria para um registro de barra adjacente para o segundo
00167    * nó da barra.  Atribui o índice a barra corrente neste registro.  
00168    * Inicializa como nulos os valores dos coeficientes de distribuição
00169    * e transmissão de momentos deste registro.  Insere o registro 
00170    * no início da lista encadeada de barras adjacentes do segundo nó
00171    * da barra.
00172    */
00173 /**** COMPLETE AQUI: 002 ****/
00174  }
00175 }
00176 
00177 /*==========================  _crsMemberLength  ========================*/
00178 
00187 static double _crsMemberLength( int id )
00188 {
00189  double len;
00190 
00191 /**** COMPLETE AQUI: 003 ****/
00192 
00193  return( len );
00194 }
00195 
00196 /*==========================  _crsMemberStiffness ========================*/
00197 
00219 static double _crsMemberStiffness( int member_id, int node_id )
00220 {
00221  double       membstiff;   /* coeficiente de rigidez à rotação da barra */
00222 
00223 /**** COMPLETE AQUI: 004 ****/
00224 
00225  return( membstiff );
00226 }
00227 
00228 /*==========================  _crsMemberTransmission ========================*/
00229 
00251 static double _crsMemberTransmission( int member_id, int node_id )
00252 {
00253  double       membtrans;   /* coeficiente de transmissão de momentos da barra */
00254 
00255 /**** COMPLETE AQUI: 005 ****/
00256 
00257  return( membtrans );
00258 }
00259 
00260 /*==========================  _crsDistribCoef  ========================*/
00261 
00266 static void _crsDistribCoef( void )
00267 {
00268 /**** COMPLETE AQUI: 006 ****/
00269 }
00270 
00271 /*==========================  _crsInitMoments  ========================*/
00272 
00277 static void _crsInitMoments( void )
00278 {
00279 /**** COMPLETE AQUI: 007 ****/
00280 }
00281  
00282 /*========================  _crsGetNodeUnbalance  ========================*/
00283 
00295 double _crsGetNodeUnbalance( int id )
00296 {
00297  double       munb;        /* momento desquilibrante do nó */
00298 
00299 /**** COMPLETE AQUI: 013 ****/
00300 
00301  return( munb );
00302 }
00303 
00304 /*=======================  _crsGetMaxMomNode  ========================*/
00305 
00324 static int _crsGetMaxMomNode( void )
00325 {
00326  int          n = -1;    /* índice do nó com máximo momento desequilibrante */
00327 
00328 /**** COMPLETE AQUI: 008 ****/
00329 
00330  return( n );
00331 }
00332  
00333 /*=========================  _crsProcessNode  =========================*/
00334 
00352 static void _crsProcessNode( int n )
00353 {
00354 /**** COMPLETE AQUI: 009 ****/
00355 }
00356 
00357 
00358 /*
00359 ** ---------------------------------------------------------------
00360 ** Funções exportadas:
00361 */
00362 
00363 /*=========================  crsInitModel  =========================*/
00364 
00377 void *crsInitModel( int max_nodes, int max_members )
00378 {
00379  CrsModel *crs_model;
00380 
00381  crs_model = (CrsModel *)malloc( sizeof( CrsModel ) );
00382  if( crs_model == NULL )
00383   return( NULL );
00384 
00385  crs_model->max_nodes = max_nodes;
00386  crs_model->node = (CrsNode *)calloc( max_nodes, sizeof( CrsNode ) );
00387  if( crs_model->node == NULL )
00388  {
00389   crsFreeModel( crs_model );
00390   return( NULL );
00391  }
00392 
00393  crs_model->max_members = max_members;
00394  crs_model->member = (CrsMember *)calloc( max_members, sizeof( CrsMember ) );
00395  if( crs_model->member == NULL )
00396  {
00397   crsFreeModel( crs_model );
00398   return( NULL );
00399  }
00400 
00401  crs_model->n_node = 0;
00402  crs_model->n_member = 0;
00403 
00404  return( crs_model );
00405 }
00406 
00407 /*=======================  crsActivateModel  =======================*/
00408 
00414 void crsActivateModel( void *model )
00415 {
00416  if( !model )
00417   return;
00418 
00419  crs = (CrsModel *)model;
00420 }
00421 
00422 /*===========================  crsFreeModel  ==========================*/
00423 
00432 void crsFreeModel( void *model )
00433 {
00434 /**** COMPLETE AQUI: 010 ****/
00435 }
00436 
00437 /*==========================  crsAddNode  =========================*/
00438 
00454 int crsAddNode( double x, double y )
00455 {
00456  int    node_id;
00457 
00458  if( !crs )
00459   return( CRS_NO_MODEL_DEFINED );
00460 
00461 /* Verifica se o número de nós do modelo é igual ao máximo número de
00462  * nós com que o vetor de nós está dimensionado.  Se este for o caso,
00463  * dobra o tamanho de dimensionamento e realoca vetor com base no 
00464  * novo tamanho.
00465  */
00466 /**** COMPLETE AQUI: 011 ****/
00467 
00468 /* Armazena as coordenadas fornecidas no nó corrente.
00469  * O índice do nó corrente corresponde ao número de nós antes da 
00470  * chamada desta função.  Incrementa o número total de nós.
00471  */
00472  node_id = crs->n_node;
00473  crs->node[node_id].x = x;
00474  crs->node[node_id].y = y;
00475  crs->node[node_id].rotlib = ROT_FREE;
00476  crs->n_node++;
00477 
00478  return( node_id );
00479 }
00480 
00481 /*==========================  crsFixNodeRot  =========================*/
00482 
00489 void crsFixNodeRot( int id )
00490 {
00491  if( !crs )
00492   return;
00493 
00494  if( (id < 0) || (id >= crs->n_node) )
00495   return;
00496 
00497  crs->node[id].rotlib = ROT_FIX;
00498 }
00499 
00500 /*==========================  crsFreeNodeRot  =========================*/
00501 
00508 void crsFreeNodeRot( int id )
00509 {
00510  if( !crs )
00511   return;
00512 
00513  if( (id < 0) || (id >= crs->n_node) )
00514   return;
00515 
00516  crs->node[id].rotlib = ROT_FREE;
00517 }
00518 
00519 /*==========================  crsAddMember  =========================*/
00520 
00537 int crsAddMember( int node0, int node1 )
00538 {
00539  int    member_id;
00540 
00541  if( !crs )
00542   return( CRS_NO_MODEL_DEFINED );
00543 
00544 /* Verifica se o número de barras do modelo é igual ao máximo número de
00545  * barras com que o vetor de barras está dimensionado.  Se este for o caso,
00546  * dobra o tamanho de dimensionamento e realoca vetor com base no 
00547  * novo tamanho.
00548  */
00549 /**** COMPLETE AQUI: 012 ****/
00550 
00551 /* Armazena os índices dos nós fornecidos na barra corrente.
00552  * O índice da barra corrente corresponde ao número de barras antes da 
00553  * chamada desta função.  Incrementa o número total de barras.
00554  */
00555  member_id = crs->n_member;
00556  crs->member[member_id].node0 = node0;
00557  crs->member[member_id].node1 = node1;
00558  crs->member[member_id].rotlib0 = ROT_FIX;
00559  crs->member[member_id].rotlib1 = ROT_FIX;
00560  crs->n_member++;
00561 
00562  return( member_id );
00563 }
00564 
00565 /*==========================  crsFixMemberEndRot  =========================*/
00566 
00575 void crsFixMemberEndRot( int id, int end )
00576 {
00577  if( !crs )
00578   return;
00579 
00580  if( (id < 0) || (id >= crs->n_member) )
00581   return;
00582 
00583  if( end = 0 )
00584   crs->member[id].rotlib0 = ROT_FIX;
00585  else
00586   crs->member[id].rotlib1 = ROT_FIX;
00587 }
00588 
00589 /*==========================  crsFreeMemberEndRot  =========================*/
00590 
00599 void crsFreeMemberEndRot( int id, int end )
00600 {
00601  if( !crs )
00602   return;
00603 
00604  if( (id < 0) || (id >= crs->n_member) )
00605   return;
00606 
00607  if( end = 0 )
00608   crs->member[id].rotlib0 = ROT_FREE;
00609  else
00610   crs->member[id].rotlib1 = ROT_FREE;
00611 }
00612 
00613 /*==========================  crsMemberElasticity  =========================*/
00614 
00623 void crsMemberElasticity( int id, double E )
00624 {
00625  if( !crs )
00626   return;
00627 
00628  if( (id < 0) || (id >= crs->n_member) )
00629   return;
00630 
00631  crs->member[id].E = E;
00632 }
00633 
00634 /*==========================  crsMemberInertia  =========================*/
00635 
00644 void crsMemberInertia( int id, double I )
00645 {
00646  if( !crs )
00647   return;
00648 
00649  if( (id < 0) || (id >= crs->n_member) )
00650   return;
00651 
00652  crs->member[id].I = I;
00653 }
00654 
00655 /*==========================  crsMemberUnifLoad  =========================*/
00656 
00671 void crsMemberUnifLoad( int id, double q )
00672 {
00673  if( !crs )
00674   return;
00675 
00676  if( (id < 0) || (id >= crs->n_member) )
00677   return;
00678 
00679  crs->member[id].q = q;
00680 }
00681 
00682 /*==========================  crsCompleteModel  ===========================*/
00683 
00695 int crsCompleteModel( void )
00696 {
00697  if( !crs )
00698   return( CRS_NO_MODEL_DEFINED );
00699 
00700  _crsBuildNodeMemberAdj( );
00701  _crsDistribCoef( );
00702 
00703  return( CRS_SUCCESS );
00704 }
00705 
00706 /*==========================  crsResetSolution  ===========================*/
00707 
00720 int crsResetSolution( double mom_tol )
00721 {
00722  if( !crs )
00723   return( CRS_NO_MODEL_DEFINED );
00724 
00725  crs->mom_tol = mom_tol;
00726 
00727  _crsInitMoments( );
00728 
00729  return( CRS_SUCCESS );
00730 }
00731 
00732 /*============================  crsSolveModel  =============================*/
00733 
00745 int crsSolveModel( void )
00746 {
00747  int  n;  /* indice do no' para processar */
00748  int  did_one_step = 0;
00749 
00750  if( !crs )
00751   return( CRS_NO_MODEL_DEFINED );
00752 
00753  while( (n = _crsGetMaxMomNode()) != -1 )
00754  {
00755   did_one_step = 1;
00756   _crsProcessNode( n );
00757  }
00758 
00759  if( ! did_one_step )
00760   return( CRS_NO_STEP_TO_GO );
00761 
00762  return( CRS_SUCCESS );
00763 }
00764  
00765 /*=========================  crsStepSolution  =========================*/
00766 
00777 int crsStepSolution( void )
00778 {
00779  int  n;  /* indice do no' para processar */
00780 
00781  if( !crs )
00782   return( CRS_NO_MODEL_DEFINED );
00783 
00784  if( (n = _crsGetMaxMomNode()) == -1 )
00785   return( CRS_NO_STEP_TO_GO );
00786 
00787  _crsProcessNode( n );
00788 
00789  return( CRS_SUCCESS );
00790 }
00791  
00792 /*========================  crsChkNodeUnbalance  ========================*/
00793 
00812 int crsChkNodeUnbalance( int id )
00813 {
00814  double       munbabs;   /* momento desquilibrante do nó em valor absoluto */
00815 
00816  if( !crs )
00817   return( CRS_NO_MODEL_DEFINED );
00818 
00819  if( crs->node[id].rotlib == ROT_FREE )
00820  {
00821   munbabs = _crsGetNodeUnbalance( id );
00822   munbabs = fabs( munbabs );
00823 
00824   if( munbabs > crs->mom_tol )
00825   {
00826    return( CRS_SUCCESS );
00827   }
00828  }
00829  else
00830  {
00831   return( CRS_FIXED_NODE );
00832  }
00833 
00834  return( CRS_NO_STEP_TO_GO );
00835 }
00836  
00837 /*=========================  crsProcessNode  =========================*/
00838 
00854 int crsProcessNode( int id )
00855 {
00856  int    status;
00857 
00858  if( !crs )
00859   return( CRS_NO_MODEL_DEFINED );
00860 
00861  status = crsChkNodeUnbalance( id );
00862  if( status != CRS_SUCCESS )
00863   return( status );
00864 
00865  _crsProcessNode( id );
00866 
00867  return( CRS_SUCCESS );
00868 }
00869 
00870 /*===========================  crsGetNumNodes  ============================*/
00871 
00879 int crsGetNumNodes( void )
00880 {
00881  if( !crs )
00882   return( 0 );
00883 
00884  return( crs->n_node );
00885 }
00886 
00887 /*==========================  crsGetNodeCoords  =========================*/
00888 
00898 void crsGetNodeCoords( int id, double *x, double *y )
00899 {
00900  if( !crs )
00901   return;
00902 
00903  if( (id < 0) || (id >= crs->n_node) )
00904   return;
00905 
00906  *x = crs->node[id].x;
00907  *y = crs->node[id].y;
00908 }
00909 
00910 /*===========================  crsGetNumMembers  ============================*/
00911 
00919 int crsGetNumMembers( void )
00920 {
00921  if( !crs )
00922   return( 0 );
00923 
00924  return( crs->n_member );
00925 }
00926 
00927 /*==========================  crsGetMemberNodes  =========================*/
00928 
00938 void crsGetMemberNodes( int id, int *node0, int *node1 )
00939 {
00940  if( !crs )
00941   return;
00942 
00943  if( (id < 0) || (id >= crs->n_member) )
00944   return;
00945 
00946  *node0 = crs->member[id].node0;
00947  *node1 = crs->member[id].node1;
00948 }
00949 
00950 /*==========================  crsGetMemberRotLibs  =========================*/
00951 
00962 void crsGetMemberRotLibs( int id, int *rotlib0, int *rotlib1 )
00963 {
00964  if( !crs )
00965   return;
00966 
00967  if( (id < 0) || (id >= crs->n_member) )
00968   return;
00969 
00970  *rotlib0 = crs->member[id].rotlib0;
00971  *rotlib1 = crs->member[id].rotlib1;
00972 }
00973 
00974 /*==========================  crsGetMemberUnifLoad  =========================*/
00975 
00988 void crsGetMemberUnifLoad( int id, double *q )
00989 {
00990  if( !crs )
00991   return;
00992 
00993  if( (id < 0) || (id >= crs->n_member) )
00994   return;
00995 
00996  *q = crs->member[id].q;
00997 }
00998 
00999 /*==========================  crsGetMemberMoments  =========================*/
01000 
01013 void crsGetMemberMoments( int id, double *m0, double *m1 )
01014 {
01015  if( !crs )
01016   return;
01017 
01018  if( (id < 0) || (id >= crs->n_member) )
01019   return;
01020 
01021  *m0 = crs->member[id].m0;
01022  *m1 = crs->member[id].m1;
01023 }
01024 
01025 /*===========================  crsGetGlobalBox  ==========================*/
01026 
01039 int crsGetGlobalBox( double *xmin, double *xmax, double *ymin, double *ymax )
01040 {
01041  int          i;         /* índice de um nó no vetor de nós do modelo */
01042 
01043  if( !crs )
01044   return( CRS_NO_MODEL_DEFINED );
01045 
01046  if( crs->n_node < 1 )
01047   return( CRS_NO_MODEL_DEFINED );
01048 
01049  *xmin = *xmax = crs->node[0].x;
01050  *ymin = *ymax = crs->node[0].y;
01051  for( i = 1; i < crs->n_node; i++ )
01052  {
01053   if( crs->node[i].x < *xmin ) 
01054    *xmin = crs->node[i].x;
01055   if( crs->node[i].x > *xmax ) 
01056    *xmax = crs->node[i].x;
01057   if( crs->node[i].y < *ymin ) 
01058    *ymin = crs->node[i].y;
01059   if( crs->node[i].y > *ymax ) 
01060    *ymax = crs->node[i].y;
01061  }
01062 
01063  return( CRS_SUCCESS );
01064 }
01065 
01066 /*===========================  crsPickNode  ==========================*/
01067 
01082 int crsPickNode( double x, double y, double tol )
01083 {
01084  int          i;         /* índice de um nó no vetor de nós do modelo */
01085 
01086  if( !crs )
01087   return( CRS_NO_MODEL_DEFINED );
01088 
01089  for( i = 0; i < crs->n_node; i++ )
01090  {
01091   if( (fabs( crs->node[i].x - x ) <= tol)  &&
01092       (fabs( crs->node[i].y - y ) <= tol) )
01093   {
01094    return( i );
01095   }
01096  }
01097 
01098  return( CRS_FAILURE );
01099 }
01100 

Gerado em Tue Oct 5 04:55:00 2004 para Trab3 por doxygen 1.3.4