// L_YieldFunc computes the yield function value for given principal stresses (σ) func (o *CamClayMod) L_YieldFunc(σ, α []float64) float64 { p, q, w := tsr.M_pqw(σ) M := o.CS.M(w) pt := o.HE.pt n0 := (p + pt) * (p - α[0]) return q*q + M*M*n0 }
// YieldFuncs computes yield function values func (o *CamClayMod) YieldFuncs(s *State) []float64 { p, q, w := tsr.M_pqw(s.Sig) M := o.CS.M(w) pt := o.HE.pt α0 := s.Alp[0] n0 := (p + pt) * (p - α0) return []float64{q*q + M*M*n0} }
// InitIntVars initialises internal (secondary) variables func (o *CamClayMod) InitIntVars(σ []float64) (s *State, err error) { // compute α0 p, q, w := tsr.M_pqw(σ) M := o.CS.M(w) pt := o.HE.pt var α0 float64 if math.Abs(p+pt) < 1e-8 { α0 = 1e-8 } else { α0 = p + q*q/(M*M*(p+pt)) } // set state nalp := 1 // alp[0] = α0 (yield surface size controller) s = NewState(o.Nsig, nalp, false, true) copy(s.Sig, σ) s.Alp[0] = α0 * o.ocr // compute initial strains o.HE.CalcEps0(s) return }
// Plot runs the plot generation (basic set) func (o *Plotter) Plot(keys []string, res []*State, sts [][]float64, first, last bool) { // auxiliary variables nr := imax(len(res), len(sts)) if nr < 1 { return } x := make([]float64, nr) y := make([]float64, nr) o.P = make([]float64, nr) o.Q = make([]float64, nr) o.W = make([]float64, nr) o.Ev = make([]float64, nr) o.Ed = make([]float64, nr) // compute invariants for i := 0; i < len(res); i++ { if len(res[i].Sig) < 4 { chk.Panic("number of stress components is incorrect: %d", len(res[i].Sig)) } o.P[i], o.Q[i], o.W[i] = tsr.M_pqw(res[i].Sig) } nsig := len(res[0].Sig) devε := make([]float64, nsig) for i := 0; i < len(sts); i++ { if len(sts[i]) < 4 { chk.Panic("number of strain components is incorrect: %d", len(sts[i])) } _, o.Ev[i], o.Ed[i] = tsr.M_devε(devε, sts[i]) } // clear previous figure if first { plt.Clf() plt.SplotGap(0.35, 0.35) if o.Hspace > 0 { plt.SetHspace(o.Hspace) } if o.Vspace > 0 { plt.SetVspace(o.Vspace) } } // number of points for contour if o.NptsPq < 2 { o.NptsPq = 61 } if o.NptsOct < 2 { o.NptsOct = 41 } if o.NptsSig < 2 { o.NptsSig = 41 } // subplot variables o.Pidx = 1 o.Ncol, o.Nrow = utl.BestSquare(len(keys)) if len(keys) == 2 { o.Ncol, o.Nrow = 1, 2 } if len(keys) == 3 { o.Ncol, o.Nrow = 1, 3 } // do plot for _, key := range keys { o.Subplot() switch key { case "ed,q": o.QdivP = false o.Plot_ed_q(x, y, res, sts, last) case "ed,q/p": o.QdivP = true o.Plot_ed_q(x, y, res, sts, last) case "p,q": o.WithYs = false o.Plot_p_q(x, y, res, sts, last) case "p,q,ys": o.WithYs = true o.Plot_p_q(x, y, res, sts, last) case "ed,ev": o.Plot_ed_ev(x, y, res, sts, last) case "p,ev": o.LogP = false o.Plot_p_ev(x, y, res, sts, last) case "log(p),ev": o.LogP = true o.Plot_p_ev(x, y, res, sts, last) case "i,f": o.Plot_i_f(x, y, res, sts, last) case "i,alp": o.Plot_i_alp(x, y, res, sts, last) case "Dgam,f": o.Plot_Dgam_f(x, y, res, sts, last) case "oct": o.WithYs = false o.Plot_oct(x, y, res, sts, last) case "oct,ys": o.WithYs = true o.Plot_oct(x, y, res, sts, last) case "s3,s1": o.WithYs = false o.Plot_s3_s1(x, y, res, sts, last) case "s3,s1,ys": o.WithYs = true o.Plot_s3_s1(x, y, res, sts, last) case "empty": continue default: chk.Panic("cannot handle key=%q", key) } if o.Split && last { o.Save("_", key) } } // save figure if !o.Split && last { o.Save("", "") } }