00001 #include "plelemqq.h"
00002 #include "plelemlq.h"
00003 #include "global.h"
00004 #include "globmat.h"
00005 #include "genfile.h"
00006 #include "adaptivity.h"
00007 #include "gadaptivity.h"
00008 #include "node.h"
00009 #include "intpoints.h"
00010 #include "element.h"
00011 #include "loadcase.h"
00012 #include <stdlib.h>
00013 #include <math.h>
00014
00015
00016
00017 planeelemqq::planeelemqq (void)
00018 {
00019 long i,j;
00020
00021
00022 nne=8;
00023
00024 ndofe=16;
00025
00026 tncomp=3;
00027
00028 gncomp=4;
00029
00030 napfun=2;
00031
00032 intordmm=4;
00033
00034 ned=4;
00035
00036 nned=3;
00037
00038 intordb=3;
00039
00040
00041 nb=1;
00042
00043
00044 ncomp = new long [nb];
00045 ncomp[0]=3;
00046
00047
00048 cncomp = new long [nb];
00049 cncomp[0]=0;
00050
00051
00052
00053 nip = new long* [nb];
00054 intordsm = new long* [nb];
00055 for (i=0;i<nb;i++){
00056 nip[i] = new long [nb];
00057 intordsm[i] = new long [nb];
00058 }
00059
00060 nip[0][0]=9;
00061
00062
00063 tnip=0;
00064 for (i=0;i<nb;i++){
00065 for (j=0;j<nb;j++){
00066 tnip+=nip[i][j];
00067 }
00068 }
00069
00070 intordsm[0][0]=3;
00071 }
00072
00073 planeelemqq::~planeelemqq (void)
00074 {
00075 long i;
00076
00077 for (i=0;i<nb;i++){
00078 delete [] nip[i];
00079 delete [] intordsm[i];
00080 }
00081 delete [] nip;
00082 delete [] intordsm;
00083
00084 delete [] cncomp;
00085 delete [] ncomp;
00086 }
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097 double planeelemqq::approx (double xi,double eta,vector &nodval)
00098 {
00099 double f;
00100 vector bf(nne);
00101
00102 bf_quad_4_2d (bf.a,xi,eta);
00103
00104 scprd (bf,nodval,f);
00105
00106 return f;
00107 }
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 void planeelemqq::bf_matrix (matrix &n,double xi,double eta)
00118 {
00119 long i,j,k;
00120 vector bf(nne);
00121
00122 fillm (0.0,n);
00123
00124 bf_quad_4_2d (bf.a,xi,eta);
00125
00126 j=0; k=1;
00127 for (i=0;i<nne;i++){
00128 n[0][j]=bf[i];
00129 n[1][k]=bf[i];
00130 j+=2; k+=2;
00131 }
00132 }
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145 void planeelemqq::geom_matrix (matrix &gm,vector &x,vector &y,double xi,double eta,double &jac)
00146 {
00147 long i,i1,i2;
00148 vector dx(nne),dy(nne);
00149
00150 dx_bf_quad_4_2d (dx.a,xi,eta);
00151 dy_bf_quad_4_2d (dy.a,xi,eta);
00152
00153 derivatives_2d (dx,dy,jac,x,y,xi,eta);
00154
00155 fillm (0.0,gm);
00156
00157 i1=0; i2=1;
00158 for (i=0;i<nne;i++){
00159 gm[0][i1]=dx[i];
00160 gm[1][i2]=dy[i];
00161 gm[2][i1]=dy[i];
00162 gm[2][i2]=dx[i];
00163 i1+=2; i2+=2;
00164 }
00165 }
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176 void planeelemqq::transf_matrix (ivector &nodes,matrix &tmat)
00177 {
00178 long i,n,m;
00179
00180 fillm (0.0,tmat);
00181
00182 n=nodes.n;
00183 m=tmat.m;
00184 for (i=0;i<m;i++){
00185 tmat[i][i]=1.0;
00186 }
00187
00188 for (i=0;i<n;i++){
00189 if (Mt->nodes[nodes[i]].transf>0){
00190 tmat[i*2][i*2] = Mt->nodes[nodes[i]].e1[0]; tmat[i*2][i*2+1] = Mt->nodes[nodes[i]].e2[0];
00191 tmat[i*2+1][i*2] = Mt->nodes[nodes[i]].e1[1]; tmat[i*2+1][i*2+1] = Mt->nodes[nodes[i]].e2[1];
00192 }
00193 }
00194 }
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210 void planeelemqq::stiffness_matrix (long eid,long ri,long ci,matrix &sm,vector &x,vector &y)
00211 {
00212 long i,j,ii,jj,ipp;
00213 double xi,eta,jac,thick;
00214 ivector nodes(nne);
00215 vector w,gp,t(nne);
00216 matrix d(tncomp,tncomp),gm(tncomp,ndofe);
00217
00218
00219 Mt->give_elemnodes (eid,nodes);
00220
00221 Mc->give_thickness (eid,nodes,t);
00222
00223 fillm (0.0,sm);
00224
00225 for (ii=0;ii<nb;ii++){
00226 for (jj=0;jj<nb;jj++){
00227 if (intordsm[ii][jj]==0) continue;
00228 allocv (intordsm[ii][jj],w);
00229 allocv (intordsm[ii][jj],gp);
00230 gauss_points (gp.a,w.a,intordsm[ii][jj]);
00231
00232 ipp=Mt->elements[eid].ipp[ri+ii][ci+jj];
00233
00234 for (i=0;i<intordsm[ii][jj];i++){
00235 xi=gp[i];
00236 for (j=0;j<intordsm[ii][jj];j++){
00237 eta=gp[j];
00238
00239
00240 geom_matrix (gm,x,y,xi,eta,jac);
00241
00242
00243 Mm->matstiff (d,ipp);
00244
00245 thick = approx (xi,eta,t);
00246
00247 jac*=thick*w[i]*w[j];
00248
00249
00250 bdbj (sm.a,gm.a,d.a,jac,gm.m,gm.n);
00251
00252 ipp++;
00253 }
00254 }
00255 destrv (gp); destrv (w);
00256 }
00257 }
00258
00259 }
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270 void planeelemqq::res_stiffness_matrix (long eid,matrix &sm)
00271 {
00272 long transf;
00273 ivector nodes(nne);
00274 vector x(nne),y(nne);
00275 matrix tmat (ndofe,ndofe);
00276
00277 Mt->give_node_coord2d (x,y,eid);
00278
00279 stiffness_matrix (eid,0,0,sm,x,y);
00280
00281
00282
00283 Mt->give_elemnodes (eid,nodes);
00284 transf = Mt->locsystems (nodes);
00285 if (transf>0){
00286 transf_matrix (nodes,tmat);
00287 glmatrixtransf (sm,tmat);
00288 }
00289 }
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304 void planeelemqq::mass_matrix (long eid,matrix &mm,vector &x,vector &y)
00305 {
00306 long i,j;
00307 double jac,xi,eta,w1,w2,thick,rho;
00308 ivector nodes(nne);
00309 vector w(intordmm),gp(intordmm),t(nne),dens(nne);
00310 matrix n(napfun,ndofe);
00311
00312
00313 Mt->give_elemnodes (eid,nodes);
00314
00315 Mc->give_thickness (eid,nodes,t);
00316
00317 Mc->give_density (eid,nodes,dens);
00318
00319 gauss_points (gp.a,w.a,intordmm);
00320
00321 fillm (0.0,mm);
00322
00323 for (i=0;i<intordmm;i++){
00324 xi=gp[i]; w1=w[i];
00325 for (j=0;j<intordmm;j++){
00326 eta=gp[j]; w2=w[i];
00327 jac_2d (jac,x,y,xi,eta);
00328
00329
00330 bf_matrix (n,xi,eta);
00331
00332
00333 thick = approx (xi,eta,t);
00334
00335 rho = approx (xi,eta,dens);
00336 jac*=w1*w2*thick*rho;
00337
00338 nnj (mm.a,n.a,jac,n.m,n.n);
00339 }
00340 }
00341
00342 }
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353 void planeelemqq::res_mass_matrix (long eid,matrix &mm)
00354 {
00355 long transf;
00356 ivector nodes(nne);
00357 vector x(nne),y(nne);
00358
00359 Mt->give_node_coord2d (x,y,eid);
00360 mass_matrix (eid,mm,x,y);
00361
00362
00363
00364 Mt->give_elemnodes (eid,nodes);
00365 transf = Mt->locsystems (nodes);
00366 if (transf>0){
00367 matrix tmat (ndofe,ndofe);
00368 transf_matrix (nodes,tmat);
00369 glmatrixtransf (mm,tmat);
00370 }
00371 }
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388 void planeelemqq::load_matrix (long eid,matrix &lm,vector &x,vector &y)
00389 {
00390 long i,j;
00391 double jac,xi,eta,w1,w2,thick;
00392 ivector nodes(nne);
00393 vector w(intordmm),gp(intordmm),t(nne);
00394 matrix n(napfun,ndofe);
00395
00396
00397 Mt->give_elemnodes (eid,nodes);
00398
00399 Mc->give_thickness (eid,nodes,t);
00400
00401 gauss_points (gp.a,w.a,intordmm);
00402
00403 fillm (0.0,lm);
00404
00405 for (i=0;i<intordmm;i++){
00406 xi=gp[i]; w1=w[i];
00407 for (j=0;j<intordmm;j++){
00408 eta=gp[j]; w2=w[j];
00409
00410 jac_2d (jac,x,y,xi,eta);
00411
00412
00413 bf_matrix (n,xi,eta);
00414
00415
00416 thick = approx (xi,eta,t);
00417 jac*=w1*w2*thick;
00418
00419 nnj (lm.a,n.a,jac,n.m,n.n);
00420 }
00421 }
00422
00423 }
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434 void planeelemqq::res_load_matrix (long eid,matrix &lm)
00435 {
00436 long transf;
00437 ivector nodes(nne);
00438 vector x(nne),y(nne);
00439
00440 Mt->give_node_coord2d (x,y,eid);
00441
00442 load_matrix (eid,lm,x,y);
00443
00444
00445
00446 Mt->give_elemnodes (eid,nodes);
00447 transf = Mt->locsystems (nodes);
00448 if (transf>0){
00449 matrix tmat (ndofe,ndofe);
00450 transf_matrix (nodes,tmat);
00451 glmatrixtransf (lm,tmat);
00452 }
00453
00454 }
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464 void planeelemqq::res_ip_strains (long lcid,long eid)
00465 {
00466 long transf;
00467 vector x(nne),y(nne),r(ndofe),aux(ndofe);
00468 ivector nodes(nne);
00469 matrix tmat(ndofe,ndofe);
00470
00471 Mt->give_node_coord2d (x,y,eid);
00472 Mt->give_elemnodes (eid,nodes);
00473 eldispl (lcid,eid,r.a);
00474
00475
00476
00477 transf = Mt->locsystems (nodes);
00478 if (transf>0){
00479 transf_matrix (nodes,tmat);
00480 lgvectortransf (aux,r,tmat);
00481 copyv (aux,r);
00482 }
00483
00484 ip_strains (lcid,eid,0,0,x,y,r);
00485 }
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502 void planeelemqq::ip_strains (long lcid,long eid,long ri,long ci,vector &x,vector &y,vector &r)
00503 {
00504 long i,j,ipp;
00505 double xi,eta,jac;
00506 vector gp,w,eps;
00507 matrix gm;
00508
00509 allocv (intordsm[0][0],gp);
00510 allocv (intordsm[0][0],w);
00511 allocv (ncomp[0],eps);
00512 allocm (ncomp[0],ndofe,gm);
00513
00514 gauss_points (gp.a,w.a,intordsm[0][0]);
00515
00516 ipp=Mt->elements[eid].ipp[ri][ci];
00517 for (i=0;i<intordsm[0][0];i++){
00518 xi=gp[i];
00519 for (j=0;j<intordsm[0][0];j++){
00520 eta=gp[j];
00521
00522
00523 geom_matrix (gm,x,y,xi,eta,jac);
00524
00525 mxv (gm,r,eps);
00526
00527 Mm->storestrain (lcid,ipp,eps);
00528 ipp++;
00529 }
00530 }
00531
00532 destrm (gm); destrv (eps); destrv (w); destrv (gp);
00533 }
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545 void planeelemqq::nod_strains_ip (long lcid,long eid,long ri,long ci)
00546 {
00547 long i,j;
00548 ivector ipnum(nne),nod(nne);
00549 vector eps(gncomp);
00550
00551
00552 nodipnum (eid,ri,ci,ipnum);
00553
00554
00555 Mt->give_elemnodes (eid,nod);
00556
00557 for (i=0;i<nne;i++){
00558
00559 Mm->givestrain (lcid,ipnum[i],eps);
00560
00561
00562 j=nod[i];
00563 Mt->nodes[j].storestrain (lcid,0,eps);
00564 }
00565
00566 }
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578 void planeelemqq::strains (long lcid,long eid,long ri,long ci)
00579 {
00580 vector coord,eps;
00581
00582 switch (Mm->stra.tape[eid]){
00583 case nowhere:{
00584 break;
00585 }
00586 case intpts:{
00587
00588 break;
00589 }
00590 case enodes:{
00591 nod_strains_ip (lcid,eid,ri,ci);
00592 break;
00593 }
00594 case userdefined:{
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615 break;
00616 }
00617 default:{
00618 fprintf (stderr,"\n\n unknown strain point is required in function planeelemqq::strains (file %s, line %d).\n",__FILE__,__LINE__);
00619 }
00620 }
00621
00622 }
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634 void planeelemqq::nodipnum (long eid,long ri,long ci,ivector &ipnum)
00635 {
00636 long i,j;
00637
00638 j=intordsm[0][0];
00639 i=Mt->elements[eid].ipp[ri][ci];
00640
00641 ipnum[0]=i+8;
00642 ipnum[1]=i+2;
00643 ipnum[2]=i+0;
00644 ipnum[3]=i+6;
00645 ipnum[4]=i+5;
00646 ipnum[5]=i+1;
00647 ipnum[6]=i+3;
00648 ipnum[7]=i+7;
00649
00650 }
00651
00652
00653
00654
00655
00656
00657 void planeelemqq::res_ip_stresses (long lcid,long eid)
00658 {
00659
00660 }
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671 void planeelemqq::ip_stresses (long lcid,long eid,long ri,long ci)
00672 {
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717 }
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729 void planeelemqq::nod_stresses_ip (long lcid,long eid,long ri,long ci)
00730 {
00731 long i,j;
00732 ivector ipnum(nne),nod(nne);
00733 vector sig(gncomp);
00734
00735
00736 nodipnum (eid,ri,ci,ipnum);
00737
00738
00739 Mt->give_elemnodes (eid,nod);
00740
00741 for (i=0;i<nne;i++){
00742
00743 Mm->givestress (lcid,ipnum[i],sig);
00744
00745
00746 j=nod[i];
00747 Mt->nodes[j].storestress (lcid,0,sig);
00748 }
00749
00750 }
00751
00752
00753 void planeelemqq::stresses (long lcid,long eid,long ri,long ci)
00754 {
00755 vector coord,sig;
00756
00757 switch (Mm->stre.tape[eid]){
00758 case nowhere:{
00759 break;
00760 }
00761 case intpts:{
00762
00763 break;
00764 }
00765 case enodes:{
00766 nod_stresses_ip (lcid,eid,ri,ci);
00767 break;
00768 }
00769 case userdefined:{
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790 break;
00791 }
00792 default:{
00793 fprintf (stderr,"\n\n unknown stress point is required in function planeelemlq::stresses (%s, line %d).\n",__FILE__,__LINE__);
00794 }
00795 }
00796
00797
00798 }
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808 void planeelemqq::nod_eqother_ip (long eid,long ri,long ci)
00809 {
00810 long i,j,ncompo;
00811 ivector ipnum(nne),nod(nne);
00812 vector eqother;
00813
00814
00815 nodipnum (eid,ri,ci,ipnum);
00816
00817
00818 Mt->give_elemnodes (eid,nod);
00819
00820 for (i=0;i<nne;i++){
00821
00822
00823
00824 ncompo = Mm->givencompeqother (ipnum[i],0);
00825 allocv (ncompo,eqother);
00826 Mm->giveeqother (ipnum[i],0,ncompo,eqother.a);
00827
00828
00829 j=nod[i];
00830 Mt->nodes[j].storeother (0,ncompo,eqother);
00831
00832 destrv (eqother);
00833 }
00834 }
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852 void planeelemqq::internal_forces (long lcid,long eid,long ri,long ci,vector &ifor,vector &x,vector &y)
00853 {
00854 integratedquant iq;
00855 iq=locstress;
00856
00857
00858 compute_nlstress (lcid,eid,ri,ci);
00859
00860
00861 elem_integration (iq,lcid,eid,ri,ci,ifor,x,y);
00862 }
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881 void planeelemqq::nonloc_internal_forces (long lcid,long eid,long ri,long ci,vector &ifor,vector &x,vector &y)
00882 {
00883 integratedquant iq;
00884 iq=nonlocstress;
00885
00886
00887 compute_nonloc_nlstress (lcid,eid,ri,ci);
00888
00889
00890 elem_integration (iq,lcid,eid,ri,ci,ifor,x,y);
00891 }
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906 void planeelemqq::incr_internal_forces (long lcid,long eid,long ri,long ci,vector &ifor,vector &x,vector &y)
00907 {
00908 integratedquant iq;
00909 iq=stressincr;
00910
00911
00912 compute_nlstressincr (lcid,eid,ri,ci);
00913
00914
00915 elem_integration (iq,lcid,eid,ri,ci,ifor,x,y);
00916 }
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935 void planeelemqq::eigstrain_forces (long lcid,long eid,long ri,long ci,vector &nfor,vector &x,vector &y)
00936 {
00937 integratedquant iq;
00938 iq=eigstress;
00939
00940
00941 if (Mp->eigstrcomp)
00942 compute_eigstress (lcid,eid,ri,ci);
00943
00944
00945 elem_integration (iq,lcid,eid,ri,ci,nfor,x,y);
00946 }
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959 void planeelemqq::res_internal_forces (long lcid,long eid,vector &ifor)
00960 {
00961 long transf;
00962 ivector nodes (nne);
00963 vector v(ndofe),x(nne),y(nne);
00964
00965 Mt->give_node_coord2d (x,y,eid);
00966
00967 internal_forces (lcid,eid,0,0,ifor,x,y);
00968
00969
00970
00971 Mt->give_elemnodes (eid,nodes);
00972 transf = Mt->locsystems (nodes);
00973 if (transf>0){
00974 matrix tmat (ndofe,ndofe);
00975 transf_matrix (nodes,tmat);
00976
00977 glvectortransf (ifor,v,tmat);
00978 copyv (v,ifor);
00979 }
00980
00981 }
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994 void planeelemqq::res_nonloc_internal_forces (long lcid,long eid,vector &ifor)
00995 {
00996 long transf;
00997 ivector nodes (nne);
00998 vector v(ndofe),x(nne),y(nne);
00999
01000 Mt->give_node_coord2d (x,y,eid);
01001
01002 nonloc_internal_forces (lcid,eid,0,0,ifor,x,y);
01003
01004
01005
01006 Mt->give_elemnodes (eid,nodes);
01007 transf = Mt->locsystems (nodes);
01008 if (transf>0){
01009 matrix tmat (ndofe,ndofe);
01010 transf_matrix (nodes,tmat);
01011
01012 glvectortransf (ifor,v,tmat);
01013 copyv (v,ifor);
01014 }
01015 }
01016
01017
01018
01019
01020
01021
01022
01023
01024
01025
01026
01027
01028 void planeelemqq::res_incr_internal_forces (long lcid,long eid,vector &ifor)
01029 {
01030 long transf;
01031 ivector nodes (nne);
01032 vector v(ndofe),x(nne),y(nne);
01033
01034 Mt->give_node_coord2d (x,y,eid);
01035
01036 incr_internal_forces (lcid,eid,0,0,ifor,x,y);
01037
01038
01039
01040 Mt->give_elemnodes (eid,nodes);
01041 transf = Mt->locsystems (nodes);
01042 if (transf>0){
01043 matrix tmat (ndofe,ndofe);
01044 transf_matrix (nodes,tmat);
01045
01046 glvectortransf (ifor,v,tmat);
01047 copyv (v,ifor);
01048 }
01049 }
01050
01051
01052
01053
01054
01055
01056
01057
01058
01059
01060
01061
01062
01063 void planeelemqq::res_eigstrain_forces (long lcid,long eid,vector &nfor)
01064 {
01065 long transf;
01066 ivector nodes (nne);
01067 vector v(ndofe),x(nne),y(nne);
01068
01069 Mt->give_node_coord2d (x,y,eid);
01070
01071 eigstrain_forces (lcid,eid,0,0,nfor,x,y);
01072
01073
01074
01075 Mt->give_elemnodes (eid,nodes);
01076 transf = Mt->locsystems (nodes);
01077 if (transf>0){
01078 matrix tmat (ndofe,ndofe);
01079 transf_matrix (nodes,tmat);
01080
01081 glvectortransf (nfor,v,tmat);
01082 copyv (v,nfor);
01083 }
01084 }
01085
01086
01087
01088
01089
01090
01091
01092
01093
01094
01095
01096
01097 void planeelemqq::compute_nlstress (long lcid,long eid,long ri,long ci)
01098 {
01099 long i,j,ipp;
01100
01101 ipp=Mt->elements[eid].ipp[ri][ci];
01102
01103 for (i=0;i<intordsm[0][0];i++){
01104 for (j=0;j<intordsm[0][0];j++){
01105
01106
01107 if (Mp->strcomp==1)
01108 Mm->computenlstresses (ipp);
01109
01110 ipp++;
01111 }
01112 }
01113 }
01114
01115
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126 void planeelemqq::compute_nlstressincr (long lcid,long eid,long ri,long ci)
01127 {
01128 long i,j,ipp;
01129
01130 ipp=Mt->elements[eid].ipp[ri][ci];
01131
01132 for (i=0;i<intordsm[0][0];i++){
01133 for (j=0;j<intordsm[0][0];j++){
01134
01135
01136 if (Mp->strcomp==1)
01137 Mm->computenlstressesincr (ipp);
01138 ipp++;
01139 }
01140 }
01141 }
01142
01143
01144
01145
01146
01147
01148
01149
01150
01151
01152
01153
01154
01155 void planeelemqq::local_values (long lcid,long eid,long ri,long ci)
01156 {
01157 long i,j,ipp;
01158
01159 ipp=Mt->elements[eid].ipp[ri][ci];
01160
01161 for (i=0;i<intordsm[0][0];i++){
01162 for (j=0;j<intordsm[0][0];j++){
01163
01164
01165 if (Mp->strcomp==1)
01166 Mm->computenlstresses (ipp);
01167
01168 ipp++;
01169 }
01170 }
01171 }
01172
01173
01174
01175
01176
01177
01178
01179
01180
01181
01182
01183
01184 void planeelemqq::compute_nonloc_nlstress (long lcid,long eid,long ri,long ci)
01185 {
01186 long i,j,ipp;
01187
01188 ipp=Mt->elements[eid].ipp[ri][ci];
01189
01190 for (i=0;i<intordsm[0][0];i++){
01191 for (j=0;j<intordsm[0][0];j++){
01192
01193
01194 if (Mp->strcomp==1)
01195 Mm->compnonloc_nlstresses (ipp);
01196
01197 ipp++;
01198 }
01199 }
01200 }
01201
01202
01203
01204
01205
01206
01207
01208
01209
01210
01211
01212
01213 void planeelemqq::compute_eigstress (long lcid,long eid,long ri,long ci)
01214 {
01215 long i,j,ipp;
01216 vector eigstr(tncomp),sig(tncomp);
01217 matrix d(tncomp,tncomp);
01218
01219 ipp=Mt->elements[eid].ipp[ri][ci];
01220
01221 for (i=0;i<intordsm[0][0];i++){
01222 for (j=0;j<intordsm[0][0];j++){
01223
01224 Mm->giveeigstrain (ipp,eigstr);
01225
01226
01227 Mm->matstiff (d,ipp);
01228
01229 mxv (d,eigstr,sig);
01230
01231 Mm->storeeigstress (ipp,sig);
01232
01233 ipp++;
01234 }
01235 }
01236 }
01237
01238
01239
01240
01241
01242
01243
01244
01245
01246
01247
01248
01249
01250
01251
01252
01253
01254 void planeelemqq::elem_integration (integratedquant iq,long lcid,long eid,long ri,long ci,vector &nv,vector &x,vector &y)
01255 {
01256 long i,j,ipp;
01257 double xi,eta,jac,thick;
01258 ivector nodes(nne);
01259 vector w,gp,t(nne),ipv(tncomp),contr(ndofe);
01260 matrix gm(tncomp,ndofe);
01261
01262 Mc->give_thickness (eid,nodes,t);
01263
01264 fillv (0.0,nv);
01265
01266 allocv (intordsm[0][0],gp);
01267 allocv (intordsm[0][0],w);
01268
01269 gauss_points (gp.a,w.a,intordsm[0][0]);
01270 ipp=Mt->elements[eid].ipp[ri][ci];
01271
01272 for (i=0;i<intordsm[0][0];i++){
01273 xi=gp[i];
01274 for (j=0;j<intordsm[0][0];j++){
01275 eta=gp[j];
01276 thick = approx (xi,eta,t);
01277
01278
01279 Mm->givequantity (iq,lcid,ipp,cncomp[0],ipv);
01280
01281
01282 geom_matrix (gm,x,y,xi,eta,jac);
01283
01284
01285 mtxv (gm,ipv,contr);
01286
01287 cmulv (jac*w[i]*w[j]*thick,contr);
01288
01289
01290 addv(contr,nv,nv);
01291
01292 ipp++;
01293 }
01294 }
01295 destrv (w); destrv (gp);
01296 }
01297
01298
01299
01300
01301
01302
01303
01304
01305
01306
01307
01308
01309
01310 void planeelemqq::ipcoord (long eid,long ipp,long ri,long ci,vector &coord)
01311 {
01312 long i,j,ii;
01313 double xi,eta;
01314 vector x(nne),y(nne),w(intordsm[ri][ci]),gp(intordsm[ri][ci]);
01315
01316 gauss_points (gp.a,w.a,intordsm[ri][ci]);
01317 Mt->give_node_coord2d (x,y,eid);
01318 ii=Mt->elements[eid].ipp[ri][ci];
01319
01320 for (i=0;i<intordsm[ri][ci];i++){
01321 xi=gp[i];
01322 for (j=0;j<intordsm[ri][ci];j++){
01323 eta=gp[j];
01324 if (ii==ipp){
01325 coord[0]=approx (xi,eta,x);
01326 coord[1]=approx (xi,eta,y);
01327 coord[2]=0.0;
01328 }
01329 ii++;
01330 }
01331 }
01332 }
01333
01334
01335
01336
01337
01338
01339
01340
01341
01342
01343
01344 void planeelemqq::ipcoordblock (long eid,long ri,long ci,double **coord)
01345 {
01346 long i,j,k;
01347 double xi,eta;
01348 vector x(nne),y(nne),w(intordsm[ri][ci]),gp(intordsm[ri][ci]);
01349
01350 gauss_points (gp.a,w.a,intordsm[ri][ci]);
01351 Mt->give_node_coord2d (x,y,eid);
01352
01353 k=0;
01354 for (i=0;i<intordsm[ri][ci];i++){
01355 xi=gp[i];
01356 for (j=0;j<intordsm[ri][ci];j++){
01357 eta=gp[j];
01358
01359 coord[k][0]=approx (xi,eta,x);
01360 coord[k][1]=approx (xi,eta,y);
01361 coord[k++][2]=0.0;
01362 }
01363 }
01364 }
01365
01366
01367
01368
01369
01370
01371
01372
01373
01374
01375
01376
01377
01378
01379 void planeelemqq::res_nodeforces (long eid,long *le,double *nv,vector &nf)
01380 {
01381 vector x(nne),y(nne);
01382 Mt->give_node_coord2d (x,y,eid);
01383 nodeforces (eid,le,nv,nf,x,y);
01384 }
01385
01386
01387
01388
01389
01390
01391
01392
01393
01394
01395
01396
01397
01398
01399
01400
01401
01402
01403 void planeelemqq::nodeforces (long eid,long *le,double *nv,vector &nf,vector &x,vector &y)
01404 {
01405 long i;
01406 double ww,jac,xi,eta;
01407 vector gp(intordb),w(intordb),av(ndofe),v(ndofe);
01408 matrix n(napfun,ndofe),am(ndofe,ndofe);
01409
01410
01411 gauss_points (gp.a,w.a,intordb);
01412
01413 if (le[0]==1){
01414
01415 fillm (0.0,am);
01416 eta = 1.0;
01417 for (i=0;i<intordb;i++){
01418 xi = gp[i];
01419 ww = w[i];
01420
01421 bf_matrix (n,xi,eta);
01422
01423 jac1d_2d (jac,x,y,xi,0);
01424 jac *= ww;
01425
01426 nnj (am.a,n.a,jac,n.m,n.n);
01427 }
01428 fillv (0.0,av);
01429 av[0]=nv[0]; av[1]=nv[1]; av[8]=nv[2]; av[9]=nv[3]; av[2]=nv[4]; av[3]=nv[5];
01430 mxv (am,av,v); addv (nf,v,nf);
01431 }
01432 if (le[1]==1){
01433
01434 fillm (0.0,am);
01435 xi = -1.0;
01436 for (i=0;i<intordb;i++){
01437 eta = gp[i];
01438 ww = w[i];
01439
01440 bf_matrix (n,xi,eta);
01441
01442 jac1d_2d (jac,x,y,eta,1);
01443 jac *= ww;
01444
01445 nnj (am.a,n.a,jac,n.m,n.n);
01446 }
01447 fillv (0.0,av);
01448 av[2]=nv[6]; av[3]=nv[7]; av[10]=nv[8]; av[11]=nv[9]; av[4]=nv[10]; av[5]=nv[11];
01449 mxv (am,av,v); addv (nf,v,nf);
01450 }
01451 if (le[2]==1){
01452
01453 fillm (0.0,am);
01454 eta = -1.0;
01455 for (i=0;i<intordb;i++){
01456 xi = gp[i];
01457 ww = w[i];
01458
01459 bf_matrix (n,xi,eta);
01460
01461 jac1d_2d (jac,x,y,xi,2);
01462 jac *= ww;
01463
01464 nnj (am.a,n.a,jac,n.m,n.n);
01465 }
01466 fillv (0.0,av);
01467 av[4]=nv[12]; av[5]=nv[13]; av[12]=nv[14]; av[13]=nv[15]; av[6]=nv[16]; av[7]=nv[17];
01468 mxv (am,av,v); addv (nf,v,nf);
01469 }
01470 if (le[3]==1){
01471
01472 fillm (0.0,am);
01473 xi = 1.0;
01474 for (i=0;i<intordb;i++){
01475 eta = gp[i];
01476 ww = w[i];
01477
01478 bf_matrix (n,xi,eta);
01479
01480 jac1d_2d (jac,x,y,eta,3);
01481 jac *= ww;
01482
01483 nnj (am.a,n.a,jac,n.m,n.n);
01484 }
01485 fillv (0.0,av);
01486 av[6]=nv[18]; av[7]=nv[19]; av[14]=nv[20]; av[15]=nv[21]; av[0]=nv[22]; av[1]=nv[23];
01487 mxv (am,av,v); addv (nf,v,nf);
01488 }
01489 }
01490
01491
01492
01493
01494
01495
01496
01497
01498
01499
01500
01501 void planeelemqq::midpoints (long eid,long dd,double *valel)
01502 {
01503 long i,j,lcid;
01504 double r[2];
01505 vector nodval(nne),der(tncomp);
01506 ivector nodes(nne);
01507
01508 lcid = 0;
01509 Mt->give_elemnodes (eid,nodes);
01510
01511 for (i=0;i<2;i++){
01512 for (j=0;j<nne;j++){
01513 noddispl (lcid,r,nodes[j]);
01514 nodval[j] = r[i];
01515 }
01516 valel[i] = approx (0.0,0.0,nodval);
01517 if (dd) valel[i+2] = valel[i];
01518 }
01519
01520
01521 for (i=0;i<tncomp;i++)
01522 valel[i+2*(1+dd)] = der[i];
01523
01524
01525 for (i=0;i<tncomp;i++)
01526 valel[i+2*(1+dd)+tncomp] = der[i];
01527 }
01528
01529
01530
01531
01532
01533
01534
01535
01536
01537
01538
01539
01540
01541
01542
01543
01544
01545
01546
01547
01548
01549
01550
01551
01552
01553 void planeelemqq::inicipval(long eid, long ri, long ci, matrix &nodval, inictype *ictn)
01554 {
01555 long i, j, k, l, ipp;
01556 long ii, jj, nv = nodval.n;
01557 double xi, eta, ipval;
01558 vector w, gp, anv(nne);
01559 long nstra, nstre, ncompstr, ncompeqother;
01560 long idstra, idstre, idoth, idic;
01561 inictype ict;
01562
01563 nstra = idstra = nstre = idstre = idoth = idic = 0;
01564
01565 ict = ictn[0];
01566 for (i=0; i<nne; i++)
01567 {
01568 if (ictn[i] != ict)
01569 {
01570 print_err("Incompatible types of initial conditions on element %ld\n"
01571 " at %ld. and %ld. nodes", __FILE__, __LINE__, __func__, eid+1, 1, i+1);
01572 abort();
01573 }
01574 }
01575 for (j = 0; j < nv; j++)
01576 {
01577 for(i = 0; i < nne; i++)
01578 anv[i] = nodval[i][j];
01579 for (ii = 0; ii < nb; ii++)
01580 {
01581 for (jj = 0; jj < nb; jj++)
01582 {
01583 ipp=Mt->elements[eid].ipp[ri+ii][ci+jj];
01584 if (intordsm[ii][jj] == 0)
01585 continue;
01586 allocv (intordsm[ii][jj],gp);
01587 allocv (intordsm[ii][jj],w);
01588 gauss_points (gp.a,w.a,intordsm[ii][jj]);
01589 for (k = 0; k < intordsm[ii][jj]; k++)
01590 {
01591 xi=gp[k];
01592 for (l = 0; l < intordsm[ii][jj]; l++)
01593 {
01594 eta=gp[l];
01595
01596 ipval = approx (xi,eta,anv);
01597 ncompstr = Mm->ip[ipp].ncompstr;
01598 ncompeqother = Mm->ip[ipp].ncompeqother;
01599 if ((ictn[0] & inistrain) && (j < ncompstr))
01600 {
01601 Mm->ip[ipp].strain[idstra] += ipval;
01602 ipp++;
01603 continue;
01604 }
01605 if ((ictn[0] & inistress) && (j < nstra + ncompstr))
01606 {
01607 Mm->ip[ipp].stress[idstre] += ipval;
01608 ipp++;
01609 continue;
01610 }
01611 if ((ictn[0] & iniother) && (j < nstra+nstre+ncompeqother))
01612 {
01613 Mm->ip[ipp].eqother[idoth] += ipval;
01614 ipp++;
01615 continue;
01616 }
01617 if ((ictn[0] & inicond) && (j < nv))
01618 {
01619 if (Mm->ic[ipp] == NULL)
01620 {
01621 Mm->ic[ipp] = new double[nv-j];
01622 memset(Mm->ic[ipp], 0, sizeof(*Mm->ic[ipp])*(nv-j));
01623 }
01624 Mm->ic[ipp][idic] += ipval;
01625 ipp++;
01626 continue;
01627 }
01628 ipp++;
01629 }
01630 }
01631 destrv (gp); destrv (w);
01632 }
01633 }
01634 ipp=Mt->elements[eid].ipp[ri][ci];
01635 ncompstr = Mm->ip[ipp].ncompstr;
01636 ncompeqother = Mm->ip[ipp].ncompeqother;
01637 if ((ictn[0] & inistrain) && (j < ncompstr))
01638 {
01639 nstra++;
01640 idstra++;
01641 continue;
01642 }
01643 if ((ictn[0] & inistress) && (j < nstra + ncompstr))
01644 {
01645 nstre++;
01646 idstre++;
01647 continue;
01648 }
01649 if ((ictn[0] & iniother) && (j < nstra + nstre + ncompeqother))
01650 {
01651 idoth++;
01652 continue;
01653 }
01654 if ((ictn[0] & inicond) && (j < nv))
01655 {
01656 idic++;
01657 continue;
01658 }
01659 }
01660 }
01661
01662
01663
01664
01665
01666
01667
01668
01669
01670 void planeelemqq::ipvolume (long eid,long ri,long ci)
01671 {
01672 long i,j,ii,jj,ipp;
01673 double xi,eta,jac,thick;
01674 ivector nodes(nne);
01675 vector x(nne),y(nne),t(nne),w,gp;
01676
01677
01678 Mt->give_elemnodes (eid,nodes);
01679
01680 Mc->give_thickness (eid,nodes,t);
01681 Mt->give_node_coord2d (x,y,eid);
01682
01683 for (ii=0;ii<nb;ii++){
01684 for (jj=0;jj<nb;jj++){
01685 if (intordsm[ii][jj]==0) continue;
01686
01687 allocv (intordsm[ii][jj],w);
01688 allocv (intordsm[ii][jj],gp);
01689
01690 gauss_points (gp.a,w.a,intordsm[ii][jj]);
01691
01692 ipp=Mt->elements[eid].ipp[ri+ii][ci+jj];
01693
01694 for (i=0;i<intordsm[ii][jj];i++){
01695 xi=gp[i];
01696 for (j=0;j<intordsm[ii][jj];j++){
01697 eta=gp[j];
01698
01699 thick = approx (xi,eta,t);
01700 jac_2d (jac,x,y,xi,eta);
01701 jac*=w[i]*w[j]*thick;
01702
01703 Mm->storeipvol (ipp,jac);
01704
01705 ipp++;
01706 }
01707 }
01708 destrv (gp); destrv (w);
01709 }
01710 }
01711 }
01712
01713
01714
01715
01716
01717
01718
01719
01720
01721
01722
01723 void planeelemqq::intpointval (long eid,vector &nodval,vector &ipval)
01724 {
01725 long i,j,ii,jj,k;
01726 double xi,eta;
01727 vector w,gp;
01728
01729 k=0;
01730 for (ii=0;ii<nb;ii++){
01731 for (jj=0;jj<nb;jj++){
01732 if (intordsm[ii][jj]==0) continue;
01733
01734 allocv (intordsm[ii][jj],w);
01735 allocv (intordsm[ii][jj],gp);
01736
01737 gauss_points (gp.a,w.a,intordsm[ii][jj]);
01738
01739 for (i=0;i<intordsm[ii][jj];i++){
01740 xi=gp[i];
01741 for (j=0;j<intordsm[ii][jj];j++){
01742 eta=gp[j];
01743
01744 ipval[k]=approx (xi,eta,nodval);
01745 k++;
01746 }
01747 }
01748
01749 destrv (w);
01750 destrv (gp);
01751 }
01752 }
01753 }
01754
01755
01756
01757
01758
01759
01760
01761
01762
01763
01764
01765 void planeelemqq::intpointval2 (long eid,vector &nodval,vector &ipval)
01766 {
01767 long i,j,ii,jj,k;
01768 double xi,eta;
01769 vector w,gp;
01770 vector modnodval(Pelq->nne);
01771
01772 for (i=0;i<Pelq->nne;i++){
01773 modnodval[i]=nodval[i];
01774 }
01775
01776 k=0;
01777 for (ii=0;ii<nb;ii++){
01778 for (jj=0;jj<nb;jj++){
01779 if (intordsm[ii][jj]==0) continue;
01780
01781 allocv (intordsm[ii][jj],w);
01782 allocv (intordsm[ii][jj],gp);
01783
01784 gauss_points (gp.a,w.a,intordsm[ii][jj]);
01785
01786 for (i=0;i<intordsm[ii][jj];i++){
01787 xi=gp[i];
01788 for (j=0;j<intordsm[ii][jj];j++){
01789 eta=gp[j];
01790
01791 ipval[k]=Pelq->approx (xi,eta,modnodval);
01792 k++;
01793 }
01794 }
01795 destrv (w);
01796 destrv (gp);
01797 }
01798 }
01799 }
01800
01801
01802
01803
01804
01805
01806
01807
01808
01809
01810
01811
01812
01813
01814
01815
01816 void planeelemqq::ntdbr_vector (long eid,vector &ntdbr)
01817 {
01818 long intord = 3;
01819 long i,j,k,l,ipp,ri,ci,lcid;
01820 double thick,xi,eta,jac;
01821 ivector nodes(nne);
01822 vector x(nne),y(nne),gp(intord),w(intord),t(nne),r(ndofe),eps(tncomp),sig(tncomp),bf(nne);
01823 matrix gm(tncomp,ndofe),d(tncomp,tncomp);
01824
01825 ri = ci = lcid = 0;
01826 ipp = Mt->elements[eid].ipp[ri][ci];
01827
01828 Mt->give_elemnodes (eid,nodes);
01829 Mt->give_node_coord2d (x,y,eid);
01830 Mc->give_thickness (eid,nodes,t);
01831 eldispl (lcid,eid,r.a);
01832
01833 Mm->matstiff (d,ipp);
01834
01835 gauss_points (gp.a,w.a,intord);
01836
01837 fillv (0.0,ntdbr);
01838
01839 for (i=0;i<intord;i++){
01840 xi=gp[i];
01841 for (j=0;j<intord;j++){
01842 eta=gp[j];
01843
01844 geom_matrix (gm,x,y,xi,eta,jac);
01845 mxv (gm,r,eps);
01846 mxv (d,eps,sig);
01847
01848 bf_quad_4_2d (bf.a,xi,eta);
01849
01850 thick = approx (xi,eta,t);
01851 jac*=thick*w[i]*w[j];
01852
01853 for (k=0;k<tncomp;k++)
01854 for (l=0;l<nne;l++)
01855 ntdbr[k*nne+l] += jac * bf[l] * sig[k];
01856
01857 }
01858 }
01859 }
01860
01861
01862
01863
01864
01865
01866
01867
01868
01869
01870
01871 void planeelemqq::ntn_matrix (long eid,matrix &ntn)
01872 {
01873 long i,j,k,l,intord = 3;
01874 double thick,xi,eta,jac;
01875 ivector nodes(nne);
01876 vector x(nne),y(nne),t(nne),gp(intord),w(intord),bf(nne);
01877
01878 Mt->give_elemnodes (eid,nodes);
01879 Mt->give_node_coord2d (x,y,eid);
01880 Mc->give_thickness (eid,nodes,t);
01881
01882 gauss_points (gp.a,w.a,intord);
01883
01884 fillm (0.0,ntn);
01885
01886 for (i=0;i<intord;i++){
01887 xi=gp[i];
01888 for (j=0;j<intord;j++){
01889 eta=gp[j];
01890
01891 thick = approx (xi,eta,t);
01892 jac_2d (jac,x,y,xi,eta);
01893 jac*=thick*w[i]*w[j];
01894
01895 bf_quad_4_2d (bf.a,xi,eta);
01896
01897 for (k=0;k<nne;k++)
01898 for (l=0;l<nne;l++)
01899 ntn[k][l] += jac * bf[k] * bf[l];
01900
01901 }
01902 }
01903 }
01904
01905
01906
01907
01908
01909
01910
01911
01912
01913
01914
01915
01916
01917
01918
01919
01920
01921
01922
01923
01924
01925
01926
01927
01928 double planeelemqq :: compute_error (long eid, double &e2, double &u2, double &sizel, vector *rsigfull)
01929 {
01930 long intord = 3;
01931 long i,j,ipp,ri,ci,lcid;
01932 double area,thick,xi,eta,jac,contr;
01933 double zero=1.0e-20;
01934 ivector nodes(nne);
01935 vector x(nne),y(nne),t(nne),gp(intord),w(intord),bf(nne),r(ndofe);
01936 vector sig_star(tncomp),sig_roof(tncomp),sig_err(tncomp),eps(tncomp);
01937 matrix gm(tncomp,ndofe),d(tncomp,tncomp),dinv(tncomp,tncomp);
01938
01939 ri = ci = lcid = 0;
01940 ipp = Mt->elements[eid].ipp[ri][ci];
01941
01942 Mt->give_elemnodes (eid,nodes);
01943 Mt->give_node_coord2d (x,y,eid);
01944 Mc->give_thickness (eid,nodes,t);
01945 eldispl (lcid,eid,r.a);
01946
01947 Mm->matstiff (d,ipp);
01948 invm (d,dinv,zero);
01949
01950 gauss_points (gp.a,w.a,intord);
01951
01952 e2 = u2 = 0;
01953 for (i=0;i<intord;i++){
01954 xi=gp[i];
01955 for (j=0;j<intord;j++){
01956 eta=gp[j];
01957
01958 bf_quad_4_2d (bf.a,xi,eta);
01959 give_der_star (bf,rsigfull,nodes,sig_star,Mt->nn);
01960
01961 geom_matrix (gm,x,y,xi,eta,jac);
01962 mxv (gm,r,eps);
01963 mxv (d,eps,sig_roof);
01964
01965 subv (sig_star,sig_roof,sig_err);
01966
01967 thick = approx (xi,eta,t);
01968 jac*=thick*w[i]*w[j];
01969
01970 vxmxv (sig_err,dinv,contr);
01971 e2 += jac*contr;
01972
01973 vxmxv (eps,d,contr);
01974 u2 += jac*contr;
01975 }
01976 }
01977
01978 area = ( (x[1]-x[0])*(y[2]-y[0])-(x[2]-x[0])*(y[1]-y[0]) + (x[2]-x[0])*(y[3]-y[0])-(x[3]-x[0])*(y[2]-y[0]) ) / 2.0;
01979 sizel = sqrt(area);
01980 return area;
01981 }
01982
01983
01984
01985
01986
01987
01988
01989
01990
01991
01992
01993
01994 void planeelemqq :: elchar (long eid, matrix &spsig)
01995 {
01996 long intord = 2;
01997 long i,j,ipp;
01998 vector eps(tncomp);
01999 matrix d(tncomp,tncomp);
02000
02001 allocm(4, tncomp, spsig);
02002
02003 ipp = Mt->elements[eid].ipp[0][0];
02004 Mm->matstiff (d,ipp);
02005
02006
02007
02008
02009 for (i=0; i<intord; i++)
02010 for (j=0;j<intord;j++){
02011 eps[0] = Mm->ip[ipp ].strain[0];
02012 eps[1] = Mm->ip[ipp ].strain[1];
02013 eps[2] = Mm->ip[ipp+4].strain[2];
02014 ipp++;
02015 mxv (d.a, eps.a, spsig.a + (i*intord+j)*tncomp, d.m, d.n);
02016 }
02017
02018
02019
02020
02021
02022
02023
02024
02025
02026
02027
02028
02029
02030
02031
02032
02033
02034
02035
02036 }
02037