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