00001 #include "climatcond2.h"
00002 #include "globalt.h"
00003
00004 climatcond2::climatcond2 (void)
00005 {
00006 mattyp = 0L;
00007
00008
00009
00010 T0 = 273.15;
00011
00012 M = 0.01801528;
00013
00014 R = 8.314472;
00015
00016 Cwat = 4180.0;
00017
00018 cvap = 1617.0;
00019
00020 hvap = 2256000.0;
00021
00022
00023 last_time = -1.0;
00024
00025 zero = 1.0e-10;
00026
00027 KIND1 = KIND2 = KIND3 = KIND4 = KIND5 = KIND6 = 0;
00028
00029
00030 TepVal=0.0;
00031
00032 RHVal=0.0;
00033
00034 DifSVal=0.0;
00035
00036 DirSVal=0.0;
00037
00038 WDVal=0.0;
00039
00040 WSVal=0.0;
00041
00042 VRVal=0.0;
00043
00044 LWVal=0.0;
00045
00046 SLWVal=0.0;
00047
00048 NorRainVal=0.0;
00049
00050 GasFluxVal=0.0;
00051
00052 HeatFluxVal=0.0;
00053
00054 ShWRadVal=0.0;
00055
00056 LoWRadVal=0.0;
00057
00058 files0 = new char[1000];
00059 files1 = new char[1000];
00060 files2 = new char[1000];
00061 files3 = new char[1000];
00062 files4 = new char[1000];
00063 files5 = new char[1000];
00064 files6 = new char[1000];
00065 files7 = new char[1000];
00066 files8 = new char[1000];
00067 }
00068
00069 climatcond2::~climatcond2 (void)
00070 {
00071 delete [] files0;
00072 delete [] files1;
00073 delete [] files2;
00074 delete [] files3;
00075 delete [] files4;
00076 delete [] files5;
00077 delete [] files6;
00078 delete [] files7;
00079 delete [] files8;
00080 }
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092 void climatcond2::read (XFILE *in, long readclimfile)
00093 {
00094
00095 xfscanf (in,"%d",(long*)&mattyp);
00096
00097 xfscanf (in,"%lf",&basicdirect);
00098
00099 xfscanf (in,"%lf",&basicinclin);
00100
00101
00102
00103 xfscanf (in,"%ld",&KIND1);
00104
00105 switch (KIND1){
00106 case 0:{
00107
00108 break;
00109 }
00110 case 12:{
00111
00112 xfscanf (in,"%lf",&coefAlf);
00113 break;
00114 }
00115 case 13:{
00116
00117
00118 xfscanf (in,"%lf %lf",&coefAlf, &WindFact);
00119 break;
00120 }
00121 case 16:{
00122
00123
00124 xfscanf (in,"%lf %lf",&tint,&coefAlf);
00125 break;
00126 }
00127 default:{
00128 print_err("unknown definition of Read clim.data-KIND1 is required",__FILE__,__LINE__,__func__);
00129 }
00130 }
00131
00132
00133
00134
00135 xfscanf (in,"%ld",&KIND2);
00136
00137 switch (KIND2){
00138 case 0:{
00139
00140 break;
00141 }
00142 case 21:{
00143
00144 xfscanf (in,"%lf",&AbsCoef);
00145 break;
00146 }
00147 case 22:{
00148
00149
00150
00151 xfscanf (in,"%lf %lf %lf",&AbsCoef,&Albedo,&Latitude);
00152 break;
00153 }
00154 default:{
00155 print_err("unknown definition of Read clim.data-KIND2 is required",__FILE__,__LINE__,__func__);
00156 }
00157 }
00158
00159
00160
00161
00162 xfscanf (in,"%ld",&KIND3);
00163
00164 switch (KIND3){
00165 case 0:{
00166
00167 break;
00168 }
00169 case 31:{
00170
00171 xfscanf (in,"%lf",&EmisCoeff);
00172 break;
00173 }
00174 case 32:{
00175
00176 xfscanf (in,"%lf",&EmisCoeff);
00177 break;
00178 }
00179 default:{
00180 print_err("unknown definition of Read clim.data-KIND3 is required",__FILE__,__LINE__,__func__);
00181 }
00182 }
00183
00184
00185
00186 xfscanf (in,"%ld",&KIND4);
00187
00188 switch (KIND4){
00189 case 0:{
00190
00191 break;
00192 }
00193 default:{
00194 print_err("unknown definition of Read clim.data-KIND4 is required",__FILE__,__LINE__,__func__);
00195 }
00196 }
00197
00198
00199
00200
00201
00202 xfscanf (in,"%ld",&KIND5);
00203
00204 switch (KIND5){
00205 case 0:{
00206
00207 break;
00208 }
00209 case 51:{
00210
00211
00212
00213
00214 xfscanf (in,"%lf %lf %lf %lf",&ExchCoeff,&RainCoeff,&MinRainTemp,&MinRainFlux);
00215 break;
00216 }
00217 case 52:{
00218
00219
00220
00221
00222 xfscanf (in,"%lf %lf %lf %lf",&ExchCoeff,&RainCoeff,&MinRainTemp,&MinRainFlux);
00223 break;
00224 }
00225 default:{
00226 print_err("unknown definition of Read clim.data-KIND5 is required",__FILE__,__LINE__,__func__);
00227 }
00228 }
00229
00230
00231
00232
00233
00234 xfscanf (in,"%ld",&KIND6);
00235
00236 switch (KIND6){
00237 case 0:{
00238
00239 break;
00240 }
00241 case 61:{
00242
00243
00244
00245
00246 xfscanf (in,"%lf",&ExchCoeffVD);
00247 break;
00248 }
00249 case 62:{
00250
00251
00252
00253
00254
00255 xfscanf (in,"%lf %lf",&ExchCoeffVD,&WindFactVD);
00256 break;
00257 }
00258 case 63:{
00259
00260
00261
00262
00263
00264 xfscanf (in,"%lf %lf",&ExchCoeffVD,&alfaK);
00265 break;
00266 }
00267 case 64:{
00268
00269
00270
00271
00272
00273 xfscanf (in,"%lf %lf",&ExchCoeffVD,&alfaK);
00274 break;
00275 }
00276 case 65:{
00277
00278
00279
00280
00281 xfscanf (in,"%lf %lf %lf",&Ax,&Bx,&Cx);
00282 break;
00283 }
00284 case 66:{
00285
00286
00287
00288
00289 xfscanf (in,"%d",&d);
00290
00291 exchangecoeff.tfunc=tab;
00292 exchangecoeff.tabf = new tablefunct();
00293 exchangecoeff.tabf->asize = d;
00294 exchangecoeff.read (in);
00295
00296 break;
00297 }
00298
00299 case 67:{
00300
00301
00302
00303 xfscanf (in,"%lf %lf %lf",&rhint,&ExchCoeffVD,&rhtemp);
00304 break;
00305 }
00306 case 68:{
00307
00308
00309
00310 xfscanf (in,"%lf %lf %lf",&rhint,&ExchCoeffVD,&rhtemp);
00311 break;
00312 }
00313 case 70:{
00314 xfscanf (in,"%lf %lf %lf",&rhint, &rhalfa, &rhtemp);
00315 break;
00316 }
00317 default:{
00318 print_err ("unknown definition of Read clim.data-KIND6 is required",__FILE__,__LINE__,__func__);
00319 }
00320 }
00321
00322
00323
00324 xfscanf(in, " %a", files0);
00325 if (readclimfile)
00326 read_climatic_files(files0,0);
00327
00328
00329 xfscanf(in, " %a", files1);
00330 if (readclimfile)
00331 read_climatic_files(files1,1);
00332
00333
00334 xfscanf(in, " %a", files2);
00335 if (readclimfile)
00336 read_climatic_files(files2,2);
00337
00338
00339 xfscanf(in, " %a", files3);
00340 if (readclimfile)
00341 read_climatic_files(files3,3);
00342
00343
00344 xfscanf(in, " %a", files4);
00345 if (readclimfile)
00346 read_climatic_files(files4,4);
00347
00348
00349 xfscanf(in, " %a", files5);
00350 if (readclimfile)
00351 read_climatic_files(files5,5);
00352
00353
00354 xfscanf(in, " %a", files6);
00355 if (readclimfile)
00356 read_climatic_files(files6,6);
00357
00358
00359 xfscanf(in, " %a", files7);
00360 if (readclimfile)
00361 read_climatic_files(files7,7);
00362
00363
00364 xfscanf(in, " %a", files8);
00365 if (readclimfile)
00366 read_climatic_files(files8,8);
00367
00368 }
00369
00370
00371
00372
00373
00374
00375
00376
00377 void climatcond2::print(FILE *out)
00378 {
00379 fprintf (out,"\n %ld ",mattyp);
00380 fprintf (out," %le ",basicdirect);
00381 fprintf (out," %le ",basicinclin);
00382
00383
00384 fprintf (out,"\n %ld ",KIND1);
00385
00386 switch (KIND1){
00387 case 0:{
00388
00389 break;
00390 }
00391 case 12:{
00392
00393 fprintf (out," %e ",coefAlf);
00394 break;
00395 }
00396 case 13:{
00397
00398 fprintf (out," %e %e ",coefAlf,WindFact);
00399 break;
00400 }
00401 case 16:{
00402
00403 fprintf (out," %e %e",tint,coefAlf);
00404 break;
00405 }
00406 default:{
00407 print_err("unknown definition of Read clim.data-KIND1 is required",__FILE__,__LINE__,__func__);
00408 }
00409 }
00410
00411
00412
00413 fprintf (out,"\n %ld ",KIND2 );
00414
00415 switch (KIND2){
00416 case 0:{
00417
00418 break;
00419 }
00420 case 21:{
00421
00422 fprintf (out," %e ",AbsCoef );
00423 break;
00424 }
00425 case 22:{
00426
00427 fprintf (out," %e %e %e ",AbsCoef , Albedo , Latitude );
00428 break;
00429 }
00430 default:{
00431 print_err ("unknown definition of clim.data-KIND2 is required",__FILE__,__LINE__,__func__);
00432 }
00433 }
00434
00435
00436 fprintf (out,"\n %ld ",KIND3);
00437
00438 switch (KIND3){
00439 case 0:{
00440
00441 break;
00442 }
00443 case 31:{
00444
00445 fprintf (out," %e ",EmisCoeff );
00446 break;
00447 }
00448 case 32:{
00449
00450 fprintf (out," %e ",EmisCoeff );
00451 break;
00452 }
00453 default:{
00454 print_err ("unknown definition of clim.data-KIND3 is required",__FILE__,__LINE__,__func__);
00455 }
00456 }
00457
00458
00459 fprintf (out,"\n %ld ",KIND4);
00460
00461 switch (KIND4){
00462 case 0:{
00463
00464 break;
00465 }
00466 case 41:{
00467
00468 break;
00469 }
00470 default:{
00471 print_err ("unknown definition of clim.data-KIND4 is required",__FILE__,__LINE__,__func__);
00472 }
00473 }
00474
00475
00476 fprintf (out,"\n %ld ",KIND5);
00477
00478
00479 switch (KIND5){
00480 case 0:{
00481
00482 break;
00483 }
00484 case 51:{
00485
00486
00487
00488
00489
00490 fprintf (out," %e %e %e %e ",ExchCoeff , RainCoeff , MinRainTemp, MinRainFlux);
00491 break;
00492 }
00493 case 52:{
00494
00495
00496
00497
00498
00499 fprintf (out," %e %e %e %e ",ExchCoeff , RainCoeff , MinRainTemp, MinRainFlux);
00500 break;
00501 }
00502 default:{
00503 print_err ("unknown definition of clim.data-KIND5 is required",__FILE__,__LINE__,__func__);
00504 }
00505 }
00506
00507
00508 fprintf (out,"\n %ld ",KIND6);
00509
00510
00511 switch (KIND6){
00512 case 0:{
00513 break;
00514 }
00515 case 61:{
00516
00517
00518 fprintf (out," %e ",ExchCoeffVD);
00519 break;
00520 }
00521 case 62:{
00522
00523
00524
00525 fprintf (out," %e %e ", ExchCoeffVD, WindFactVD);
00526 break;
00527 }
00528 case 63:{
00529
00530
00531 fprintf (out," %e %e ", ExchCoeffVD, alfaK);
00532 break;
00533 }
00534 case 64:{
00535
00536
00537 fprintf (out," %e %e ", ExchCoeffVD, alfaK);
00538 break;
00539 }
00540 case 65:{
00541 fprintf (out," %e %e %e ", Ax, Bx, Cx);
00542 break;
00543 }
00544 case 66:{
00545 exchangecoeff.print (out);
00546 break;
00547 }
00548 case 67:{
00549
00550
00551
00552 fprintf (out," %e %e %e",rhint, ExchCoeffVD, rhtemp);
00553 break;
00554 }
00555 case 68:{
00556
00557
00558
00559 fprintf (out," %e %e %e",rhint,ExchCoeffVD,rhtemp);
00560 break;
00561 }
00562 case 70:{
00563 fprintf (out," %e %e %e",rhint, rhalfa, rhtemp);
00564 break;
00565 }
00566 default:{
00567 print_err ("unknown definition of clim.data-KIND6 is required",__FILE__,__LINE__,__func__);
00568 }
00569 }
00570
00571
00572 fprintf (out,"\n%s",files0);
00573 fprintf (out,"\n%s",files1);
00574 fprintf (out,"\n%s",files2);
00575 fprintf (out,"\n%s",files3);
00576 fprintf (out,"\n%s",files4);
00577 fprintf (out,"\n%s",files5);
00578 fprintf (out,"\n%s",files6);
00579 fprintf (out,"\n%s",files7);
00580 fprintf (out,"\n%s",files8);
00581
00582 fprintf (out,"\n");
00583 }
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593 void climatcond2::read_climatic_files (char *Cfile, long cod)
00594 {
00595 long time;
00596 long i;
00597 double Val;
00598
00599 XFILE *ffile;
00600
00601 if (strcmp(Cfile,"0") == 0)
00602 return;
00603
00604 ffile = xfopen(Cfile,"r");
00605
00606 if (ffile==NULL){
00607 print_err ("Input file %s for climatic condition is not found. \n",__FILE__,__LINE__,__func__,Cfile);
00608 abort();
00609 }
00610
00611 xfscanf (ffile,"%ld",&tn);
00612
00613 switch (cod){
00614 case 0:{
00615
00616 TepValue.tfunc=tab;
00617 TepValue.tabf = new tablefunct (tn,1);
00618 break;
00619 }
00620 case 1:{
00621
00622 RHValue.tfunc=tab;
00623 RHValue.tabf = new tablefunct (tn,1);
00624 break;
00625 }
00626 case 2:{
00627
00628 DifSValue.tfunc=tab;
00629 DifSValue.tabf = new tablefunct (tn,1);
00630 break;
00631 }
00632 case 3:{
00633
00634 DirSValue.tfunc=tab;
00635 DirSValue.tabf = new tablefunct (tn,1);
00636 break;
00637 }
00638 case 4:{
00639
00640 WDValue.tfunc=tab;
00641 WDValue.tabf = new tablefunct (tn,1);
00642 break;
00643 }
00644 case 5:{
00645
00646 WSValue.tfunc=tab;
00647 WSValue.tabf = new tablefunct (tn,1);
00648 break;
00649 }
00650 case 6:{
00651
00652 VRValue.tfunc=tab;
00653 VRValue.tabf = new tablefunct (tn,1);
00654 break;
00655 }
00656 case 7:{
00657
00658 LWValue.tfunc=tab;
00659 LWValue.tabf = new tablefunct (tn,1);
00660 break;
00661 }
00662 case 8:{
00663
00664 SLWValue.tfunc=tab;
00665 SLWValue.tabf = new tablefunct (tn,1);
00666 break;
00667 }
00668 case 9:{
00669
00670 NorRainValue.tfunc=tab;
00671 NorRainValue.tabf = new tablefunct (tn,1);
00672 break;
00673 }
00674 case 10:{
00675
00676 GasFluxValue.tfunc=tab;
00677 GasFluxValue.tabf = new tablefunct (tn,1);
00678 break;
00679 }
00680 case 11:{
00681
00682 HeatFluxValue.tfunc=tab;
00683 HeatFluxValue.tabf = new tablefunct (tn,1);
00684 break;
00685 }
00686 case 12:{
00687
00688 ShWRadValue.tfunc=tab;
00689 ShWRadValue.tabf = new tablefunct (tn,1);
00690 break;
00691 }
00692 case 13:{
00693
00694 LoWRadValue.tfunc=tab;
00695 LoWRadValue.tabf = new tablefunct (tn,1);
00696 break;
00697 }
00698 default:{
00699 print_err ("unknown definition of ReadCllimaticFiles is required",__FILE__,__LINE__,__func__);
00700 }
00701 }
00702
00703
00704
00705 for (i=0;i<tn;i++){
00706 xfscanf (ffile,"%ld %lf", &time, &Val);
00707 switch (cod){
00708 case 0:{
00709
00710 TepValue.tabf->x[i]=time;
00711 TepValue.tabf->y[i]=Val;
00712 break;
00713 }
00714 case 1:{
00715
00716 RHValue.tabf->x[i]=time;
00717 RHValue.tabf->y[i]=Val;
00718 break;
00719 }
00720 case 2:{
00721
00722 DifSValue.tabf->x[i]=time;
00723 DifSValue.tabf->y[i]=Val;
00724 break;
00725 }
00726 case 3:{
00727
00728 DirSValue.tabf->x[i]=time;
00729 DirSValue.tabf->y[i]=Val;
00730 break;
00731 }
00732 case 4:{
00733
00734 WDValue.tabf->x[i]=time;
00735 WDValue.tabf->y[i]=Val;
00736 break;
00737 }
00738 case 5:{
00739
00740 WSValue.tabf->x[i]=time;
00741 WSValue.tabf->y[i]=Val;
00742 break;
00743 }
00744 case 6:{
00745
00746 VRValue.tabf->x[i]=time;
00747 VRValue.tabf->y[i]=Val;
00748 break;
00749 }
00750 case 7:{
00751
00752 LWValue.tabf->x[i]=time;
00753 LWValue.tabf->y[i]=Val;
00754 break;
00755 }
00756 case 8:{
00757
00758 SLWValue.tabf->x[i]=time;
00759 SLWValue.tabf->y[i]=Val;
00760 break;
00761 }
00762 case 9:{
00763
00764 NorRainValue.tabf->x[i]=time;
00765 NorRainValue.tabf->y[i]=Val;
00766 break;
00767 }
00768 case 10:{
00769
00770 GasFluxValue.tabf->x[i]=time;
00771 GasFluxValue.tabf->y[i]=Val;
00772 break;
00773 }
00774 case 11:{
00775
00776 HeatFluxValue.tabf->x[i]=time;
00777 HeatFluxValue.tabf->y[i]=Val;
00778 break;
00779 }
00780 case 12:{
00781
00782 ShWRadValue.tabf->x[i]=time;
00783 ShWRadValue.tabf->y[i]=Val;
00784 break;
00785 }
00786 case 13:{
00787
00788 LoWRadValue.tabf->x[i]=time;
00789 LoWRadValue.tabf->y[i]=Val;
00790 break;
00791 }
00792 default:{
00793 print_err ("unknown definition of ReadCllimaticFiles is required",__FILE__,__LINE__,__func__);
00794 }
00795 }
00796
00797 }
00798
00799
00800 xfclose (ffile);
00801 }
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811 void climatcond2::prepare_values (double time)
00812 {
00813
00814 while (time >= 31536000){
00815 time = time - 31536000;
00816 }
00817
00818 if (fabs(time-last_time) < zero){
00819
00820
00821 }else{
00822 compute_values (time);
00823 }
00824
00825 }
00826
00827
00828
00829
00830
00831
00832
00833
00834 void climatcond2::compute_values (double time)
00835 {
00836
00837 if (TepValue.tabf != NULL){
00838 if (TepValue.tabf->asize>0){
00839 TepVal = TepValue.getval (time);
00840 TepVal = TepVal + 273.15;
00841 }
00842 }
00843
00844 if (RHValue.tabf != NULL){
00845 if (RHValue.tabf->asize>0){
00846 RHVal = RHValue.getval (time);
00847 RHVal = RHVal/100.0;
00848 }
00849 }
00850
00851 if (DifSValue.tabf != NULL){
00852 if (DifSValue.tabf->asize>0){
00853 DifSVal = DifSValue.getval (time);
00854 }
00855 }
00856
00857 if (DirSValue.tabf != NULL){
00858 if (DirSValue.tabf->asize>0){
00859 DirSVal = DirSValue.getval (time);
00860 }
00861 }
00862
00863 if (WDValue.tabf != NULL){
00864 if (WDValue.tabf->asize>0){
00865 WDVal = WDValue.getval (time);
00866 WDVal = WDVal * M_PI / 180.0;
00867 }
00868 }
00869
00870 if (WSValue.tabf != NULL){
00871 if (WSValue.tabf->asize>0){
00872 WSVal = WSValue.getval (time);
00873 }
00874 }
00875
00876 if (VRValue.tabf != NULL){
00877 if (VRValue.tabf->asize>0){
00878 VRVal = VRValue.getval (time);
00879 VRVal = VRVal/3600.0;
00880 }
00881 }
00882
00883 if (LWValue.tabf != NULL){
00884 if (LWValue.tabf->asize>0){
00885 LWVal = LWValue.getval (time);
00886 }
00887 }
00888
00889 if (SLWValue.tabf != NULL){
00890 if (SLWValue.tabf->asize>0){
00891 SLWVal = SLWValue.getval (time);
00892 }
00893 }
00894
00895 if (NorRainValue.tabf != NULL){
00896 if (NorRainValue.tabf->asize>0){
00897 NorRainVal = NorRainValue.getval (time);
00898 }
00899 }
00900
00901 if (GasFluxValue.tabf != NULL){
00902 if (GasFluxValue.tabf->asize>0){
00903 GasFluxVal = GasFluxValue.getval (time);
00904 }
00905 }
00906
00907 if (HeatFluxValue.tabf != NULL){
00908 if (HeatFluxValue.tabf->asize>0){
00909 HeatFluxVal = HeatFluxValue.getval (time);
00910 }
00911 }
00912
00913 if (ShWRadValue.tabf != NULL){
00914 if (ShWRadValue.tabf->asize>0){
00915 ShWRadVal = ShWRadValue.getval (time);
00916 }
00917 }
00918
00919 if (LoWRadValue.tabf != NULL){
00920 if (LoWRadValue.tabf->asize>0){
00921 LoWRadVal = LoWRadValue.getval (time);
00922 }
00923 }
00924 }
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936 double climatcond2::give_flux (long flid, double *nval,long ipp,long nid)
00937 {
00938 double flux,time;
00939 mednamest mn;
00940
00941
00942 time = Tp->time;
00943
00944
00945 prepare_values (time);
00946
00947
00948 mn = Tp->mednam;
00949
00950 switch (mn){
00951 case 1:{
00952
00953 flux = give_heat_flux (0,nval[0],ipp, nid);
00954 break;
00955 }
00956 case 2:{
00957
00958 flux = give_moisture_flux (nval[0], -1000,ipp, nid);
00959 break;
00960 }
00961 case 10:{
00962
00963 switch (flid){
00964 case 0:{
00965
00966 flux = give_moisture_flux (nval[0], nval[1],ipp, nid);
00967 break;
00968 }
00969 case 1:{
00970
00971 flux = give_heat_flux (nval[0],nval[1],ipp, nid);
00972 break;
00973 }
00974 default:{
00975 print_err ("unknown flux is required",__FILE__,__LINE__,__func__);
00976 }
00977 }
00978 break;
00979 }
00980 default:{
00981 print_err ("unknown medium/media flux is required",__FILE__,__LINE__,__func__);
00982 }
00983 }
00984
00985 return flux;
00986 }
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004 double climatcond2::give_heat_flux (double nval_0,double temp,long ipp, long nid)
01005 {
01006 double JH1, JH2, JH3, JH7;
01007 double time;
01008 mednamest mn;
01009
01010
01011 mn = Tp->mednam;
01012
01013
01014 time = Tp->time;
01015
01016 switch (KIND1){
01017 case 0:{
01018 JH1 = 0.0;
01019 break;
01020 }
01021 case 12:{
01022 JH1 = 0.0;
01023 }
01024 case 16:{
01025 JH1=0.0;
01026 break;
01027 }
01028 default:{
01029 print_err ("unknown definition of Get_Heat_Flux-KIND1 is required",__FILE__,__LINE__,__func__);
01030 }
01031 }
01032
01033
01034
01035
01036 switch (KIND2){
01037 case 0:{
01038
01039 JH2 = 0;
01040 break;
01041 }
01042 case 21:{
01043
01044 JH2 =-1* condit_short_wave_radiat_flux(21,time);
01045 break;
01046 }
01047 case 22:{
01048
01049 JH2 =-1* condit_short_wave_radiat_flux(22,time);
01050 break;
01051 }
01052 default:{
01053 print_err ("unknown definition of Get_Heat_Flux-KIND2 is required",__FILE__,__LINE__,__func__);
01054 }
01055 }
01056
01057
01058
01059 switch(KIND3){
01060 case 0:{
01061
01062 JH3 = 0;
01063 break;
01064 }
01065 case 31:{
01066
01067 JH3 =-1* condit_long_wave_radiat_flux (31);
01068 break;
01069 }
01070 case 32:{
01071
01072 JH3 =-1* condit_long_wave_radiat_flux (32);
01073 break;
01074 }
01075 default:{
01076 print_err ("unknown definition of Get_Heat_Flux-KIND3 is required",__FILE__,__LINE__,__func__);
01077 }
01078 }
01079
01080
01081 switch(mn){
01082 case 10:{
01083 switch (KIND5){
01084 case 0:{
01085 JH7 = 0;
01086 break;
01087 }
01088 case 51:{
01089
01090 JH7 = condit_rain_heat_flux(51,nid);
01091 break;
01092 }
01093 case 52:{
01094
01095 JH7 = condit_rain_heat_flux(52,nid);
01096 break;
01097 }
01098 default:{
01099 print_err ("unknown definition of Get_Heat_Flux-KIND5 is required",__FILE__,__LINE__,__func__);
01100 }
01101 }
01102 break;
01103 }
01104
01105 default:{
01106 JH7 = 0.0;
01107 break;
01108 }
01109 }
01110
01111
01112 return(JH1 +JH2 +JH3 + JH7);
01113 }
01114
01115
01116
01117
01118
01119
01120
01121
01122
01123
01124 double climatcond2::condit_short_wave_radiat_flux (long swkind, double time)
01125 {
01126 double MAXSUNDECL = 0.4089306437;
01127 double HOURFREQU = 0.26179939;
01128 double YEARFREQU =0.017214206;
01129 double SPRINGBEGIN =80;
01130 double th, dt,day, sdt,cdt, hold, hnew, sold, snew, alf, r;
01131 double JkQdif, JkQdir,Jq;
01132
01133 switch (swkind){
01134 case 21:{
01135
01136
01137
01138 Jq=AbsCoef*ShWRadVal;
01139 break;
01140 }
01141 case 22:{
01142
01143
01144
01145
01146
01147
01148
01149
01150
01151 th = time/3600;
01152 day = time/86400;
01153 dt = MAXSUNDECL * sin((YEARFREQU * (day-SPRINGBEGIN )));
01154
01155 sdt = sin(Latitude)*sin(dt);
01156 cdt = cos(Latitude)*cos(dt);
01157
01158 hold = asin(sdt - cdt*cos(HOURFREQU * (th - 2)));
01159 hnew = asin(sdt - cdt*cos(HOURFREQU * (th - 1)));
01160
01161 sold = cos(dt)*(sin(HOURFREQU * (th-2)))/(cos(hold));
01162 snew = cos(dt)*(sin(HOURFREQU * (th-1)))/(cos(hnew));
01163
01164 if((th>12) && (snew > sold)){
01165 alf = 2*M_PI + asin(snew);
01166 }
01167 if ((th <= 12) || (snew <= sold)){
01168 alf = M_PI - asin(snew);
01169 }
01170
01171 r = cos(basicinclin) + sin(basicinclin)*(cos(alf -basicdirect))/(tan(hnew));
01172
01173 if (r<0.0){
01174 JkQdir = 0.0;
01175 }else{
01176 if (r>0.5){
01177 JkQdir = 0.5 *DirSVal;
01178 }else{
01179 JkQdir = r * DirSVal;
01180 }
01181 }
01182
01183 JkQdif = DifSVal*cos(basicinclin/2.0)*cos(basicinclin/2.0) + Albedo *(DifSVal +DirSVal)*sin(basicinclin/2.0)*sin(basicinclin/2.0);
01184
01185 Jq=AbsCoef*(JkQdif +JkQdir);
01186
01187 break;
01188 }
01189 default:{
01190 print_err("unknown definition is required",__FILE__,__LINE__,__func__);
01191 }
01192 }
01193
01194 return (Jq);
01195
01196 }
01197
01198
01199
01200
01201
01202
01203
01204 double climatcond2::condit_long_wave_radiat_flux (long lwkind)
01205 {
01206 double flux;
01207
01208 switch (lwkind){
01209 case 31:{
01210
01211
01212
01213 flux = EmisCoeff*LoWRadVal;
01214 break;
01215 }
01216 case 32:{
01217
01218
01219
01220
01221
01222 flux = (EmisCoeff * (LWVal + SLWVal));
01223 break;
01224 }
01225 default:{
01226 print_err("unknown definition of ConditLongWaveRadiatFlux is required",__FILE__,__LINE__,__func__);
01227 }
01228 }
01229
01230 return (flux);
01231 }
01232
01233
01234
01235
01236
01237
01238 double climatcond2::condit_rain_heat_flux (long rainkind,long nid)
01239 {
01240 double RainMoistureFlux, TemperRain;
01241 double uwT;
01242
01243
01244
01245
01246
01247 RainMoistureFlux =-1.0 * condit_rain_moisture_flux (rainkind,nid);
01248
01249 TemperRain = pow (RHVal,0.1247) * (109.8 + TepVal) - 109.8;
01250
01251 uwT = Cwat *(TemperRain - T0);
01252
01253 return uwT*RainMoistureFlux;
01254 }
01255
01256
01257
01258
01259
01260
01261
01262
01263
01264 double climatcond2::transmission_coefficient_tt (long tkind)
01265 {
01266 double excoef,betaWind,coefAlf0;
01267
01268 switch (tkind){
01269 case 12:{
01270
01271
01272 excoef = coefAlf;
01273 break;
01274 }
01275 case 13:{
01276
01277
01278
01279
01280
01281
01282 if ((fabs(basicdirect - WDVal)) <= M_PI){
01283 betaWind = fabs (basicdirect - WDVal);
01284 }else{
01285 betaWind = 2.0*M_PI - (fabs (basicdirect - WDVal));
01286 }
01287
01288 if (betaWind < (M_PI/2.0)){
01289 coefAlf0 = coefAlf + WindFact*sqrt(WSVal);
01290 }else{
01291 coefAlf0 = coefAlf;
01292 }
01293
01294 excoef = coefAlf0;
01295 break;
01296 }
01297 case 16:{
01298
01299
01300 excoef = coefAlf;
01301
01302 break;
01303 }
01304
01305 default:{
01306 print_err("unknown type is required",__FILE__,__LINE__,__func__);
01307 }
01308 }
01309
01310 return excoef;
01311 }
01312
01313
01314
01315
01316
01317
01318
01319
01320
01321 double climatcond2::transmission_exterior_value_tt (long tkind)
01322 {
01323 double tval;
01324
01325 switch (tkind){
01326 case 0:{
01327
01328 break;
01329 }
01330 case 12:{
01331
01332 tval = TepVal;
01333 break;
01334 }
01335 case 13:{
01336
01337
01338
01339 tval = TepVal;
01340 break;
01341 }
01342 case 16:{
01343
01344
01345 tval = tint+273.15;
01346
01347 break;
01348 }
01349
01350 default:{
01351 print_err("unknown type is required",__FILE__,__LINE__,__func__);
01352 }
01353 }
01354
01355 return tval;
01356 }
01357
01358
01359
01360
01361
01362
01363
01364
01365
01366 double climatcond2::transmission_coefficient_tw (long VDKind,double temp)
01367 {
01368
01369 double c,betaWind,betaExch, tval;
01370
01371
01372
01373
01374
01375
01376
01377
01378
01379
01380
01381
01382
01383
01384
01385
01386
01387 switch (VDKind){
01388 case 0:{
01389 betaExch = 0.0;
01390 break;
01391 }
01392 case 61:{
01393
01394 betaExch = ExchCoeffVD;
01395 tval = TepVal;
01396 break;
01397 }
01398 case 62:{
01399
01400
01401
01402
01403 tval = TepVal;
01404 WDVal = (M_PI/180.0)*WDVal;
01405 if (fabs (basicdirect - WDVal) <= M_PI){
01406 betaWind = fabs (basicdirect-WDVal);
01407 }
01408 else{
01409 betaWind = 2*M_PI - fabs(basicdirect-WDVal);
01410 }
01411
01412 if (betaWind < (M_PI/2)){
01413 betaExch = ExchCoeffVD +WindFactVD * sqrt(WSVal);
01414 }
01415 else{
01416 betaExch = ExchCoeffVD;
01417 }
01418 break;
01419 }
01420
01421
01422
01423
01424
01425 case 67:{
01426
01427 betaExch = ExchCoeffVD;
01428 tval = rhtemp + 273.15;
01429 break;
01430 }
01431 default:{
01432 print_err("unknown type of VDKind is required",__FILE__,__LINE__,__func__);
01433 }
01434 }
01435
01436 c = cvap*((tval-temp)/2.0-T0) + hvap;
01437
01438
01439
01440 return betaExch*c;
01441 }
01442
01443
01444
01445
01446
01447
01448
01449
01450
01451
01452
01453
01454
01455
01456
01457
01458
01459 double climatcond2::give_moisture_flux (double nval_0, double nval_1,long ipp, long nid)
01460 {
01461
01462
01463
01464
01465
01466
01467
01468 double jh4, jh5;
01469
01470
01471 switch (KIND4){
01472 case 0:{
01473
01474 jh4 = 0;
01475 break;
01476 }
01477 case 41:{
01478 jh4 = 0.0;
01479 break;
01480 }
01481 default:{
01482 print_err("unknown definition of Get_moisture_flux-KIND4 is required",__FILE__,__LINE__,__func__);
01483 }
01484 }
01485
01486 switch (KIND5){
01487 case 0:{
01488
01489 jh5 = 0.0;
01490 break;
01491 }
01492 case 51:{
01493
01494 jh5 = -1.0 * condit_rain_moisture_flux (51,nid);
01495 break;
01496 }
01497 case 52:{
01498
01499 jh5 = -1.0 * condit_rain_moisture_flux (52,nid);
01500 break;
01501 }
01502 default:{
01503 print_err("unknown definition of Get_moisture_flux-KIND5 is required",__FILE__,__LINE__,__func__);
01504 }
01505 }
01506
01507 return (jh4 +jh5);
01508 }
01509
01510
01511
01512
01513
01514
01515
01516
01517
01518
01519
01520 double climatcond2::condit_rain_moisture_flux (long rainkind,long nid)
01521 {
01522 double NorRain, MoistureAkt, Smc;
01523 double kwind, betawind, krainEff, jkNorRain, jkmaxWat;
01524 double c1, c2, c3, c4, c5;
01525
01526
01527 MoistureAkt = Tm->give_nodal_vol_moist_cont (nid,mattyp);
01528
01529
01530 Smc = Tm->give_nodal_sat_vol_moist_cont (nid,mattyp);
01531
01532
01533 if (Smc == 0.0)
01534 return 0.0;
01535
01536
01537
01538 switch (rainkind){
01539 case 51:{
01540 kwind = 1;
01541 NorRain = VRVal;
01542 break;
01543 }
01544 case 52:{
01545
01546
01547
01548 if ((fabs(basicdirect - WDVal)) <= M_PI){
01549 betawind = fabs(basicdirect - WDVal);
01550 }else{
01551 betawind = 2*M_PI - fabs(basicdirect - WDVal);
01552 }
01553
01554 if ((betawind <(M_PI/2)) && (WSVal >0) && (VRVal >0)){
01555
01556 c1 = cos (betawind);
01557 c2 = 1141*sqrt(3600*VRVal/(WSVal *WSVal*WSVal*WSVal));
01558 c3 = sqrt (1 + c2);
01559 c5 = sqrt(3600*VRVal);
01560 c5 = sqrt(c5);
01561 c4 = exp(-12/(5*c5));
01562 kwind = c1/c3 * c4;
01563
01564 }else{
01565 kwind = 0;
01566 }
01567
01568 NorRain = VRVal ;
01569
01570 break;
01571 }
01572 default:{
01573 print_err("unknown definition of Condit_Rain_moistureFlux is required",__FILE__,__LINE__,__func__);
01574 }
01575 }
01576
01577
01578 if (NorRain <= MinRainFlux){
01579 krainEff = 1;
01580 }else{
01581 krainEff = RainCoeff ;
01582 }
01583
01584 if (TepVal <= MinRainTemp){
01585 jkNorRain = 0;
01586 }else{
01587 jkNorRain = kwind * krainEff * NorRain;
01588 }
01589
01590 jkmaxWat = ExchCoeff * (Smc - MoistureAkt);
01591
01592 if (jkNorRain <jkmaxWat){
01593 return jkNorRain;
01594 }else{
01595 return jkmaxWat;
01596 }
01597
01598 }
01599
01600
01601
01602
01603
01604
01605
01606
01607 double climatcond2::transmission_coefficient_ww (long VDKind)
01608 {
01609
01610 double betaWind,betaExch;
01611
01612
01613
01614
01615
01616
01617
01618
01619
01620
01621
01622
01623
01624
01625
01626
01627
01628 switch (VDKind){
01629 case 0:{
01630 betaExch = 0.0;
01631 break;
01632 }
01633 case 61:{
01634
01635 betaExch = ExchCoeffVD;
01636 break;
01637 }
01638 case 62:{
01639
01640
01641
01642
01643 WDVal = (M_PI/180.0)*WDVal;
01644 if (fabs (basicdirect - WDVal) <= M_PI){
01645 betaWind = fabs (basicdirect-WDVal);
01646 }
01647 else{
01648 betaWind = 2*M_PI - fabs(basicdirect-WDVal);
01649 }
01650
01651 if (betaWind < (M_PI/2)){
01652 betaExch = ExchCoeffVD +WindFactVD * sqrt(WSVal);
01653 }
01654 else{
01655 betaExch = ExchCoeffVD;
01656 }
01657 break;
01658 }
01659
01660
01661
01662
01663
01664 case 67:{
01665
01666 betaExch = ExchCoeffVD;
01667 break;
01668 }
01669 default:{
01670 print_err("unknown type of VDKind is required",__FILE__,__LINE__,__func__);
01671 }
01672 }
01673
01674
01675
01676
01677 return betaExch;
01678 }
01679
01680
01681
01682
01683
01684
01685
01686
01687
01688 double climatcond2::transmission_exterior_value_ww (long VDKind)
01689 {
01690 double vappres,psate, tval;
01691
01692 switch (VDKind){
01693 case 0:{
01694 break;
01695 }
01696 case 61:{
01697 tval = TepVal;
01698 tval = 298.15;
01699 break;
01700 }
01701 case 62:{
01702 tval = TepVal;
01703 tval = 298.15;
01704 break;
01705 }
01706 case 67:{
01707
01708 tval = rhtemp + 273.15;
01709 RHVal=rhint/100;
01710 break;
01711 }
01712 default:{
01713 print_err("unknown type of VDKind is required",__FILE__,__LINE__,__func__);
01714 }
01715 }
01716
01717
01718
01719 psate = exp(23.5771 - 4042.9/(tval - 37.58));
01720
01721 vappres = psate * RHVal;
01722
01723
01724
01725 return vappres;
01726 }
01727
01728
01729
01730
01731
01732
01733
01734
01735
01736 double climatcond2::external_nodval (long cid)
01737 {
01738 double eval;
01739
01740 if (cid==0){
01741
01742 eval = transmission_exterior_value_ww (KIND6);
01743 }
01744 if (cid==1){
01745
01746 eval = transmission_exterior_value_tt (KIND1);
01747 }
01748
01749
01750
01751 return eval;
01752 }
01753
01754
01755
01756
01757
01758
01759
01760
01761
01762
01763 double climatcond2::transmission_coeff (long lcid,long cid,double temp)
01764 {
01765 double trcoef;
01766
01767 trcoef=0.0;
01768 if (lcid==0){
01769 if (cid==0){
01770
01771 trcoef = transmission_coefficient_ww (KIND6);
01772 }
01773 if (cid==1){
01774
01775
01776 }
01777 }
01778 if (lcid==1){
01779 if (cid==0){
01780
01781 trcoef = transmission_coefficient_tw (KIND6,temp);
01782 }
01783 if (cid==1){
01784
01785 trcoef = transmission_coefficient_tt (KIND1);
01786 }
01787 }
01788
01789
01790
01791 return trcoef;
01792 }