00001 #include "glasgownew.h"
00002 #include "vecttens.h"
00003 #include "global.h"
00004 #include "intpoints.h"
00005
00006 glasgownew::glasgownew ()
00007 {
00008
00009 }
00010
00011 glasgownew::~glasgownew ()
00012 {
00013
00014 }
00015
00016 void glasgownew::read (XFILE *in)
00017 {
00018
00019 }
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 void glasgownew::material_matrix_fts (long ipp,matrix &d,strastrestate ssst)
00031 {
00032 long nmc;
00033 double t;
00034
00035
00036 nmc = d.m;
00037
00038 matrix m(nmc,1),dd(nmc,nmc);
00039
00040
00041 tensor_vector_matrix (ssst,m);
00042
00043
00044 Mm->elmatstiff (dd,ipp);
00045
00046
00047 t = Mm->givenonmechq(temperature, ipp);
00048
00049
00050 norm_tempr = (t-273.15-20.0)/100.0;
00051
00052
00053 if (0.0<= norm_tempr && norm_tempr<=6.0)
00054 alpha = 6.0e-5/(7.0-norm_tempr);
00055 else
00056 alpha = 0.0;
00057
00058
00059 cmulm (alpha,m);
00060
00061
00062 mxm (dd,m,d);
00063
00064 return;
00065 }
00066
00067
00068
00069
00070
00071
00072 void glasgownew::material_matrix_td (long ipp,matrix &d,strastrestate ssst)
00073 {
00074 long nmc;
00075 double t_old,t_new,dt,chi,htd;
00076
00077
00078 nmc = d.m;
00079
00080 matrix m(nmc,1),dd(nmc,nmc),toteps(nmc,1),epst(nmc,1),epsel(nmc,1),sig(nmc,1);
00081
00082
00083 tensor_vector_matrix (ssst,m);
00084
00085
00086 Mm->elmatstiff (dd,ipp);
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 norm_tempr = (t_new-273.15-20.0)/100.0;
00101
00102
00103 if (0.0<= norm_tempr && norm_tempr<=6.0)
00104 alpha = 6.0e-5/(7.0-norm_tempr);
00105 else
00106 alpha = 0.0;
00107
00108
00109 cmulm (alpha,m);
00110
00111
00112 dt = t_new-t_old;
00113
00114
00115 cmulm (dt,m,epst);
00116
00117
00118 subm(toteps,epst,epsel);
00119
00120
00121 mxm(dd,epsel,sig);
00122
00123 if (norm_tempr>t_hat){
00124 t_hat=norm_tempr;
00125 }
00126
00127
00128 chi = 0.2*t_hat - 0.01*t_hat*t_hat;
00129
00130
00131 htd = (0.2-0.02*t_hat)/100.0;
00132
00133
00134
00135 mxm (dd,m,d);
00136 cmulm (htd,sig,sig);
00137 addm (d,sig,d);
00138
00139 return;
00140 }
00141
00142
00143
00144
00145
00146
00147
00148
00149 void glasgownew::free_thermal_strains (long ipp, vector &epsft)
00150 {
00151 long nmc, i;
00152 double t,t_new;
00153 strastrestate ssst;
00154
00155
00156 ssst = Mm->ip[ipp].ssst;
00157
00158
00159 nmc = Mm->ip[ipp].ncompstr;
00160
00161 matrix m(nmc,1);
00162
00163
00164 tensor_vector_matrix (ssst,m);
00165
00166
00167
00168 t_new = Mm->givenonmechq(temperature, ipp);
00169
00170
00171
00172 norm_tempr = (t-273.15-20.0)/100.0;
00173
00174
00175 if (0.0<= norm_tempr && norm_tempr<=6.0)
00176 alpha = 6.0e-5/(7.0-norm_tempr);
00177 else
00178 alpha = 0.0;
00179
00180
00181 cmulm (alpha,m);
00182
00183 for (i=0; i<epsft.n; i++)
00184 epsft[i] = m[i][0];
00185
00186 return;
00187 }
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203 double glasgownew::thermdamfunction (long ipp,double tempr,vector &kappa)
00204 {
00205 double chi = 0.0;
00206 double tkappa0 = 20.0;
00207
00208 if (tempr > kappa[0])
00209 kappa[0] = tempr;
00210 if (kappa[0] > tkappa0)
00211 chi = 2.0e-3*(kappa[0] - tkappa0)*(1.0-5.0e-4*(kappa[0]-tkappa0));
00212 else
00213 chi = 0.0;
00214
00215 return chi;
00216 }
00217
00218
00219
00220 void glasgownew::nlstresses(long ipp, long ido)
00221 {
00222 long ncomp = Mm->ip[ipp].ncompstr;
00223 vector eps(ncomp), eps_ft(ncomp), eps_el(ncomp);
00224 matrix d(ncomp, ncomp);
00225 vector sig(ncomp);
00226 strastrestate ssst = Mm->ip[ipp].ssst;
00227 long i;
00228 double chi;
00229 vector kappa(1);
00230
00231
00232 for (i=0;i<ncomp;i++)
00233 eps[i]=Mm->ip[ipp].strain[i];
00234
00235
00236
00237 free_thermal_strains(ipp, eps_ft);
00238
00239 subv(eps, eps_ft, eps_el);
00240
00241 mxv (d, eps, sig);
00242
00243 kappa[0] = Mm->ip[ipp].eqother[0+ido];
00244
00245 chi = thermdamfunction (ipp, Mm->givenonmechq(temperature, ipp), kappa);
00246
00247 cmulv(1.0-chi, sig);
00248
00249 for (i=0; i<ncomp; i++)
00250 Mm->ip[ipp].stress[i]=sig[i];
00251
00252 return;
00253 }
00254
00255 void glasgownew::updateval(long ipp, long ido)
00256 {
00257 Mm->ip[ipp].eqother[0+ido] = Mm->givenonmechq(temperature, ipp);
00258 return;
00259 }