00001 #include "mechcrsec.h"
00002 #include "global.h"
00003 #include "matrix.h"
00004 #include "vector.h"
00005 #include "crsec2dbar.h"
00006 #include "crsecplstr.h"
00007 #include "crsec2dbeam.h"
00008 #include "crsec3dbeam.h"
00009 #include "crsec3d.h"
00010 #include "crsecnod.h"
00011 #include "crseclayer.h"
00012 #include "element.h"
00013 #include "node.h"
00014
00015
00016
00017
00018
00019
00020
00021
00022 mechcrsec::mechcrsec ()
00023 {
00024
00025 ncst=0;
00026
00027 cstype = NULL;
00028
00029 numtype = NULL;
00030
00031 cs2dbar=NULL;
00032 cs2dbeam=NULL;
00033 cs3dbeam=NULL;
00034 csplstr=NULL;
00035 cs3d=NULL;
00036 csnod=NULL;
00037 cslay=NULL;
00038 }
00039
00040
00041
00042
00043
00044
00045
00046
00047 mechcrsec::~mechcrsec ()
00048 {
00049 delete [] cstype;
00050 delete [] numtype;
00051 delete [] cs2dbar;
00052 delete [] cs2dbeam;
00053 delete [] cs3dbeam;
00054 delete [] csplstr;
00055 delete [] cs3d;
00056 delete [] csnod;
00057 delete [] cslay;
00058 }
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 void mechcrsec::read (XFILE *in)
00073 {
00074 long i;
00075
00076 xfscanf (in, "%k%ld", "num_crsec_types", &ncst);
00077 if (ncst<0)
00078 print_err("negative number of cross-sections", __FILE__, __LINE__, __func__);
00079
00080
00081 cstype = new crsectype [ncst];
00082
00083 numtype = new long [ncst];
00084
00085
00086 for (i=0;i<ncst;i++){
00087 xfscanf (in, "%k%m %k%ld", "crstype", &crsectype_kwdset, &cstype[i], "num_inst", &numtype[i]);
00088 if (numtype[i]<1)
00089 print_err("negative number of cross-section", __FILE__, __LINE__, __func__);
00090
00091 readcrsectype(in, cstype[i], numtype[i]);
00092 }
00093 }
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 void mechcrsec::readcrsectype(XFILE *in, crsectype ct, long numt)
00110 {
00111 long j, k;
00112 switch (ct)
00113 {
00114 case nocrosssection:{
00115 break;
00116 }
00117 case csbar2d:{
00118 cs2dbar = new crsec2dbar [numt];
00119 for (j=0;j<numt;j++){
00120 xfscanf (in,"%ld",&k);
00121 if ((k<1) || (k>numt))
00122 {
00123 print_err("index %ld of cross section parameter set is out of range <1,%ld>",
00124 __FILE__, __LINE__, __func__, k, numt);
00125 }
00126 cs2dbar[k-1].read (in);
00127 }
00128 break;
00129 }
00130 case csbeam2d:{
00131 cs2dbeam = new crsec2dbeam [numt];
00132 for (j=0;j<numt;j++){
00133 xfscanf (in,"%ld",&k);
00134 if ((k<1) || (k>numt))
00135 {
00136 print_err("index %ld of cross section parameter set is out of range <1,%ld>",
00137 __FILE__, __LINE__, __func__, k, numt);
00138 }
00139 cs2dbeam[k-1].read (in);
00140 }
00141 break;
00142 }
00143 case csbeam3d:{
00144 cs3dbeam = new crsec3dbeam [numt];
00145 for (j=0;j<numt;j++){
00146 xfscanf (in,"%ld",&k);
00147 if ((k<1) || (k>numt))
00148 {
00149 print_err("index %ld of cross section parameter set is out of range <1,%ld>",
00150 __FILE__, __LINE__, __func__, k, numt);
00151 }
00152 cs3dbeam[k-1].read (in);
00153 }
00154 break;
00155 }
00156 case csplanestr:{
00157 csplstr = new crsecplstr [numt];
00158 for (j=0;j<numt;j++){
00159 xfscanf (in,"%ld",&k);
00160 if ((k<1) || (k>numt))
00161 {
00162 print_err("index %ld of cross section parameter set is out of range <1,%ld>",
00163 __FILE__, __LINE__, __func__, k, numt);
00164 }
00165 csplstr[k-1].read (in);
00166 }
00167 break;
00168 }
00169 case cs3dprob:{
00170 cs3d = new crsec3d [numt];
00171 for (j=0;j<numt;j++){
00172 xfscanf (in,"%ld",&k);
00173 if ((k<1) || (k>numt))
00174 {
00175 print_err("index %ld of cross section parameter set is out of range <1,%ld>",
00176 __FILE__, __LINE__, __func__, k, numt);
00177 }
00178 cs3d[k-1].read (in);
00179 }
00180 break;
00181 }
00182 case csnodal:{
00183 csnod = new crsecnod [numt];
00184 for (j=0;j<numt;j++){
00185 xfscanf (in,"%ld",&k);
00186 if ((k<1) || (k>numt))
00187 {
00188 print_err("index %ld of cross section parameter set is out of range <1,%ld>",
00189 __FILE__, __LINE__, __func__, k, numt);
00190 }
00191 csnod[k-1].read (in);
00192 }
00193 break;
00194 }
00195 case cslayer:
00196 cslay = new crseclayer [numt];
00197 for (j=0;j<numt;j++){
00198 xfscanf (in,"%ld",&k);
00199 if (k<1){}
00200 if (k>numt){}
00201 cslay[k-1].read (in);
00202 }
00203 break;
00204 default:
00205 print_err("unknown cross section type is required",__FILE__,__LINE__,__func__);
00206 }
00207 }
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221 void mechcrsec::print (FILE *out)
00222 {
00223 long i,j;
00224
00225 fprintf (out,"\n\n ## cross-sections:");
00226 fprintf (out,"\n%ld\n",ncst);
00227
00228 for (i=0;i<ncst;i++){
00229 fprintf (out,"\n%d %ld",(int)cstype[i],numtype[i]);
00230
00231 for (j=0;j<numtype[i];j++)
00232 {
00233 fprintf (out,"\n%ld ",j+1);
00234 printcrschar(out, cstype[i], j);
00235 }
00236 }
00237 }
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252 void mechcrsec::printcrschar (FILE *out, crsectype ct, long numinst)
00253 {
00254 switch (ct)
00255 {
00256 case nocrosssection:
00257 break;
00258
00259 case csbar2d:{
00260 cs2dbar[numinst].print (out);
00261 break;
00262 }
00263
00264 case csbeam2d:{
00265 cs2dbeam[numinst].print (out);
00266 break;
00267 }
00268
00269 case csbeam3d:{
00270 cs3dbeam[numinst].print (out);
00271 break;
00272 }
00273
00274 case csplanestr:{
00275 csplstr[numinst].print (out);
00276 break;
00277 }
00278
00279 case cs3dprob:{
00280 cs3d[numinst].print (out);
00281 break;
00282 }
00283
00284 case csnodal:{
00285 csnod[numinst].print (out);
00286 break;
00287 }
00288
00289 default:
00290 print_err("unknown cross section type is required",__FILE__,__LINE__,__func__);
00291 }
00292 }
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306 void mechcrsec::give_thickn (ivector &nod,vector &t)
00307 {
00308 long i,n;
00309 n=nod.n;
00310 for (i=0;i<n;i++){
00311 switch (Mt->nodes[nod[i]].crst){
00312 case nocrosssection:{
00313 break;
00314 }
00315 case csbar2d:{
00316 break;
00317 }
00318 case csbeam2d:{
00319 break;
00320 }
00321 case csbeam3d:{
00322 break;
00323 }
00324 case csplanestr:{
00325 t[i]=csplstr[Mt->nodes[nod[i]].idcs].t;
00326 break;
00327 }
00328 case cslayer:{
00329 t[i]=cslay[Mt->nodes[nod[i]].idcs].th;
00330 break;
00331 }
00332 default:{
00333 print_err("unknown cross section type is required", __FILE__, __LINE__, __func__);
00334 }
00335 }
00336 }
00337 }
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351 void mechcrsec::give_thicke (long eid,double &t)
00352 {
00353 switch (Mt->elements[eid].crst){
00354 case nocrosssection:{
00355 break;
00356 }
00357 case csbar2d:{
00358 break;
00359 }
00360 case csbeam2d:{
00361 break;
00362 }
00363 case csbeam3d:{
00364 break;
00365 }
00366 case csplanestr:{
00367 t=csplstr[Mt->elements[eid].idcs].t;
00368 break;
00369 }
00370 case cslayer:{
00371 t=cslay[Mt->elements[eid].idcs].th;
00372 break;
00373 }
00374 default:
00375 print_err("unknown cross section type is required",__FILE__,__LINE__,__func__);
00376 }
00377 }
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392 void mechcrsec::give_thickness (long eid,ivector &nodes,vector &th)
00393 {
00394 long i,nne;
00395 double t;
00396
00397 if (Mt->elements[eid].crst==0){
00398 give_thickn (nodes,th);
00399 }
00400 else{
00401 give_thicke (eid,t);
00402 nne = Mt->give_nne (eid);
00403 for (i=0;i<nne;i++){
00404 th[i]=t;
00405 }
00406 }
00407 }
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421 double mechcrsec::give_onethickness (crsectype crst,long idcs)
00422 {
00423 double t;
00424
00425 switch (crst){
00426 case nocrosssection:{
00427 break;
00428 }
00429 case csbar2d:{
00430 break;
00431 }
00432 case csbeam2d:{
00433 t=cs2dbeam[idcs].t;
00434 break;
00435 }
00436 case csbeam3d:{
00437 break;
00438 }
00439 case csplanestr:{
00440 t=csplstr[idcs].t;
00441 break;
00442 }
00443 case csnodal:{
00444 t=csnod[idcs].t;
00445 break;
00446 }
00447 case cslayer:{
00448 t=cslay[idcs].th;
00449 break;
00450 }
00451 default:{
00452 print_err("unknown cross section type is required",__FILE__,__LINE__,__func__);
00453 }
00454 }
00455
00456 return t;
00457 }
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471 void mechcrsec::give_area (long eid,double &a)
00472 {
00473 switch (Mt->elements[eid].crst){
00474 case nocrosssection:{
00475 break;
00476 }
00477 case csbar2d:{
00478 a=cs2dbar[Mt->elements[eid].idcs].a;
00479 break;
00480 }
00481 case csbeam2d:{
00482 a=cs2dbeam[Mt->elements[eid].idcs].a;
00483 break;
00484 }
00485 case csbeam3d:{
00486 a=cs3dbeam[Mt->elements[eid].idcs].a;
00487 break;
00488 }
00489 default:{
00490 print_err("unknown cross section type is required",__FILE__,__LINE__,__func__);
00491 }
00492 }
00493 }
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507 void mechcrsec::give_mominer (long eid,double *i)
00508 {
00509 switch (Mt->elements[eid].crst){
00510 case nocrosssection:{
00511 break;
00512 }
00513 case csbeam2d:{
00514
00515 cs2dbeam[Mt->elements[eid].idcs].give_moments (i);
00516 break;
00517 }
00518 case csbeam3d:{
00519 cs3dbeam[Mt->elements[eid].idcs].give_moments (i);
00520 break;
00521 }
00522 default:{
00523 print_err("unknown cross section type is required",__FILE__,__LINE__,__func__);
00524 }
00525 }
00526 }
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541 void mechcrsec::give_shearcoeff (long eid,double *shearcoeff)
00542 {
00543 switch (Mt->elements[eid].crst){
00544 case nocrosssection:{
00545 break;
00546 }
00547 case csbeam2d:{
00548
00549 cs2dbeam[Mt->elements[eid].idcs].give_shearcoeff (shearcoeff);
00550 break;
00551 }
00552 case csbeam3d:{
00553 cs3dbeam[Mt->elements[eid].idcs].give_shearcoeff (shearcoeff);
00554 break;
00555 }
00556 default:{
00557 print_err("unknown cross section type is required",__FILE__,__LINE__,__func__);
00558 }
00559 }
00560 }
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575 void mechcrsec::give_vectorlcs (long eid,vector &vec)
00576 {
00577 switch (Mt->elements[eid].crst){
00578 case csbeam3d:{
00579 copyv(cs3dbeam[Mt->elements[eid].idcs].lcs,vec);
00580 break;
00581 }
00582 default:{
00583 print_err("unknown cross section type is required",__FILE__,__LINE__,__func__);
00584 }
00585 }
00586 }
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600 void mechcrsec::give_densityn (ivector &nod,vector &rho)
00601 {
00602 long i,n;
00603 n=nod.n;
00604 for (i=0;i<n;i++){
00605 switch (Mt->nodes[nod[i]].crst){
00606 case nocrosssection:{
00607 break;
00608 }
00609 case csbar2d:{
00610 break;
00611 }
00612 case csbeam2d:{
00613 break;
00614 }
00615 case csbeam3d:{
00616 break;
00617 }
00618 case csplanestr:{
00619 rho[i]=csplstr[Mt->nodes[nod[i]].idcs].rho;
00620 break;
00621 }
00622 case cs3dprob:{
00623 rho[i]=cs3d[Mt->nodes[nod[i]].idcs].rho;
00624 break;
00625 }
00626 case cslayer:{
00627 rho[i]=cslay[Mt->nodes[nod[i]].idcs].rho;
00628 break;
00629 }
00630 default:{
00631 print_err("unknown cross section type is required",__FILE__,__LINE__,__func__);
00632 }
00633 }
00634 }
00635 }
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649 void mechcrsec::give_densitye (long eid,double &rho)
00650 {
00651 switch (Mt->elements[eid].crst){
00652 case nocrosssection:{
00653 break;
00654 }
00655 case csbar2d:{
00656 rho=cs2dbar[Mt->elements[eid].idcs].rho;
00657 break;
00658 }
00659 case csbeam2d:{
00660 rho=cs2dbeam[Mt->elements[eid].idcs].rho;
00661 break;
00662 }
00663 case csbeam3d:{
00664 rho=cs3dbeam[Mt->elements[eid].idcs].rho;
00665 break;
00666 }
00667 case cs3dprob:{
00668 rho=cs3d[Mt->elements[eid].idcs].rho;
00669 break;
00670 }
00671 default:{
00672 print_err("unknown cross section type is required",__FILE__,__LINE__,__func__);
00673 }
00674 }
00675 }
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690 void mechcrsec::give_density (long eid,ivector &nodes,vector &dens)
00691 {
00692 long i,nne;
00693 double d;
00694
00695 if (Mt->elements[eid].crst==0){
00696 give_densityn (nodes,dens);
00697 }
00698 else{
00699 give_densitye (eid,d);
00700 nne = Mt->give_nne (eid);
00701 for (i=0;i<nne;i++){
00702 dens[i]=d;
00703 }
00704 }
00705 }
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720 double mechcrsec::give_weight (crsectype cr,long idcs)
00721 {
00722 double m;
00723
00724 switch (cr){
00725 case nocrosssection:{
00726 break;
00727 }
00728 case csbar2d:{
00729 break;
00730 }
00731 case csbeam2d:{
00732 break;
00733 }
00734 case csbeam3d:{
00735 break;
00736 }
00737 case csplanestr:{
00738 m=csplstr[idcs].m;
00739 break;
00740 }
00741 case csnodal:{
00742 m=csnod[idcs].m;
00743 }
00744 case cslayer:{
00745 m=cslay[idcs].m;
00746 break;
00747 }
00748 default:{
00749 print_err("unknown cross section type is required",__FILE__,__LINE__,__func__);
00750 }
00751 }
00752
00753 return m;
00754 }
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767 double* mechcrsec::give_layer_thicke (long eid)
00768 {
00769 double *t;
00770
00771 switch (Mt->elements[eid].crst){
00772 case cslayer:{
00773 t = cslay[Mt->elements[eid].idcs].layth;
00774 break;
00775 }
00776 default:
00777 print_err("unknown type of layered cross section is required", __FILE__, __LINE__, __func__);
00778 }
00779 return t;
00780 }
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793 double* mechcrsec::give_layer_zcoord (long eid)
00794 {
00795 double *z;
00796
00797 switch (Mt->elements[eid].crst){
00798 case cslayer:{
00799 z = cslay[Mt->elements[eid].idcs].layz;
00800 break;
00801 }
00802 default:
00803 print_err("unknown type of layered cross section is required", __FILE__, __LINE__, __func__);
00804 }
00805 return z;
00806 }
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818 long mechcrsec::give_num_lay (long eid)
00819 {
00820 long nl;
00821
00822 switch (Mt->elements[eid].crst){
00823 case cslayer:{
00824 nl = cslay[Mt->elements[eid].idcs].nl;
00825 break;
00826 }
00827 default:
00828 print_err("unknown type of layered cross section is required", __FILE__, __LINE__, __func__);
00829 }
00830 return nl;
00831 }