00001 #include "dbcrs.h"
00002 #include "descrip.h"
00003 #include "alias.h"
00004 #include "iotools.h"
00005 #include "mechcrsec.h"
00006 #include <string.h>
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 csec :: csec(void)
00017 {
00018 type = crsectype(-1);
00019 ninst = 0;
00020 inst = NULL;
00021 instu = NULL;
00022 ridx = NULL;
00023 ninstu = 0;
00024 }
00025
00026
00027
00028
00029
00030
00031
00032
00033 csec :: ~csec(void)
00034 {
00035 long i;
00036 if (inst)
00037 {
00038 for (i=0; i < ninst; i++)
00039 delete [] inst[i];
00040 }
00041 delete [] inst;
00042 delete [] instu;
00043 delete [] ridx;
00044 }
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 void csec::alloc(long ni)
00059 {
00060 ninst = ni;
00061 inst = new char*[ninst];
00062 memset(inst, 0, sizeof(*inst)*ninst);
00063 instu = new long[ninst];
00064 memset(instu, 0, sizeof(*instu)*ninst);
00065 ridx = new long[ninst];
00066 memset(ridx, 0, sizeof(*ridx)*ninst);
00067 }
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 void csec::allocmc(long ni)
00082 {
00083 ninst = ni;
00084 instu = new long[ninst];
00085 memset(instu, 0, sizeof(*instu)*ninst);
00086 ridx = new long[ninst];
00087 memset(ridx, 0, sizeof(*ridx)*ninst);
00088 }
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104 long csec::read(XFILE *in)
00105 {
00106 long i, id;
00107 char emsg[1001];
00108
00109 xfscanf(in, "%k%m%k%ld", "crstype", &crsectype_kwdset, &type, "num_inst", &ninst);
00110
00111 alloc(ninst);
00112 for (i=0; i < ninst; i++)
00113
00114
00115
00116 {
00117 inst[i] = new char[1025];
00118 memset(inst[i], 0, sizeof(*inst[i])*1025);
00119 xfscanf(in, "%ld", &id);
00120 if ((id < 1) || (id > ninst))
00121 {
00122 sprintf(emsg, "index of the cross-section type instance is out of range <1,%ld>\n"
00123 "input file : %s, line=%ld, column=%ld", ninst, in->fname, in->line, in->col);
00124 print_err(emsg, __FILE__, __LINE__, __func__);
00125 return 1;
00126 }
00127 else
00128 {
00129 xfscanf(in,"%a", inst[id-1]);
00130 skipline(in);
00131 }
00132 }
00133 return(0);
00134 }
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 dbcrs::dbcrs(void)
00145 {
00146 numt = 0L;
00147 crs = NULL;
00148 crsu = NULL;
00149 ncrsu = 0L;
00150 }
00151
00152
00153
00154
00155
00156
00157
00158
00159 dbcrs::~dbcrs(void)
00160 {
00161 delete [] crs;
00162 delete [] crsu;
00163 }
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178 long dbcrs::read(XFILE *in)
00179 {
00180
00181 xfscanf(in, "%k%ld", "num_crsec_types", &numt);
00182
00183 crs = new csec[numt];
00184 crsu = new long[numt];
00185 memset(crsu, 0, sizeof(*crsu)*numt);
00186 for (long i = 0; i < numt; i++)
00187 {
00188
00189 if (crs[i].read(in))
00190 {
00191 return(i+1);
00192 }
00193 }
00194 return 0;
00195 }
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212 long dbcrs::readmc(XFILE *in, mechcrsec *mechc, descrip *d)
00213 {
00214 kwd_handling bmode;
00215
00216 xfscanf(in, "%k%ld", "num_crsec_types", &numt);
00217
00218 crs = new csec[numt];
00219 crsu = new long[numt];
00220 memset(crsu, 0, sizeof(*crsu)*numt);
00221 mechc->ncst = numt;
00222 mechc->cstype = new crsectype [numt];
00223 mechc->numtype = new long [numt];
00224 for (long i = 0; i < numt; i++)
00225 {
00226 xfscanf(in, "%k%m %k%ld", "crstype", &crsectype_kwdset, &crs[i].type, "num_inst", &crs[i].ninst);
00227 crs[i].allocmc(crs[i].ninst);
00228 mechc->cstype[i] = crs[i].type;
00229 mechc->numtype[i] = crs[i].ninst;
00230 if (d->matkwd == no)
00231 {
00232 bmode = in->kwdmode;
00233 if (in->index_created)
00234 in->kwdmode = sect_mode_ignore;
00235 else
00236 in->kwdmode = ignore;
00237 }
00238
00239 mechc->readcrsectype(in, mechc->cstype[i], mechc->numtype[i]);
00240 if (d->matkwd == no)
00241 in->kwdmode = bmode;
00242 }
00243 return 0;
00244 }
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261 long dbcrs::search_crs(crsectype ce, long ci)
00262 {
00263 long i,ret = -1;
00264
00265 for (i = 0; i < numt; i++)
00266 {
00267 if ((crs[i].type == ce) && ((ci >= 0) && (ci < crs[i].ninst)))
00268 {
00269 ret = i;
00270 break;
00271 }
00272 }
00273 return(ret);
00274 }
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288 void dbcrs::mark_used(long ic, long csti)
00289 {
00290 if (crs[ic].instu[csti] == 0)
00291 {
00292 crs[ic].ninstu++;
00293 crs[ic].instu[csti]++;
00294 if (crsu[ic] == 0)
00295 {
00296 crsu[ic]++;
00297 ncrsu++;
00298 }
00299 }
00300 }
00301
00302
00303
00304
00305
00306
00307
00308
00309 void dbcrs::renumber_id(void)
00310 {
00311 long i, k, rindex;
00312
00313 for (i = 0; i < numt; i++)
00314 {
00315 if (crs[i].ninstu)
00316 {
00317 rindex = 1;
00318 for (k = 0; k < crs[i].ninst; k++)
00319 {
00320 if (crs[i].instu[k])
00321 {
00322 crs[i].ridx[k] = rindex;
00323 rindex++;
00324 }
00325 }
00326 }
00327 }
00328 }