00001
00044
00045
00046
00047
00048 #include <stdio.h>
00049 #include <stdlib.h>
00050 #include <math.h>
00051
00052 #include "crs.h"
00053
00054
00055
00056
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
00138
00139
00140
00141
00150 static void _crsBuildNodeMemberAdj( void )
00151 {
00152 CrsAdjMember *adjmember;
00153 int i;
00154
00155 for( i = 0; i < crs->n_member; i++ )
00156 {
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 }
00175 }
00176
00177
00178
00187 static double _crsMemberLength( int id )
00188 {
00189 double len;
00190
00191
00192
00193 return( len );
00194 }
00195
00196
00197
00219 static double _crsMemberStiffness( int member_id, int node_id )
00220 {
00221 double membstiff;
00222
00223
00224
00225 return( membstiff );
00226 }
00227
00228
00229
00251 static double _crsMemberTransmission( int member_id, int node_id )
00252 {
00253 double membtrans;
00254
00255
00256
00257 return( membtrans );
00258 }
00259
00260
00261
00266 static void _crsDistribCoef( void )
00267 {
00268
00269 }
00270
00271
00272
00277 static void _crsInitMoments( void )
00278 {
00279
00280 }
00281
00282
00283
00295 double _crsGetNodeUnbalance( int id )
00296 {
00297 double munb;
00298
00299
00300
00301 return( munb );
00302 }
00303
00304
00305
00324 static int _crsGetMaxMomNode( void )
00325 {
00326 int n = -1;
00327
00328
00329
00330 return( n );
00331 }
00332
00333
00334
00352 static void _crsProcessNode( int n )
00353 {
00354
00355 }
00356
00357
00358
00359
00360
00361
00362
00363
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
00408
00414 void crsActivateModel( void *model )
00415 {
00416 if( !model )
00417 return;
00418
00419 crs = (CrsModel *)model;
00420 }
00421
00422
00423
00432 void crsFreeModel( void *model )
00433 {
00434
00435 }
00436
00437
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
00462
00463
00464
00465
00466
00467
00468
00469
00470
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
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
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
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
00545
00546
00547
00548
00549
00550
00551
00552
00553
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
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
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
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
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
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
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
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
00733
00745 int crsSolveModel( void )
00746 {
00747 int n;
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
00766
00777 int crsStepSolution( void )
00778 {
00779 int n;
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
00793
00812 int crsChkNodeUnbalance( int id )
00813 {
00814 double munbabs;
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
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
00871
00879 int crsGetNumNodes( void )
00880 {
00881 if( !crs )
00882 return( 0 );
00883
00884 return( crs->n_node );
00885 }
00886
00887
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
00911
00919 int crsGetNumMembers( void )
00920 {
00921 if( !crs )
00922 return( 0 );
00923
00924 return( crs->n_member );
00925 }
00926
00927
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
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
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
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
01026
01039 int crsGetGlobalBox( double *xmin, double *xmax, double *ymin, double *ymax )
01040 {
01041 int i;
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
01067
01082 int crsPickNode( double x, double y, double tol )
01083 {
01084 int i;
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