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