// CheckDerivT checks derivatives w.r.t to t for fixed coordinates x func CheckDerivT(tst *testing.T, o Func, t0, tf float64, xcte []float64, np int, tskip []float64, sktol, dtol, dtol2 float64, ver bool) { t := utl.LinSpace(t0, tf, np) for i := 0; i < np; i++ { g := o.G(t[i], xcte) h := o.H(t[i], xcte) skip := false for _, val := range tskip { if math.Abs(val-t[i]) < sktol { skip = true break } } if skip { continue } dnum := num.DerivCen(func(t float64, args ...interface{}) (res float64) { return o.F(t, xcte) }, t[i]) chk.AnaNum(tst, io.Sf("G(%10f)", t[i]), dtol, g, dnum, ver) dnum2 := num.DerivCen(func(t float64, args ...interface{}) (res float64) { return o.G(t, xcte) }, t[i]) chk.AnaNum(tst, io.Sf("H(%10f)", t[i]), dtol2, h, dnum2, ver) } }
func Test_hyperelast02(tst *testing.T) { //verbose() chk.PrintTitle("hyperelast02 (linear)") E, ν := 1500.0, 0.25 K := Calc_K_from_Enu(E, ν) G := Calc_G_from_Enu(E, ν) io.Pforan("K = %v\n", K) io.Pforan("G = %v\n", G) var m HyperElast1 m.Init(2, false, []*fun.Prm{ &fun.Prm{N: "K0", V: K}, &fun.Prm{N: "G0", V: G}, &fun.Prm{N: "le", V: 1}, }) io.Pforan("m = %+v\n", m) ε := []float64{-0.001, -0.002, -0.003} σ := make([]float64, 3) m.L_update(σ, ε) io.Pfblue2("ε = %v\n", ε) io.Pfcyan("σ = %v\n", σ) D := la.MatAlloc(3, 3) m.L_CalcD(D, ε) la.PrintMat("D", D, "%14.6f", false) tol := 1e-11 verb := io.Verbose var tmp float64 for i := 0; i < 3; i++ { for j := 0; j < 3; j++ { dnum := num.DerivCen(func(x float64, args ...interface{}) (res float64) { tmp, ε[j] = ε[j], x m.L_update(σ, ε) res = σ[i] ε[j] = tmp return }, ε[j]) chk.AnaNum(tst, io.Sf("D%d%d", i, j), tol, D[i][j], dnum, verb) } } }
// CheckDerivX checks derivatives w.r.t to x for fixed t func CheckDerivX(tst *testing.T, o Func, tcte float64, xmin, xmax []float64, np int, xskip [][]float64, sktol, dtol float64, ver bool) { ndim := len(xmin) dx := make([]float64, ndim) for i := 0; i < ndim; i++ { dx[i] = (xmax[i] - xmin[i]) / float64(np-1) } x := make([]float64, ndim) g := make([]float64, ndim) nz := 1 if ndim == 3 { nz = np } xtmp := make([]float64, ndim) for k := 0; k < nz; k++ { if ndim == 3 { x[2] = xmin[2] + float64(k)*dx[2] } for j := 0; j < np; j++ { x[1] = xmin[1] + float64(j)*dx[1] for i := 0; i < np; i++ { x[0] = xmin[0] + float64(i)*dx[0] o.Grad(g, tcte, x) for l := 0; l < ndim; l++ { skip := false for _, val := range xskip { if math.Abs(val[l]-x[l]) < sktol { skip = true break } } if skip { continue } dnum := num.DerivCen(func(s float64, args ...interface{}) (res float64) { copy(xtmp, x) xtmp[l] = s return o.F(tcte, xtmp) }, x[l]) chk.AnaNum(tst, io.Sf("dFdX(t,%10v)[%d]", x, l), dtol, g[l], dnum, ver) } } } } }
func Test_hyperelast03(tst *testing.T) { //verbose() chk.PrintTitle("hyperelast03 (nonlinear)") var m HyperElast1 m.Init(2, false, []*fun.Prm{ &fun.Prm{N: "kap", V: 0.05}, &fun.Prm{N: "kapb", V: 20.0}, &fun.Prm{N: "G0", V: 1500}, &fun.Prm{N: "pr", V: 2.2}, &fun.Prm{N: "pt", V: 11.0}, }) io.Pforan("m = %+v\n", m) ε := []float64{-0.001, -0.002, -0.003} σ := make([]float64, 3) m.L_update(σ, ε) io.Pfblue2("ε = %v\n", ε) io.Pfcyan("σ = %v\n", σ) D := la.MatAlloc(3, 3) m.L_CalcD(D, ε) la.PrintMat("D", D, "%14.6f", false) tol := 1e-7 verb := io.Verbose var tmp float64 for i := 0; i < 3; i++ { for j := 0; j < 3; j++ { dnum := num.DerivCen(func(x float64, args ...interface{}) (res float64) { tmp, ε[j] = ε[j], x m.L_update(σ, ε) res = σ[i] ε[j] = tmp return }, ε[j]) chk.AnaNum(tst, io.Sf("D%d%d", i, j), tol, D[i][j], dnum, verb) } } }