func GetIntegrationPoints(nip, nipf int, cellType string) (ipsElem, ipsFace []*shp.Ipoint) { // get integration points of element var err error ipsElem, err = shp.GetIps(cellType, nip) if LogErr(err, io.Sf("cannot get integration points for element with shape type=%q and nip=%d", cellType, nip)) { return nil, nil } // get integration points of face faceType := shp.GetFaceType(cellType) ipsFace, err = shp.GetIps(faceType, nipf) if LogErr(err, io.Sf("cannot get integration points for face with face-shape type=%q and nip=%d", faceType, nip)) { return nil, nil } return }
// register element func init() { // information allocator infogetters["rod"] = func(cellType string, faceConds []*FaceCond) *Info { // new info var info Info // number of nodes in element nverts := shp.GetNverts(cellType) // solution variables ykeys := []string{"ux", "uy"} if Global.Ndim == 3 { ykeys = []string{"ux", "uy", "uz"} } info.Dofs = make([][]string, nverts) for m := 0; m < nverts; m++ { info.Dofs[m] = ykeys } // maps info.Y2F = map[string]string{"ux": "fx", "uy": "fy", "uz": "fz"} // t1 and t2 variables info.T2vars = ykeys return &info } // element allocator eallocators["rod"] = func(cellType string, faceConds []*FaceCond, cid int, edat *inp.ElemData, x [][]float64) Elem { // basic data var o Rod o.Cid = cid o.X = x o.Shp = shp.Get(cellType) ndim := Global.Ndim o.Nu = ndim * o.Shp.Nverts var err error // material model name matname := edat.Mat matdata := Global.Sim.Mdb.Get(matname) if LogErrCond(matdata == nil, "materials database failed on getting %q material\n", matname) { return nil } mdlname := matdata.Model o.Model = msolid.GetOnedSolid(Global.Sim.Data.FnameKey, matname, mdlname, false) if LogErrCond(o.Model == nil, "cannot find model named %s\n", mdlname) { return nil } err = o.Model.Init(ndim, matdata.Prms) if LogErr(err, "Model.Init failed") { return nil } // parameters for _, p := range matdata.Prms { switch p.N { case "A": o.A = p.V case "rho": o.Rho = p.V } } // integration points var nip int if s_nip, found := io.Keycode(edat.Extra, "nip"); found { nip = io.Atoi(s_nip) } o.IpsElem, err = shp.GetIps(o.Shp.Type, nip) if LogErr(err, "GetIps failed") { return nil } nip = len(o.IpsElem) // scratchpad. computed @ each ip o.K = la.MatAlloc(o.Nu, o.Nu) o.M = la.MatAlloc(o.Nu, o.Nu) o.ue = make([]float64, o.Nu) o.Rus = make([]float64, o.Nu) // scratchpad. computed @ each ip o.grav = make([]float64, ndim) o.us = make([]float64, ndim) o.fi = make([]float64, o.Nu) // return new element return &o } }