00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <stdio.h>
00013 #include <stdlib.h>
00014 #include <math.h>
00015
00016 #include "elm.h"
00017 #include "node.h"
00018 #include "alg.h"
00019 #include "fem.h"
00020 #include "csr.h"
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 void BuildIaVec(CsrNode *node_list, int *ia, int nnu, int *nna)
00038 {
00039
00040
00041
00042
00043
00044 *nna = 0;
00045
00046
00047
00048 BuildIaVector(node_list, nnu, nna, ia);
00049
00050 }
00051
00052
00053
00054
00055
00056 void BuildJaVec(CsrNode *node_list, int *ja)
00057 {
00058
00059
00060
00061
00062
00063 BuildJaVector(node_list, ja);
00064
00065
00066 }
00067
00068
00069
00070
00071 void BuildNodeList( CsrNode *node_list )
00072 {
00073 int elem;
00074 int node;
00075 int next;
00076 int j,k;
00077 int inc[8];
00078 int index;
00079
00080
00081
00082 for( elem = 0; elem < NumElements; elem++ ){
00083
00084
00085 ElmGetInc(ElmList[elem], inc, &index);
00086 for( j = 0; j < index; j++ ){
00087 node = inc[j];
00088 for( k = 0; k < index; k++ ){
00089 if(k != j){
00090 next = inc[k];
00091
00092
00093 mshAddAdjNode( &node_list[node], next );
00094 }
00095 }
00096 }
00097 }
00098 }
00099
00100
00101
00102
00103
00104 void BuildIaVector(CsrNode *node_list, int nnu, int *nna, int *ia )
00105 {
00106
00107
00108 int i,j,k;
00109 AdjNode *adjnode;
00110 AdjNode *adjnodehead;
00111 int nn;
00112
00113
00114
00115 k = 1;
00116
00117
00118
00119 ia[0] = 0;
00120
00121
00122
00123 if( node_list != NULL ){
00124 for ( j = 0; j < NumNodes; j++) {
00125 nn = 0;
00126 adjnodehead = node_list[j].adj_head;
00127 while ( adjnodehead != NULL ){
00128 adjnode = adjnodehead;
00129 adjnodehead = adjnode->next;
00130 nn ++;
00131 }
00132
00133
00134
00135 for ( i = 0; i < NDof; i++) {
00136 ia[k] = ia[k-1] + (nn + 1) * NDof;
00137 k ++;
00138 }
00139
00140
00141 *nna += ((nn + 1) * NDof) * NDof;
00142 }
00143 }
00144
00145
00146
00147
00148 ia[nnu] = *nna;
00149 }
00150
00151
00152
00153
00154
00155 void BuildJaVector(CsrNode *node_list, int *ja )
00156 {
00157
00158
00159 int i,j,l,m;
00160 AdjNode *adjnode;
00161 AdjNode *adjnodehead;
00162 int nv, cja[200];
00163
00164
00165
00166 l = 0;
00167
00168
00169
00170 if( node_list != NULL ){
00171 for ( j = 0; j < NumNodes; j++) {
00172 nv = 0;
00173 for ( i = 0; i < NDof; i++) {
00174 ja[l] = cja[nv] = NDof*j+i;
00175 l ++;
00176 nv ++;
00177 }
00178 adjnodehead = node_list[j].adj_head;
00179 while ( adjnodehead != NULL ){
00180 adjnode = adjnodehead;
00181 for ( i = 0; i < NDof; i++) {
00182 ja[l] = cja[nv] = NDof*adjnodehead->id+i;
00183 l ++;
00184 nv ++;
00185 }
00186 adjnodehead = adjnode->next;
00187 }
00188
00189
00190
00191 for ( i = 0; i < (NDof - 1); i++) {
00192 for ( m = 0; m < nv; m++) {
00193
00194
00195 if(m == 0){
00196 if(i == 0){
00197 ja[l] = cja[1];
00198 l ++;
00199 ja[l] = cja[0];
00200 m++;
00201 }
00202
00203
00204 else{
00205 ja[l] = cja[2];
00206 l ++;
00207 ja[l] = cja[1];
00208 l ++;
00209 ja[l] = cja[0];
00210 m = 2;
00211 }
00212 }
00213 else{
00214 ja[l] = cja[m];
00215 }
00216
00217
00218 l ++;
00219 }
00220 }
00221 }
00222 }
00223 }
00224
00225
00226
00227
00228
00229 void mshAddAdjNode( CsrNode *node, int adj_id )
00230 {
00231
00232
00233
00234 AdjNode *newadj;
00235 AdjNode *adjnode;
00236 int found = 0;
00237
00238 adjnode = node->adj_head;
00239 while( adjnode != NULL)
00240 {
00241 if( adjnode->id == adj_id )
00242 {
00243 found=1;
00244 break;
00245 }
00246 adjnode = adjnode->next;
00247 }
00248 if(!found){
00249 newadj=(AdjNode *)malloc(sizeof(AdjNode));
00250 newadj->next=node->adj_head;
00251 newadj->id=adj_id;
00252 node->adj_head = newadj;
00253 }
00254 }
00255
00256
00257
00258
00259
00260 void FreeNodeList( CsrNode *node_list )
00261 {
00262 AdjNode *adjnode;
00263 int i;
00264
00265 if( node_list != NULL ){
00266 for ( i = 0; i < NumNodes; i++)
00267 while ( node_list[i].adj_head != NULL ){
00268 adjnode = node_list[i].adj_head;
00269 node_list[i].adj_head = adjnode->next;
00270 free (adjnode);
00271 }
00272 free (node_list);
00273 }
00274 node_list = NULL;
00275 }
00276
00277
00278
00279
00280
00281 int BuildaVector(int i, int j, double coef, int *ia, int *ja, double *avector )
00282 {
00283
00284
00285
00286 int k;
00287
00288 for( k = 0; k < (ia[i + 1] - ia[i]); k++ ){
00289 if(ja[ia[i]+k] == j){
00290
00291 avector[ia[i]+k] += coef;
00292 return(1);
00293 }
00294 }
00295 return (0);
00296 }
00297
00298
00299
00300
00301