00001 #include "elementt.h"
00002 #include "globalt.h"
00003 #include <string.h>
00004
00005 long elementt::ntm = 0;
00006
00007 elementt::elementt (void)
00008 {
00009 long i;
00010
00011
00012 te = (elemtypet) 0;
00013
00014
00015
00016 source=0;
00017
00018
00019 ipp=NULL;
00020
00021 crst = (crsectypet) 0;
00022
00023 idcs=0;
00024
00025
00026 ntm = Tp->ntm;
00027
00028
00029 tm = NULL;
00030
00031 idm = NULL;
00032
00033
00034 transi=new long [ntm];
00035 for (i=0;i<Tp->ntm;i++){
00036
00037 transi[i]=0;
00038 }
00039
00040
00041
00042 initnodval=NULL;
00043 }
00044
00045 elementt::~elementt (void)
00046 {
00047 long i;
00048 if (ipp != NULL)
00049 {
00050 for (i=0; i<ntm; i++)
00051 delete [] ipp[i];
00052 }
00053 delete [] tm;
00054 delete [] idm;
00055 delete [] ipp;
00056 delete [] transi;
00057 delete [] initnodval;
00058 }
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 void elementt::read (XFILE *in,long eid)
00069 {
00070 long nne,ndofe;
00071 gelemtype get;
00072
00073
00074 xfscanf (in,"%d",(int*)&te);
00075
00076 switch (te){
00077 case barlint:{
00078 get=linbar;
00079 if (Lbt==NULL)
00080 Lbt = new linbart;
00081 Tp->gdim=1;
00082 break;
00083 }
00084 case barlintax:{
00085 get=linbar;
00086 if (Lbt==NULL)
00087 Lbat = new linbartax;
00088 Tp->gdim=1;
00089 break;
00090 }
00091 case barquadt:{
00092 get=quadbar;
00093 if (Qbt==NULL)
00094 Qbt = new quadbart;
00095 Tp->gdim=1;
00096 break;
00097 }
00098 case barquadtax:{
00099 get=quadbar;
00100 if (Qbat==NULL)
00101 Qbat = new quadbartax;
00102 Tp->gdim=1;
00103 break;
00104 }
00105 case trlint:{
00106 get=lintriag;
00107 if (Ltt==NULL)
00108 Ltt = new trlineart;
00109 Tp->gdim=2;
00110 break;
00111 }
00112 case trlaxisym:{
00113 get=lintriag;
00114 if (Ltat==NULL)
00115 Ltat = new trlinaxisym;
00116 Tp->gdim=2;
00117 break;
00118 }
00119 case quadlint:{
00120 get=linquad;
00121 if (Lqt==NULL)
00122 Lqt = new quadlineart;
00123 Tp->gdim=2;
00124 break;
00125 }
00126 case quadquadt:{
00127 get=quadquad;
00128 if (Qqt==NULL)
00129 Qqt = new quadquadrilatt;
00130 Tp->gdim=2;
00131 break;
00132 }
00133 case quadquadtax:{
00134 get=quadquad;
00135 if (Qqat==NULL)
00136 Qqat = new quadquadrilattax;
00137 Tp->gdim=2;
00138 break;
00139 }
00140 case quadlaxisym:{
00141 get=linquad;
00142 if (Lqat==NULL)
00143 Lqat = new quadlinaxisym;
00144 Tp->gdim=2;
00145 break;
00146 }
00147 case lineartett:{
00148 get=lintetra;
00149 if (Ltett==NULL)
00150 Ltett = new lintett;
00151 Tp->gdim=3;
00152 break;
00153 }
00154 case linearhext:{
00155 get=linhexa;
00156 if (Lht==NULL)
00157 Lht = new linhext;
00158 Tp->gdim=3;
00159 break;
00160 }
00161 case quadratichext:{
00162 get=quadhexa;
00163 if (Qht==NULL)
00164 Qht = new quadhext;
00165 Tp->gdim=3;
00166 break;
00167 }
00168 case gen2del:{
00169 get=gen2d;
00170
00171 if (G2d==NULL)
00172 G2d = new gen2delem;
00173 Tp->gdim=2;
00174 break;
00175 }
00176 default:{
00177 print_err("unknown element type is required", __FILE__, __LINE__, __func__);
00178 }
00179 }
00180
00181
00182 ndofe=Tt->give_ndofe (eid);
00183
00184 nne=Tt->give_nne(eid);
00185
00186 if (Tp->tprob == growing_np_problem || Tp->tprob == growing_np_problem_nonlin){
00187 Gtt->gelements[eid].read_gf (in,nne,ndofe);
00188 initnodval = new double [ndofe];
00189 }
00190 else{
00191 Gtt->gelements[eid].read (in,nne,ndofe,get);
00192 }
00193
00194
00195 xfscanf (in,"%d",(int*)&crst);
00196 if (crst!=0){
00197
00198 xfscanf (in,"%ld",&idcs);
00199 idcs--;
00200 }
00201
00202
00203 readmat (Tp->ntm*Tp->ntm,in);
00204 }
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214 void elementt::print (FILE *out,long eid)
00215 {
00216 long nne,ndofe;
00217 gelemtype get;
00218
00219
00220 fprintf (out,"\n%d",(int)te);
00221
00222
00223 ndofe=Tt->give_ndofe (eid);
00224
00225 nne=Tt->give_nne(eid);
00226
00227 get = Gtt->give_elem_type (eid);
00228
00229 if (Tp->tprob == growing_np_problem || Tp->tprob == growing_np_problem_nonlin){
00230 Gtt->gelements[eid].print_gf (out,nne,ndofe);
00231 }
00232 else{
00233 Gtt->gelements[eid].print (out,nne,ndofe,get);
00234 }
00235
00236 fprintf (out," %d",crst);
00237 if (crst!=0){
00238 fprintf (out," %ld",idcs+1);
00239 }
00240
00241
00242 printmat (Tp->ntm*Tp->ntm,out);
00243 }
00244
00245
00246
00247
00248
00249
00250
00251
00252 void elementt::readmat (long m,XFILE *in)
00253 {
00254 long i;
00255
00256 tm = new mattypet [m];
00257 idm = new long [m];
00258
00259 for (i=0;i<m;i++){
00260 xfscanf (in,"%d %ld",(int*)&tm[i],&idm[i]);
00261 idm[i]--;
00262 }
00263 }
00264
00265
00266
00267
00268
00269
00270
00271
00272 void elementt::printmat (long m,FILE *out)
00273 {
00274 long i;
00275
00276 for (i=0;i<m;i++){
00277 fprintf (out," %d %ld",tm[i],idm[i]+1);
00278 }
00279 fprintf (out,"\n");
00280 }
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290 void elementt::alloc_initnodval (long ndofe)
00291 {
00292 initnodval = new double [ndofe];
00293 }
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304 void elementt::initnodvalues (double *r,long ndofe)
00305 {
00306 long i;
00307
00308 for (i=0;i<ndofe;i++){
00309 initnodval[i]=r[i];
00310 }
00311
00312 }
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323 void elementt::subtrinitnodval (double *r,long ndofe)
00324 {
00325 long i;
00326
00327 for (i=0;i<ndofe;i++){
00328 r[i]-=initnodval[i];
00329 }
00330 }