00001 #include "pvalt.h"
00002 #include "globalt.h"
00003
00004 pvalt::pvalt()
00005 {
00006 v = 0.0;
00007 ipv = 0.0;
00008 func[0] = '\0';
00009 eq = NULL;
00010 var = NULL;
00011 nmultpv = 0;
00012 }
00013
00014 pvalt::~pvalt()
00015 {
00016 delete eq;
00017 }
00018
00019
00020
00021
00022
00023
00024 long pvalt::read(XFILE *in)
00025 {
00026 Parser par;
00027
00028
00029 xfscanf (in,"%lf",&ipv);
00030
00031 switch (Tp->tprob){
00032 case stationary_problem:
00033 case nonlinear_stationary_problem:{
00034 xfscanf (in,"%lf",&v);
00035 break;
00036 }
00037 case nonstationary_problem:
00038 case nonlinear_nonstationary_problem:
00039 case growing_np_problem:
00040 case growing_np_problem_nonlin:
00041 case discont_nonstat_problem:
00042 case discont_nonlin_nonstat_problem:{
00043
00044
00045 xfscanf(in,"%d",(int*)&tfunc);
00046
00047 switch (tfunc){
00048 case stat:{
00049 xfscanf (in,"%lf",&v);
00050 break;
00051 }
00052 case pars:{
00053 xfscanf(in, "%255s", func);
00054
00055 eq = par.TextToTree(func);
00056 if (eq == NULL)
00057 {
00058 print_err("Error parsing expression",__FILE__,__LINE__,__func__);
00059 return(1);
00060 }
00061 var = eq->Variables.at(0);
00062 break;
00063 }
00064 case tab_file:{
00065 tabf.read_data_file(in);
00066 break;
00067 }
00068 case tab:{
00069 tabf.read(in);
00070 break;
00071 }
00072 case multpv:{
00073 xfscanf (in,"%ld",&nmultpv);
00074 xfscanf (in,"%lf",&v);
00075 break;
00076 }
00077 default:{
00078 print_err("unknown function is required",__FILE__,__LINE__,__func__);
00079 }
00080 }
00081
00082 break;
00083 }
00084 default:{
00085 print_err("unknown problem type",__FILE__,__LINE__,__func__);
00086 }
00087 }
00088
00089 return(0);
00090 }
00091
00092 long pvalt::print(FILE *out)
00093 {
00094 Parser par;
00095
00096 fprintf (out,"\n\n %lf",ipv);
00097
00098 switch (Tp->tprob){
00099 case stationary_problem:
00100 case nonlinear_stationary_problem:{
00101 fprintf (out," %lf",v);
00102 break;
00103 }
00104 case nonstationary_problem:
00105 case nonlinear_nonstationary_problem:
00106 case growing_np_problem:
00107 case growing_np_problem_nonlin:
00108 case discont_nonstat_problem:
00109 case discont_nonlin_nonstat_problem:{
00110
00111 fprintf(out," %d",tfunc);
00112
00113 switch (tfunc){
00114 case stat:{
00115 fprintf (out," %lf",v);
00116 break;
00117 }
00118 case pars:{
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128 break;
00129 }
00130 case tab_file:{
00131 tabf.print_data_file(out);
00132 break;
00133 }
00134 case tab:{
00135 tabf.print(out);
00136 break;
00137 }
00138 case multpv:{
00139 fprintf (out,"\n %ld",nmultpv);
00140 fprintf (out,"\n %lf",v);
00141 break;
00142 }
00143 default:{
00144 }
00145 }
00146
00147 break;
00148 }
00149 default:{
00150 print_err("unknown problem type is required",__FILE__,__LINE__,__func__);
00151 }
00152 }
00153
00154 return(0);
00155 }
00156
00157
00158 double pvalt::getval(void)
00159 {
00160 double ret,t;
00161
00162 switch (Tp->tprob){
00163 case stationary_problem:
00164 case nonlinear_stationary_problem:{
00165 ret=v;
00166 break;
00167 }
00168 case nonstationary_problem:
00169 case nonlinear_nonstationary_problem:
00170 case discont_nonstat_problem:
00171 case discont_nonlin_nonstat_problem:
00172 case growing_np_problem:
00173 case growing_np_problem_nonlin:{
00174 t=Tp->time;
00175 switch (tfunc){
00176 case stat:{
00177 ret=v;
00178 break;
00179 }
00180 case pars:{
00181 if (var)
00182 var->Value = t;
00183 ret = eq->Evaluate();
00184 break;
00185 }
00186 case tab_file:
00187 case tab:{
00188 ret=tabf.getval(t);
00189 break;
00190 }
00191 case multpv:{
00192 t=Tp->time;
00193
00194 ret=ipv + (v - ipv)*Tb->lc[0].give_fact (t,nmultpv);
00195 break;
00196 }
00197 default:{
00198 print_err("unknown time function is required",__FILE__,__LINE__,__func__);
00199 }
00200 }
00201 break;
00202 }
00203 default:{
00204 print_err("unknown problem type is required",__FILE__,__LINE__,__func__);
00205 }
00206 }
00207
00208 return(ret);
00209 }
00210
00211 long pvalt::read_prop(FILE *in, long lc)
00212 {
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222 return(0);
00223
00224 }
00225
00226 double pvalt::getipv(void)
00227 {
00228 return (ipv);
00229 }