func Test_nurbs01(tst *testing.T) { /* 4 (1,2) (2,2) 6 5 2@o--------------o@3 7 | | | | @ -- control point | | o -- node | | (a,b) -- span | | | | 0 0@o--------------o@1 2 1 (1,1) (2,1) 3 */ //verbose() chk.PrintTitle("nurb01. square with initial stress") // fem analysis := NewFEM("data/nurbs01.sim", "", true, false, false, false, chk.Verbose, 0) // set stage err := analysis.SetStage(0) if err != nil { tst.Errorf("SetStage failed:\n%v", err) return } // initialise solution vectors err = analysis.ZeroStage(0, true) if err != nil { tst.Errorf("ZeroStage failed:\n%v", err) return } // domain dom := analysis.Domains[0] // draw NURBS if false { nurbs := dom.Msh.Cells[0].Shp.Nurbs gm.PlotNurbs("/tmp/gofem", "test_nurbs01", nurbs, 21, false, nil) } // nodes and elements chk.IntAssert(len(dom.Nodes), 4) chk.IntAssert(len(dom.Elems), 1) // check dofs for _, nod := range dom.Nodes { chk.IntAssert(len(nod.Dofs), 2) chk.StrAssert(nod.Dofs[0].Key, "ux") chk.StrAssert(nod.Dofs[1].Key, "uy") } // check equations nids, eqs := get_nids_eqs(dom) chk.Ints(tst, "eqs", eqs, utl.IntRange(4*2)) chk.Ints(tst, "nids", nids, []int{0, 1, 2, 3}) // check Umap Umaps := [][]int{ {0, 1, 2, 3, 4, 5, 6, 7}, } for i, ele := range dom.Elems { e := ele.(*ElemU) io.Pfpink("%2d : Umap = %v\n", e.Id(), e.Umap) chk.Ints(tst, "Umap", e.Umap, Umaps[i]) } // constraints chk.IntAssert(len(dom.EssenBcs.Bcs), 4) var ct_ux_eqs []int // equations with ux prescribed [sorted] var ct_uy_eqs []int // equations with uy prescribed [sorted] for _, c := range dom.EssenBcs.Bcs { chk.IntAssert(len(c.Eqs), 1) eq := c.Eqs[0] io.Pfgrey("key=%v eq=%v\n", c.Key, eq) switch c.Key { case "ux": ct_ux_eqs = append(ct_ux_eqs, eq) case "uy": ct_uy_eqs = append(ct_uy_eqs, eq) default: tst.Errorf("key %s is incorrect", c.Key) } } sort.Ints(ct_ux_eqs) sort.Ints(ct_uy_eqs) chk.Ints(tst, "equations with ux prescribed", ct_ux_eqs, []int{0, 4}) chk.Ints(tst, "equations with uy prescribed", ct_uy_eqs, []int{1, 3}) // check displacements tolu := 1e-16 for _, n := range dom.Nodes { eqx := n.GetEq("ux") eqy := n.GetEq("uy") u := []float64{dom.Sol.Y[eqx], dom.Sol.Y[eqy]} chk.Vector(tst, "u", tolu, u, nil) } // analytical solution qnV, qnH := -100.0, -50.0 ν := 0.25 σx, σy := qnH, qnV σz := ν * (σx + σy) σref := []float64{σx, σy, σz, 0} // check stresses e := dom.Elems[0].(*ElemU) tols := 1e-13 for idx, _ := range e.IpsElem { σ := e.States[idx].Sig io.Pforan("σ = %v\n", σ) chk.Vector(tst, "σ", tols, σ, σref) } }
func Test_up01a(tst *testing.T) { /* this tests simulates seepage flow along a column * by reducing the initial hydrostatic pressure at * at the bottom of the column * * using mesh from col104elay.msh * * Nodes / Tags Equations * ux uy pl ux uy pl * 8 o----o----o 9 (-5) 53 54 55 o----o----o 50 51 52 * | 14 | . . . | 58 59 | . . . * | (-1) | . . . | | . . . * 21 o o o 22 (-6) 60 61 . o o o 56 57 . * | 26 | . . . | 62 63 | . . . * | | . . . | | . . . * 6 o----o----o 7 (-4) 39 40 41 o----o----o 36 37 38 * | 13 | . . . | 44 45 | . . . * | (-1) | . . . | | . . . * 19 | o o 20 (-6) 46 47 . | o o 42 43 . * | 25 | . . . | 48 49 | . . . * | | . . . | | . . . * 4 o----o----o 5 (-3) 25 26 27 o----o----o 22 23 24 * | 12 | . . . | 30 31 | . . . * | (-2) | . . . | | . . . * 17 o o o 18 (-6) 32 33 . o o o 28 29 . * | 24 | . . . | 34 35 | . . . * | | . . . | | . . . * 2 o----o----o 3 (-2) 9 10 11 o----o----o 6 7 8 * | 11 | . . . | 16 17 | . . . * | (-2) | . . . | | . . . * 15 o o o 16 (-6) 18 19 o o o 14 15 * | 23 | . . . | 20 21 | . . . * | | . . . | | . . . * 0 o----o----o 1 (-1) 0 1 2 o----o----o 3 4 5 * 10 12 13 */ // capture errors and flush log defer End() //verbose() chk.PrintTitle("up01a") // start simulation if !Start("data/up01.sim", true, chk.Verbose) { chk.Panic("cannot start simulation") } // domain distr := false dom := NewDomain(Global.Sim.Regions[0], distr) if dom == nil { chk.Panic("cannot allocate new domain") } // set stage if !dom.SetStage(0, Global.Sim.Stages[0], distr) { chk.Panic("cannot set stage") } // nodes and elements chk.IntAssert(len(dom.Nodes), 27) chk.IntAssert(len(dom.Elems), 4) if true { // nodes with pl nods_with_pl := map[int]bool{0: true, 2: true, 4: true, 6: true, 8: true, 1: true, 3: true, 5: true, 7: true, 9: true} // check dofs for _, nod := range dom.Nodes { if nods_with_pl[nod.Vert.Id] { chk.IntAssert(len(nod.Dofs), 3) chk.StrAssert(nod.Dofs[0].Key, "ux") chk.StrAssert(nod.Dofs[1].Key, "uy") chk.StrAssert(nod.Dofs[2].Key, "pl") } else { chk.IntAssert(len(nod.Dofs), 2) chk.StrAssert(nod.Dofs[0].Key, "ux") chk.StrAssert(nod.Dofs[1].Key, "uy") } } // check equations nids, eqs := get_nids_eqs(dom) chk.Ints(tst, "eqs", eqs, utl.IntRange(10*3+17*2)) chk.Ints(tst, "nids", nids, []int{ 0, 1, 3, 2, 10, 16, 11, 15, 23, 5, 4, 18, 12, 17, 24, 7, 6, 20, 13, 19, 25, 9, 8, 22, 14, 21, 26, }) // check pmap Pmaps := [][]int{ {2, 5, 8, 11}, {11, 8, 24, 27}, {27, 24, 38, 41}, {41, 38, 52, 55}, } Umaps := [][]int{ {0, 1, 3, 4, 6, 7, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21}, {9, 10, 6, 7, 22, 23, 25, 26, 16, 17, 28, 29, 30, 31, 32, 33, 34, 35}, {25, 26, 22, 23, 36, 37, 39, 40, 30, 31, 42, 43, 44, 45, 46, 47, 48, 49}, {39, 40, 36, 37, 50, 51, 53, 54, 44, 45, 56, 57, 58, 59, 60, 61, 62, 63}, } for i, ele := range dom.Elems { e := ele.(*ElemUP) io.Pfpink("%2d : Pmap = %v\n", e.Id(), e.P.Pmap) io.Pfpink("%2d : Umap = %v\n", e.Id(), e.U.Umap) chk.Ints(tst, "Pmap", e.P.Pmap, Pmaps[i]) chk.Ints(tst, "Umap", e.U.Umap, Umaps[i]) } // constraints chk.IntAssert(len(dom.EssenBcs.Bcs), 9*2+2+3) var ct_ux_eqs []int // equations with ux prescribed [sorted] var ct_uy_eqs []int // equations with uy prescribed [sorted] var ct_pl_eqs []int // equations with pl prescribed [sorted] for _, c := range dom.EssenBcs.Bcs { chk.IntAssert(len(c.Eqs), 1) eq := c.Eqs[0] io.Pfgrey("key=%v eq=%v\n", c.Key, eq) switch c.Key { case "ux": ct_ux_eqs = append(ct_ux_eqs, eq) case "uy": ct_uy_eqs = append(ct_uy_eqs, eq) case "pl": ct_pl_eqs = append(ct_pl_eqs, eq) default: tst.Errorf("key %s is incorrect", c.Key) } } sort.Ints(ct_ux_eqs) sort.Ints(ct_uy_eqs) sort.Ints(ct_pl_eqs) chk.Ints(tst, "equations with ux prescribed", ct_ux_eqs, []int{0, 3, 6, 9, 14, 18, 22, 25, 28, 32, 36, 39, 42, 46, 50, 53, 56, 60}) chk.Ints(tst, "equations with uy prescribed", ct_uy_eqs, []int{1, 4, 13}) chk.Ints(tst, "equations with pl prescribed", ct_pl_eqs, []int{2, 5}) } // initial values @ nodes io.Pforan("initial values @ nodes\n") for _, nod := range dom.Nodes { z := nod.Vert.C[1] for _, dof := range nod.Dofs { u := dom.Sol.Y[dof.Eq] switch dof.Key { case "ux": chk.Scalar(tst, io.Sf("nod %3d : ux(@ %4g)= %6g", nod.Vert.Id, z, u), 1e-17, u, 0) case "uy": chk.Scalar(tst, io.Sf("nod %3d : uy(@ %4g)= %6g", nod.Vert.Id, z, u), 1e-17, u, 0) case "pl": plC, _, _ := Global.HydroSt.Calc(z) chk.Scalar(tst, io.Sf("nod %3d : pl(@ %4g)= %6g", nod.Vert.Id, z, u), 1e-13, u, plC) } } } // intial values @ integration points io.Pforan("initial values @ integration points\n") for _, ele := range dom.Elems { e := ele.(*ElemUP) for idx, ip := range e.P.IpsElem { s := e.P.States[idx] z := e.P.Shp.IpRealCoords(e.P.X, ip)[1] chk.AnaNum(tst, io.Sf("sl(z=%11.8f)", z), 1e-17, s.A_sl, 1, chk.Verbose) } } // parameters ν := 0.2 // Poisson's coefficient K0 := ν / (1.0 - ν) // earth pressure at rest nf := 0.3 // porosity sl := 1.0 // saturation ρL := 1.0 // intrinsic (real) density of liquid ρS_top := 2.0 // intrinsic (real) density of solids in top layer ρS_bot := 3.0 // intrinsic (real) density of solids in bottom layer h := 5.0 // height of each layer g := 10.0 // gravity // densities nl := nf * sl // volume fraction of luqid ns := 1.0 - nf // volume fraction of solid ρl := nl * ρL // partial density of liquid ρs_top := ns * ρS_top // partial density of solids in top layer ρs_bot := ns * ρS_bot // partial density of solids in bottom layer ρ_top := ρl + ρs_top // density of mixture in top layer ρ_bot := ρl + ρs_bot // density of mixture in bottom layer // absolute values of stresses σV_z5 := ρ_top * g * h // total vertical stress @ elevation z = 5 m (absolute value) σV_z0 := σV_z5 + ρ_bot*g*h // total vertical stress @ elevation z = 0 m (absolute value) io.Pfyel("ρ_top = %g\n", ρ_top) io.Pfyel("ρ_bot = %g\n", ρ_bot) io.Pfyel("|ΔσV_top| = %g\n", ρ_top*g*h) io.Pfyel("|ΔσV_bot| = %g\n", ρ_bot*g*h) io.PfYel("|σV|(@ z=0) = %g\n", σV_z0) io.PfYel("|σV|(@ z=5) = %g\n", σV_z5) // stress functions var sig fun.Pts var pres fun.Pts sig.Init(fun.Prms{ &fun.Prm{N: "t0", V: 0.00}, {N: "y0", V: -σV_z0}, &fun.Prm{N: "t1", V: 5.00}, {N: "y1", V: -σV_z5}, &fun.Prm{N: "t2", V: 10.00}, {N: "y2", V: 0.0}, }) pres.Init(fun.Prms{ &fun.Prm{N: "t0", V: 0.00}, {N: "y0", V: 100}, &fun.Prm{N: "t1", V: 10.00}, {N: "y1", V: 0}, }) // check stresses io.Pforan("initial stresses @ integration points\n") for _, ele := range dom.Elems { e := ele.(*ElemUP) for idx, ip := range e.U.IpsElem { z := e.U.Shp.IpRealCoords(e.U.X, ip)[1] σe := e.U.States[idx].Sig sv := sig.F(z, nil) sve := sv + pres.F(z, nil) she := sve * K0 if math.Abs(σe[2]-σe[0]) > 1e-17 { tst.Errorf("[1;31mσx is not equal to σz: %g != %g[0m\n", σe[2], σe[0]) return } if math.Abs(σe[3]) > 1e-17 { tst.Errorf("[1;31mσxy is not equal to zero: %g != 0[0m\n", σe[3]) return } chk.AnaNum(tst, io.Sf("sx(z=%11.8f)", z), 0.0003792, σe[0], she, chk.Verbose) chk.AnaNum(tst, io.Sf("sy(z=%11.8f)", z), 0.001517, σe[1], sve, chk.Verbose) } } return }
func Test_sg52a(tst *testing.T) { /* Smith & Griffths (5th ed) Figure 5.2 p173 * * 0.25 0.5 0.25 kN/m * ↓ ↓ ↓ * --- ▷0---------1---------2 * | | ,'| ,'| E = 1e6 kN/m² * | | 0 ,' | 2 ,' | ν = 0.3 * | | ,' | ,' | * | ,' 1 | ,' 3 | connectivity: * 1 m ▷3'--------4'--------5 0 : 1 0 3 * | ,'| ,'| 1 : 3 4 1 * | | 4 ,' | 6 ,' | 2 : 2 1 4 * | | ,' | ,' | 3 : 4 5 2 * | | ,' 5 | ,' 7 | 4 : 4 3 6 * --- ▷6'--------7'--------8 5 : 6 7 4 * △ △ △ 6 : 5 4 7 * 7 : 7 8 5 * |------- 1 m -------| */ //verbose() chk.PrintTitle("sg52a") // start simulation analysis := NewFEM("data/sg52.sim", "", true, false, false, false, chk.Verbose, 0) // set stage err := analysis.SetStage(0) if err != nil { tst.Errorf("SetStage failed:\n%v", err) return } // initialise solution vectros err = analysis.ZeroStage(0, true) if err != nil { tst.Errorf("ZeroStage failed:\n%v", err) return } // domain dom := analysis.Domains[0] // nodes and elements chk.IntAssert(len(dom.Nodes), 9) chk.IntAssert(len(dom.Elems), 8) // check dofs for _, nod := range dom.Nodes { chk.IntAssert(len(nod.Dofs), 2) } // check equations nids, eqs := get_nids_eqs(dom) chk.Ints(tst, "nids", nids, []int{1, 0, 3, 4, 2, 5, 6, 7, 8}) chk.Ints(tst, "eqs", eqs, []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17}) // check solution arrays ny := 9 * 2 nλ := 6 nyb := ny + nλ chk.IntAssert(len(dom.Sol.Y), ny) chk.IntAssert(len(dom.Sol.Dydt), 0) chk.IntAssert(len(dom.Sol.D2ydt2), 0) chk.IntAssert(len(dom.Sol.Psi), 0) chk.IntAssert(len(dom.Sol.Zet), 0) chk.IntAssert(len(dom.Sol.Chi), 0) chk.IntAssert(len(dom.Sol.L), nλ) chk.IntAssert(len(dom.Sol.ΔY), ny) // check linear solver arrays chk.IntAssert(len(dom.Fb), nyb) chk.IntAssert(len(dom.Wb), nyb) // check umap umaps := [][]int{ {0, 1, 2, 3, 4, 5}, {4, 5, 6, 7, 0, 1}, {8, 9, 0, 1, 6, 7}, {6, 7, 10, 11, 8, 9}, {6, 7, 4, 5, 12, 13}, {12, 13, 14, 15, 6, 7}, {10, 11, 6, 7, 14, 15}, {14, 15, 16, 17, 10, 11}, } for i, ele := range dom.Elems { e := ele.(*ElemU) io.Pforan("e%d.umap = %v\n", e.Id(), e.Umap) chk.Ints(tst, "umap", e.Umap, umaps[i]) } // constraints chk.IntAssert(len(dom.EssenBcs.Bcs), nλ) var ct_ux_eqs []int // constrained ux equations [sorted] var ct_uy_eqs []int // constrained uy equations [sorted] for _, c := range dom.EssenBcs.Bcs { chk.IntAssert(len(c.Eqs), 1) eq := c.Eqs[0] io.Pforan("key=%v eq=%v\n", c.Key, eq) switch c.Key { case "ux": ct_ux_eqs = append(ct_ux_eqs, eq) case "uy": ct_uy_eqs = append(ct_uy_eqs, eq) default: tst.Errorf("key %s is incorrect", c.Key) } } sort.Ints(ct_ux_eqs) sort.Ints(ct_uy_eqs) chk.Ints(tst, "constrained ux equations", ct_ux_eqs, []int{2, 4, 12}) chk.Ints(tst, "constrained uy equations", ct_uy_eqs, []int{13, 15, 17}) // point loads chk.IntAssert(len(dom.PtNatBcs.Bcs), 3) chk.StrAssert(dom.PtNatBcs.Bcs[0].Key, "fuy") chk.StrAssert(dom.PtNatBcs.Bcs[1].Key, "fuy") chk.StrAssert(dom.PtNatBcs.Bcs[2].Key, "fuy") chk.IntAssert(dom.PtNatBcs.Bcs[0].Eq, 3) chk.IntAssert(dom.PtNatBcs.Bcs[1].Eq, 1) chk.IntAssert(dom.PtNatBcs.Bcs[2].Eq, 9) }
func Test_phi01(tst *testing.T) { /* Nodes Equations: * 7 15 * 6 o----o----o----o----o 8 16 o----o----o----o----o 21 * | 13 | 14 | | 18 | 23 | * | | | | | | * 18 o [2] o19 [3] o 20 19 o o o17 o o 22 * | 23 | 24 | | 20 | 24 | * | | | | | | * 3 o----o----o----o----o 5 3 o----o----o----o----o 10 * | 11 4| 12 | | 6 2| 13 | * | | | | | | * 15 o [0] o16 [1] o 17 7 o o o5 o o 12 * | 21 | 22 | | 8 | 14 | * | | | | | | * 0 o----o----o----o----o 2 0 o----o----o----o----o 9 * 9 1 10 4 1 11 */ //verbose() chk.PrintTitle("phi01a") // make sure to flush log defer End() // start simulation if !Start("data/phi01.sim", true, chk.Verbose) { tst.Errorf("test failed\n") return } // domain distr := false dom := NewDomain(Global.Sim.Regions[0], distr) if dom == nil { tst.Errorf("test failed\n") return } // set stage if !dom.SetStage(0, Global.Sim.Stages[0], distr) { tst.Errorf("test failed\n") return } // nodes and elements chk.IntAssert(len(dom.Nodes), 25) chk.IntAssert(len(dom.Elems), 4) // check dofs for _, nod := range dom.Nodes { chk.IntAssert(len(nod.Dofs), 1) chk.StrAssert(nod.Dofs[0].Key, "h") } // check equations nids, eqs := get_nids_eqs(dom) chk.Ints(tst, "nids", nids, []int{ 0, 1, 4, 3, 9, 16, 11, 15, 21, 2, 5, 10, 17, 12, 22, 7, 6, 19, 13, 18, 23, 8, 20, 14, 24, }) chk.Ints(tst, "eqs", eqs, []int{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, }) /* // check pmap pmaps := [][]int{ {0, 1, 2, 3, 4, 5, 6, 7, 8}, {3, 2, 9, 10, 6, 11, 12, 13, 14}, {10, 9, 15, 16, 12, 17, 18, 19, 20}, {16, 15, 21, 22, 18, 23, 24, 25, 26}, } for i, ele := range dom.Elems { e := ele.(*ElemP) io.Pforan("e%d.pmap = %v\n", e.Id(), e.Pmap) chk.Ints(tst, "pmap", e.Pmap, pmaps[i]) } // constraints chk.IntAssert(len(dom.EssenBcs.Bcs), 3) var ct_pl_eqs []int // equations with pl prescribed [sorted] for _, c := range dom.EssenBcs.Bcs { chk.IntAssert(len(c.Eqs), 1) eq := c.Eqs[0] io.Pforan("key=%v eq=%v\n", c.Key, eq) switch c.Key { case "pl": ct_pl_eqs = append(ct_pl_eqs, eq) default: tst.Errorf("key %s is incorrect", c.Key) } } sort.Ints(ct_pl_eqs) chk.Ints(tst, "equations with pl prescribed", ct_pl_eqs, []int{0, 1, 4}) // initial values @ nodes io.Pforan("initial values @ nodes\n") for _, nod := range dom.Nodes { z := nod.Vert.C[1] eq := nod.Dofs[0].Eq pl := dom.Sol.Y[eq] plC, _, _ := Global.HydroSt.Calc(z) chk.Scalar(tst, io.Sf("nod %3d : pl(@ %4g)= %6g", nod.Vert.Id, z, pl), 1e-17, pl, plC) } // intial values @ integration points io.Pforan("initial values @ integration points\n") for _, ele := range dom.Elems { e := ele.(*ElemP) for idx, ip := range e.IpsElem { s := e.States[idx] z := e.Shp.IpRealCoords(e.X, ip)[1] _, ρLC, _ := Global.HydroSt.Calc(z) chk.Scalar(tst, io.Sf("sl(@ %18g)= %18g", z, s.A_sl), 1e-17, s.A_sl, 1) chk.Scalar(tst, io.Sf("ρL(@ %18g)= %18g", z, s.A_ρL), 1e-13, s.A_ρL, ρLC) } } */ }
func Test_phi01(tst *testing.T) { /* Nodes Equations: * 7 15 * 6 o----o----o----o----o 8 16 o----o----o----o----o 21 * | 13 | 14 | | 18 | 23 | * | | | | | | * 18 o [2] o19 [3] o 20 19 o o o17 o o 22 * | 23 | 24 | | 20 | 24 | * | | | | | | * 3 o----o----o----o----o 5 3 o----o----o----o----o 10 * | 11 4| 12 | | 6 2| 13 | * | | | | | | * 15 o [0] o16 [1] o 17 7 o o o5 o o 12 * | 21 | 22 | | 8 | 14 | * | | | | | | * 0 o----o----o----o----o 2 0 o----o----o----o----o 9 * 9 1 10 4 1 11 */ //verbose() chk.PrintTitle("phi01") // start simulation analysis := NewFEM("data/phi01.sim", "", true, false, false, false, chk.Verbose, 0) // set stage err := analysis.SetStage(0) if err != nil { tst.Errorf("SetStage failed:\n%v", err) return } // initialise solution vectros err = analysis.ZeroStage(0, true) if err != nil { tst.Errorf("ZeroStage failed:\n%v", err) return } // domain dom := analysis.Domains[0] // nodes and elements chk.IntAssert(len(dom.Nodes), 25) chk.IntAssert(len(dom.Elems), 4) // check dofs for _, nod := range dom.Nodes { chk.IntAssert(len(nod.Dofs), 1) chk.StrAssert(nod.Dofs[0].Key, "h") } // check equations nids, eqs := get_nids_eqs(dom) chk.Ints(tst, "nids", nids, []int{ 0, 1, 4, 3, 9, 16, 11, 15, 21, 2, 5, 10, 17, 12, 22, 7, 6, 19, 13, 18, 23, 8, 20, 14, 24, }) chk.Ints(tst, "eqs", eqs, []int{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, }) // check initial values r := 0.25 chk.Scalar(tst, "h @ nod 4", 1e-17, dom.Sol.Y[2], -r) chk.Scalar(tst, "h @ nod 8", 1e-17, dom.Sol.Y[21], math.Sqrt(2)/2.0-r) for _, eq := range []int{5, 6, 13, 17} { chk.Scalar(tst, io.Sf("h @ eq %d", eq), 1e-17, dom.Sol.Y[eq], 0) } }
func Test_p01a(tst *testing.T) { /* this tests simulates seepage flow along a column * by reducing the initial hydrostatic pressure at * at the bottom of the column * * Nodes / Tags Equations * * 8 o----o----o 9 (-5) 22 o----o----o 21 * | 14 | | 24 | * | | | | * 21 o o o 22 (-6) 25 o o o 23 * | 26 | | 26 | * | | | | * 6 o----o----o 7 (-4) 16 o----o----o 15 * | 13 | | 18 | * | | | | * 19 | o o 20 (-6) 19 | o o 17 * | 25 | | 20 | * | | | | * 4 o----o----o 5 (-3) 10 o----o----o 9 * | 12 | | 12 | * | | | | * 17 o o o 18 (-6) 13 o o o 11 * | 24 | | 14 | * | | | | * 2 o----o----o 3 (-2) 3 o----o----o 2 * | 11 | | 6 | * | | | | * 15 o o o 16 (-6) 7 o o o 5 * | 23 | | 8 | * | | | | * 0 o----o----o 1 (-1) 0 o----o----o 1 * 10 4 */ //verbose() chk.PrintTitle("p01a") // start simulation analysis := NewFEM("data/p01.sim", "", true, false, false, false, chk.Verbose, 0) // set stage err := analysis.SetStage(0) if err != nil { tst.Errorf("SetStage failed:\n%v", err) return } // initialise solution vectros err = analysis.ZeroStage(0, true) if err != nil { tst.Errorf("ZeroStage failed:\n%v", err) return } // domain dom := analysis.Domains[0] // nodes and elements chk.IntAssert(len(dom.Nodes), 27) chk.IntAssert(len(dom.Elems), 4) // check dofs for _, nod := range dom.Nodes { chk.IntAssert(len(nod.Dofs), 1) chk.StrAssert(nod.Dofs[0].Key, "pl") } // check equations nids, eqs := get_nids_eqs(dom) chk.Ints(tst, "nids", nids, []int{ 0, 1, 3, 2, 10, 16, 11, 15, 23, 5, 4, 18, 12, 17, 24, 7, 6, 20, 13, 19, 25, 9, 8, 22, 14, 21, 26, }) chk.Ints(tst, "eqs", eqs, utl.IntRange(27)) // check pmap pmaps := [][]int{ {0, 1, 2, 3, 4, 5, 6, 7, 8}, {3, 2, 9, 10, 6, 11, 12, 13, 14}, {10, 9, 15, 16, 12, 17, 18, 19, 20}, {16, 15, 21, 22, 18, 23, 24, 25, 26}, } for i, ele := range dom.Elems { e := ele.(*ElemP) io.Pforan("e%d.pmap = %v\n", e.Id(), e.Pmap) chk.Ints(tst, "pmap", e.Pmap, pmaps[i]) } // constraints chk.IntAssert(len(dom.EssenBcs.Bcs), 3) var ct_pl_eqs []int // equations with pl prescribed [sorted] for _, c := range dom.EssenBcs.Bcs { chk.IntAssert(len(c.Eqs), 1) eq := c.Eqs[0] io.Pforan("key=%v eq=%v\n", c.Key, eq) switch c.Key { case "pl": ct_pl_eqs = append(ct_pl_eqs, eq) default: tst.Errorf("key %s is incorrect", c.Key) } } sort.Ints(ct_pl_eqs) chk.Ints(tst, "equations with pl prescribed", ct_pl_eqs, []int{0, 1, 4}) // initial values @ nodes io.Pforan("initial values @ nodes\n") for _, nod := range dom.Nodes { z := nod.Vert.C[1] eq := nod.Dofs[0].Eq pl := dom.Sol.Y[eq] plC, _, _ := dom.HydSta.Calc(z) chk.Scalar(tst, io.Sf("nod %3d : pl(@ %4g)= %6g", nod.Vert.Id, z, pl), 1e-17, pl, plC) } // intial values @ integration points io.Pforan("initial values @ integration points\n") for _, ele := range dom.Elems { e := ele.(*ElemP) for idx, ip := range e.IpsElem { s := e.States[idx] z := e.Cell.Shp.IpRealCoords(e.X, ip)[1] _, ρLC, _ := dom.HydSta.Calc(z) chk.Scalar(tst, io.Sf("sl(@ %18g)= %18g", z, s.A_sl), 1e-17, s.A_sl, 1) chk.Scalar(tst, io.Sf("ρL(@ %18g)= %18g", z, s.A_ρL), 1e-13, s.A_ρL, ρLC) } } }