00001 #include "gelement.h"
00002 #include <string.h>
00003 #include "gnode.h"
00004
00005 gelement::gelement (void)
00006 {
00007
00008 nne = 0;
00009
00010 nmne = 0;
00011
00012 ndofe = 0;
00013
00014 cne = 0;
00015
00016 get=noelem;
00017
00018 nmult=0;
00019
00020
00021 nodes=NULL;
00022
00023
00024 master_nodes=NULL;
00025
00026 auxinf=0;
00027
00028
00029
00030 cn = NULL;
00031
00032 tgf=0;
00033 }
00034
00035 gelement::~gelement (void)
00036 {
00037
00038 delete [] nodes;
00039
00040
00041 delete [] master_nodes;
00042
00043 delete [] cn;
00044 }
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 void gelement::read (XFILE *in,long m,long n,gelemtype et)
00057 {
00058 long i;
00059
00060
00061 get=et;
00062
00063 nne=m;
00064
00065 ndofe=n;
00066
00067 nodes = new long [nne];
00068 for (i=0;i<nne;i++){
00069 xfscanf (in,"%ld",nodes+i);
00070 nodes[i]--;
00071 }
00072
00073 xfscanf (in,"%ld",&cne);
00074 if (cne!=0 && cne!=1 && cne!=2){
00075 print_err("identification of code numbers on element (cne) must be equal to 0, 1 or 2", __FILE__, __LINE__, __func__);
00076 }
00077
00078
00079 if ((ndofe < -1) && (nne == 1))
00080 return;
00081
00082 if (cne==1 || cne==2){
00083 cn = new long [ndofe];
00084 for (i=0;i<ndofe;i++){
00085 xfscanf (in,"%ld",cn+i);
00086 }
00087 }
00088
00089 }
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 void gelement::print (FILE *out,long m,long n,gelemtype et)
00102 {
00103 long i;
00104
00105 for (i=0;i<nne;i++){
00106 fprintf (out," %ld ",nodes[i]+1);
00107 }
00108
00109 fprintf (out," %ld ",cne);
00110
00111 if (cne==1 || cne==2){
00112 for (i=0;i<ndofe;i++){
00113 fprintf (out," %ld ",cn[i]+1);
00114 }
00115 }
00116 }
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 void gelement::read_gf (XFILE *in,long m,long n)
00130 {
00131 long i;
00132
00133
00134 nne=m;
00135
00136 ndofe=n;
00137
00138 nodes = new long [nne];
00139 for (i=0;i<nne;i++){
00140 xfscanf (in,"%ld",nodes+i);
00141 nodes[i]--;
00142 }
00143
00144 xfscanf (in,"%ld",&cne);
00145 if (cne!=0 && cne!=1 && cne!=2){
00146 print_err("identification of code numbers on element (cne) must be equal to 0, 1 or 2", __FILE__, __LINE__, __func__);
00147 }
00148
00149
00150 if ((ndofe < -1) && (nne == 1))
00151 return;
00152
00153 if (cne==1 || cne==2){
00154 cn = new long [ndofe];
00155 for (i=0;i<ndofe;i++){
00156 xfscanf (in,"%ld",cn+i);
00157 }
00158 }
00159
00160 xfscanf (in,"%ld",&tgf);
00161 tgf--;
00162 }
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175 void gelement::print_gf (FILE *out,long m,long n)
00176 {
00177 long i;
00178
00179 for (i=0;i<nne;i++){
00180 fprintf (out," %ld ",nodes[i]+1);
00181 }
00182
00183 fprintf (out," %ld ",cne);
00184
00185 if (cne==1 || cne==2){
00186 for (i=0;i<ndofe;i++){
00187 fprintf (out," %ld ",cn[i]+1);
00188 }
00189 }
00190
00191 fprintf (out," %ld ",tgf+1);
00192 }
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204 void gelement::initiate (long *icn,long m)
00205 {
00206 long i;
00207 cne=1;
00208 ndofe=m;
00209
00210 cn = new long [ndofe];
00211 for (i=0;i<ndofe;i++){
00212 cn[i]=icn[i];
00213 }
00214
00215 }
00216
00217
00218
00219
00220
00221
00222 long gelement::give_nne ()
00223 {
00224 return nne;
00225 }
00226
00227
00228
00229
00230
00231
00232 long gelement::give_nmne ()
00233 {
00234 return nmne;
00235 }
00236
00237
00238
00239
00240
00241
00242 long gelement::give_ndofe ()
00243 {
00244 return ndofe;
00245 }
00246
00247
00248
00249
00250
00251
00252 long gelement::give_nmult ()
00253 {
00254 return nmult;
00255 }
00256
00257
00258
00259
00260
00261
00262
00263
00264 void gelement::give_nodes (ivector &nod)
00265 {
00266 long i;
00267 if (nod.n!=nne){
00268 print_err("wrong size of array is required", __FILE__, __LINE__, __func__);
00269 }
00270
00271 for (i=0;i<nne;i++){
00272 nod[i]=nodes[i];
00273 }
00274 }
00275
00276
00277
00278
00279
00280
00281
00282
00283 void gelement::give_master_nodes (ivector &nod)
00284 {
00285 long i;
00286 if (nod.n!=nmne){
00287 print_err("wrong size of array is required", __FILE__, __LINE__, __func__);
00288 }
00289
00290 for (i=0;i<nmne;i++){
00291 nod[i]=master_nodes[i];
00292 }
00293 }
00294
00295
00296
00297
00298
00299
00300
00301
00302 long gelement::give_cne ()
00303 {
00304 return cne;
00305 }
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316 void gelement::centroid (long dim,gnode *gnodes,double *coord)
00317 {
00318 long i;
00319
00320 switch (auxinf){
00321 case 312:
00322 case 412:{
00323 coord[0]=coord[1]=0.0;
00324 for (i=0;i<nne;i++){
00325 coord[0] += gnodes[nodes[i]].x;
00326 coord[1] += gnodes[nodes[i]].y;
00327 }
00328 for (i=0;i<dim;i++)
00329 coord[i] /= nne;
00330
00331 break;
00332 }
00333 default:{
00334 print_err("wrong dimdegnne", __FILE__, __LINE__, __func__);
00335 break;
00336 }
00337 }
00338 }