00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "kunzel.h"
00029 #include "globalt.h"
00030
00031
00032 kunmat::kunmat()
00033 {
00034 rho_m = 0.0;
00035 rho_w = 1000.0;
00036 }
00037
00038 kunmat::~kunmat()
00039 {
00040
00041
00042 }
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 void kunmat::matcond (matrix &d,long ri,long ci,long ipp)
00057 {
00058 long n;
00059 n = d.n;
00060
00061 switch (n){
00062 case 1:{
00063 matcond1d (d,ri,ci,ipp);
00064 break;
00065 }
00066 case 2:{
00067 matcond2d (d,ri,ci,ipp);
00068 break;
00069 }
00070 case 3:{
00071 matcond3d (d,ri,ci,ipp);
00072 break;
00073 }
00074 default:{
00075 fprintf (stderr,"\n unknown number of components of stress tensor is required");
00076 fprintf (stderr,"\n in function (%s, line %d).\n",__FILE__,__LINE__);
00077 }
00078 }
00079 }
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090 void kunmat::matcond1d (matrix &d,long ri,long ci,long ipp)
00091 {
00092 double k;
00093 double phi,t;
00094 k = 0.0;
00095
00096 phi = Tm->ip[ipp].av[0];
00097 t = Tm->ip[ipp].av[1];
00098
00099 if((ri == 0) && (ci == 0))
00100 k = tokJ1(phi,t,ipp);
00101 if((ri == 0) && (ci == 1))
00102 k = tokJ2(phi,t,ipp);
00103 if((ri == 1) && (ci == 0))
00104 k = tokJ3(phi,t,ipp);
00105 if((ri == 1) && (ci == 1))
00106 k = tokJ4(phi,t,ipp);
00107
00108 d[0][0] = k;
00109 }
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119 void kunmat::matcond2d (matrix &d,long ri,long ci,long ipp)
00120 {
00121 double k;
00122 double phi,t;
00123 k = 0.0;
00124
00125 phi = Tm->ip[ipp].av[0];
00126 t = Tm->ip[ipp].av[1];
00127
00128 if((ri == 0) && (ci == 0))
00129 k = tokJ1(phi,t,ipp);
00130 if((ri == 0) && (ci == 1))
00131 k = tokJ2(phi,t,ipp);
00132 if((ri == 1) && (ci == 0))
00133 k = tokJ3(phi,t,ipp);
00134 if((ri == 1) && (ci == 1))
00135 k = tokJ4(phi,t,ipp);
00136
00137 fillm(0.0,d);
00138
00139
00140
00141 d[0][0] = k; d[0][1] = 0.0;
00142 d[1][0] = 0.0; d[1][1] = k;
00143 }
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154 void kunmat::matcond3d (matrix &d,long ri,long ci,long ipp)
00155 {
00156 double k;
00157 double phi,t;
00158 k = 0.0;
00159
00160 phi = Tm->ip[ipp].av[0];
00161 t = Tm->ip[ipp].av[1];
00162
00163 if((ri == 0) && (ci == 0))
00164 k = tokJ1(phi,t,ipp);
00165 if((ri == 0) && (ci == 1))
00166 k = tokJ2(phi,t,ipp);
00167 if((ri == 1) && (ci == 0))
00168 k = tokJ3(phi,t,ipp);
00169 if((ri == 1) && (ci == 1))
00170 k = tokJ4(phi,t,ipp);
00171
00172 fillm(0.0,d);
00173
00174 d[0][0]=k; d[0][1]=0.0; d[0][2]=0.0;
00175 d[1][0]=0.0; d[1][1]=k; d[1][2]=0.0;
00176 d[2][0]=0.0; d[2][1]=0.0; d[2][2]=k;
00177 }
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 void kunmat::matcap (double &c,long ri,long ci,long ipp)
00189 {
00190 double phi,t;
00191 c = 0.0;
00192
00193 phi = Tm->ip[ipp].av[0];
00194 t = Tm->ip[ipp].av[1];
00195
00196 if((ri == 0) && (ci == 0))
00197
00198 c = Tm->ip[ipp].eqother[1];
00199 if((ri == 0) && (ci == 1))
00200 c = 0.0;
00201 if((ri == 1) && (ci == 0))
00202 c = 0.0;
00203 if((ri == 1) && (ci == 1))
00204 c = DerivaceHustotyEntalpiePodleTeploty(phi,t,ipp);
00205 }
00206
00207
00208 void kunmat::values_correction (vector &nv, long ipp)
00209 {
00210
00211 relhum_check(nv[0],nv[1],ipp);
00212 }
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224 void kunmat::relhum_check(double &rh,double &t,long ipp)
00225 {
00226 if (rh >= 1.0)
00227 rh = 1.0;
00228 if (rh <= 0.0)
00229 rh = 0.0;
00230
00231
00232 if (t >= 350.0)
00233 t = 350.0;
00234 if (t <= 240.0)
00235 t = 240.0;
00236
00237
00238
00239
00240 }
00241
00242
00243
00244
00245
00246
00247
00248
00249 double kunmat::DerivaceTlakuNasycenychParNaTeplote(double rh, double tk)
00250 {
00251
00252 return ((4042.9 * exp(23.5771-4042.9/(tk - 37.58)))/((tk-37.58)*(tk-37.58)));
00253 }
00254
00255
00256
00257
00258
00259
00260
00261
00262 double kunmat::PermeabilitaVodniPary(double rh, double tk,long ipp)
00263 {
00264 double P, Rv, Pa;
00265
00266 double da, dp, mi, smc;
00267
00268 if (rh >1) rh = 1.0;
00269 if (rh < 0) rh = 0.0;
00270
00271
00272
00273 moist = Tm->ip[ipp].eqother[0];
00274 smc = Tm->ip[ipp].eqother[2];
00275
00276 CorD(4,kd,smc,moist,mi,a2,a3);
00277
00278 Rv = 461.5;
00279 Pa = 101325;
00280 P = 101325;
00281
00282 da = (2.306e-5 * Pa)/(Rv * tk * P)*pow((tk/273.15),1.81);
00283
00284 if (mi==0.0)
00285 dp=0.0;
00286 else
00287 dp = da/mi;
00288
00289 return (dp);
00290 }
00291
00292
00293
00294
00295
00296
00297
00298 double kunmat::tokJ2(double rh, double tk, long ipp)
00299 {
00300
00301 double dp, dpsdt;
00302
00303
00304 if (rh >1) rh = 1;
00305 if (rh < 0) rh = 0;
00306
00307
00308 dp = DerivaceTlakuNasycenychParNaTeplote(rh,tk);
00309 dpsdt = PermeabilitaVodniPary(rh, tk,ipp);
00310
00311 J2 = dp * rh * dpsdt;
00312
00313
00314
00315 return (J2);
00316
00317 }
00318
00319
00320
00321
00322
00323
00324
00325
00326 double kunmat::tokJ4(double rh, double tk, long ipp)
00327 {
00328 double lv1, lambdaakt, dpsdt, dp, moist,smc;
00329
00330
00331 if (rh >1) rh = 1;
00332 if (rh < 0) rh = 0;
00333
00334
00335
00336 moist = Tm->ip[ipp].eqother[0];
00337 smc = Tm->ip[ipp].eqother[2];
00338
00339 CorD(10,kd,smc,moist,lambdaakt,a2,a3);
00340
00341 dpsdt = DerivaceTlakuNasycenychParNaTeplote(rh, tk);
00342 dp = PermeabilitaVodniPary(rh, tk,ipp);
00343
00344 lv1 = LatentHeatofEvaporationOfWater (rh, tk);
00345
00346 J4 = lambdaakt + lv1 * dp * rh * dpsdt;
00347
00348 return (J4);
00349
00350 }
00351
00352
00353
00354
00355
00356
00357
00358
00359 double kunmat::tokJ3(double rh, double tk, long ipp)
00360 {
00361 double lv1;
00362 double dp, ps;
00363
00364 if (rh >1) rh = 1;
00365 if (rh < 0) rh = 0;
00366
00367 dp = PermeabilitaVodniPary(rh, tk,ipp);
00368 ps = TlakNasycenychVodnichParNaTeplote (rh, tk);
00369 lv1 = LatentHeatofEvaporationOfWater (rh, tk);
00370
00371 J3 = lv1 * dp * ps;
00372
00373 return (J3);
00374 }
00375
00376
00377 double kunmat::LatentHeatofEvaporationOfWater(double rh, double tk)
00378 {
00379 return (2.5008e6)*pow((273.15/tk),(0.167+tk*3.67e-4));
00380 }
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394 double kunmat::TlakNasycenychVodnichParNaTeplote(double rh, double tk)
00395 {
00396 return (exp(23.5771 - 4042.9/(tk - 37.58)));
00397 }
00398
00399
00400
00401
00402
00403
00404
00405
00406 double kunmat::DerivaceHustotyEntalpiePodleTeploty(double rh, double tk, long ipp)
00407 {
00408 double rom, c, moist, smc;
00409 if (rh >1) rh = 1;
00410 if (rh < 0) rh = 0;
00411
00412
00413 moist = Tm->ip[ipp].eqother[0];
00414 smc = Tm->ip[ipp].eqother[2];
00415
00416
00417 CorD(2,kd,0,0,rom,a2,a3);
00418 CorD(9,kd,smc,moist,c,a2,a3);
00419 rho_m = rom;
00420
00421 return (rom * c);
00422 }
00423
00424
00425
00426
00427
00428
00429
00430 double kunmat::HygroscopicMoisture(double rh, double tk)
00431 {
00432
00433 double mhmc, mhrh;
00434 CorD(6,kd,0,rh,mhmc,mhrh,a3);
00435
00436 return (mhmc/(1-sqrt(1-mhrh)));
00437
00438 }
00439
00440
00441
00442
00443
00444
00445
00446
00447 double kunmat::DerivativeOfTheSorptionIsotherm(double rh, double tk)
00448 {
00449
00450 double mhv;
00451 if (rh >1) rh = 1;
00452 if (rh < 0) rh = 0;
00453
00454 mhv = HygroscopicMoisture (rh,tk);
00455
00456 return (1000 * mhv/(2*sqrt(1-rh)));
00457
00458 }
00459
00460
00461
00462
00463
00464
00465
00466 double kunmat::DerivativeOfTheRetentionCurve(double rh, double tk, long ipp)
00467 {
00468
00469 double smc, mhmc, mhrh;
00470
00471 smc = Tm->ip[ipp].eqother[2];
00472 CorD(6,kd,0,rh,mhmc,mhrh,a3);
00473
00474
00475 return (1000 * (smc - mhmc)/(1 - mhrh));
00476 }
00477
00478
00479
00480
00481
00482
00483
00484 double kunmat::DerivativeOfTheMoistureRetentionCharacteristik(double rh,double tk, long ipp)
00485 {
00486
00487 double drfdrh;
00488
00489 sorption_izoterms_giva_data(1,rh,tk,a1,drfdrh, ipp);
00490
00491 return (drfdrh);
00492
00493 }
00494
00495
00496
00497
00498
00499
00500
00501 double kunmat::tokJ1(double rh, double tk, long ipp)
00502 {
00503
00504 double kapa1,b, mi, dp, dmretc, ps, drh, moist, smc;
00505 int s;
00506
00507
00508 if (rh < 0) rh = 0;
00509 if (rh >1) rh = 1;
00510
00511
00512 moist = Tm->ip[ipp].eqother[0];
00513
00514 smc = Tm->ip[ipp].eqother[2];
00515 CorD(4,kd,smc,moist,mi,a2,a3);
00516 kapa1 = Tm->ip[ipp].eqother[3];
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541 dp = PermeabilitaVodniPary(rh, tk,ipp);
00542 ps = TlakNasycenychVodnichParNaTeplote (rh, tk);
00543
00544
00545
00546 dmretc = Tm->ip[ipp].eqother[1];
00547
00548 drh = kapa1 * dmretc;
00549
00550 J1 = drh + dp * ps;
00551
00552
00553
00554 return (J1);
00555 }
00556
00557 void kunmat::read(XFILE *in)
00558 {
00559 int i, j;
00560
00561 for (i = 2; i<19; i++)
00562 {
00563 xfscanf(in, "%d",&MatChar[i]);
00564 }
00565 xfscanf(in, "%d",&MatChar[19]);
00566 for (i = 2;i <= 19; i++)
00567 {
00568
00569 switch (MatChar[i]){
00570 case 0:{
00571 break;
00572 }
00573 case 1:{
00574 xfscanf(in, "%lf",&MatConst[i]);
00575
00576 break;
00577 }
00578 case 2:{
00579
00580
00581 if( MatChar[i-1] ==2)
00582 {
00583 xfscanf(in, "%lf %lf",&MatData[i][0][0],&MatData[i][1][0]);
00584 }
00585 else
00586 {
00587 xfscanf(in, "%lf %lf",&MatData[i][0][0],&MatData[i][1][0]);
00588 }
00589
00590 switch (int(MatData[i][1][0])){
00591 case 2:{
00592 for (j=1; j<=MatData[i][0][0];j++)
00593 {
00594 xfscanf(in, "%lf %lf",&MatData[i][0][j],&MatData[i][1][j]);
00595 }
00596 break;
00597 }
00598 case 3:{
00599 for (j=1; j<=MatData[i][0][0];j++)
00600 {
00601 xfscanf(in, "%lf %lf %lf",&MatData[i][0][j],&MatData[i][1][j],&MatData[i][2][j]);
00602 }
00603 break;
00604 }
00605 default:{
00606 fprintf (stderr,"\n\n unknown definition of Material KUNZEL-DATA is required");
00607 fprintf (stderr,"\n in function read (file %s, line %d)\n",__FILE__,__LINE__);
00608 }
00609 }
00610 xfscanf(in, "%d",&MatData[i][0][0]);
00611
00612 break;
00613 }
00614 case 3:{
00615
00616 break;
00617 }
00618 case 30:{
00619 if( MatChar[i-1] ==1)
00620 {
00621 xfscanf(in, "%lf %lf",&MatFunce[i][0],&MatFunce[i][1]);
00622 }
00623 else
00624 {
00625 xfscanf(in, "%lf %lf",&MatFunce[i][0],&MatFunce[i][1]);
00626 }
00627 break;
00628 }
00629 case 31:{
00630 if( MatChar[i-1] ==1)
00631 {
00632 if (i == 6)
00633 {
00634 xfscanf(in, "%lf %lf %lf",&MatFunce[i][0],&MatFunce[i][1], &MatFunce[i][2]);
00635 }
00636 else
00637 {
00638 xfscanf(in, "%lf %lf",&MatFunce[i][0],&MatFunce[i][1]);
00639 }
00640 }
00641 else
00642 {
00643 if (i == 6)
00644 {
00645 xfscanf(in, "%lf %lf %lf",&MatFunce[i][0],&MatFunce[i][1], &MatFunce[i][2]);
00646 }
00647 else
00648 {
00649 xfscanf(in, "%lf %lf",&MatFunce[i][0],&MatFunce[i][1]);
00650 }
00651 }
00652
00653 break;
00654 }
00655 case 32:{
00656 if( MatChar[i-1] ==1)
00657 {
00658 xfscanf(in, "%lf %lf",&MatFunce[i][0],&MatFunce[i][1]);
00659 }
00660 else
00661 {
00662 xfscanf(in, "%lf %lf",&MatFunce[i][0],&MatFunce[i][1]);
00663 }
00664 break;
00665 }
00666 default:{
00667 fprintf (stderr,"\n\n unknown definition of Material KUNZEL is required");
00668 fprintf (stderr,"\n in function read (file %s, line %d)\n",__FILE__,__LINE__);
00669 }
00670 }
00671 }
00672
00673 madripom = 0;
00674 CorD(2,kd,0,0,rho_m,a2,a3);
00675 }
00676
00677
00678 void kunmat::print(FILE *out)
00679 {
00680
00681 int i, j;
00682
00683 fprintf (out,"\n");
00684 for (i = 2; i<19; i++)
00685 {
00686 fprintf(out, " %d ",MatChar[i]);
00687 }
00688 fprintf(out, " %d ",MatChar[19]);
00689 for (i = 2;i <= 19; i++)
00690 {
00691
00692 switch (MatChar[i]){
00693 case 0:{
00694 break;
00695 }
00696 case 1:{
00697 fprintf(out, "\n %e ",MatConst[i]);
00698
00699 break;
00700 }
00701 case 2:{
00702 if( MatChar[i-1] ==2)
00703 {
00704 fprintf(out, "\n %d %d ",int(MatData[i][0][0]),int(MatData[i][1][0]));
00705 }
00706 else
00707 {
00708 fprintf(out, "\n %d %d ",int(MatData[i][0][0]),int(MatData[i][1][0]));
00709 }
00710
00711 switch (int(MatData[i][1][0])){
00712 case 2:{
00713 for (j=1; j<=MatData[i][0][0];j++)
00714 {
00715 fprintf(out, "\n %e %e ",MatData[i][0][j],MatData[i][1][j] );
00716 }
00717 break;
00718 }
00719 case 3:{
00720 for (j=1; j<=MatData[i][0][0];j++)
00721 {
00722 fprintf(out, "\n %e %e %e ",MatData[i][0][j],MatData[i][1][j],MatData[i][2][j] );
00723 }
00724 break;
00725 }
00726 default:{
00727 fprintf (out,"\n");
00728 }
00729 }
00730
00731 fprintf(out, "\n %d ",int(MatData[i][0][0]));
00732
00733 break;
00734 }
00735 case 3:{
00736
00737 break;
00738 }
00739 case 30:{
00740 if( MatChar[i-1] ==1)
00741 {
00742 fprintf(out, "\n %e %e ",MatFunce[i][0],MatFunce[i][1]);
00743 }
00744 else
00745 {
00746 fprintf(out, "\n %e %e ",MatFunce[i][0],MatFunce[i][1]);
00747 }
00748 break;
00749 }
00750 case 31:{
00751 if( MatChar[i-1] ==1)
00752 {
00753 if (i == 6)
00754 {
00755 fprintf(out, "\n %e %e %e ",MatFunce[i][0],MatFunce[i][1], MatFunce[i][2]);
00756 }
00757 else
00758 {
00759 fprintf(out, "\n %e %e ",MatFunce[i][0],MatFunce[i][1]);
00760 }
00761 }
00762 else
00763 {
00764 if (i == 6)
00765 {
00766 fprintf(out, "\n %e %e %e",MatFunce[i][0],MatFunce[i][1], MatFunce[i][2]);
00767 }
00768 else
00769 {
00770 fprintf(out, "\n %e %e ",MatFunce[i][0],MatFunce[i][1]);
00771 }
00772 }
00773
00774 break;
00775 }
00776 case 32:{
00777 if( MatChar[i-1] ==1)
00778 {
00779 fprintf(out, "\n %e %e ",MatFunce[i][0],MatFunce[i][1]);
00780 }
00781 else
00782 {
00783 fprintf(out, "\n %e %e ",MatFunce[i][0],MatFunce[i][1]);
00784 }
00785 break;
00786 }
00787 default:{
00788 fprintf (out,"\n");
00789 }
00790 }
00791 }
00792 fprintf (out,"\n");
00793 }
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803 double kunmat::soptionizothermDerivation(double rh, double tk)
00804 {
00805 double a, b, n;
00806
00807 CorD(6,kd,0,rh,a,b,n);
00808
00809
00810 if (rh >1) rh = 1;
00811 if (rh < 0) rh = 0;
00812
00813
00814 return (1000 * (a/(b*rh*n))*pow((1-(log(rh))/b),(-1-(1/n))));
00815
00816 }
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834 double kunmat::transmission_transcoeff(double trc,long ri,long ci,long nn,long bc,long ipp)
00835 {
00836 long k;
00837 double new_trc,h,t;
00838 new_trc = 0.0;
00839
00840 k=Gtt->give_dof(nn,0);
00841 if (k>0) {h = Lsrst->lhs[k-1]+Lsrst->lhsi[k-1];}
00842 if (k==0) {h = 0.0;}
00843 if (k<0) {h = Tb->lc[0].pv[0-k-1].getval();}
00844 k=Gtt->give_dof(nn,1);
00845 if (k>0) {t = Lsrst->lhs[k-1]+Lsrst->lhsi[k-1];}
00846 if (k==0) {t = 0.0;}
00847 if (k<0) {t = Tb->lc[0].pv[0-k-1].getval();}
00848
00849 if((ri == 0) && (ci == 0))
00850 new_trc = get_transmission_transcoeff_hh(h,t,bc,ipp);
00851 if((ri == 0) && (ci == 1))
00852 new_trc = 0.0;
00853
00854 if((ri == 1) && (ci == 0))
00855 new_trc = 0.0;
00856 if((ri == 1) && (ci == 1))
00857 new_trc = get_transmission_transcoeff_tt(h,t,bc,ipp);
00858
00859 new_trc = new_trc*trc;
00860
00861 return (new_trc);
00862 }
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877 double kunmat::transmission_nodval(double nodval,double trc2,long ri,long ci,long nn,long bc,long ipp)
00878 {
00879 long k;
00880 double new_nodval,h,t;
00881 new_nodval = 0.0;
00882
00883 k=Gtt->give_dof(nn,0);
00884 if (k>0) {h = Lsrst->lhs[k-1]+Lsrst->lhsi[k-1];}
00885 if (k==0) {h = 0.0;}
00886 if (k<0) {h = Tb->lc[0].pv[0-k-1].getval();}
00887 k=Gtt->give_dof(nn,1);
00888 if (k>0) {t = Lsrst->lhs[k-1]+Lsrst->lhsi[k-1];}
00889 if (k==0) {t = 0.0;}
00890 if (k<0) {t = Tb->lc[0].pv[0-k-1].getval();}
00891
00892 if((ri == 0) && (ci == 0))
00893 new_nodval = get_transmission_nodval_hh(nodval,h,t,bc,ipp);
00894 if((ri == 0) && (ci == 1))
00895 new_nodval = 0.0;
00896
00897 if((ri == 1) && (ci == 0))
00898 new_nodval = 0.0;
00899 if((ri == 1) && (ci == 1))
00900 new_nodval = get_transmission_nodval_tt(nodval,h,t,bc,ipp);
00901
00902 return (new_nodval);
00903 }
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919 double kunmat::transmission_flux(double nodval,double trc2,long ri,long ci,long nn,long bc,long ipp)
00920 {
00921 long k;
00922 double flux,h,t;
00923 flux = 0.0;
00924
00925 k=Gtt->give_dof(nn,0);
00926 if (k>0) {h = Lsrst->lhs[k-1]+Lsrst->lhsi[k-1];}
00927 if (k==0) {h = 0.0;}
00928 if (k<0) {h = Tb->lc[0].pv[0-k-1].getval();}
00929 k=Gtt->give_dof(nn,1);
00930 if (k>0) {t = Lsrst->lhs[k-1]+Lsrst->lhsi[k-1];}
00931 if (k==0) {t = 0.0;}
00932 if (k<0) {t = Tb->lc[0].pv[0-k-1].getval();}
00933
00934 if((ri == 0) && (ci == 0))
00935 flux = get_transmission_flux_hh(nodval,h,t,bc,ipp);
00936 if((ri == 0) && (ci == 1))
00937 flux = 0.0;
00938
00939 if((ri == 1) && (ci == 0))
00940 flux = 0.0;
00941 if((ri == 1) && (ci == 1))
00942 flux = get_transmission_flux_tt(nodval,h,t,bc,ipp);
00943
00944 return (flux);
00945 }
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955 double kunmat::get_transmission_transcoeff_hh(double rh,double t,long bc,long ipp)
00956 {
00957 double trc,pgws;
00958
00959 switch (bc){
00960 case 30:{
00961 pgws = TlakNasycenychVodnichParNaTeplote(rh,t);
00962 trc = pgws;
00963 break;
00964 }
00965 case 31:{
00966 pgws = TlakNasycenychVodnichParNaTeplote(rh,t);
00967 trc = pgws;
00968 break;
00969 }
00970 case 32:{
00971 trc = 0.0;
00972 break;
00973 }
00974 default:{
00975 fprintf (stderr,"\n\n No real boundary condition is prescribed (%s, line %d).\n",__FILE__,__LINE__);
00976 exit(0);
00977 }
00978 }
00979 return(trc);
00980 }
00981
00982
00983
00984
00985
00986
00987
00988
00989
00990 double kunmat::get_transmission_nodval_hh(double bv,double rh,double t,long bc,long ipp)
00991 {
00992 double nodval,pgws, pgwspred;
00993
00994 switch (bc){
00995 case 30:{
00996
00997 pgws = TlakNasycenychVodnichParNaTeplote(rh,t);
00998 pgwspred = TlakNasycenychVodnichParNaTeplote(rh,t);
00999
01000 nodval = bv*pgwspred;
01001
01002 break;
01003 }
01004 case 31:{
01005 nodval = bv;
01006 break;
01007 }
01008 case 32:{
01009 pgws = TlakNasycenychVodnichParNaTeplote(rh,t);
01010
01011 nodval = pgws*rh;
01012 bv = pgws*bv;
01013 nodval = bv - nodval;
01014
01015 break;
01016 }
01017 default:{
01018 fprintf (stderr,"\n\n No real boundary condition is prescribed (%s, line %d).\n",__FILE__,__LINE__);
01019 exit(0);
01020 }
01021 }
01022 return(nodval);
01023 }
01024
01025
01026
01027
01028
01029
01030
01031
01032
01033
01034 double kunmat::get_transmission_flux_hh(double bv,double rh,double t,long bc,long ipp)
01035 {
01036 double flux,pgws;
01037
01038 switch (bc){
01039 case 30:{
01040 pgws = TlakNasycenychVodnichParNaTeplote(rh, t);
01041
01042 flux = pgws*rh;
01043 bv = pgws*bv;
01044 flux = bv - flux;
01045
01046 break;
01047 }
01048 case 31:{
01049 pgws = TlakNasycenychVodnichParNaTeplote(rh, t);
01050 flux = pgws*rh;
01051
01052 flux = bv - flux;
01053 break;
01054 }
01055 case 32:{
01056 pgws = TlakNasycenychVodnichParNaTeplote(rh, t);
01057
01058 flux = pgws*rh;
01059 bv = pgws*bv;
01060 flux = bv - flux;
01061
01062 break;
01063 }
01064 default:{
01065 fprintf (stderr,"\n\n No real boundary condition is prescribed (%s, line %d).\n",__FILE__,__LINE__);
01066 exit(0);
01067 }
01068 }
01069 return(flux);
01070 }
01071
01072
01073
01074
01075
01076
01077
01078
01079
01080 double kunmat::get_transmission_transcoeff_tt(double h,double t,long bc,long ipp)
01081 {
01082 double trc;
01083
01084 switch (bc){
01085 case 30:{
01086 trc = 1.0;
01087 break;
01088 }
01089 default:{
01090 fprintf (stderr,"\n\n No real boundary condition is prescribed (%s, line %d).\n",__FILE__,__LINE__);
01091 exit(0);
01092 }
01093 }
01094
01095 return(trc);
01096 }
01097
01098
01099
01100
01101
01102
01103
01104
01105
01106 double kunmat::get_transmission_nodval_tt(double bv,double h,double t,long bc,long ipp)
01107 {
01108 double nodval;
01109
01110 switch (bc){
01111 case 30:{
01112 nodval = bv;
01113 break;
01114 }
01115 default:{
01116 fprintf (stderr,"\n\n No real boundary condition is prescribed (%s, line %d).\n",__FILE__,__LINE__);
01117 exit(0);
01118 }
01119 }
01120 return(nodval);
01121 }
01122
01123
01124
01125
01126
01127
01128
01129
01130
01131
01132 double kunmat::get_transmission_flux_tt(double bv,double h,double t,long bc,long ipp)
01133 {
01134 double flux;
01135
01136 switch (bc){
01137 case 30:{
01138 flux = (bv - t);
01139 break;
01140 }
01141 default:{
01142 fprintf (stderr,"\n\n No real boundary condition is prescribed (%s, line %d).\n",__FILE__,__LINE__);
01143 exit(0);
01144 }
01145 }
01146 return(flux);
01147 }
01148
01149
01150
01151
01152
01153
01154
01155
01156
01157
01158
01159 double kunmat::get_othervalue(long compother,double rh,double t, long ipp)
01160 {
01161 double other;
01162
01163 switch (compother){
01164 case 0:{
01165 other = rh;
01166 break;
01167 }
01168 case 1:{
01169 other = t;
01170 break;
01171 }
01172 case 2:{
01173 double w, a3;
01174 sorption_izoterms_giva_data(0,rh,t,w,a3, ipp);
01175 other = w;
01176 break;
01177 }
01178 case 3:{
01179 other = rh * TlakNasycenychVodnichParNaTeplote (rh, t);
01180 break;
01181 }
01182 case 4:{
01183 double w, a3;
01184 sorption_izoterms_giva_data(0,rh,t,w,a3, ipp);
01185 other = w*rho_w/rho_m;
01186 break;
01187 }
01188 case 5:{
01189 other = 0.0;
01190 break;
01191 }
01192 case 6:{
01193 other = 0.0;
01194 break;
01195 }
01196 case 7:{
01197 other = 0.0;
01198 break;
01199 }
01200 case 8:{
01201 other = 0.0;
01202 break;
01203 }
01204 case 9:{
01205 other = 0.0;
01206 break;
01207 }
01208 case 10:{
01209 other = 0.0;
01210 break;
01211 }
01212 default:{
01213
01214 }
01215 }
01216 return (other);
01217
01218 }
01219
01220
01221
01222
01223
01224
01225 void kunmat::print_othervalue_name(FILE *out,long compother)
01226 {
01227 switch (compother){
01228 case 0:{
01229 fprintf (out,"Relative humidity () ");
01230 break;
01231 }
01232 case 1:{
01233 fprintf (out,"Temperature (K) ");
01234 break;
01235 }
01236 case 2:{
01237 fprintf (out,"Moisture content w (m3/m3) ");
01238 break;
01239 }
01240 case 3:{
01241 fprintf (out,"Water vapour pressure (Pa) ");
01242 break;
01243 }
01244 case 4:{
01245 fprintf (out,"Moisture content u (kg/kg) ");
01246 break;
01247 }
01248 default:{
01249
01250 }
01251 }
01252 }
01253
01254
01255 void kunmat::give_data(double rh,double Mhmc, double Smc, double Mhrh, double & moistakt)
01256 {
01257 double hvezdicka;
01258 hvezdicka = Mhmc/(1-sqrt(1-Mhrh));
01259
01260 if (rh < Mhrh)
01261 {
01262 moistakt = (1-sqrt(1-rh)) * hvezdicka ;
01263 }
01264 else {
01265 if (rh > 1)
01266 {
01267 moistakt = Smc;
01268 }
01269 else
01270 {
01271 moistakt = Mhmc + (rh - Mhrh )/(1-Mhrh )* (Smc - Mhmc );
01272 }
01273 }
01274
01275 }
01276
01277
01278 double kunmat::kapa_exp(double a, double b, double rh, double tk, long ipp)
01279 {
01280 double moist;
01281
01282
01283
01284
01285
01286 return (a * exp(b * rh));
01287
01288 }
01289
01290
01291
01292
01293
01294
01295
01296
01297
01298
01299
01300
01301
01302
01303
01304
01305
01306
01307 void kunmat::CorD(int cislochar, int &kvyhl,double in, double x, double & y, double & z, double &z2)
01308 {
01309
01310 switch (MatChar[cislochar]){
01311 case 0:{
01312 kvyhl = 0;
01313 break;
01314 }
01315 case 1:{
01316 y = MatConst[cislochar];
01317 kvyhl = 1;
01318 break;
01319 }
01320 case 2:{
01321 int i = 1;
01322
01323 int psl, prad;
01324 prad = int( MatData[cislochar][0][0]);
01325 psl = int (MatData[cislochar][1][0]);
01326 if (x <=0)
01327 {
01328 x = 0;
01329 y = MatData[cislochar][1][1];
01330 if (psl == 3)
01331 {
01332 z = MatData[cislochar][2][1];
01333 }
01334
01335 }
01336 else {
01337 if (x > in)
01338 {
01339 x = in;
01340 y = MatData[cislochar][1][prad];
01341 if (psl == 3)
01342 {
01343 z = MatData[cislochar][2][prad];
01344 }
01345 }
01346 else
01347 {
01348 while (x > MatData[cislochar][0][i]){
01349 i++;
01350 }
01351
01352 y = MatData[cislochar][1][i-1] + ((x - MatData[cislochar][0][i-1])*(MatData[cislochar][1][i] - MatData[cislochar][1][i-1]))/(MatData[cislochar][0][i] - MatData[cislochar][0][i-1]);
01353 if (psl == 3)
01354 {
01355 z = MatData[cislochar][2][i-1] + ((x - MatData[cislochar][0][i-1])*(MatData[cislochar][2][i] - MatData[cislochar][2][i-1]))/(MatData[cislochar][0][i] - MatData[cislochar][0][i-1]);
01356 }
01357 }
01358 }
01359 kvyhl = 2;
01360 z2=MatData[cislochar][1][prad];
01361
01362 break;
01363 }
01364 case 30:{
01365 y = MatFunce[cislochar][0];
01366 z = MatFunce[cislochar][1];
01367 kvyhl = 30;
01368 break;
01369 }
01370 case 31:{
01371 y = MatFunce[cislochar][0];
01372 z = MatFunce[cislochar][1];
01373 if (cislochar == 6)
01374 {
01375 z2 = MatFunce[cislochar][2];
01376 }
01377 kvyhl = 31;
01378 break;
01379 }
01380 case 32:{
01381 y = MatFunce[cislochar][0];
01382 z = MatFunce[cislochar][1];
01383 kvyhl = 32;
01384 break;
01385 }
01386 case 33:{
01387 kvyhl = 33;
01388
01389 break;
01390 }
01391 default:{
01392 fprintf (stderr,"\n\n unknown definition of material parameter is required");
01393 fprintf (stderr,"\n in function CorD (file %s, line %d)\n",__FILE__,__LINE__);
01394 }
01395 }
01396 }
01397
01398 void kunmat::sorption_izoterms_giva_data(int kod,double rh, double tk, double & moist, double & dmoistdrh, long ipp)
01399 {
01400
01401
01402
01403 int s;
01404 double hmrh, mhmc, smc, u, a, n;
01405
01406 if (rh < 0) rh = 0;
01407
01408 CorD(6,s,0,0,a1,a2,a3);
01409
01410 switch (s){
01411 case 2:{
01412 if(rh>0.976)
01413 {
01414
01415 CorD(7,kd,0,rh,smc,a2,a3);
01416 CorD(6,kd,0,rh,mhmc,a2,mhmc);
01417 give_data(rh,mhmc, smc, 0.976,moist);
01418 dmoistdrh =1000 * (smc - mhmc)/(1 - 0.976);
01419 }
01420 else
01421 {
01422 CorD(6,s,1,rh,moist,dmoistdrh,a3);
01423 dmoistdrh =1000* derivation_sorption_izoterm_data(rh,tk, 0);
01424 }
01425 break;
01426 }
01427 case 30:{
01428 CorD(6,s,1,rh,a1,hmrh,a3);
01429 CorD(7,s,0,rh,smc,a2,a3);
01430 CorD(6,s,0,rh,mhmc,hmrh,a3);
01431 give_data(rh,mhmc, smc, hmrh,moist);
01432 if (rh < hmrh)
01433 {
01434 dmoistdrh = DerivativeOfTheSorptionIsotherm (rh, tk);
01435 }
01436 else {
01437 dmoistdrh = DerivativeOfTheRetentionCurve(rh, tk, ipp);
01438 }
01439
01440 break;
01441 }
01442 case 31:{
01443 switch (kod){
01444 case 0:{
01445 CorD(6,kod,0,0,u,a,n);
01446 moist = si_kk_hansen(rh, 0,u,a,n);
01447 dmoistdrh = soptionizothermDerivation(rh, tk);
01448 break;
01449 }
01450 case 1:{
01451 dmoistdrh = soptionizothermDerivation(rh, tk);
01452 break;
01453 }
01454 default:{
01455 fprintf (stderr,"\n\n unknown definition of Sorption isotherm HANSEN is required");
01456 fprintf (stderr,"\n in function sorption_izoterms_giva_data (file %s, line %d)\n",__FILE__,__LINE__);
01457 }
01458 }
01459 break ;
01460 }
01461 default:{
01462 fprintf (stderr,"\n\n unknown definition of Sorption isotherm is required");
01463 fprintf (stderr,"\n in function sorption_izoterms_giva_data (file %s, line %d)\n",__FILE__,__LINE__);
01464 }
01465 }
01466
01467
01468 }
01469
01470 double kunmat::si_kk_hansen(double rh, double tk,double u, double a, double n)
01471 {
01472 return (u*pow((1-(log(rh))/a),(-1/n)));
01473 }
01474
01475 double kunmat::derivation_sorption_izoterm_data(double x1, double x2, double x3)
01476 {
01477 int i = 1;
01478 double derbi;
01479 if ( x1 < 0)
01480 {
01481 x1 = 0;
01482 }
01483
01484 while (x1 > MatData[6][0][i]){
01485 i++;
01486 }
01487 derbi = (MatData [6][1][i] - MatData [6][1][i-1])/(MatData [6][0][i] - MatData [6][0][i-1]);
01488 return(derbi);
01489 }
01490
01491
01492
01493
01494
01495
01496
01497
01498
01499
01500
01501
01502
01503 void kunmat::aux_values (long ipp,double *in,double *inp, double *ineq,double *out)
01504 {
01505 double x1,x2,x1p, x2p, ypv1,ypv2,ypv3,ypv4,ypv5, ypv0;
01506
01507 double w,dwdf, kapaA;
01508 double t;
01509 t = Tp->time;
01510 x1 = in[0];
01511 x2 = in[1];
01512
01513 x1p = inp[0];
01514 x2p = inp[1];
01515
01516
01517 ypv0 =ineq[0];
01518 ypv1 =ineq[1];
01519 ypv2 =ineq[2];
01520 ypv3 =ineq[3];
01521 ypv4 =ineq[4];
01522 ypv5 =ineq[5];
01523
01524 sorption_izoterms_giva_data(0,x1,x2,w,dwdf, ipp);
01525
01526 kapa_values(MatChar[5],ipp,w,ypv0,ypv2, kapaA);
01527 out[3] = kapaA;
01528
01529
01530 out[5] = -10000.0;
01531
01532 out[0] = w;
01533 out[1] = dwdf;
01534
01535 out[4] = -10000.0;
01536 out[2] = MatConst[7];
01537
01538
01539
01540
01541 }
01542
01543 void kunmat::sorption_izoterms_values(int kod, long ipp, double x1,double xpv, double ineq1, double & w, double & dwdf)
01544 {
01545
01546
01547
01548
01549
01550
01551
01552
01553
01554
01555
01556
01557
01558
01559
01560
01561
01562
01563
01564
01565
01566
01567
01568
01569
01570
01571
01572
01573
01574
01575
01576
01577
01578
01579
01580
01581
01582
01583
01584
01585
01586
01587 }
01588
01589 void kunmat::save_values (long ipp,double *out)
01590 {
01591 Tm->ip[ipp].eqother[0]=out[0];
01592 Tm->ip[ipp].eqother[1]=out[1];
01593 Tm->ip[ipp].eqother[2]=out[2];
01594 Tm->ip[ipp].eqother[3]=out[3];
01595 Tm->ip[ipp].eqother[4]=out[4];
01596 Tm->ip[ipp].eqother[5]=out[5];
01597
01598 }
01599
01600 void kunmat::give_values (long ipp,double *av, double *pv, double *eq)
01601 {
01602 av[0] = Tm->ip[ipp].av[0];
01603 av[1] = Tm->ip[ipp].av[1];
01604
01605 pv[0] = Tm->ip[ipp].pv[0];
01606 pv[1] = Tm->ip[ipp].pv[1];
01607
01608
01609 eq[0] = Tm->ip[ipp].eqother[0];
01610 eq[1] = Tm->ip[ipp].eqother[1];
01611 eq[2] = Tm->ip[ipp].eqother[2];
01612 eq[3] = Tm->ip[ipp].eqother[3];
01613 eq[4] = Tm->ip[ipp].eqother[4];
01614 eq[5] = Tm->ip[ipp].eqother[5];
01615
01616
01617 }
01618
01619 void kunmat::kapa_values (int kod, long ipp,double x1, double xpv, double ineq1, double &kapa)
01620 {
01621 double kapa1, kapa2, kapa3, x1w;
01622 double smc, a, n, x2;
01623 int kd1;
01624
01625
01626 CorD(7,kd1,1,x1,smc,a,n);
01627
01628 if( x1 > smc)
01629 {
01630 x1 = smc;
01631 }
01632
01633 switch (kod){
01634 case 0: kapa = 0.0;
01635 break;
01636 case 1: CorD(5,kod,1,x1,kapa,kapa1,kapa2);
01637 break;
01638 case 2: CorD(5,kod,1,x1,kapa,kapa1,kapa2);
01639 break;
01640 case 30:{
01641 CorD(5,kod,1,x1,kapa1,kapa2,kapa3);
01642 kapa = kapa_exp(kapa1,kapa2,x1, x2, ipp);
01643 break;
01644 }
01645
01646
01647 }
01648 }
01649
01650 void kunmat::initvalues (long ipp,long ido)
01651 {
01652 double x1,x2;
01653
01654 x1 = Tm->ip[ipp].av[0];
01655 x2 = Tm->ip[ipp].av[1];
01656
01657 }
01658
01659