func main() { // input filename _, fnkey := io.ArgToFilename(0, "frame2d", ".sim", true) // simple problems var opts []*goga.Optimiser if fnkey == "simple" { io.Pf("\n\n\n") //P := []int{1} P := utl.IntRange2(1, 19) opts = make([]*goga.Optimiser, len(P)) for i, problem := range P { opts[i] = solve_problem(fnkey, problem) } } else { opts = []*goga.Optimiser{solve_problem(fnkey, 0)} } if opts[0].PlotSet1 { return } if opts[0].Nsamples > 1 { io.Pf("\n") rpt := goga.NewTexReport(opts) rpt.ShowDEC = false rpt.Type = 4 rpt.TextSize = "" rpt.Title = "FORM Reliability: " + fnkey rpt.Fnkey = "rel-" + fnkey rpt.Generate() } }
func main() { // filename filename, fnkey := io.ArgToFilename(0, "sg111", ".sim", true) // results out.Start(filename, 0, 0) out.Define("tip", out.N{1}) out.LoadResults(nil) // plot FEM results out.Plot("t", "uy", "tip", plt.Fmt{C: "r", Ls: "None", M: ".", L: "gofem"}, -1) // analytical solution tAna := utl.LinSpace(0, 5, 101) uyAna := make([]float64, len(tAna)) for i, t := range tAna { uyAna[i] = solution_uy(t, 1.0) } // save plt.SetForPng(0.8, 400, 200) out.Draw("/tmp", fnkey+".png", false, func(i, j, n int) { plt.Plot(tAna, uyAna, "'g-', clip_on=0, label='analytical'") }) }
func main() { // filename filename, fnkey := io.ArgToFilename(0, "rjoint01", ".sim", true) // results out.Start(filename, 0, 0) out.Define("p0", out.P{{-3, 0}}) // -3=tag, first ip out.Define("p1", out.P{{-3, 1}}) // -3=tag, second ip out.Define("p2", out.P{{-3, 2}}) // -3=tag, third ip out.LoadResults(nil) mtau0 := out.GetRes("tau", "p0", -1) mtau1 := out.GetRes("tau", "p1", -1) mtau2 := out.GetRes("tau", "p2", -1) for i := 0; i < len(out.Times); i++ { mtau0[i] *= -1 mtau1[i] *= -1 mtau2[i] *= -1 } // plot FEM results out.Plot("ompb", mtau0, "p0", plt.Fmt{C: "r", Ls: "-", M: "."}, -1) out.Plot("ompb", mtau1, "p1", plt.Fmt{C: "g", Ls: "-", M: "."}, -1) out.Plot("ompb", mtau2, "p2", plt.Fmt{C: "b", Ls: "-", M: "."}, -1) out.Csplot.Ylbl = "$-\\tau$" // save plt.SetForPng(0.8, 400, 200) out.Draw("/tmp", fnkey+".png", false, nil) }
func main() { // filename filename, fnkey := io.ArgToFilename(0, "sg111", ".sim", true) // fem if !fem.Start(filename, false, false, false) { io.PfRed("Start failed\n") return } dom, sum, ok := fem.AllocSetAndInit(0, true, true) if !ok { io.PfRed("AllocSetAndInit failed\n") return } // selected node and dof index nidx := 1 didx := 1 // gofem ntout := len(sum.OutTimes) uy := make([]float64, ntout) for tidx, _ := range sum.OutTimes { // read results from file if !dom.In(sum, tidx, true) { io.PfRed("plot_spo751: cannot read solution\n") return } // collect results for load versus time plot nod := dom.Nodes[nidx] eq := nod.Dofs[didx].Eq uy[tidx] = dom.Sol.Y[eq] // check if math.Abs(dom.Sol.T-sum.OutTimes[tidx]) > 1e-14 { io.PfRed("output times do not match time in solution array\n") return } } // plot fem results plt.SetForPng(0.8, 400, 200) plt.Plot(sum.OutTimes, uy, "'ro-', clip_on=0, label='gofem'") // analytical solution tAna := utl.LinSpace(0, 5, 101) uyAna := make([]float64, len(tAna)) for i, t := range tAna { uyAna[i] = solution_uy(t, 1.0) } plt.Plot(tAna, uyAna, "'g-', clip_on=0, label='analytical'") // save plt.Gll("$t$", "$u_y$", "") plt.SaveD("/tmp", fnkey+".png") }
func main() { // input data fn, fnk := io.ArgToFilename(0, "nurbs01", ".msh", true) ctrl := io.ArgToBool(1, true) ids := io.ArgToBool(2, true) useminmax := io.ArgToBool(3, false) axisequal := io.ArgToBool(4, true) xmin := io.ArgToFloat(5, 0) xmax := io.ArgToFloat(6, 0) ymin := io.ArgToFloat(7, 0) ymax := io.ArgToFloat(8, 0) eps := io.ArgToBool(9, false) npts := io.ArgToInt(10, 41) // print input table io.Pf("\n%s\n", io.ArgsTable("INPUT ARGUMENTS", "mesh filename", "fn", fn, "show control points", "ctrl", ctrl, "show ids", "ids", ids, "use xmin,xmax,ymin,ymax", "useminmax", useminmax, "enforce axis.equal", "axisequal", axisequal, "min(x)", "xmin", xmin, "max(x)", "xmax", xmax, "min(y)", "ymin", ymin, "max(y)", "ymax", ymax, "generate eps instead of png", "eps", eps, "number of divisions", "npts", npts, )) // load nurbss B := gm.ReadMsh(fnk) // plot if eps { plt.SetForEps(0.75, 500) } else { plt.SetForPng(0.75, 500, 150) } for _, b := range B { if ctrl { b.DrawCtrl2d(ids, "", "") } b.DrawElems2d(npts, ids, "", "") } if axisequal { plt.Equal() } if useminmax { plt.AxisRange(xmin, xmax, ymin, ymax) } ext := ".png" if eps { ext = ".eps" } plt.Save(fnk + ext) }
func main() { // catch errors defer func() { if err := recover(); err != nil { if mpi.Rank() == 0 { chk.Verbose = true for i := 8; i > 3; i-- { chk.CallerInfo(i) } io.PfRed("ERROR: %v\n", err) } } mpi.Stop(false) }() mpi.Start(false) // default input parameters // read input parameters fnamepath, _ := io.ArgToFilename(0, "", ".sim", true) verbose := io.ArgToBool(1, true) erasePrev := io.ArgToBool(2, true) saveSummary := io.ArgToBool(3, true) allowParallel := io.ArgToBool(4, true) alias := io.ArgToString(5, "") // message if mpi.Rank() == 0 && verbose { io.PfWhite("\nGofem v3 -- Go Finite Element Method\n\n") io.Pf("Copyright 2015 Dorival Pedroso and Raul Durand. All rights reserved.\n") io.Pf("Use of this source code is governed by a BSD-style\n") io.Pf("license that can be found in the LICENSE file.\n\n") io.Pf("\n%v\n", io.ArgsTable( "filename path", "fnamepath", fnamepath, "show messages", "verbose", verbose, "erase previous results", "erasePrev", erasePrev, "save summary", "saveSummary", saveSummary, "allow parallel run", "allowParallel", allowParallel, "word to add to results", "alias", alias, )) } // profiling? defer utl.DoProf(false)() // analysis data readSummary := false analysis := fem.NewFEM(fnamepath, alias, erasePrev, saveSummary, readSummary, allowParallel, verbose, 0) // run simulation err := analysis.Run() if err != nil { chk.Panic("Run failed:\n%v", err) } }
func main() { // filename filename, fnkey := io.ArgToFilename(0, "rjoint01", ".sim", true) // fem if !fem.Start(filename, false, false, false) { io.PfRed("Start failed\n") return } dom, sum, ok := fem.AllocSetAndInit(0, true, true) if !ok { io.PfRed("AllocSetAndInit failed\n") return } // rjoint element eid := 2 ele := dom.Elems[eid].(*fem.Rjoint) ipd := ele.OutIpsData() // load results from file n := len(sum.OutTimes) mtau0 := make([]float64, n) mtau1 := make([]float64, n) mtau2 := make([]float64, n) ompb0 := make([]float64, n) ompb1 := make([]float64, n) ompb2 := make([]float64, n) for i, _ := range sum.OutTimes { if !dom.In(sum, i, true) { io.PfRed("cannot read solution\n") return } res0 := ipd[0].Calc(dom.Sol) res1 := ipd[1].Calc(dom.Sol) res2 := ipd[2].Calc(dom.Sol) mtau0[i] = -res0["tau"] mtau1[i] = -res1["tau"] mtau2[i] = -res2["tau"] ompb0[i] = res0["ompb"] ompb1[i] = res1["ompb"] ompb2[i] = res2["ompb"] } // plot plt.SetForPng(0.8, 400, 200) plt.Plot(ompb0, mtau0, "'r-', marker='.', label='p0', clip_on=0") plt.Plot(ompb1, mtau1, "'g-', marker='.', label='p1', clip_on=0") plt.Plot(ompb2, mtau2, "'b-', marker='.', label='p2', clip_on=0") plt.Gll("$\\bar{\\omega}_p$", "$-\\tau$", "") plt.SaveD("/tmp", fnkey+".png") }
func main() { // filename filename, fnkey := io.ArgToFilename(0, "a-coarse-elast-d2-q9.sim", ".sim", true) // start analysis process out.Start(filename, 0, 0) // define entities out.Define("A B C D E", out.N{-1, -2, -3, -4, -5}) // top => bottom out.Define("a b c d e", out.P{{18, 8}, {8, 8}, {4, 8}, {30, 8}, {0, 0}}) // top => bottom // load results out.LoadResults(nil) // styles me := 10 S := []plt.Fmt{ plt.Fmt{C: "b", M: "*", Me: me}, plt.Fmt{C: "g", M: "o", Me: me}, plt.Fmt{C: "m", M: "x", Me: me}, plt.Fmt{C: "orange", M: "+", Me: me}, plt.Fmt{C: "r", M: "^", Me: me}, } // pl out.Splot("liquid pressure") for i, l := range []string{"A", "B", "C", "D", "E"} { out.Plot("t", "pl", l, S[i], -1) } // uy out.Splot("displacements") for i, l := range []string{"A", "B", "C", "D", "E"} { out.Plot("t", "uy", l, S[i], -1) } out.Splot("liquid saturation") for i, l := range []string{"a", "b", "c", "d", "e"} { out.Plot("t", "sl", l, S[i], -1) } out.Splot("stresses") for i, l := range []string{"a", "b", "c", "d", "e"} { out.Plot("t", "sy", l, S[i], -1) } // show plt.SetForPng(1, 500, 200) out.Draw("/tmp", "up_indentation2d_unsat_"+fnkey+".png", false, nil) }
func main() { // catch errors defer func() { if err := recover(); err != nil { io.PfRed("ERROR: %v\n", err) } }() // input data var mshfn string mshfn, fnkey = io.ArgToFilename(0, "data/d2-coarse", ".msh", true) io.Pf("\n%s\n", io.ArgsTable( "mesh filename", "mshfn", mshfn, )) // read mesh msh, err := inp.ReadMsh("", mshfn, 0) if err != nil { io.PfRed("cannot read mesh:\n%v", err) return } ndim = msh.Ndim verts = msh.Verts cells = msh.Cells dirout = "/tmp/gofem" // buffers geo := new(bytes.Buffer) vtu := new(bytes.Buffer) // generate topology topology(geo) // points data pdata_write(vtu) // cells data cdata_write(vtu) // write vtu file vtu_write(geo, vtu) }
func main() { // filename filename, fnkey := io.ArgToFilename(0, "sg1121", ".sim", true) // results out.Start(filename, 0, 0) out.Define("A", out.N{30}) out.LoadResults(nil) // plot FEM results out.Plot("t", "uy", "A", plt.Fmt{C: "k", Ls: "-", L: "gofem"}, -1) // old results b, err := io.ReadFile("cmp/sg1121gofemold.json") if err != nil { io.PfRed("cannot read comparison file\n") return } var gofemold struct { Time, Uy30 []float64 } err = json.Unmarshal(b, &gofemold) if err != nil { io.PfRed("cannot unmarshal comparison file\n") return } // mechsys results _, res, err := io.ReadTable("cmp/sg1121mechsysN30.cmp") if err != nil { io.PfRed("cannot read mechsys comparison file\n") return } // save plt.SetForPng(0.8, 400, 200) out.Draw("/tmp", fnkey+".png", false, func(i, j, n int) { plt.Plot(gofemold.Time, gofemold.Uy30, "'r-', lw=2, label='gofemOld'") plt.Plot(res["Time"], res["uy"], "'b-', label='mechsys'") }) }
func main() { // filename filename, fnkey := io.ArgToFilename(0, "d2-simple-flux", ".sim", true) // start analysis process out.Extrap = []string{"nwlx", "nwly"} out.Start(filename, 0, 0) // define entities out.Define("top-middle", out.At{5, 3}) out.Define("section-A", out.N{-1}) out.Define("section-B", out.Along{{0, 0}, {10, 0}}) // load results out.LoadResults(nil) // compute water discharge along section-A nwlx_TM := out.GetRes("ex_nwlx", "top-middle", -1) Q := out.Integrate("ex_nwlx", "section-A", "y", -1) io.PfYel("Q = %g m³/s [answer: 0.0003]\n", Q) // plot kt := len(out.Times) - 1 out.Splot("") out.Plot("pl", "y", "section-A", plt.Fmt{L: "t=0"}, 0) out.Plot("pl", "y", "section-A", plt.Fmt{L: io.Sf("t=%g", out.Times[kt])}, kt) out.Splot("") out.Plot("x", "pl", "section-B", plt.Fmt{L: "t=0"}, 0) out.Plot("x", "pl", "section-B", plt.Fmt{L: io.Sf("t=%g", out.Times[kt])}, kt) out.Splot("") out.Plot("t", nwlx_TM, "top-middle", plt.Fmt{}, -1) out.Csplot.Ylbl = "$n_{\\ell}\\cdot w_{\\ell x}$" // save plt.SetForPng(1.5, 400, 200) out.Draw("/tmp", "seep_simple_flux_"+fnkey+".png", false, func(i, j, nplots int) { if i == 2 && j == 1 { plt.Plot([]float64{0, 10}, []float64{10, 9}, "'k--'") } }) }
func main() { // catch errors defer func() { if err := recover(); err != nil { io.PfRed("ERROR: %v\n", err) } }() // input data simfile, _ := io.ArgToFilename(0, "simfile.sim", true) zmin := io.ArgToFloat(1, 0.0) zmax := io.ArgToFloat(2, 3.0) npts := io.ArgToInt(3, 11) io.Pf("\n%s\n", io.ArgsTable( "simulation filename", "simfile", simfile, "min elevation", "zmin", zmin, "max elevation", "zmax", zmax, "number of points", "npts", npts, )) // sim file sim := inp.ReadSim("", simfile, false) if sim == nil { io.PfRed("cannot read sim file\n") return } // layer var lay fem.GeoLayer lay.Zmin = zmin lay.Zmax = zmax lay.Cl = sim.WaterRho0 / sim.WaterBulk //if !lay.ReadPorousParameters(sim.Regions[0], // TODO }
func main() { // filename filename, fnkey := io.ArgToFilename(0, "a-coarse-elast-d2-q9", ".sim", true) // start analysis process out.Start(filename, 0, 0) // define entities out.Define("a", out.P{{18, 8}}) // load results out.LoadResults(nil) nf_a := out.GetRes("nf", "a", -1) pl_a := out.GetRes("pl", "a", -1) pc_a := make([]float64, len(pl_a)) for i, _ := range pl_a { pc_a[i] = -pl_a[i] } out.Splot("LRM") _, d, _ := io.ReadTable("lrm.dat") plt.Plot(d["pc"], d["sl"], "'c-',lw=2") out.Plot(pc_a, "sl", "a", plt.Fmt{M: "o"}, -1) out.Csplot.Xlbl = "$p_c$" out.Splot("porosity") out.Plot("t", nf_a, "a", plt.Fmt{M: "+"}, -1) out.Csplot.Ylbl = "$n_f$" // show plt.SetForPng(1.2, 500, 200) out.Draw("/tmp", "up_indentation2d_unsat_lrm_"+fnkey+".png", false, nil) }
func runone(ncpu int) (nsol, tf int, elaspsedTime time.Duration) { // input filename fn, fnkey := io.ArgToFilename(0, "ground10", ".sim", true) // GA parameters var opt goga.Optimiser opt.Read("ga-" + fnkey + ".json") opt.GenType = "rnd" nsol, tf = opt.Nsol, opt.Tf postproc := true if ncpu > 0 { opt.Ncpu = ncpu postproc = false } // FEM data := make([]*FemData, opt.Ncpu) for i := 0; i < opt.Ncpu; i++ { data[i] = NewData(fn, fnkey, i) } io.Pforan("MaxWeight = %v\n", data[0].MaxWeight) // set integers if data[0].Opt.BinInt { opt.CxInt = goga.CxInt opt.MtInt = goga.MtIntBin opt.BinInt = data[0].Ncells } // set floats opt.FltMin = make([]float64, data[0].Nareas) opt.FltMax = make([]float64, data[0].Nareas) for i := 0; i < data[0].Nareas; i++ { opt.FltMin[i] = data[0].Opt.Amin opt.FltMax[i] = data[0].Opt.Amax } // initialise optimiser opt.Nova = 2 // weight and deflection opt.Noor = 4 // mobility, feasibility, maxdeflection, stress opt.Init(goga.GenTrialSolutions, func(sol *goga.Solution, cpu int) { mob, fail, weight, umax, _, errU, errS := data[cpu].RunFEM(sol.Int, sol.Flt, 0, false) sol.Ova[0] = weight sol.Ova[1] = umax sol.Oor[0] = mob sol.Oor[1] = fail sol.Oor[2] = errU sol.Oor[3] = errS }, nil, 0, 0, 0) // initial solutions var sols0 []*goga.Solution if false { sols0 = opt.GetSolutionsCopy() } // benchmark initialTime := time.Now() defer func() { elaspsedTime = time.Now().Sub(initialTime) }() // solve opt.Verbose = true opt.Solve() goga.SortByOva(opt.Solutions, 0) // post processing if !postproc { return } // check nfailed, front0 := goga.CheckFront0(&opt, true) // save results var log, res bytes.Buffer io.Ff(&log, opt.LogParams()) io.Ff(&res, PrintSolutions(data[0], opt.Solutions)) io.Ff(&res, io.Sf("\n\nnfailed = %d\n", nfailed)) io.WriteFileVD("/tmp/goga", fnkey+".log", &log) io.WriteFileVD("/tmp/goga", fnkey+".res", &res) // plot Pareto-optimal front feasibleOnly := true plt.SetForEps(0.8, 350) if strings.HasPrefix(fnkey, "ground10") { _, ref, _ := io.ReadTable("p460_fig300.dat") plt.Plot(ref["w"], ref["u"], "'b-', label='reference'") } fmtAll := &plt.Fmt{L: "final solutions", M: ".", C: "orange", Ls: "none", Ms: 3} fmtFront := &plt.Fmt{L: "final Pareto front", C: "r", M: "o", Ms: 3, Ls: "none"} goga.PlotOvaOvaPareto(&opt, sols0, 0, 1, feasibleOnly, fmtAll, fmtFront) plt.Gll("weight ($f_0$)", "deflection ($f_1)$", "") //, "leg_out=1, leg_ncol=4, leg_hlen=1.5") if strings.HasPrefix(fnkey, "ground10") { plt.AxisRange(1800, 14000, 1, 6) } // plot selected results ia, ib, ic, id, ie := 0, 0, 0, 0, 0 nfront0 := len(front0) io.Pforan("nfront0 = %v\n", nfront0) if nfront0 > 4 { ib = nfront0 / 10 ic = nfront0 / 5 id = nfront0 / 2 ie = nfront0 - 1 } A := front0[ia] B := front0[ib] C := front0[ic] D := front0[id] E := front0[ie] wid, hei := 0.20, 0.10 draw_truss(data[0], "A", A, 0.17, 0.75, wid, hei) draw_truss(data[0], "B", B, 0.20, 0.55, wid, hei) draw_truss(data[0], "C", C, 0.28, 0.33, wid, hei) draw_truss(data[0], "D", D, 0.47, 0.22, wid, hei) draw_truss(data[0], "E", E, 0.70, 0.18, wid, hei) // save figure plt.SaveD("/tmp/goga", fnkey+".eps") // tex file title := "Shape and topology optimisation. Results." label := "topoFront" document := true compact := true tex_results("/tmp/goga", "tmp_"+fnkey, title, label, data[0], A, B, C, D, E, document, compact) document = false tex_results("/tmp/goga", fnkey, title, label, data[0], A, B, C, D, E, document, compact) return }
func main() { // catch errors defer func() { if err := recover(); err != nil { io.PfRed("ERROR: %v\n", err) } }() // input data matfn, fnk := io.ArgToFilename(0, "materials", ".mat", true) io.Pf("\n%s\n", io.ArgsTable( "material filename", "matfn", matfn, )) // skip variables skip := "gref nowet α" // skip parameters skipp := make(map[string]bool) for _, key := range io.SplitKeys(skip) { skipp[key] = true } // Read mdb := inp.ReadMat("", matfn) // Get max number of parameters nmaxprms := 0 for _, mdat := range mdb.Materials { n := len(mdat.Prms) if n > nmaxprms { nmaxprms = n } } // header b := new(bytes.Buffer) io.Ff(b, "\\documentclass[12pt,a4paper]{article}\n") io.Ff(b, "\\usepackage[margin=2.0cm,footskip=0.5cm]{geometry}\n") io.Ff(b, "\\usepackage[labelfont=bf,tableposition=top,aboveskip=4pt]{caption}\n") io.Ff(b, "\\usepackage{tabularx}\n") io.Ff(b, "\\usepackage{booktabs}\n") io.Ff(b, "\n") io.Ff(b, "\\title{Materials Table}\n") io.Ff(b, "\\author{GoFem MatTable tool}\n") io.Ff(b, "\n") io.Ff(b, "\\begin{document}\n") io.Ff(b, "\\maketitle\n") // table with parameters io.Ff(b, "\n") io.Ff(b, "\\begin{table} \\centering\n") io.Ff(b, "\\caption{Parameters from %s}\n", matfn) io.Ff(b, "\\begin{tabularx}{\\linewidth}[c]{l %s} \\toprule\n", strings.Repeat("c", nmaxprms)) for i, mdat := range mdb.Materials { necols := nmaxprms - len(mdat.Prms) // number of empty cols // mat name io.Ff(b, " %-20s", mdat.Name) // parameters names for _, param := range mdat.Prms { io.Ff(b, " &%12s", ToTex(param.N)) } io.Ff(b, " %s", strings.Repeat(" &", necols)) io.Ff(b, " \\\\\n") // values io.Ff(b, " %-20s", "") for _, param := range mdat.Prms { io.Ff(b, " &%12s", NumFormat(param.V)) } io.Ff(b, " %s", strings.Repeat(" &", necols)) io.Ff(b, " \\\\\n") // units io.Ff(b, " %-20s", "") for _, param := range mdat.Prms { if param.U == "" { io.Ff(b, " &%12v", "-") } else { io.Ff(b, " &%12v", UnitFormat(param.U)) } } io.Ff(b, " %s", strings.Repeat(" &", necols)) io.Ff(b, " \\\\\n") if i < len(mdb.Materials)-1 { io.Ff(b, " \\\\\n") } } // footer io.Ff(b, " \\bottomrule\n\\end{tabularx}\n\\label{tab:prms}\n\\end{table}\n") io.Ff(b, "\\end{document}\n") io.WriteFileV(fnk+".tex", b) }
func main() { // catch errors defer func() { if err := recover(); err != nil { io.PfRed("ERROR: %v\n", err) } }() // input data mshfn, fnkey := io.ArgToFilename(0, "data/sgm57", ".msh", true) // old mesh var old OldMesh // read file b, err := io.ReadFile(mshfn) if err != nil { chk.Panic("%v", err) } // decode err = json.Unmarshal(b, &old) if err != nil { chk.Panic("%v", err) } // verts: find largest strings var ndim int L := make([]int, 5) for _, v := range old.Verts { L[0] = utl.Imax(L[0], len(io.Sf("%d", v.Id))) L[1] = utl.Imax(L[1], len(io.Sf("%d", v.Tag))) for j, x := range v.C { L[2+j] = utl.Imax(L[2+j], len(io.Sf("%g", x))) } ndim = len(v.C) } S := make([]string, 5) for i, l := range L { S[i] = io.Sf("%d", l) } // write vertices buf := new(bytes.Buffer) io.Ff(buf, "{\n \"verts\":[\n") for i, v := range old.Verts { if i > 0 { io.Ff(buf, ",\n") } io.Ff(buf, " {\"i\":%"+S[0]+"d, \"t\":%"+S[1]+"d, \"x\":[", v.Id, v.Tag) for j, x := range v.C { if j > 0 { io.Ff(buf, ", ") } io.Ff(buf, "%"+S[2+j]+"g", x) } io.Ff(buf, "] }") } // cells: find largest strings n := 30 L = make([]int, n*2) for _, c := range old.Cells { L[0] = utl.Imax(L[0], len(io.Sf("%d", c.Id))) L[1] = utl.Imax(L[1], len(io.Sf("%d", c.Tag))) L[2] = utl.Imax(L[2], len(io.Sf("%d", c.Part))) for j, v := range c.Verts { L[3+j] = utl.Imax(L[3+j], len(io.Sf("%d", v))) } } S = make([]string, n*2) for i, l := range L { S[i] = io.Sf("%d", l) } io.Ff(buf, "\n ],") // write cells io.Ff(buf, "\n \"cells\":[\n") for i, c := range old.Cells { if i > 0 { io.Ff(buf, ",\n") } io.Ff(buf, " {\"i\":%"+S[0]+"d, \"t\":%"+S[1]+"d, \"p\":%"+S[2]+"d, \"y\":%q, \"v\":[", c.Id, c.Tag, c.Part, c.Type) for j, v := range c.Verts { if j > 0 { io.Ff(buf, ", ") } io.Ff(buf, "%"+S[3+j]+"d", v) } io.Ff(buf, "]") if len(c.FTags) > 0 { io.Ff(buf, ", ") if ndim == 2 { io.Ff(buf, "\"et\":[") } else { io.Ff(buf, "\"ft\":[") } for j, t := range c.FTags { if j > 0 { io.Ff(buf, ", ") } io.Ff(buf, "%d", t) } io.Ff(buf, "]") } io.Ff(buf, " }") } io.Ff(buf, "\n ]\n}") io.WriteFileVD("/tmp/gosl", fnkey+"-new.msh", buf) // check m, err := msh.Read("/tmp/gosl/" + fnkey + "-new.msh") if err != nil { chk.Panic("cannot read new mesh:\n%v", err) } m.Check() }
func main() { // catch errors defer func() { if err := recover(); err != nil { io.PfRed("ERROR: %v\n", err) } }() // input data simfn, _ := io.ArgToFilename(0, "elast", ".sim", true) matname := io.ArgToString(1, "lrm1") pcmax := io.ArgToFloat(2, 30.0) npts := io.ArgToInt(3, 101) // print input table io.Pf("\n%s\n", io.ArgsTable( "simulation filename", "simfn", simfn, "material name", "matname", matname, "max pc", "pcmax", pcmax, "number of points", "npts", npts, )) // load simulation sim := inp.ReadSim(simfn, "lrm", false, 0) if sim == nil { io.PfRed("cannot load simulation\n") return } // get material data mat := sim.MatParams.Get(matname) if mat == nil { io.PfRed("cannot get material\n") return } io.Pforan("mat = %v\n", mat) // get and initialise model mdl := mreten.GetModel(simfn, matname, mat.Model, false) if mdl == nil { io.PfRed("cannot allocate model\n") return } mdl.Init(mat.Prms) // plot drying path d_Pc := utl.LinSpace(0, pcmax, npts) d_Sl := make([]float64, npts) d_Sl[0] = 1 var err error for i := 1; i < npts; i++ { d_Sl[i], err = mreten.Update(mdl, d_Pc[i-1], d_Sl[i-1], d_Pc[i]-d_Pc[i-1]) if err != nil { io.PfRed("drying: cannot updated model\n%v\n", err) return } } plt.Plot(d_Pc, d_Sl, io.Sf("'b-', label='%s (dry)', clip_on=0", matname)) // plot wetting path w_Pc := utl.LinSpace(pcmax, 0, npts) w_Sl := make([]float64, npts) w_Sl[0] = d_Sl[npts-1] for i := 1; i < npts; i++ { w_Sl[i], err = mreten.Update(mdl, w_Pc[i-1], w_Sl[i-1], w_Pc[i]-w_Pc[i-1]) if err != nil { io.PfRed("wetting: cannot updated model\n%v\n", err) return } } plt.Plot(w_Pc, w_Sl, io.Sf("'c-', label='%s (wet)', clip_on=0", matname)) // save results type Results struct{ Pc, Sl []float64 } res := Results{append(d_Pc, w_Pc...), append(d_Sl, w_Sl...)} var buf bytes.Buffer enc := json.NewEncoder(&buf) err = enc.Encode(&res) if err != nil { io.PfRed("cannot encode results\n") return } fn := path.Join(sim.Data.DirOut, matname+".dat") io.WriteFile(fn, &buf) io.Pf("file <[1;34m%s[0m> written\n", fn) // show figure plt.AxisYrange(0, 1) plt.Cross("") plt.Gll("$p_c$", "$s_{\\ell}$", "") plt.Show() }
func main() { // catch errors defer func() { if err := recover(); err != nil { io.PfRed("ERROR: %v\n", err) } }() // filename filename, fnkey := io.ArgToFilename(0, "spo751", ".sim", true) // constants nidx := 20 // selected node at outer surface didx := 0 // selected dof index for plot nels := 4 // number of elements nips := 4 // number of ips // selected P values for stress plot Psel := []float64{100, 140, 180, 190} tolPsel := 2.0 // tolerance to compare P GPa2MPa := 1000.0 // conversion factor // input data Pcen := 200.0 // [Mpa] a, b := 100.0, 200.0 // [mm], [mm] E, ν := 210000.0, 0.3 // [MPa], [-] σy := 240.0 // [MPa] // analytical solution var sol ana.PressCylin sol.Init([]*fun.Prm{ &fun.Prm{N: "a", V: a}, &fun.Prm{N: "b", V: b}, &fun.Prm{N: "E", V: E}, &fun.Prm{N: "ν", V: ν}, &fun.Prm{N: "σy", V: σy}, }) np := 41 P_ana, Ub_ana := sol.CalcPressDisp(np) R_ana, Sr_ana, St_ana := sol.CalcStresses(Psel, np) // fem analysis := fem.NewFEM(filename, "", false, false, true, false, true, 0) err := analysis.SetStage(0) if err != nil { chk.Panic("SetStage failed:\n%v", err) } err = analysis.ZeroStage(0, true) if err != nil { chk.Panic("ZeroStage failed:\n%v", err) } dom := analysis.Domains[0] sum := analysis.Summary // gofem results nto := len(sum.OutTimes) P := make([]float64, nto) Ub := make([]float64, nto) R := utl.Deep3alloc(len(Psel), nels, nips) Sr := utl.Deep3alloc(len(Psel), nels, nips) St := utl.Deep3alloc(len(Psel), nels, nips) i := 0 for tidx, t := range sum.OutTimes { // read results from file err = dom.Read(sum, tidx, 0, true) if err != nil { chk.Panic("cannot read solution\n%v", err) } // collect results for load versus displacement plot nod := dom.Nodes[nidx] eq := nod.Dofs[didx].Eq P[tidx] = t * Pcen Ub[tidx] = dom.Sol.Y[eq] // stresses if isPsel(Psel, P[tidx], tolPsel) { for j, ele := range dom.ElemIntvars { e := ele.(*fem.ElemU) ipsdat := e.OutIpsData() for k, dat := range ipsdat { res := dat.Calc(dom.Sol) x, y := dat.X[0], dat.X[1] sx := res["sx"] * GPa2MPa sy := res["sy"] * GPa2MPa sxy := res["sxy"] * GPa2MPa / math.Sqrt2 R[i][j][k], Sr[i][j][k], St[i][j][k], _ = ana.PolarStresses(x, y, sx, sy, sxy) } } i++ } } // auxiliary data for plotting stresses colors := []string{"r", "m", "g", "k", "y", "c", "r", "m"} markers1 := []string{"o", "s", "x", ".", "^", "*", "o", "s"} markers2 := []string{"+", "+", "+", "+", "+", "+", "+", "+"} // plot load displacements plt.SetForPng(0.8, 400, 200) if true { //if false { plt.Plot(Ub_ana, P_ana, "'b-', ms=2, label='solution', clip_on=0") plt.Plot(Ub, P, "'r.--', label='fem: outer', clip_on=0") plt.Gll("$u_x\\;\\mathrm{[mm]}$", "$P\\;\\mathrm{[MPa]}$", "") plt.SaveD("/tmp", io.Sf("gofem_%s_disp.png", fnkey)) } // plot radial stresses if true { //if false { plt.Reset() for i, Pval := range Psel { plt.Plot(R_ana, Sr_ana[i], "'b-'") for k := 0; k < nips; k++ { for j := 0; j < nels; j++ { args := io.Sf("'%s%s'", colors[i], markers1[i]) if k > 1 { args = io.Sf("'k%s', ms=10", markers2[i]) } if k == 0 && j == 0 { args += io.Sf(", label='P=%g'", Pval) } plt.PlotOne(R[i][j][k], Sr[i][j][k], args) } } } plt.Gll("$r\\;\\mathrm{[mm]}$", "$\\sigma_r\\;\\mathrm{[MPa]}$", "leg_loc='lower right'") plt.AxisXrange(a, b) plt.SaveD("/tmp", io.Sf("gofem_%s_sr.png", fnkey)) } // plot tangential stresses if true { //if false { plt.Reset() for i, Pval := range Psel { plt.Plot(R_ana, St_ana[i], "'b-'") for k := 0; k < nips; k++ { for j := 0; j < nels; j++ { args := io.Sf("'%s%s'", colors[i], markers1[i]) if k > 1 { args = io.Sf("'k%s', ms=10", markers2[i]) } if k == 0 && j == 0 { args += io.Sf(", label='P=%g'", Pval) } plt.PlotOne(R[i][j][k], St[i][j][k], args) } } } plt.Gll("$r\\;\\mathrm{[mm]}$", "$\\sigma_t\\;\\mathrm{[MPa]}$", "leg_loc='upper left'") plt.SaveD("/tmp", io.Sf("gofem_%s_st.png", fnkey)) } }
func main() { // filename filename, fnkey := io.ArgToFilename(0, "onepulse-qua9co.sim", ".sim", true) // start analysis process out.Start(filename, 0, 0) // define entities out.Define("A B C D E", out.N{-5, -4, -3, -2, -1}) out.Define("a b c d e", out.P{{15, 8}, {13, 8}, {8, 8}, {4, 8}, {0, 0}}) out.Define("left-side", out.Along{{0, 0}, {0, 3}}) // load results out.LoadResults(nil) // styles me := 10 S := []plt.Fmt{ plt.Fmt{C: "b", M: "*", Me: me}, plt.Fmt{C: "g", M: "o", Me: me}, plt.Fmt{C: "m", M: "x", Me: me}, plt.Fmt{C: "orange", M: "+", Me: me}, plt.Fmt{C: "r", M: "^", Me: me}, } // pl out.Splot("liquid pressure") for i, l := range []string{"A", "B", "C", "D", "E"} { out.Plot("t", "pl", l, S[i], -1) } // uy out.Splot("displacements") for i, l := range []string{"A", "B", "C", "D", "E"} { out.Plot("t", "uy", l, S[i], -1) } // sl out.Splot("liquid saturation") for i, l := range []string{"a", "b", "c", "d", "e"} { out.Plot("t", "sl", l, S[i], -1) } // sy out.Splot("stresses") for i, l := range []string{"a", "b", "c", "d", "e"} { out.Plot("t", "sy", l, S[i], -1) } // pl out.Splot("pressure along column") I, _ := utl.GetITout(out.Times, []float64{0, 1000, 2000, 3000, 4000}, 0.1) for _, i := range I { t := out.Times[i] out.Plot("pl", "y", "left-side", plt.Fmt{L: io.Sf("t=%g", t)}, i) } // empty out.Splot("") // save plt.SetForPng(1.2, 800, 200) out.Draw("/tmp", "up_3mcolumn_dessication_"+fnkey+".png", false, nil) }
func main() { // catch errors defer func() { if err := recover(); err != nil { io.PfRed("ERROR: %v\n", err) } }() // input data simfn, _ := io.ArgToFilename(0, "data/twoqua4", ".sim", true) exnwl := io.ArgToBool(1, false) stgidx := io.ArgToInt(2, 0) io.Pf("\n%s\n", io.ArgsTable( "simulation filename", "simfn", simfn, "extrapolate nwl", "exnwl", exnwl, "stage index", "stgidx", stgidx, )) // start analysis process out.Start(simfn, stgidx, 0) // global variables ndim = out.Dom.Msh.Ndim verts = out.Dom.Msh.Verts cells = out.Dom.Msh.Cells nodes = out.Dom.Nodes elems = out.Dom.Elems dirout = out.Dom.Sim.DirOut fnkey = out.Dom.Sim.Key steady = out.Dom.Sim.Data.Steady // flags has_u := out.Dom.YandC["ux"] has_pl := out.Dom.YandC["pl"] has_pg := out.Dom.YandC["pg"] has_sig := out.Ipkeys["sx"] has_nwl := out.Ipkeys["nwlx"] has_p := has_pl || has_pg lbb := has_u && has_p if out.Dom.Sim.Data.NoLBB { lbb = false } // buffers pvd := make(map[string]*bytes.Buffer) geo := make(map[string]*bytes.Buffer) vtu := make(map[string]*bytes.Buffer) if _, ok := out.Dom.YandC["ux"]; ok { pvd["u"] = new(bytes.Buffer) geo["u"] = new(bytes.Buffer) vtu["u"] = new(bytes.Buffer) } for ykey, _ := range out.Dom.Dof2Tnum { if ykey == "ux" || ykey == "uy" || ykey == "uz" { continue } pvd[ykey] = new(bytes.Buffer) geo[ykey] = new(bytes.Buffer) vtu[ykey] = new(bytes.Buffer) label2keys[ykey] = []string{ykey} } if len(out.Ipkeys) > 0 { pvd["ips"] = new(bytes.Buffer) geo["ips"] = new(bytes.Buffer) vtu["ips"] = new(bytes.Buffer) } if exnwl { pvd["ex_nwl"] = new(bytes.Buffer) geo["ex_nwl"] = new(bytes.Buffer) vtu["ex_nwl"] = new(bytes.Buffer) } // extrapolated values keys extrap_keys := []string{"nwlx", "nwly"} if ndim == 3 { extrap_keys = []string{"nwlx", "nwly", "nwlz"} } // headers for _, b := range pvd { pvd_header(b) } // process results for tidx, t := range out.Sum.OutTimes { // input results into domain err := out.Dom.Read(out.Sum, tidx, 0, true) if err != nil { chk.Panic("cannot load results into domain\n%v", err) } // message io.PfWhite("time = %g\r", t) // generate topology if tidx == 0 { for label, b := range geo { topology(b, label == "ips", lbb) } // allocate integration points values ipvals = make([]map[string]float64, len(out.Ipoints)) for i, _ := range out.Ipoints { ipvals[i] = make(map[string]float64) } } // get integration points values @ time t for i, p := range out.Ipoints { vals := p.Calc(out.Dom.Sol) for key, val := range vals { ipvals[i][key] = val } } // compute extrapolated values if exnwl { out.ComputeExtrapolatedValues(extrap_keys) } // for each data buffer for label, b := range vtu { // reset buffer b.Reset() // points data if label == "ips" { pdata_open(b) if has_sig { pdata_write(b, "sig", skeys, true) } if has_nwl { pdata_write(b, "nwl", nwlkeys, true) } for key, _ := range out.Ipkeys { if !is_sig[key] && !is_nwl[key] { pdata_write(b, key, []string{key}, true) } } pdata_close(b) } else { pdata_open(b) pdata_write(b, label, label2keys[label], false) pdata_close(b) } // cells data cdata_write(b, label == "ips") // write vtu file vtu_write(geo[label], b, tidx, label) } // pvd for label, b := range pvd { pvd_line(b, tidx, t, label) } } // write pvd files for label, b := range pvd { pvd_write(b, label) } }
func main() { // catch errors defer func() { if err := recover(); err != nil { io.PfRed("ERROR: %v\n", err) } }() // input data file var in Input in.inpfn, _ = io.ArgToFilename(0, "data/loccmdrv1", ".inp", true) // read and parse input data b, err := io.ReadFile(in.inpfn) if err != nil { io.PfRed("cannot read %s\n", in.inpfn) return } err = json.Unmarshal(b, &in) if err != nil { io.PfRed("cannot parse %s\n", in.inpfn) return } in.PostProcess() // print input table io.Pf("%v\n", in) // load simulation sim := inp.ReadSim(in.Dir+"/"+in.SimFn, "", false, 0) if sim == nil { io.PfRed("cannot load simulation\n") return } // get material data mat := sim.MatParams.Get(in.MatName) if mat == nil { io.PfRed("cannot get material\n") return } //io.Pfcyan("mat = %v\n", mat) // get and initialise model mdl, _ := msolid.GetModel(in.SimFn, in.MatName, mat.Model, false) if mdl == nil { io.PfRed("cannot allocate model\n") return } ndim := 3 pstress := false mdl.Init(ndim, pstress, mat.Prms) //io.Pforan("mdl = %v\n", mdl) // load path var pth msolid.Path err = pth.ReadJson(ndim, path.Join(in.Dir, in.PathFn)) if err != nil { io.PfRed("cannot read path file %v\n", err) return } //io.PfYel("pth = %v\n", pth) // driver var drv msolid.Driver drv.InitWithModel(ndim, mdl) // run err = drv.Run(&pth) if err != nil { io.Pfred("driver: Run failed: %v\n", err) } // plot //if false { if true { var plr msolid.Plotter plr.SetFig(false, in.FigEps, in.FigProp, in.FigWid, "/tmp", "cmd_"+in.SimFn) var epm msolid.EPmodel if m, ok := mdl.(msolid.EPmodel); ok { plr.SetModel(m) epm = m } if epm != nil { //plr.Phi = epm.Get_phi() b := epm.Get_bsmp() epm.Set_bsmp(0) plr.YsClr0 = "magenta" plr.Plot(in.PlotSet, drv.Res, nil, true, false) epm.Set_bsmp(b) } plr.YsClr0 = "green" plr.Plot(in.PlotSet, drv.Res, drv.Eps, false, true) } // plot ys if false { //if true { plt.Reset() m := mdl.(*msolid.SmpInvs) φ := m.Get_phi() σcCte := 10.0 M := tsr.Phi2M(φ, "oct") rmin, rmax := 0.0, 1.28*M*σcCte nr, nα := 31, 81 //nr, nα := 31, 1001 npolarc := true simplec := false only0 := false grads := false showpts := false ferr := 10.0 tsr.PlotOct("fig_isofun02.png", σcCte, rmin, rmax, nr, nα, φ, m.Isof.Fa, m.Isof.Ga, npolarc, simplec, only0, grads, showpts, true, true, ferr) } }
func main() { // catch errors defer func() { if err := recover(); err != nil { io.PfRed("ERROR: %v\n", err) } }() // input data filename, fnkey := io.ArgToFilename(0, "data/equations.txt", "", true) io.Pf("\n%s\n", io.ArgsTable("INPUT ARGUMENTS", "file with equations", "filename", filename, )) io.Pforan("fnkey = %v\n", fnkey) // open file f, err := io.OpenFileR(filename) if err != nil { return } // constants MAXNIDX := 100 INDICES := []string{"i", "j", "k", "l", "m", "n", "r", "s", "p", "q"} // read file var buf bytes.Buffer io.ReadLinesFile(f, func(idx int, line string) (stop bool) { // indices l := line for i := 0; i < MAXNIDX; i++ { l = strings.Replace(l, io.Sf("[%d]", i), io.Sf("_{%d}", i), -1) } for _, idx := range INDICES { l = strings.Replace(l, io.Sf("[%s]", idx), io.Sf("_{%s}", idx), -1) } // constants l = strings.Replace(l, "math.Sqrt2", "\\sqrt{2}", -1) l = strings.Replace(l, "SQ2", "\\sqrt{2}", -1) // functions l = strings.Replace(l, "math.Sqrt", "\\sqrt", -1) l = strings.Replace(l, "math.Pow", "\\pow", -1) l = strings.Replace(l, "math.Exp", "\\exp", -1) l = strings.Replace(l, "math.Sin", "\\sin", -1) l = strings.Replace(l, "math.Cos", "\\cos", -1) // star l = strings.Replace(l, "*", " \\, ", -1) // colon-equal l = strings.Replace(l, ":=", "=", -1) // add to results io.Ff(&buf, "%s\n", l) return }) // write file io.WriteFileVD("/tmp/gosl", fnkey+".tex", &buf) }
func main() { // catch errors defer func() { if err := recover(); err != nil { io.PfRed("ERROR: %v\n", err) } }() // input data simfnA, fnkA := io.ArgToFilename(0, "o2elastCO", ".sim", true) skip := io.ArgToInt(1, 0) simfnB, fnkB := io.ArgToFilename(2, "", ".sim", false) labelA := io.ArgToString(3, "") labelB := io.ArgToString(4, "") // print input data io.Pf("\n%s\n", io.ArgsTable( "simulation filename", "simfnA", simfnA, "number of initial increments to skip", "skip", skip, "simulation filename for comparison", "simfnB", simfnB, "label for histogram", "labelA", labelA, "label for histogram", "labelB", labelB, )) // read residuals residA, fnkA := read_summary(simfnA) residB, fnkB := read_summary(simfnB) // residuals: it => residuals io.Pf("\nResiduals A\n") io.Pf("============\n") residA.Print("%10.2e") if simfnB != "" { io.Pf("\nResiduals B\n") io.Pf("============\n") residB.Print("%10.2e") } io.Pf("\n") // plot convergence curves plot_conv_curve(fnkA, skip, residA) if simfnB != "" { plot_conv_curve(fnkB, skip, residB) } // plot histogram io.Pf("\n") X := [][]float64{count_iters(residA)} labels := []string{fnkA} if labelA != "" { labels[0] = labelA } if simfnB != "" { X = append(X, count_iters(residB)) labels = append(labels, fnkB) if labelB != "" { labels[1] = labelB } } plt.Reset() plt.SetForEps(0.75, 300) plt.Hist(X, labels, "") plt.Gll("number of iterations", "counts", "") plt.SaveD("/tmp", "gofem_residplot_"+fnkA+"_"+fnkB+"_hist.eps") }