00001 #include <string.h>
00002 #include <stdlib.h>
00003 #include "bocon.h"
00004 #include "parser.h"
00005 #include "globprep.h"
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 bocon::bocon()
00016 {
00017 nn = 0L;
00018 ndir = 0L;
00019 dir = NULL;
00020 con = NULL;
00021 expr = NULL;
00022 nspd = NULL;
00023 ndpd = NULL;
00024 }
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 long bocon::read(XFILE *in, long ndofn)
00043 {
00044 long nbc, td, tlc, tslc, tnlc, i;
00045 double tc;
00046 Parser par;
00047 Equation *eq;
00048
00049
00050 if (dir)
00051 delete [] dir;
00052 if (con)
00053 delete [] con;
00054 if (nspd)
00055 delete [] nspd;
00056 if (ndpd)
00057 delete [] ndpd;
00058 if (expr)
00059 {
00060 for (i = 0; i < ndir; i++)
00061 delete [] expr[i];
00062 delete [] expr;
00063 }
00064
00065 tnlc = Nlc;
00066 if (Tnslc)
00067 tnlc = Tnslc;
00068
00069 ndir = ndofn;
00070 xfscanf (in, "%k%ld", "num_bc", &nbc);
00071
00072 if ((nbc < 1) || (nbc > ndir))
00073
00074 return(1);
00075
00076 dir = new long[ndir];
00077 for (i = 0; i < ndir; dir[i] = -1, i++);
00078
00079 nspd = new long[ndir];
00080 memset(nspd, 0, sizeof(*nspd)*ndir);
00081 ndpd = new long[ndir];
00082 memset(ndpd, 0, sizeof(*ndpd)*ndir);
00083 con = new double[ndir*tnlc];
00084 memset(con, 0, sizeof(*con)*ndir*tnlc);
00085 expr = new char*[ndir*tnlc];
00086 memset(expr, 0, sizeof(*expr)*ndir*tnlc);
00087
00088
00089 for (i = 0; i < nbc; i++)
00090 {
00091 xfscanf(in, "%k%ld", "dir", &td);
00092 xfscanf(in, "%k%le", "cond", &tc);
00093 if ((labs(td) < 1) || (labs(td) > ndir))
00094
00095 return(2);
00096 if (td > 0)
00097 {
00098 td--;
00099 dir[td] = td;
00100 tlc = 0;
00101 if (tc != 0.0)
00102
00103 {
00104 xfscanf (in, "%k%ld", "lc_id", &tlc);
00105 if ((tlc < 1) || (tlc > Nlc))
00106 return (3);
00107 tlc--;
00108 if (Tnslc)
00109 {
00110 xfscanf(in, "%k%ld", "slc_id", &tslc);
00111 if ((tslc < 1) || (tslc > Nslc[tlc]))
00112 return (4);
00113 tslc--;
00114 tlc = Nslc_cum[tlc]+tslc;
00115 }
00116 nspd[td]++;
00117 }
00118 con[tlc*ndir+td] = tc;
00119 }
00120 if (td < 0)
00121
00122 {
00123 td = labs(td);
00124 td--;
00125 dir[td] = td;
00126 tlc = 0;
00127 if (tc != 0.0)
00128
00129 {
00130 xfscanf (in, "%k%ld", "lc_id", &tlc);
00131 if ((tlc < 1) || (tlc > Nlc))
00132 return (3);
00133 tlc--;
00134 if (Tnslc)
00135 {
00136 xfscanf(in, "%k%ld", "slc_id", &tslc);
00137 if ((tslc < 1) || (tslc > Nslc[tlc]))
00138 return (4);
00139 tslc--;
00140 tlc = Nslc_cum[tlc]+tslc;
00141 }
00142 expr[tlc*ndir+td] = new char[1025];
00143 expr[tlc*ndir+td][0] = '\0';
00144 xfscanf(in, "%1024s", expr[tlc*ndir+td]);
00145 eq = par.TextToTree(expr[tlc*ndir+td]);
00146
00147 if (eq == NULL)
00148
00149 return(5);
00150 ndpd[td]++;
00151 }
00152 else
00153 nspd[td]++;
00154
00155 con[tlc*ndir+td] = tc;
00156 }
00157 }
00158 return(0);
00159 }
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170 bocon *bocon::merge(bocon *tbc)
00171 {
00172 bocon *ret = new bocon;
00173 long i, k, l, nlcid;
00174
00175 ret->nn = nn;
00176 ret->ndir = ndir;
00177 nlcid = Nlc;
00178 if (Tnslc)
00179 nlcid = Tnslc;
00180
00181 ret->dir = new long[ndir];
00182 for (i = 0; i < ndir; ret->dir[i] = -1, i++);
00183 ret->nspd = new long[ndir];
00184 memset(ret->nspd, 0, sizeof(*ret->nspd)*ndir);
00185 ret->ndpd = new long[ndir];
00186 memset(ret->ndpd, 0, sizeof(*ret->ndpd)*ndir);
00187 ret->con = new double[ndir*nlcid];
00188 memset(ret->con, 0, sizeof(*ret->con)*ndir*nlcid);
00189 ret->expr = new char*[ndir*nlcid];
00190 memset(ret->expr, 0, sizeof(*ret->expr)*ndir*nlcid);
00191
00192 for (k=0; k < nlcid; k++)
00193 {
00194 for (i=0; i<ndir; i++)
00195 {
00196
00197 if (dir[i] == tbc->dir[i])
00198 {
00199
00200 ret->dir[i] = dir[i];
00201
00202 if (con[ndir*k+i] == tbc->con[ndir*k+i])
00203 {
00204
00205 ret->con[ndir*k+i] = con[ndir*k+i];
00206 if ((tbc->expr[ndir*k+i] == NULL) && (expr[ndir*k+i] == NULL))
00207 {
00208
00209 ret->expr[ndir*k+i] = NULL;
00210 if (con[ndir*k+i] != 0.0)
00211 ret->nspd[i]++;
00212 continue;
00213 }
00214 else
00215 {
00216 if (strcmp(expr[ndir*k+i], tbc->expr[ndir*k+i]) == 0)
00217 {
00218
00219 l = strlen(expr[ndir*k+i]);
00220 ret->expr[ndir*k+i] = new char[l+1];
00221 memcpy(ret->expr[ndir*k+i], expr[ndir*k+i], sizeof(*expr[ndir*k+i])*(l+1));
00222 ret->ndpd[i]++;
00223 continue;
00224 }
00225 else
00226
00227 {
00228 return NULL;
00229 }
00230 }
00231 }
00232 else
00233
00234
00235 {
00236 return NULL;
00237 }
00238 }
00239 else
00240 {
00241
00242 if (dir[i] != -1)
00243 {
00244
00245 ret->dir[i] = dir[i];
00246 ret->con[ndir*k+i] = con[ndir*k+i];
00247 if (expr[ndir*k+i] == NULL)
00248 {
00249 ret->expr[ndir*k+i] = NULL;
00250 if (con[ndir*k+i] != 0.0)
00251 ret->nspd[i]++;
00252 }
00253 else
00254 {
00255 l = strlen(expr[ndir*k+i]);
00256 ret->expr[ndir*k+i] = new char[l+1];
00257 memcpy(ret->expr[ndir*k+i], expr[ndir*k+i], sizeof(*expr[ndir*k+i])*(l+1));
00258 ret->ndpd[i]++;
00259 continue;
00260 }
00261 }
00262 else
00263 {
00264
00265 ret->dir[i] = tbc->dir[i];
00266 ret->con[ndir*k+i] = tbc->con[ndir*k+i];
00267 if (tbc->expr[ndir*k+i] == NULL)
00268 {
00269 ret->expr[ndir*k+i] = NULL;
00270 if (tbc->con[ndir*k+i] != 0.0)
00271 ret->nspd[i]++;
00272 }
00273 else
00274 {
00275 l = strlen(tbc->expr[ndir*k+i]);
00276 ret->expr[ndir*k+i] = new char[l+1];
00277 memcpy(ret->expr[ndir*k+i], tbc->expr[ndir*k+i], sizeof(*tbc->expr[ndir*k+i])*(l+1));
00278 ret->ndpd[i]++;
00279 continue;
00280 }
00281 }
00282 }
00283 }
00284 }
00285 return ret;
00286 }
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296 bocon *bocon::copy(void)
00297 {
00298 bocon *ret = new bocon;
00299 long i, k, l, nlcid;
00300
00301 ret->nn = nn;
00302 ret->ndir = ndir;
00303 nlcid = Nlc;
00304 if (Tnslc)
00305 nlcid = Tnslc;
00306
00307 ret->dir = new long[ndir];
00308 memcpy(ret->dir, dir, sizeof(*dir)*ndir);
00309 ret->nspd = new long[ndir];
00310 memcpy(ret->nspd, nspd, sizeof(*nspd)*ndir);
00311 ret->ndpd = new long[ndir];
00312 memcpy(ret->ndpd, ndpd, sizeof(*ndpd)*ndir);
00313 ret->con = new double[ndir*nlcid];
00314 memcpy(ret->con, con, sizeof(*con)*ndir*nlcid);
00315 ret->expr = new char*[ndir*nlcid];
00316 memset(ret->expr, 0, sizeof(*ret->expr)*ndir*nlcid);
00317 for (k=0; k < nlcid; k++)
00318 {
00319 for(i=0; i<ndir; i++)
00320 {
00321 if (expr[ndir*k+i])
00322 {
00323 l = strlen(expr[ndir*k+i]);
00324 ret->expr[ndir*k+i] = new char[l+1];
00325 memcpy(ret->expr[ndir*k+i], expr[ndir*k+i], sizeof(*expr[ndir*k+i])*(l+1));
00326 }
00327 }
00328 }
00329 return ret;
00330 }
00331
00332
00333
00334 bocon::~bocon()
00335 {
00336 long tnlc = Nlc;
00337 if (Tnslc)
00338 tnlc = Tnslc;
00339
00340 delete [] dir;
00341 delete [] con;
00342 delete [] nspd;
00343 delete [] ndpd;
00344 if (expr)
00345 {
00346 for (long i = 0; i < tnlc*ndir; i++)
00347 delete [] expr[i];
00348 delete [] expr;
00349 }
00350 }