00001 #include "contactmat.h"
00002 #include "matrix.h"
00003 #include "vector.h"
00004 #include "stochdriver.h"
00005 #include "global.h"
00006 #include "intpoints.h"
00007
00008 contactmat::contactmat (void)
00009 {
00010 slip = 0.0; normal = 0.0; limitn=0.0; limits=0.0;
00011 }
00012 contactmat::~contactmat (void)
00013 {
00014
00015 }
00016
00017 void contactmat::read (XFILE *in)
00018 {
00019 xfscanf (in,"%lf %lf %lf %lf",&slip,&normal,&limits,&limitn);
00020 }
00021
00022
00023
00024
00025
00026
00027
00028
00029 void contactmat::matstiff (matrix &d,long ipp)
00030 {
00031 long n = Mm->ip[ipp].ncompstr;
00032 vector eps(n),sig(n);
00033
00034 d[0][0] = slip;
00035 d[1][1] = normal;
00036 }
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 void contactmat::nlstresses (long ipp, long im, long ido)
00053 {
00054 long i, n = Mm->ip[ipp].ncompstr;
00055 vector eps(n),sig(n),dpp(n),dpmax(n);
00056 double dlim;
00057
00058
00059 for (i=0;i<n;i++)
00060 {
00061 eps[i]=Mm->ip[ipp].strain[i];
00062 dpmax[i]=Mm->ip[ipp].eqother[i];
00063 }
00064
00065
00066
00067 dlim=limits/slip;
00068
00069
00070 if (fabs(eps[0]-dpmax[0]) > dlim) dpp[0]=sgn(eps[0]-dpmax[0])*(fabs(eps[0]-dpmax[0])-dlim);
00071 if (fabs(eps[0]-dpmax[0]) < dlim) dpp[0]=0.0;
00072
00073
00074 sig[0]=slip*(eps[0]-(dpmax[0]+dpp[0]));
00075
00076
00077
00078
00079
00080 sig[1]=eps[1]*normal;
00081 if (sig[1]>limitn)
00082 sig[1]=limitn;
00083 if (sig[1]<-limitn)
00084 sig[1]=-limitn;
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 for (i=0;i<n;i++)
00097 {
00098 Mm->ip[ipp].other[i] = dpmax[i]+dpp[i];
00099 }
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 for (i=0;i<n;i++){
00117 Mm->ip[ipp].stress[i]=sig[i];
00118 }
00119
00120 }
00121
00122 void contactmat::changeparam (atsel &atm,vector &val)
00123 {
00124 long i;
00125
00126 for (i=0;i<atm.num;i++){
00127 switch (atm.atrib[i]){
00128 case 0:{
00129 slip=val[i];
00130 break;
00131 }
00132 case 1:{
00133 normal=val[i];
00134 break;
00135 }
00136 default:{
00137 fprintf (stderr,"\n\n wrong number of atribute in function changeparam (%s, line %d).\n",__FILE__,__LINE__);
00138 }
00139 }
00140 }
00141 }
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 void contactmat::updateval (long ipp, long im, long ido)
00152 {
00153 long i,n = Mm->givencompeqother(ipp, im);
00154
00155 for (i=0;i<n;i++){
00156 Mm->ip[ipp].eqother[ido+i]=Mm->ip[ipp].other[ido+i];
00157 }
00158 }
00159
00160 long contactmat::sgn (double a)
00161 {
00162 long b;
00163 if (a==0) b=0;
00164 if (a<0) b=-1;
00165 if (a>0) b=1;
00166 return (b);
00167 }