00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <stdio.h>
00011 #include <stdlib.h>
00012 #include <math.h>
00013 #include "bazped.h"
00014 #include "globalt.h"
00015 #include "globmatt.h"
00016
00017 bazpedmat::bazpedmat()
00018 {
00019 por = 0.0;
00020 rho = 0.0; ceff = 0.0; chieff = 0.0;
00021 a_0 = 0.0; nn = 0.0; phi_c = 0.0;
00022 delta_dry = 0.0; delta_wet = 0.0;
00023 w_h_sorp = 0.0; n_sorp = 0.0; a_sorp = 0.0;
00024
00025
00026 mw = 18.01528e-3;
00027 gasr = 8.31441;
00028 rhow = 998.0;
00029 awet = 0.0; bwet = 0.0;
00030 k_wg = 0.0; ak = 0.0; bk = 0.0; nk = 0.0;
00031 w_cr = 0.0; w_cap = 0.0; w_vac = 0.0; w_98 = 0.0;
00032 dhvap = 2.7e+5;
00033 }
00034
00035 bazpedmat::~bazpedmat()
00036 {}
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 void bazpedmat::matcond (matrix &d,long ri,long ci,long ipp)
00052 {
00053 long n;
00054 n = d.n;
00055
00056 switch (n){
00057 case 1:{
00058 matcond1d (d,ri,ci,ipp);
00059 break;
00060 }
00061 case 2:{
00062 matcond2d (d,ri,ci,ipp);
00063 break;
00064 }
00065 case 3:{
00066 matcond3d (d,ri,ci,ipp);
00067 break;
00068 }
00069 default:{
00070 fprintf (stderr,"\n unknown number of components of stress tensor is required");
00071 fprintf (stderr,"\n in function (%s, line %d).\n",__FILE__,__LINE__);
00072 }
00073 }
00074 }
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 void bazpedmat::matcond1d (matrix &d,long ri,long ci,long ipp)
00086 {
00087 double k;
00088 double w,t;
00089 k = 0.0;
00090
00091 w = Tm->ip[ipp].av[0];
00092 t = Tm->ip[ipp].av[1];
00093
00094 if((ri == 0) && (ci == 0))
00095 k = perm_ww(w,t);
00096 if((ri == 0) && (ci == 1))
00097 k = perm_wt(w,t);
00098 if((ri == 1) && (ci == 0))
00099 k = perm_tw(w,t);
00100 if((ri == 1) && (ci == 1))
00101 k = perm_tt(w,t);
00102
00103 d[0][0] = k;
00104 }
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 void bazpedmat::matcond2d (matrix &d,long ri,long ci,long ipp)
00115 {
00116 double k;
00117 double w,t;
00118 k = 0.0;
00119
00120 w = Tm->ip[ipp].av[0];
00121 t = Tm->ip[ipp].av[1];
00122
00123 if((ri == 0) && (ci == 0))
00124 k = perm_ww(w,t);
00125 if((ri == 0) && (ci == 1))
00126 k = perm_wt(w,t);
00127 if((ri == 1) && (ci == 0))
00128 k = perm_tw(w,t);
00129 if((ri == 1) && (ci == 1))
00130 k = perm_tt(w,t);
00131
00132 fillm(0.0,d);
00133
00134 d[0][0] = k; d[0][1] = 0.0;
00135 d[1][0] = 0.0; d[1][1] = k;
00136 }
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 void bazpedmat::matcond3d (matrix &d,long ri,long ci,long ipp)
00148 {
00149 double k;
00150 double w,t;
00151 k = 0.0;
00152
00153 w = Tm->ip[ipp].av[0];
00154 t = Tm->ip[ipp].av[1];
00155
00156 if((ri == 0) && (ci == 0))
00157 k = perm_ww(w,t);
00158 if((ri == 0) && (ci == 1))
00159 k = perm_wt(w,t);
00160 if((ri == 1) && (ci == 0))
00161 k = perm_tw(w,t);
00162 if((ri == 1) && (ci == 1))
00163 k = perm_tt(w,t);
00164
00165 fillm(0.0,d);
00166
00167 d[0][0]=k; d[0][1]=0.0; d[0][2]=0.0;
00168 d[1][0]=0.0; d[1][1]=k; d[1][2]=0.0;
00169 d[2][0]=0.0; d[2][1]=0.0; d[2][2]=k;
00170 }
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185 void bazpedmat::matcond2 (matrix &d,long ri,long ci,long ipp)
00186 {
00187 long n;
00188 n = d.n;
00189
00190 switch (n){
00191 case 1:{
00192 matcond1d_2 (d,ri,ci,ipp);
00193 break;
00194 }
00195 case 2:{
00196 matcond2d_2 (d,ri,ci,ipp);
00197 break;
00198 }
00199 case 3:{
00200 matcond3d_2 (d,ri,ci,ipp);
00201 break;
00202 }
00203 default:{
00204 print_err("unknown number of components is required",__FILE__,__LINE__,__func__);
00205 }
00206 }
00207 }
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220 void bazpedmat::matcond1d_2 (matrix &d,long ri,long ci,long ipp)
00221 {
00222 double g,w,t,phi,delta_gw,kwg,pgw,rhogw;
00223
00224 w = Tm->ip[ipp].av[0];
00225 t = Tm->ip[ipp].av[1];
00226
00227 phi = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w);
00228 delta_gw = get_delta_gw(phi,w);
00229 kwg = get_kw_g(w);
00230 pgw = phi*exp(23.5771 - 4042.9/(t-37.58));
00231 rhogw = pgw/t/gasr*mw;
00232
00233
00234 fillm(0.0,d);
00235
00236 if((ri == 0) && (ci == 0)){
00237 g = Tp->gr1;
00238
00239
00240 d[0][0] = -1.0*kwg*rhow*g - delta_gw*rhogw*g;
00241 }
00242 }
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253 void bazpedmat::matcond2d_2 (matrix &d,long ri,long ci,long ipp)
00254 {
00255 double w,t,phi,delta_gw,kwg,pgw,rhogw;
00256 double *g;
00257
00258 w = Tm->ip[ipp].av[0];
00259 t = Tm->ip[ipp].av[1];
00260
00261 phi = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w);
00262 delta_gw = get_delta_gw(phi,w);
00263 kwg = get_kw_g(w);
00264 pgw = phi*exp(23.5771 - 4042.9/(t-37.58));
00265 rhogw = pgw/t/gasr*mw;
00266
00267 fillm(0.0,d);
00268
00269 if((ri == 0) && (ci == 0)){
00270 g = new double [2];
00271 g[0] = Tp->gr1;
00272 g[1] = Tp->gr2;
00273
00274 d[0][0] = -1.0*kwg*rhow*g[0] - delta_gw*rhogw*g[0];
00275 d[0][1] = -1.0*kwg*rhow*g[1] - delta_gw*rhogw*g[1];
00276
00277 delete [] g;
00278 }
00279 }
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291 void bazpedmat::matcond3d_2 (matrix &d,long ri,long ci,long ipp)
00292 {
00293 double w,t,phi,delta_gw,kwg,pgw,rhogw;
00294 double *g;
00295
00296 w = Tm->ip[ipp].av[0];
00297 t = Tm->ip[ipp].av[1];
00298
00299 phi = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w);
00300 delta_gw = get_delta_gw(phi,w);
00301 kwg = get_kw_g(w);
00302 pgw = phi*exp(23.5771 - 4042.9/(t-37.58));
00303 rhogw = pgw/t/gasr*mw;
00304
00305 fillm(0.0,d);
00306
00307 if((ri == 0) && (ci == 0)){
00308 g = new double [3];
00309 g[0] = Tp->gr1;
00310 g[1] = Tp->gr2;
00311 g[2] = Tp->gr3;
00312
00313 d[0][0] = -1.0*kwg*rhow*g[0] - delta_gw*rhogw*g[0];
00314 d[0][1] = -1.0*kwg*rhow*g[1] - delta_gw*rhogw*g[1];
00315 d[0][2] = -1.0*kwg*rhow*g[2] - delta_gw*rhogw*g[2];
00316
00317 delete [] g;
00318 }
00319 }
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333 void bazpedmat::matcap (double &c,long ri,long ci,long ipp)
00334 {
00335 double w,t;
00336 c = 0.0;
00337
00338 w = Tm->ip[ipp].av[0];
00339 t = Tm->ip[ipp].av[1];
00340
00341 if((ri == 0) && (ci == 0))
00342 c = c_ww(w,t);
00343 if((ri == 0) && (ci == 1))
00344 c = c_wt(w,t);
00345 if((ri == 1) && (ci == 0))
00346 c = c_tw(w,t);
00347 if((ri == 1) && (ci == 1))
00348 c = c_tt(w,t);
00349 }
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361 double bazpedmat::perm_ww(double w,double t)
00362 {
00363 double k_ww,phi,delta_gw,dphi_dw,p_gws;
00364 double kwg;
00365 double help1,help2,help3;
00366
00367 phi = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w);
00368 delta_gw = get_delta_gw(phi,w);
00369 dphi_dw = get_dphi_dw(w);
00370 p_gws = get_p_gws(t);
00371
00372 k_ww = delta_gw*p_gws*dphi_dw;
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383 if (w < w_cap){
00384
00385 kwg = get_kw_g(w);
00386 help1 = pow((w_cap-w)/awet,(1.0/bwet));
00387 help2 = exp(help1);
00388 help3 = bwet/(w-w_cap);
00389
00390
00391
00392
00393 k_ww = k_ww - kwg*help1*help2/help3;
00394 }
00395 else{
00396 w = w_cap;
00397 }
00398
00399 return(k_ww);
00400 }
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410 double bazpedmat::perm_wt(double w,double t)
00411 {
00412 double k_wt,phi,delta_gw,dpgw_dt;
00413
00414 phi = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w);
00415 delta_gw = get_delta_gw(phi,w);
00416 dpgw_dt = get_dpgw_dt(t,phi);
00417
00418 k_wt = delta_gw*dpgw_dt;
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429 if (w < w_cap){
00430
00431 }
00432 else{
00433 w = w_cap;
00434 }
00435
00436 return(k_wt);
00437 }
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447 double bazpedmat::perm_tw(double w,double t)
00448 {
00449 double k_tw,phi,delta_gw,dphi_dw,p_gws;
00450
00451
00452 phi = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w);
00453 delta_gw = get_delta_gw(phi,w);
00454 dphi_dw = get_dphi_dw(w);
00455 p_gws = get_p_gws(t);
00456
00457 k_tw = dhvap*delta_gw*p_gws*dphi_dw;
00458
00459 return(k_tw);
00460 }
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471 double bazpedmat::perm_tt(double w,double t)
00472 {
00473 double k_tt,phi,delta_gw,dpgw_dt;
00474
00475
00476 phi = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w);
00477 delta_gw = get_delta_gw(phi,w);
00478 dpgw_dt = get_dpgw_dt(t,phi);
00479
00480 k_tt = chieff + dhvap*delta_gw*dpgw_dt;
00481
00482 return(k_tt);
00483 }
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493 double bazpedmat::c_ww (double w,double t)
00494 {
00495 double c;
00496
00497 c=1.0*rho;
00498
00499 return(c);
00500 }
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510 double bazpedmat::c_wt (double w,double t)
00511 {
00512 double c;
00513
00514 c=0.0;
00515
00516 return(c);
00517 }
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527 double bazpedmat::c_tw (double w,double t)
00528 {
00529 double phi,dphi_dw,pgw,s,rhogw,ds_dw,c;
00530
00531
00532
00533 phi = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w);
00534 dphi_dw = get_dphi_dw(w);
00535 pgw = phi*exp(23.5771 - 4042.9/(t-37.58));
00536 rhogw = pgw/t/gasr*mw;
00537
00538 s = ((1.0 - por)*rho*w - por*rhogw)/(por*rhow - por*rhogw);
00539 ds_dw = ((1.0 - por)*rho)/(por*rhow - por*rhogw);
00540 c = dhvap*por*rhogw*(phi*ds_dw - (1.0-s)*dphi_dw);
00541
00542
00543
00544 return(c);
00545 }
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555 double bazpedmat::c_tt (double w,double t)
00556 {
00557 double c;
00558
00559 c = ceff * rho;
00560
00561 return(c);
00562 }
00563
00564
00565 void bazpedmat::values_correction (vector &nv)
00566 {
00567
00568 moisture_check(nv[0],nv[1],0);
00569 }
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581 void bazpedmat::moisture_check(double &w,double t,long ipp)
00582 {
00583
00584 if (w > w_cap){
00585 w = w_cap;
00586
00587 }
00588
00589
00590 Tm->ip[ipp].av[0] = w;
00591 }
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606 double bazpedmat::get_delta_gw(double phi,double w)
00607 {
00608 double delta_gw;
00609
00610
00611
00612
00613
00614 if(phi <= 0.60){
00615 delta_gw = delta_dry;
00616 }
00617 if(phi > 0.60 && phi < 0.98){
00618 delta_gw = delta_dry + ((phi-0.60)/(0.98-phi))*(delta_wet-delta_dry);
00619 }
00620 if(phi >= 0.98 && w <= w_vac){
00621 delta_gw = delta_wet * ((w_cap - w)/(w_vac - w_98));
00622 }
00623 if(w > w_vac){
00624 delta_gw = 0.0;
00625 }
00626
00627 delta_gw = fabs(delta_gw);
00628
00629 return(delta_gw);
00630 }
00631
00632
00633
00634
00635
00636
00637
00638
00639 double bazpedmat::get_kw_g(double w)
00640 {
00641 double kw_g,a0_k,wc_k;
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652 a0_k = ak;
00653 wc_k = bk;
00654 kw_g = k_wg*(a0_k + (1.0 - a0_k)/(1 + pow((wc_k/w),nk)));
00655
00656 return(kw_g);
00657 }
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671 double bazpedmat::sorption_isotherm(double w_h_s, double a_s, double n_s, double phi)
00672 {
00673 double w;
00674
00675
00676 w = w_h_s*pow((1.0-log(phi)/a_s),(-1.0/n_s));
00677
00678 return(w);
00679 }
00680
00681 double bazpedmat::inverse_sorption_isotherm(double w)
00682 {
00683 double phi;
00684
00685 if (w > w_cap)
00686 w = w_h_sorp;
00687
00688
00689 phi = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w);
00690
00691 return(phi);
00692 }
00693
00694
00695 double bazpedmat::suction_curve(double s)
00696 {
00697 double w;
00698
00699 if (s <= 0)
00700 w = w_cap;
00701 else
00702 w = w_cap - awet*pow(log(s),bwet);
00703
00704 return(w);
00705 }
00706
00707
00708 double bazpedmat::inverse_suction_curve(double w,double t)
00709 {
00710 double s,help;
00711
00712 if (w > w_cap)
00713 w = w_cap;
00714
00715 help = pow(((w_cap-w)/awet),(1.0/bwet));
00716 s = exp(help);
00717
00718 return(s);
00719 }
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733 double bazpedmat::inverse_sorption_isotherm(double w_h_s, double a_s, double n_s, double w)
00734 {
00735 double phi;
00736
00737 if (w > w_cap)
00738 w = w_h_sorp;
00739
00740
00741 phi = exp(a_s*(1.0-pow((w_h_s/w),(n_s))));
00742
00743 return(phi);
00744 }
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758 double bazpedmat::get_dphi_dw(double w)
00759 {
00760
00761 double dphi_dw;
00762
00763 if (w > w_cap)
00764 w = w_h_sorp;
00765
00766 dphi_dw = exp(a_sorp*(1.0-pow((w_h_sorp/w),n_sorp)))*a_sorp*n_sorp*pow(w_h_sorp,n_sorp)*pow(w,(-1.0-n_sorp));
00767
00768 return(dphi_dw);
00769 }
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782 double bazpedmat::get_p_gws(double t)
00783 {
00784 double p_gws;
00785
00786
00787 p_gws = exp(23.5771 - 4042.9/(t-37.58));
00788
00789 return(p_gws);
00790 }
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803
00804 double bazpedmat::get_dpgw_dt(double t, double phi)
00805 {
00806 double dp_gw_dt,dp_gws_dt;
00807
00808 dp_gws_dt = exp(23.5771 - 4042.9/(t-37.58))*4042.9/(t-37.58)/(t-37.58);
00809
00810 dp_gw_dt = phi*dp_gws_dt;
00811
00812 return(dp_gw_dt);
00813 }
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823 double bazpedmat::get_dpc_dw(double w, double t)
00824 {
00825 double dphi_dw,rh,dpc_drh,dpc_dw;
00826
00827 dphi_dw = get_dphi_dw(w);
00828 rh = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w);
00829
00830 dpc_drh = -1.0*rhow/gasr/t*mw/rh;
00831
00832 dpc_dw = dpc_drh*dphi_dw;
00833
00834 return(dpc_dw);
00835 }
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845 double bazpedmat::get_dpc_dt(double w, double t)
00846 {
00847 double rh,dpc_dt;
00848
00849 rh = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w);
00850
00851 dpc_dt = -1.0*log(rh)/mw*rhow*gasr;
00852
00853 return(dpc_dt);
00854 }
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873 double bazpedmat::transmission_nodval (double nodval,double trc2,long ri,long ci,long nid,long bc)
00874 {
00875 double new_nodval,w,t;
00876 new_nodval = 0.0;
00877
00878
00879 w = nodalval (0,nid,0);
00880
00881 t = nodalval (0,nid,1);
00882
00883 if((ri == 0) && (ci == 0))
00884 new_nodval = get_transmission_nodval_ww (nodval,w,t,bc);
00885 if((ri == 0) && (ci == 1))
00886 new_nodval = 0.0;
00887
00888 if((ri == 1) && (ci == 0))
00889 new_nodval = 0.0;
00890 if((ri == 1) && (ci == 1))
00891 new_nodval = get_transmission_nodval_tt (nodval,t,bc);
00892
00893 return (new_nodval);
00894 }
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905 double bazpedmat::get_transmission_nodval_ww (double bv,double w,double t,long bc)
00906 {
00907 double nodval;
00908 double pgws,rh;
00909
00910 switch (bc){
00911 case 30:{
00912
00913
00914 pgws = get_p_gws(t);
00915 nodval = bv*pgws;
00916 nodval = nodval - pgws*inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w) + pgws*w*get_dphi_dw(w);
00917 break;
00918 }
00919 case 31:{
00920
00921 pgws = get_p_gws(t);
00922 nodval = bv;
00923 nodval = nodval - pgws*inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w) + pgws*w*get_dphi_dw(w);
00924 break;
00925 }
00926 case 32:{
00927
00928
00929 pgws = get_p_gws(t);
00930 rh = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w);
00931
00932 nodval = pgws*rh;
00933 bv = pgws*bv;
00934 nodval = bv - nodval;
00935 break;
00936 }
00937 case 33:{
00938
00939
00940 pgws = get_p_gws(t);
00941 rh = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w);
00942
00943 nodval = pgws*rh;
00944 nodval = bv - nodval;
00945 break;
00946 }
00947 default:{
00948 print_err("no acceptable boundary condition is prescribed",__FILE__,__LINE__,__func__);
00949 exit(0);
00950 }
00951 }
00952 return(nodval);
00953 }
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963 double bazpedmat::get_transmission_nodval_tt (double bv,double t,long bc)
00964 {
00965 double nodval;
00966
00967 switch (bc){
00968 case 30:{
00969
00970 nodval = bv;
00971 break;
00972 }
00973 case 31:{
00974
00975 nodval = (bv - t);
00976 break;
00977 }
00978 default:{
00979 print_err("no acceptable boundary condition is prescribed",__FILE__,__LINE__,__func__);
00980 exit(0);
00981 }
00982 }
00983
00984 return nodval;
00985 }
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004 double bazpedmat::transmission_transcoeff (double trc,long ri,long ci,long nid,long bc)
01005 {
01006 double new_trc,w,t;
01007 new_trc = 0.0;
01008
01009
01010 w = nodalval (0,nid,0);
01011
01012 t = nodalval (0,nid,1);
01013
01014 if((ri == 0) && (ci == 0))
01015 new_trc = get_transmission_transcoeff_ww (w,t,bc);
01016 if((ri == 0) && (ci == 1))
01017 new_trc = 0.0;
01018
01019 if((ri == 1) && (ci == 0))
01020 new_trc = 0.0;
01021 if((ri == 1) && (ci == 1))
01022 new_trc = get_transmission_transcoeff_tt (w,t,bc);
01023
01024 new_trc = new_trc*trc;
01025
01026 return new_trc;
01027 }
01028
01029
01030
01031
01032
01033
01034
01035
01036 double bazpedmat::get_transmission_transcoeff_ww (double w,double t,long bc)
01037 {
01038 double trc;
01039 double pgws;
01040
01041 switch (bc){
01042 case 30:{
01043
01044 pgws = get_p_gws(t);
01045
01046 trc = pgws*get_dphi_dw(w);
01047 break;
01048 }
01049 case 31:{
01050
01051 pgws = get_p_gws(t);
01052
01053 trc = pgws*get_dphi_dw(w);
01054 break;
01055 }
01056 case 32:{
01057 trc = 0.0;
01058 break;
01059 }
01060 case 33:{
01061 trc = 0.0;
01062 break;
01063 }
01064 default:{
01065 print_err("no acceptable boundary condition is prescribed",__FILE__,__LINE__,__func__);
01066 exit(0);
01067 }
01068 }
01069
01070 return(trc);
01071 }
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081
01082
01083
01084
01085
01086
01087 double bazpedmat::transmission_flux (double nodval,double trc2,long ri,long ci,long nid,long bc)
01088 {
01089 long k;
01090 double flux,w,t;
01091 flux = 0.0;
01092
01093
01094 w = nodalval (0,nid,0);
01095
01096 t = nodalval (0,nid,1);
01097
01098 if((ri == 0) && (ci == 0))
01099 flux = get_transmission_flux_ww(nodval,w,t,bc);
01100 if((ri == 0) && (ci == 1))
01101 flux = 0.0;
01102
01103 if((ri == 1) && (ci == 0))
01104 flux = 0.0;
01105 if((ri == 1) && (ci == 1))
01106 flux = get_transmission_flux_tt(nodval,w,t,bc);
01107
01108 return (flux);
01109 }
01110
01111
01112
01113
01114
01115
01116
01117
01118
01119
01120 double bazpedmat::get_transmission_flux_ww (double bv,double w,double t,long bc)
01121 {
01122 double flux;
01123 double pgws,rh;
01124
01125 switch (bc){
01126 case 30:{
01127
01128 pgws = get_p_gws(t);
01129 rh = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w);
01130
01131 flux = pgws*rh;
01132 bv = pgws*bv;
01133 flux = bv - flux;
01134 break;
01135 }
01136 case 31:{
01137
01138 pgws = get_p_gws(t);
01139 rh = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w);
01140
01141 flux = pgws*rh;
01142 flux = bv - flux;
01143 break;
01144 }
01145 case 32:{
01146
01147 pgws = get_p_gws(t);
01148 rh = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w);
01149
01150 flux = pgws*rh;
01151 bv = pgws*bv;
01152 flux = bv - flux;
01153 break;
01154 }
01155 case 33:{
01156
01157 pgws = get_p_gws(t);
01158 rh = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w);
01159
01160 flux = pgws*rh;
01161 flux = bv - flux;
01162 break;
01163 }
01164 default:{
01165 print_err("no acceptable boundary condition is prescribed",__FILE__,__LINE__,__func__);
01166 exit(0);
01167 }
01168 }
01169 return(flux);
01170 }
01171
01172
01173
01174
01175
01176
01177
01178
01179
01180 double bazpedmat::get_transmission_transcoeff_tt (double w,double t,long bc)
01181 {
01182 double trc;
01183
01184 switch (bc){
01185 case 30:{
01186 trc = 1.0;
01187 break;
01188 }
01189 case 31:{
01190 trc = 0.0;
01191 break;
01192 }
01193 default:{
01194 print_err("no acceptable boundary condition is prescribed",__FILE__,__LINE__,__func__);
01195 exit(0);
01196 }
01197 }
01198
01199 return(trc);
01200 }
01201
01202
01203
01204
01205
01206
01207
01208
01209
01210
01211
01212 double bazpedmat::get_transmission_flux_tt (double bv,double w,double t,long bc)
01213 {
01214 double flux;
01215
01216 switch (bc){
01217 case 30:{
01218 flux = (bv - t);
01219 break;
01220 }
01221 case 31:{
01222 flux = (bv - t);
01223 break;
01224 }
01225 default:{
01226 print_err("no acceptable boundary condition is prescribed",__FILE__,__LINE__,__func__);
01227 exit(0);
01228 }
01229 }
01230 return(flux);
01231 }
01232
01233
01234
01235
01236
01237
01238
01239
01240
01241
01242
01243 double bazpedmat::get_othervalue(long compother,double w,double t)
01244 {
01245 double other;
01246
01247 switch (compother){
01248 case 0:{
01249 other = w;
01250 break;
01251 }
01252 case 1:{
01253 other = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w);
01254 break;
01255 }
01256 case 2:{
01257 other = t;
01258 break;
01259 }
01260 case 3:{
01261 other = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w) * get_p_gws(t);
01262 break;
01263 }
01264 case 4:{
01265 double pc,pgw,rh;
01266
01267 pgw = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w) * get_p_gws(t);
01268 rh = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w);
01269 pc = -rhow*gasr*t/mw*log(rh);
01270 other = pgw - pc;
01271 break;
01272 }
01273 case 5:{
01274 double rh;
01275
01276 rh = inverse_sorption_isotherm(w_h_sorp,a_sorp,n_sorp,w);
01277 other = -rhow*gasr*t/mw*log(rh);
01278 break;
01279 }
01280 case 6:{
01281 other = inverse_suction_curve(w,t);
01282 break;
01283 }
01284 default:{
01285 fprintf (stderr,"\n\n unknown type of component is required in function (%s, line %d).\n",__FILE__,__LINE__);
01286 }
01287 }
01288 return (other);
01289
01290 }
01291
01292
01293
01294
01295
01296
01297 void bazpedmat::print_othervalue_name(FILE *out,long compother)
01298 {
01299 switch (compother){
01300 case 0:{
01301 fprintf (out,"Moisture content u (kg/kg)");
01302 break;
01303 }
01304 case 1:{
01305 fprintf (out,"Relative humidity () ");
01306 break;
01307 }
01308 case 2:{
01309 fprintf (out,"Temperature (K) ");
01310 break;
01311 }
01312 case 3:{
01313 fprintf (out,"Water vapour pressure (Pa)");
01314 break;
01315 }
01316 case 4:{
01317 fprintf (out,"Water pressure (Pa) ");
01318 break;
01319 }
01320 case 5:{
01321 fprintf (out,"Capillary pressure (Pa) ");
01322 break;
01323 }
01324 case 6:{
01325 fprintf (out,"Suction pressure (Pa) ");
01326 break;
01327 }
01328 default:{
01329 fprintf (stderr,"\n\n unknown type of component is required in function (%s, line %d).\n",__FILE__,__LINE__);
01330 }
01331 }
01332 }
01333
01334
01335
01336
01337
01338
01339
01340 void bazpedmat::read(XFILE *in)
01341 {
01342
01343
01344
01345
01346 xfscanf (in,"%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf", &por, &rho, &ceff, &chieff, &delta_dry, &delta_wet, &w_h_sorp, &a_sorp, &n_sorp, &awet, &bwet, &w_cr, &w_cap, &w_vac, &k_wg, &ak, &bk, &nk);
01347
01348 w_98 = sorption_isotherm(w_h_sorp,a_sorp,n_sorp,0.98);
01349 }
01350
01351
01352
01353
01354
01355
01356
01357 void bazpedmat::print(FILE *out)
01358 {
01359
01360
01361
01362
01363 fprintf (out," %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e ", por,rho, ceff, chieff, delta_dry, delta_wet, w_h_sorp, a_sorp, n_sorp, awet, bwet, w_cr, w_cap, w_vac, k_wg, ak, bk, nk);
01364
01365 }