本文整理汇总了Golang中github.com/cpmech/gosl/la.Triplet类的典型用法代码示例。如果您正苦于以下问题:Golang Triplet类的具体用法?Golang Triplet怎么用?Golang Triplet使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Triplet类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: CompareJacMpi
// CompareJacMpi compares Jacobian matrix (e.g. for testing)
func CompareJacMpi(tst *testing.T, ffcn Cb_f, Jfcn Cb_J, x []float64, tol float64, distr bool) {
// numerical
n := len(x)
fx := make([]float64, n)
w := make([]float64, n) // workspace
ffcn(fx, x)
var Jnum la.Triplet
Jnum.Init(n, n, n*n)
JacobianMpi(&Jnum, ffcn, x, fx, w, distr)
jn := Jnum.ToMatrix(nil)
// analytical
var Jana la.Triplet
Jana.Init(n, n, n*n)
Jfcn(&Jana, x)
ja := Jana.ToMatrix(nil)
// compare
max_diff := la.MatMaxDiff(jn.ToDense(), ja.ToDense())
if max_diff > tol {
tst.Errorf("[1;31mmax_diff = %g[0m\n", max_diff)
} else {
io.Pf("[1;32mmax_diff = %g[0m\n", max_diff)
}
}
示例2: CompareJac
func CompareJac(tst *testing.T, ffcn Cb_f, Jfcn Cb_J, x []float64, tol float64, distr bool) {
n := len(x)
// numerical
fx := make([]float64, n)
w := make([]float64, n) // workspace
ffcn(fx, x)
var Jnum la.Triplet
Jnum.Init(n, n, n*n)
Jacobian(&Jnum, ffcn, x, fx, w, distr)
jn := Jnum.ToMatrix(nil)
// analytical
var Jana la.Triplet
Jana.Init(n, n, n*n)
Jfcn(&Jana, x)
ja := Jana.ToMatrix(nil)
// compare
//la.PrintMat(fmt.Sprintf("Jana(%d)",mpi.Rank()), ja.ToDense(), "%13.6f", false)
//la.PrintMat(fmt.Sprintf("Jnum(%d)",mpi.Rank()), jn.ToDense(), "%13.6f", false)
max_diff := la.MatMaxDiff(jn.ToDense(), ja.ToDense())
if max_diff > tol {
tst.Errorf("[1;31mmax_diff = %g[0m\n", max_diff)
} else {
io.Pf("[1;32mmax_diff = %g[0m\n", max_diff)
}
}
示例3: CheckJ
// CheckJ check Jacobian matrix
// Ouptut: cnd -- condition number (with Frobenius norm)
func (o *NlSolver) CheckJ(x []float64, tol float64, chkJnum, silent bool) (cnd float64, err error) {
// Jacobian matrix
var Jmat [][]float64
if o.useDn {
Jmat = la.MatAlloc(o.neq, o.neq)
err = o.JfcnDn(Jmat, x)
if err != nil {
return 0, chk.Err(_nls_err5, "dense", err.Error())
}
} else {
if o.numJ {
err = Jacobian(&o.Jtri, o.Ffcn, x, o.fx, o.w, false)
if err != nil {
return 0, chk.Err(_nls_err5, "sparse", err.Error())
}
} else {
err = o.JfcnSp(&o.Jtri, x)
if err != nil {
return 0, chk.Err(_nls_err5, "sparse(num)", err.Error())
}
}
Jmat = o.Jtri.ToMatrix(nil).ToDense()
}
//la.PrintMat("J", Jmat, "%23g", false)
// condition number
cnd, err = la.MatCondG(Jmat, "F", 1e-10)
if err != nil {
return cnd, chk.Err(_nls_err6, err.Error())
}
if math.IsInf(cnd, 0) || math.IsNaN(cnd) {
return cnd, chk.Err(_nls_err7, cnd)
}
// numerical Jacobian
if !chkJnum {
return
}
var Jtmp la.Triplet
ws := make([]float64, o.neq)
err = o.Ffcn(o.fx, x)
if err != nil {
return
}
Jtmp.Init(o.neq, o.neq, o.neq*o.neq)
Jacobian(&Jtmp, o.Ffcn, x, o.fx, ws, false)
Jnum := Jtmp.ToMatrix(nil).ToDense()
for i := 0; i < o.neq; i++ {
for j := 0; j < o.neq; j++ {
chk.PrintAnaNum(io.Sf("J[%d][%d]", i, j), tol, Jmat[i][j], Jnum[i][j], !silent)
}
}
maxdiff := la.MatMaxDiff(Jmat, Jnum)
if maxdiff > tol {
err = chk.Err(_nls_err8, maxdiff)
}
return
}
示例4: AddToKb
// AddToKb adds element K to global Jacobian matrix Kb
func (o *ElastRod) AddToKb(Kb *la.Triplet, sol *Solution, firstIt bool) (err error) {
for i, I := range o.Umap {
for j, J := range o.Umap {
Kb.Put(I, J, o.K[i][j])
}
}
return
}
示例5: AddToKb
// AddToKb adds element K to global Jacobian matrix Kb
func (o *Rod) AddToKb(Kb *la.Triplet, sol *Solution, firstIt bool) (err error) {
// zero K matrix
la.MatFill(o.K, 0)
la.MatFill(o.M, 0) // TODO: implement mass matrix
// for each integration point
var E float64
nverts := o.Cell.Shp.Nverts
for idx, ip := range o.IpsElem {
// interpolation functions, gradients and variables @ ip
err = o.ipvars(idx, sol)
if err != nil {
return
}
// auxiliary
coef := ip[3]
Jvec := o.Cell.Shp.Jvec3d
G := o.Cell.Shp.Gvec
J := o.Cell.Shp.J
// add contribution to consistent tangent matrix
for m := 0; m < nverts; m++ {
for n := 0; n < nverts; n++ {
for i := 0; i < o.Ndim; i++ {
for j := 0; j < o.Ndim; j++ {
r := i + m*o.Ndim
c := j + n*o.Ndim
E, err = o.Model.CalcD(o.States[idx], firstIt)
if err != nil {
return
}
o.K[r][c] += coef * o.A * E * G[m] * G[n] * Jvec[i] * Jvec[j] / J
}
}
}
}
}
// add K to sparse matrix Kb
for i, I := range o.Umap {
for j, J := range o.Umap {
Kb.Put(I, J, o.K[i][j])
}
}
return
}
示例6: AddToKb
// adds element K to global Jacobian matrix Kb
func (o Rod) AddToKb(Kb *la.Triplet, sol *Solution, firstIt bool) (ok bool) {
// zero K matrix
la.MatFill(o.K, 0)
la.MatFill(o.M, 0)
// for each integration point
nverts := o.Shp.Nverts
ndim := Global.Ndim
for idx, ip := range o.IpsElem {
// interpolation functions, gradients and variables @ ip
if !o.ipvars(idx, sol) {
return
}
// auxiliary
coef := ip.W
Jvec := o.Shp.Jvec3d
G := o.Shp.Gvec
J := o.Shp.J
// add contribution to consistent tangent matrix
for m := 0; m < nverts; m++ {
for n := 0; n < nverts; n++ {
for i := 0; i < ndim; i++ {
for j := 0; j < ndim; j++ {
r := i + m*ndim
c := j + n*ndim
E, err := o.Model.CalcD(o.States[idx], firstIt)
if LogErr(err, "AddToKb") {
return
}
o.K[r][c] += coef * o.A * E * G[m] * G[n] * Jvec[i] * Jvec[j] / J
}
}
}
}
}
// add K to sparse matrix Kb
for i, I := range o.Umap {
for j, J := range o.Umap {
Kb.Put(I, J, o.K[i][j])
}
}
return true
}
示例7: AddToKb
// adds element K to global Jacobian matrix Kb
func (o Beam) AddToKb(Kb *la.Triplet, sol *Solution, firstIt bool) (ok bool) {
if Global.Sim.Data.Steady {
for i, I := range o.Umap {
for j, J := range o.Umap {
Kb.Put(I, J, o.K[i][j])
}
}
} else {
dc := Global.DynCoefs
for i, I := range o.Umap {
for j, J := range o.Umap {
Kb.Put(I, J, o.M[i][j]*dc.α1+o.K[i][j])
}
}
}
return true
}
示例8: AddToKb
// adds element K to global Jacobian matrix Kb
func (o *Beam) AddToKb(Kb *la.Triplet, sol *Solution, firstIt bool) (err error) {
if sol.Steady {
for i, I := range o.Umap {
for j, J := range o.Umap {
Kb.Put(I, J, o.K[i][j])
}
}
return
}
α1 := sol.DynCfs.α1
for i, I := range o.Umap {
for j, J := range o.Umap {
Kb.Put(I, J, o.M[i][j]*α1+o.K[i][j])
}
}
return
}
示例9: main
func main() {
mpi.Start(false)
defer func() {
mpi.Stop(false)
}()
if mpi.Rank() == 0 {
chk.PrintTitle("Test SumToRoot 01")
}
M := [][]float64{
{1000, 1000, 1000, 1011, 1021, 1000},
{1000, 1000, 1000, 1012, 1022, 1000},
{1000, 1000, 1000, 1013, 1023, 1000},
{1011, 1012, 1013, 1000, 1000, 1000},
{1021, 1022, 1023, 1000, 1000, 1000},
{1000, 1000, 1000, 1000, 1000, 1000},
}
id, sz, m := mpi.Rank(), mpi.Size(), len(M)
start, endp1 := (id*m)/sz, ((id+1)*m)/sz
if sz > 6 {
chk.Panic("this test works with at most 6 processors")
}
var J la.Triplet
J.Init(m, m, m*m)
for i := start; i < endp1; i++ {
for j := 0; j < m; j++ {
J.Put(i, j, M[i][j])
}
}
la.PrintMat(fmt.Sprintf("J @ proc # %d", id), J.ToMatrix(nil).ToDense(), "%10.1f", false)
la.SpTriSumToRoot(&J)
var tst testing.T
if mpi.Rank() == 0 {
chk.Matrix(&tst, "J @ proc 0", 1.0e-17, J.ToMatrix(nil).ToDense(), [][]float64{
{1000, 1000, 1000, 1011, 1021, 1000},
{1000, 1000, 1000, 1012, 1022, 1000},
{1000, 1000, 1000, 1013, 1023, 1000},
{1011, 1012, 1013, 1000, 1000, 1000},
{1021, 1022, 1023, 1000, 1000, 1000},
{1000, 1000, 1000, 1000, 1000, 1000},
})
}
}
示例10: main
func main() {
mpi.Start(false)
defer func() {
mpi.Stop(false)
}()
myrank := mpi.Rank()
if myrank == 0 {
chk.PrintTitle("Test MUMPS Sol 02")
}
ndim := 10
id, sz := mpi.Rank(), mpi.Size()
start, endp1 := (id*ndim)/sz, ((id+1)*ndim)/sz
if mpi.Size() > ndim {
chk.Panic("the number of processors must be smaller than or equal to %d", ndim)
}
b := make([]float64, ndim)
var t la.Triplet
t.Init(ndim, ndim, ndim*ndim)
for i := start; i < endp1; i++ {
j := i
if i > 0 {
j = i - 1
}
for ; j < ndim; j++ {
val := 10.0 - float64(j)
if i > j {
val -= 1.0
}
t.Put(i, j, val)
}
b[i] = float64(i + 1)
}
x_correct := []float64{-1, 8, -65, 454, -2725, 13624, -54497, 163490, -326981, 326991}
sum_b_to_root := true
la.RunMumpsTestR(&t, 1e-4, b, x_correct, sum_b_to_root)
}
示例11: AddToKb
// AddToKb adds element K to global Jacobian matrix Kb
func (o *ElemPhi) AddToKb(Kb *la.Triplet, sol *Solution, firstIt bool) (err error) {
// auxiliary
nverts := o.Cell.Shp.Nverts
// zero K matrix
la.MatFill(o.K, 0)
dt := sol.Dt * 2
// for each integration point
for iip, ip := range o.IpsElem {
// interpolation functions and gradients
err = o.Cell.Shp.CalcAtIp(o.X, ip, true)
if err != nil {
return
}
// auxiliary variables
coef := o.Cell.Shp.J * ip[3]
S := o.Cell.Shp.S
G := o.Cell.Shp.G
// add to right hand side vector
for m := 0; m < nverts; m++ {
for n := 0; n < nverts; n++ {
o.K[m][n] -= coef * (S[m]*S[n] + dt*dt/6.0*(o.v_0[iip][0]*G[m][0]+o.v_0[iip][1]*G[m][1])*(o.v_0[iip][0]*G[n][0]+o.v_0[iip][1]*G[n][1])) / dt
}
}
}
// add K to sparse matrix Kb
for i, I := range o.Umap {
for j, J := range o.Umap {
Kb.Put(I, J, o.K[i][j])
}
}
return
}
示例12: AddToKb
// AddToKb adds element K to global Jacobian matrix Kb
func (o *ElemPhi) AddToKb(Kb *la.Triplet, sol *Solution, firstIt bool) (ok bool) {
// auxiliary
β1 := Global.DynCoefs.β1
nverts := o.Shp.Nverts
// zero K matrix
la.MatFill(o.K, 0)
// for each integration point
for _, ip := range o.IpsElem {
// interpolation functions and gradients
if LogErr(o.Shp.CalcAtIp(o.X, ip, true), "InterpStarVars") {
return
}
// auxiliary variables
coef := o.Shp.J * ip.W
S := o.Shp.S
// add to right hand side vector
for m := 0; m < nverts; m++ {
for n := 0; n < nverts; n++ {
o.K[m][n] += coef * S[m] * S[n] * β1
}
}
}
// add K to sparse matrix Kb
for i, I := range o.Umap {
for j, J := range o.Umap {
Kb.Put(I, J, o.K[i][j])
}
}
return true
}
示例13: Assemble
func Assemble(K11, K12 *la.Triplet, F1 []float64, src Cb_src, g *Grid2D, e *Equations) {
K11.Start()
K12.Start()
la.VecFill(F1, 0.0)
kx, ky := 1.0, 1.0
alp, bet, gam := 2.0*(kx/g.Dxx+ky/g.Dyy), -kx/g.Dxx, -ky/g.Dyy
mol := []float64{alp, bet, bet, gam, gam}
for i, I := range e.RF1 {
col, row := I%g.Nx, I/g.Nx
nodes := []int{I, I - 1, I + 1, I - g.Nx, I + g.Nx} // I, left, right, bottom, top
if col == 0 {
nodes[1] = nodes[2]
}
if col == g.Nx-1 {
nodes[2] = nodes[1]
}
if row == 0 {
nodes[3] = nodes[4]
}
if row == g.Ny-1 {
nodes[4] = nodes[3]
}
for k, J := range nodes {
j1, j2 := e.FR1[J], e.FR2[J] // 1 or 2?
if j1 > -1 { // 11
K11.Put(i, j1, mol[k])
} else { // 12
K12.Put(i, j2, mol[k])
}
}
if src != nil {
x := float64(col) * g.Dx
y := float64(row) * g.Dy
F1[i] += src(x, y)
}
}
}
示例14: Jacobian
// Jacobian computes Jacobian (sparse) matrix
// Calculates (with N=n-1):
// df0dx0, df0dx1, df0dx2, ... df0dxN
// df1dx0, df1dx1, df1dx2, ... df1dxN
// . . . . . . . . . . . . .
// dfNdx0, dfNdx1, dfNdx2, ... dfNdxN
// INPUT:
// ffcn : f(x) function
// x : station where dfdx has to be calculated
// fx : f @ x
// w : workspace with size == n == len(x)
// RETURNS:
// J : dfdx @ x [must be pre-allocated]
func Jacobian(J *la.Triplet, ffcn Cb_f, x, fx, w []float64) (err error) {
ndim := len(x)
start, endp1 := 0, ndim
if J.Max() == 0 {
J.Init(ndim, ndim, ndim*ndim)
}
J.Start()
var df float64
for col := 0; col < ndim; col++ {
xsafe := x[col]
delta := math.Sqrt(EPS * max(CTE1, math.Abs(xsafe)))
x[col] = xsafe + delta
err = ffcn(w, x) // w := f(x+δx[col])
if err != nil {
return
}
for row := start; row < endp1; row++ {
df = w[row] - fx[row]
J.Put(row, col, df/delta)
}
x[col] = xsafe
}
return
}
示例15: Test_assemb01
func Test_assemb01(tst *testing.T) {
chk.PrintTitle("assemb01")
// grid
var g Grid2D
g.Init(1.0, 1.0, 3, 3)
// equations numbering
var e Equations
e.Init(g.N, []int{0, 3, 6})
// K11 and K12
var K11, K12 la.Triplet
InitK11andK12(&K11, &K12, &e)
// assembly
F1 := make([]float64, e.N1)
Assemble(&K11, &K12, F1, nil, &g, &e)
// check
K11d := K11.ToMatrix(nil).ToDense()
K12d := K12.ToMatrix(nil).ToDense()
K11c := [][]float64{
{16.0, -4.0, -8.0, 0.0, 0.0, 0.0},
{-8.0, 16.0, 0.0, -8.0, 0.0, 0.0},
{-4.0, 0.0, 16.0, -4.0, -4.0, 0.0},
{0.0, -4.0, -8.0, 16.0, 0.0, -4.0},
{0.0, 0.0, -8.0, 0.0, 16.0, -4.0},
{0.0, 0.0, 0.0, -8.0, -8.0, 16.0},
}
K12c := [][]float64{
{-4.0, 0.0, 0.0},
{0.0, 0.0, 0.0},
{0.0, -4.0, 0.0},
{0.0, 0.0, 0.0},
{0.0, 0.0, -4.0},
{0.0, 0.0, 0.0},
}
chk.Matrix(tst, "K11: ", 1e-16, K11d, K11c)
chk.Matrix(tst, "K12: ", 1e-16, K12d, K12c)
}