00001 #include <string.h>
00002 #include "element.h"
00003 #include "global.h"
00004 #include "elemhead.h"
00005 #include "gtopology.h"
00006 #include "intpoints.h"
00007
00008
00009
00010
00011
00012
00013
00014
00015 element::element (void)
00016 {
00017
00018 tm = NULL;
00019
00020 idm = NULL;
00021
00022 nm = 0;
00023
00024 te = (elemtype) 0;
00025
00026
00027
00028 prescdispl=0;
00029
00030 presctemp=0;
00031
00032 react=0;
00033
00034 ipp=NULL;
00035
00036 crst = (crsectype) 0;
00037
00038 idcs=0;
00039
00040 ssst = (strastrestate)0;
00041
00042 ncomp=0;
00043
00044 initdispl=NULL;
00045
00046 tmat=NULL;
00047 }
00048
00049
00050
00051
00052
00053
00054
00055
00056 element::~element (void)
00057 {
00058 long i,nb;
00059
00060 delete [] tm;
00061 delete [] idm;
00062 delete [] initdispl;
00063
00064
00065 nb = Mt->give_nb_te (te);
00066
00067 if (ipp != NULL){
00068 for (i=0; i < nb; i++){
00069 delete [] ipp[i];
00070 }
00071 delete [] ipp;
00072 }
00073 delete tmat;
00074 }
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 void element::read (XFILE *in,long eid)
00089 {
00090 long nne,ndofe;
00091 gelemtype get=noelem;
00092
00093
00094 xfscanf (in,"%m", &elemtype_kwdset, (int*)&te);
00095
00096 switch (te){
00097 case bar2d:{ if (Bar2d==NULL) Bar2d = new barel2d; break; }
00098 case bar3d:{ if (Bar3d==NULL) Bar3d = new barel3d; break; }
00099 case barq2d:{ if (Barq2d==NULL) Barq2d = new barelq2d; break; }
00100 case barq3d:{ if (Barq3d==NULL) Barq3d = new barelq3d; break; }
00101 case beam2d:{ if (Beam2d==NULL) Beam2d = new beamel2d; break; }
00102 case beam3d:{ if (Beam3d==NULL) Beam3d = new beamel3d; break; }
00103 case beamg3d:{ if (Beam3dg==NULL) Beam3dg = new beamgen3d; break; }
00104 case subsoilbeam:{ if (Sbeam==NULL) Sbeam = new soilbeam; break; }
00105 case spring_1:{ if (Spring==NULL) Spring = new springel; break; }
00106 case spring_2:{ if (Spring==NULL) Spring = new springel; break; }
00107 case spring_3:{ if (Spring==NULL) Spring = new springel; break; }
00108 case spring_4:{ if (Spring==NULL) Spring = new springel; break; }
00109 case spring_5:{ if (Spring==NULL) Spring = new springel; break; }
00110 case spring_6:{ if (Spring==NULL) Spring = new springel; break; }
00111 case planeelementlt:{ if (Pelt==NULL) Pelt = new planeelemlt; break; }
00112 case planeelementqt:{ if (Peqt==NULL) Peqt = new planeelemqt; break; }
00113 case planeelementrotlt:{ if (Perlt==NULL) Perlt = new planeelemrotlt; break; }
00114 case planeelementlq:{ if (Pelq==NULL) Pelq = new planeelemlq; break; }
00115 case planeelementqq:{ if (Peqq==NULL) Peqq = new planeelemqq; break; }
00116 case planeelementrotlq:{ if (Perlq==NULL) Perlq = new planeelemrotlq; break; }
00117 case planeelementsubqt:{ if (Pesqt==NULL) Pesqt = new planeelemsubqt; break; }
00118 case planequadcontact:{ if (Pqcon==NULL) Pqcon = new plquadcontact; break; }
00119 case cctel:{ if (Cct==NULL) Cct = new cctelem; break; }
00120 case dktel:{ if (Dkt==NULL) Dkt = new dktelem; break; }
00121 case dstel:{ if (Dst==NULL) Dst = new dstelem; break; }
00122 case q4plateel:{ if (Q4pl==NULL) Q4pl = new q4plate; break; }
00123
00124 case argyristr:{ if (Argtrpl==NULL) Argtrpl = new argyrisplate; break; }
00125 case subsoilplatetr:{ if (Spltr==NULL) Spltr = new soilplatetr; break; }
00126 case subsoilplateq:{ if (Splq==NULL) Splq = new soilplateq; break; }
00127 case axisymmlt:{ if (Asymlt==NULL) Asymlt = new axisymlt; break; }
00128 case axisymmlq:{ if (Asymlq==NULL) Asymlq = new axisymlq; break; }
00129 case axisymmqq:{ if (Asymqq==NULL) Asymqq = new axisymqq; break; }
00130 case shelltrelem:{ if (Shtr==NULL) Shtr = new shelltr; break; }
00131 case shellqelem:{ if (Shq==NULL) Shq = new shellq; break; }
00132 case lineartet:{ if (Ltet==NULL) Ltet = new lintet; break; }
00133 case quadrtet:{ if (Qtet==NULL) Qtet = new quadtet; break; }
00134 case linearhex:{ if (Lhex==NULL) Lhex = new linhex; break; }
00135 case quadrhex:{ if (Qhex==NULL) Qhex = new quadhex; break; }
00136 case lineartetrot:{ if (Ltetrot==NULL) Ltetrot = new lintetrot; break; }
00137 case linearhexrot:{ if (Lhexrot==NULL) Lhexrot = new linhexrot; break; }
00138 case linearwed:{ if (Lwed==NULL) Lwed = new linwedge; break; }
00139 case quadrwed:{ if (Qwed==NULL) Qwed = new quadwedge; break; }
00140 case particleelem:{
00141 if (Pelem==NULL){
00142 long nne,dim;
00143 xfscanf (in,"%ld %ld",&nne,&dim);
00144 Pelem = new elemparticle (nne,dim);
00145 }
00146 break;
00147 }
00148 default:{
00149 print_err("unknown element type is required", __FILE__, __LINE__, __func__);
00150 }
00151 }
00152
00153 switch (te){
00154 case planeelementlt:{ xfscanf (in,"%m", &strastrestate_kwdset, (int*)&ssst); break; }
00155 case planeelementqt:{ xfscanf (in,"%m", &strastrestate_kwdset, (int*)&ssst); break; }
00156 case planeelementrotlt:{ xfscanf (in,"%m", &strastrestate_kwdset, (int*)&ssst); break; }
00157 case planeelementlq:{ xfscanf (in,"%m", &strastrestate_kwdset, (int*)&ssst); break; }
00158 case planeelementqq:{ xfscanf (in,"%m", &strastrestate_kwdset, (int*)&ssst); break; }
00159 case planeelementrotlq:{ xfscanf (in,"%m", &strastrestate_kwdset, (int*)&ssst); break; }
00160 case planeelementsubqt:{ xfscanf (in,"%m", &strastrestate_kwdset, (int*)&ssst); break; }
00161 default:{
00162 }
00163 }
00164
00165 switch (te){
00166 case bar2d:{ get=linbar; break; }
00167 case bar3d:{ get=linbar; break; }
00168 case barq2d:{ get=linbar; break; }
00169 case barq3d:{ get=linbar; break; }
00170 case beam2d:{ break; }
00171 case beam3d:{ break; }
00172 case beamg3d:{ break; }
00173 case subsoilbeam:{ break; }
00174 case spring_1:{ break; }
00175 case spring_2:{ break; }
00176 case spring_3:{ break; }
00177 case spring_4:{ break; }
00178 case spring_5:{ break; }
00179 case spring_6:{ break; }
00180 case planeelementlt:{ get=lintriag; break; }
00181 case planeelementqt:{ get=quadtriag; break; }
00182 case planeelementrotlt:{ get=lintriag; break; }
00183 case planeelementlq:{ get=linquad; break; }
00184 case planeelementqq:{ get=quadquad; break; }
00185 case planeelementrotlq:{ get=linquad; break; }
00186 case planeelementsubqt:{ break; }
00187 case planequadcontact:{ break; }
00188 case cctel:{ get=lintriag; break; }
00189 case dktel:{ get=linquad; break; }
00190 case dstel:{ get=lintriag; break; }
00191 case q4plateel:{ break; }
00192 case argyristr:{ break; }
00193 case subsoilplatetr:{ break; }
00194 case subsoilplateq:{ break; }
00195 case axisymmlt:{ get=lintriag; break; }
00196 case axisymmlq:{ get=linquad; break; }
00197 case axisymmqq:{ get=quadquad; break; }
00198 case shelltrelem:{ break; }
00199 case shellqelem:{ break; }
00200 case lineartet:{ get=lintetra; break; }
00201 case quadrtet:{ get=quadtetra; break; }
00202 case linearhex:{ get=linhexa; break; }
00203 case quadrhex:{ get=quadhexa; break; }
00204 case lineartetrot:{ get=lintetra; break; }
00205 case linearhexrot:{ get=linhexa; break; }
00206 case linearwed:{ break; }
00207 case quadrwed:{ break; }
00208 case particleelem:{ break; }
00209 default:{
00210 print_err("unknown element type is required", __FILE__, __LINE__, __func__);
00211 }
00212 }
00213
00214 ndofe=Mt->give_ndofe (eid);
00215 nne = Mt->give_nne (eid);
00216
00217 if (Mp->homog==3){
00218
00219
00220 ndofe+= Mt->give_ncomp (eid,0);
00221 }
00222
00223 if (Mp->tprob != growing_mech_structure){
00224 Gtm->gelements[eid].read (in,nne,ndofe,get);
00225 }
00226 else{
00227 Gtm->gelements[eid].read_gf (in,nne,ndofe);
00228 }
00229
00230
00231
00232 switch (te){
00233 case quadrtet:{
00234 double vol;
00235 vol = Mt->give_volume(eid);
00236 if(vol < 0.0){
00237 printf("element volume for quadtet = %ld is negative\n\n",eid+1);
00238 print_err("wrong numbering in mesh element", __FILE__, __LINE__, __func__);
00239 exit(0);
00240 }
00241
00242 break;}
00243 default:{}
00244 }
00245
00246
00247 xfscanf (in,"%m", &crsectype_kwdset, (int*)&crst);
00248 if (crst!=0){
00249 xfscanf (in,"%ld",&idcs);
00250 idcs--;
00251 }
00252
00253 readmat (in);
00254
00255 }
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270 void element::print (FILE *out,long eid)
00271 {
00272 long nne,ndofe;
00273 gelemtype get;
00274
00275
00276 fprintf (out,"\n %d",te);
00277
00278
00279 ndofe=Mt->give_ndofe (eid);
00280
00281 nne = Mt->give_nne (eid);
00282
00283 get = Gtm->give_elem_type (eid);
00284
00285 if (Mp->tprob != growing_mech_structure){
00286 Gtm->gelements[eid].print (out,nne,ndofe,get);
00287 }
00288 else{
00289 Gtm->gelements[eid].print_gf (out,nne,ndofe);
00290 }
00291
00292 fprintf (out," %d",crst);
00293 if (crst!=0){
00294 fprintf (out," %ld",idcs+1);
00295 }
00296
00297 printmat (out);
00298 }
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313 void element::readmat (XFILE *in)
00314 {
00315 long i, idx, idxt;
00316
00317 xfscanf (in, "%ld", &nm);
00318 tm = new mattype[nm];
00319 idm = new long[nm];
00320 memset (tm, 0, sizeof(*tm)*nm);
00321 memset (idm, 0, sizeof(*idm)*nm);
00322 idx = 0;
00323 idxt = nm-1;
00324 for (i = 0; i < nm; i++)
00325 {
00326 xfscanf(in, "%k%m%k%ld", "mattype", &mattype_kwdset, (int*)(tm+idx), "num_inst", idm+idx);
00327
00328 idm[idx]--;
00329 if (tm[idx] == therisodilat){
00330 tm[idxt] = tm[idx];
00331 idm[idxt] = idm[idx];
00332 idxt--;
00333 idx--;
00334 }
00335 idx++;
00336 }
00337 }
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351 void element::printmat (FILE *out)
00352 {
00353 long i;
00354
00355 fprintf (out, " %ld", nm);
00356 for (i = 0; i < nm; i++)
00357 {
00358 fprintf(out, " %d %ld", tm[i],idm[i]+1);
00359 }
00360 fprintf (out,"\n");
00361 }
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373 void element::alloc_initdispl (long ndofe)
00374 {
00375 initdispl = new double [ndofe];
00376 }
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389 void element::initdisplacement (double *r,long ndofe)
00390 {
00391 long i;
00392
00393 for (i=0;i<ndofe;i++){
00394 initdispl[i]=r[i];
00395 }
00396
00397 }
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410 void element::subtrinitdispl (double *r,long ndofe)
00411 {
00412 long i;
00413
00414 for (i=0;i<ndofe;i++){
00415 r[i]-=initdispl[i];
00416 }
00417 }
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429 void element::alloc_growstr (long eid)
00430 {
00431 long i,ndofe;
00432
00433 ndofe=Mt->give_ndofe (eid);
00434
00435 initdispl = new double [ndofe];
00436
00437 for (i=0;i<ndofe;i++){
00438 initdispl[i]=0.0;
00439 }
00440 }
00441