00001
00002
00003
00004
00005
00006
00007 #include "lincoupmat.h"
00008 #include "stochdrivert.h"
00009
00010 lincoupmat::lincoupmat (void)
00011 {
00012
00013 ntm=0;
00014
00015 dim=0;
00016
00017
00018 k=NULL;
00019
00020 c=NULL;
00021 }
00022 lincoupmat::~lincoupmat (void)
00023 {
00024 delete [] k;
00025 delete [] c;
00026 }
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 void lincoupmat::read (XFILE *in)
00038 {
00039 long i,n;
00040
00041
00042 xfscanf (in,"%k%ld","number_of_matters",&ntm);
00043
00044 xfscanf (in,"%k%ld","geom_dimension",&dim);
00045
00046 if (ntm<1)
00047 print_err("number of transported matters is less than 1",__FILE__,__LINE__,__func__);
00048 if (dim<1)
00049 print_err("geometrical dimension is less than 1",__FILE__,__LINE__,__func__);
00050 if (dim<3)
00051 print_err("geometrical dimension is greater than 3",__FILE__,__LINE__,__func__);
00052
00053 if (k!=NULL)
00054 delete [] k;
00055 if (c!=NULL)
00056 delete [] c;
00057
00058
00059 n = ntm*ntm*dim*dim;
00060
00061
00062 k = new double [n];
00063
00064 c = new double [n];
00065
00066
00067 for (i=0;i<n;i++){
00068 xfscanf (in,"%le",k+i);
00069 }
00070
00071
00072 for (i=0;i<n;i++){
00073 xfscanf (in,"%le",c+i);
00074 }
00075
00076 }
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 void lincoupmat::print (FILE *out)
00087 {
00088 long i,n;
00089
00090
00091 fprintf (out,"\n%ld",ntm);
00092
00093 fprintf (out," %ld\n",dim);
00094
00095
00096 n = ntm*ntm*dim*dim;
00097
00098
00099 for (i=0;i<n;i++){
00100 fprintf (out,"%le ",k[i]);
00101 }
00102 fprintf (out,"\n");
00103
00104 for (i=0;i<n;i++){
00105 fprintf (out,"%le ",c[i]);
00106 }
00107 fprintf (out,"\n");
00108
00109 }
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 void lincoupmat::matcond (matrix &d,long ri,long ci,long ipp)
00126 {
00127 switch (d.n){
00128 case 1:{
00129 matcond1d (d,ri,ci,ipp);
00130 break;
00131 }
00132 case 2:{
00133 matcond2d (d,ri,ci,ipp);
00134 break;
00135 }
00136 case 3:{
00137 matcond3d (d,ri,ci,ipp);
00138 break;
00139 }
00140 default:{
00141 print_err("unknown geometrical dimension of the problem is required",__FILE__,__LINE__,__func__);
00142 }
00143 }
00144 }
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157 void lincoupmat::matcond1d (matrix &d,long ri,long ci,long ipp)
00158 {
00159 d[0][0] = give_k (ri,ci,0,0);
00160 }
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172 void lincoupmat::matcond2d (matrix &d,long ri,long ci,long ipp)
00173 {
00174 fillm(0.0,d);
00175
00176 d[0][0] = give_k (ri,ci,0,0);
00177 d[0][1] = give_k (ri,ci,0,1);
00178
00179 d[1][0] = give_k (ri,ci,1,0);
00180 d[1][1] = give_k (ri,ci,1,1);
00181 }
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193 void lincoupmat::matcond3d (matrix &d,long ri,long ci,long ipp)
00194 {
00195 fillm(0.0,d);
00196
00197 d[0][0] = give_k (ri,ci,0,0);
00198 d[0][1] = give_k (ri,ci,0,1);
00199 d[0][2] = give_k (ri,ci,0,2);
00200
00201 d[1][0] = give_k (ri,ci,1,0);
00202 d[1][1] = give_k (ri,ci,1,1);
00203 d[1][2] = give_k (ri,ci,1,2);
00204
00205 d[2][0] = give_k (ri,ci,2,0);
00206 d[2][1] = give_k (ri,ci,2,1);
00207 d[2][2] = give_k (ri,ci,2,2);
00208 }
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221 void lincoupmat::matcap (double &cc,long ri,long ci,long ipp)
00222 {
00223 cc = give_c (ri,ci,0,0);
00224 }
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239 double lincoupmat::give_k (long bri,long bci, long ri,long ci)
00240 {
00241 return (k[bri*ntm*dim*dim+bci*dim*dim+ri*dim+ci]);
00242 }
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254 double lincoupmat::give_c (long bri,long bci, long ri,long ci)
00255 {
00256 return (c[bri*ntm*dim*dim+bci*dim*dim+ri*dim+ci]);
00257 }
00258