本文整理汇总了Golang中github.com/cpmech/gosl/la.Triplet类的典型用法代码示例。如果您正苦于以下问题:Golang Triplet类的具体用法?Golang Triplet怎么用?Golang Triplet使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Triplet类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的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)
}
}
开发者ID:yunpeng1,项目名称:gosl,代码行数:27,代码来源:jacobian_mpi.go
示例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)
}
}
开发者ID:PaddySchmidt,项目名称:gosl,代码行数:25,代码来源:auxiliary.go
示例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
}
开发者ID:PaddySchmidt,项目名称:gosl,代码行数:61,代码来源:nlsolver.go
示例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
}
开发者ID:PaddySchmidt,项目名称:gofem,代码行数:9,代码来源:e_elastrod.go
示例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
}
开发者ID:PaddySchmidt,项目名称:gofem,代码行数:50,代码来源:e_rod.go
示例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
}
开发者ID:PatrickSchm,项目名称:gofem,代码行数:49,代码来源:e_rod.go
示例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
}
开发者ID:PatrickSchm,项目名称:gofem,代码行数:18,代码来源:e_beam.go
示例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
}
开发者ID:PaddySchmidt,项目名称:gofem,代码行数:18,代码来源:e_beam.go
示例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},
})
}
}
开发者ID:yunpeng1,项目名称:gosl,代码行数:49,代码来源:t_sumtoroot_main.go
示例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)
}
开发者ID:yunpeng1,项目名称:gosl,代码行数:43,代码来源:t_mumpssol02_main.go
示例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
}
开发者ID:PaddySchmidt,项目名称:gofem,代码行数:40,代码来源:e_phi.go
示例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
}
开发者ID:PatrickSchm,项目名称:gofem,代码行数:38,代码来源:e_phi.go
示例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)
}
}
}
开发者ID:PaddySchmidt,项目名称:gosl,代码行数:37,代码来源:assembly.go
示例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
}
开发者ID:yunpeng1,项目名称:gosl,代码行数:37,代码来源:jacobian.go
示例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)
}
开发者ID:yunpeng1,项目名称:gosl,代码行数:42,代码来源:t_assemb_test.go
示例16: Test_linipm01
func Test_linipm01(tst *testing.T) {
//verbose()
chk.PrintTitle("linipm01")
// linear programming problem
// min -4*x0 - 5*x1
// s.t. 2*x0 + x1 ≤ 3
// x0 + 2*x1 ≤ 3
// x0,x1 ≥ 0
// standard:
// 2*x0 + x1 + x2 = 3
// x0 + 2*x1 + x3 = 3
// x0,x1,x2,x3 ≥ 0
var T la.Triplet
T.Init(2, 4, 6)
T.Put(0, 0, 2.0)
T.Put(0, 1, 1.0)
T.Put(0, 2, 1.0)
T.Put(1, 0, 1.0)
T.Put(1, 1, 2.0)
T.Put(1, 3, 1.0)
Am := T.ToMatrix(nil)
A := Am.ToDense()
c := []float64{-4, -5, 0, 0}
b := []float64{3, 3}
// print LP
la.PrintMat("A", A, "%6g", false)
la.PrintVec("b", b, "%6g", false)
la.PrintVec("c", c, "%6g", false)
io.Pf("\n")
// solve LP
var ipm LinIpm
defer ipm.Clean()
ipm.Init(Am, b, c, nil)
err := ipm.Solve(chk.Verbose)
if err != nil {
tst.Errorf("ipm failed:\n%v", err)
return
}
// check
io.Pf("\n")
io.Pforan("x = %v\n", ipm.X)
io.Pfcyan("λ = %v\n", ipm.L)
io.Pforan("s = %v\n", ipm.S)
x := ipm.X[:2]
bres := make([]float64, 2)
la.MatVecMul(bres, 1, A, x)
io.Pforan("bres = %v\n", bres)
chk.Vector(tst, "x", 1e-9, x, []float64{1, 1})
chk.Vector(tst, "A*x=b", 1e-8, bres, b)
// plot
if true && chk.Verbose {
f := func(x []float64) float64 {
return c[0]*x[0] + c[1]*x[1]
}
g := func(x []float64, i int) float64 {
return A[i][0]*x[0] + A[i][1]*x[1] - b[i]
}
np := 41
vmin, vmax := []float64{-2.0, -2.0}, []float64{2.0, 2.0}
PlotTwoVarsContour("/tmp/gosl", "test_linipm01", x, np, nil, true, vmin, vmax, f,
func(x []float64) float64 { return g(x, 0) },
func(x []float64) float64 { return g(x, 1) },
)
}
}
开发者ID:PaddySchmidt,项目名称:gosl,代码行数:71,代码来源:t_linipm_test.go
示例17: InitK11andK12
func InitK11andK12(K11, K12 *la.Triplet, e *Equations) {
K11.Init(e.N1, e.N1, e.N1*5)
K12.Init(e.N1, e.N2, e.N1*5)
}
开发者ID:PaddySchmidt,项目名称:gosl,代码行数:4,代码来源:assembly.go
示例18: AddToKb
// AddToKb adds element K to global Jacobian matrix Kb
func (o *ElemU) AddToKb(Kb *la.Triplet, sol *Solution, firstIt bool) (ok bool) {
// zero K matrix
la.MatFill(o.K, 0)
// for each integration point
dc := Global.DynCoefs
ndim := Global.Ndim
nverts := o.Shp.Nverts
for idx, ip := range o.IpsElem {
// interpolation functions, gradients and variables @ ip
if !o.ipvars(idx, sol) {
return
}
// check Jacobian
if o.Shp.J < 0 {
LogErrCond(true, "ElemU: eid=%d: Jacobian is negative = %g\n", o.Id(), o.Shp.J)
return
}
// auxiliary
coef := o.Shp.J * ip.W * o.Thickness
S := o.Shp.S
G := o.Shp.G
// consistent tangent model matrix
if LogErr(o.MdlSmall.CalcD(o.D, o.States[idx], firstIt), "AddToKb") {
return
}
// add contribution to consistent tangent matrix
if o.UseB {
radius := 1.0
if Global.Sim.Data.Axisym {
radius = o.Shp.AxisymGetRadius(o.X)
coef *= radius
}
IpBmatrix(o.B, ndim, nverts, G, radius, S)
la.MatTrMulAdd3(o.K, coef, o.B, o.D, o.B) // K += coef * tr(B) * D * B
} else {
IpAddToKt(o.K, nverts, ndim, coef, G, o.D)
}
// dynamic term
if !Global.Sim.Data.Steady {
for m := 0; m < nverts; m++ {
for i := 0; i < ndim; i++ {
r := i + m*ndim
for n := 0; n < nverts; n++ {
c := i + n*ndim
o.K[r][c] += coef * S[m] * S[n] * (o.Rho*dc.α1 + o.Cdam*dc.α4)
}
}
}
}
}
// 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
}
开发者ID:PatrickSchm,项目名称:gofem,代码行数:68,代码来源:e_u.go
示例19: TestDiffusion1D
func TestDiffusion1D(tst *testing.T) {
//verbose()
chk.PrintTitle("Test Diffusion 1D (cooling)")
// solution parameters
silent := false
fixstp := true
//fixstp := false
//method := "FwEuler"
method := "BwEuler"
//method := "Dopri5"
//method := "Radau5"
//numjac := true
numjac := false
rtol := 1e-4
atol := rtol
// timestep
t0, tf, dt := 0.0, 0.2, 0.03
// problem data
kx := 1.0 // conductivity
N := 6 // number of nodes
//Nb := N + 2 // augmented system dimension
xmax := 1.0 // length
dx := xmax / float64(N-1) // spatial step size
dxx := dx * dx
mol := []float64{kx / dxx, -2.0 * kx / dxx, kx / dxx}
// function
fcn := func(f []float64, t float64, y []float64, args ...interface{}) error {
for i := 0; i < N; i++ {
f[i] = 0
if i == 0 || i == N-1 {
continue // skip presc node
}
for p, j := range []int{i - 1, i, i + 1} {
if j < 0 {
j = i + 1
} // left boundary
if j == N {
j = i - 1
} // right boundary
f[i] += mol[p] * y[j]
}
}
//io.Pfgrey("y = %v\n", y)
//io.Pfcyan("f = %v\n", f)
return nil
}
// Jacobian
jac := func(dfdy *la.Triplet, t float64, y []float64, args ...interface{}) error {
//chk.Panic("jac is not available")
if dfdy.Max() == 0 {
//dfdy.Init(Nb, Nb, 3*N)
dfdy.Init(N, N, 3*N)
}
dfdy.Start()
for i := 0; i < N; i++ {
if i == 0 || i == N-1 {
dfdy.Put(i, i, 0.0)
continue
}
for p, j := range []int{i - 1, i, i + 1} {
if j < 0 {
j = i + 1
} // left boundary
if j == N {
j = i - 1
} // right boundary
dfdy.Put(i, j, mol[p])
}
}
return nil
}
// initial values
x := utl.LinSpace(0.0, xmax, N)
y := make([]float64, N)
//y := make([]float64, Nb)
for i := 0; i < N; i++ {
y[i] = 4.0*x[i] - 4.0*x[i]*x[i]
}
// debug
f0 := make([]float64, N)
//f0 := make([]float64, Nb)
fcn(f0, 0, y)
if false {
io.Pforan("y0 = %v\n", y)
io.Pforan("f0 = %v\n", f0)
var J la.Triplet
jac(&J, 0, y)
la.PrintMat("J", J.ToMatrix(nil).ToDense(), "%8.3f", false)
}
//chk.Panic("stop")
/*
//.........这里部分代码省略.........
开发者ID:PaddySchmidt,项目名称:gosl,代码行数:101,代码来源:t_diffusion1d_test.go
示例20: AddToKb
// adds element K to global Jacobian matrix Kb
func (o ElemUP) AddToKb(Kb *la.Triplet, sol *Solution, firstIt bool) (ok bool) {
// clear matrices
ndim := Global.Ndim
u_nverts := o.U.Shp.Nverts
p_nverts := o.P.Shp.Nverts
la.MatFill(o.P.Kpp, 0)
for i := 0; i < o.U.Nu; i++ {
for j := 0; j < o.P.Np; j++ {
o.Kup[i][j] = 0
o.Kpu[j][i] = 0
}
for j := 0; j < o.U.Nu; j++ {
o.U.K[i][j] = 0
}
}
if o.P.DoExtrap {
for i := 0; i < p_nverts; i++ {
o.P.ρl_ex[i] = 0
for j := 0; j < p_nverts; j++ {
o.P.dρldpl_ex[i][j] = 0
}
for j := 0; j < o.U.Nu; j++ {
o.dρldus_ex[i][j] = 0
}
}
}
// for each integration point
dc := Global.DynCoefs
var coef, plt, klr, ρL, Cl, divvs float64
var ρl, ρ, Cpl, Cvs, dρdpl, dpdpl, dCpldpl, dCvsdpl, dklrdpl, dCpldusM, dρldusM, dρdusM float64
var r, c int
for idx, ip := range o.U.IpsElem {
// interpolation functions, gradients and variables @ ip
if !o.ipvars(idx, sol) {
return
}
coef = o.U.Shp.J * ip.W
S := o.U.Shp.S
G := o.U.Shp.G
Sb := o.P.Shp.S
Gb := o.P.Shp.G
// axisymmetric case
radius := 1.0
if Global.Sim.Data.Axisym {
radius = o.U.Shp.AxisymGetRadius(o.U.X)
coef *= radius
}
// auxiliary
divvs = dc.α4*o.divus - o.U.divχs[idx] // divergence of Eq (35a) [1]
// tpm variables
plt = dc.β1*o.P.pl - o.P.ψl[idx] // Eq (35c) [1]
klr = o.P.Mdl.Cnd.Klr(o.P.States[idx].A_sl)
ρL = o.P.States[idx].A_ρL
Cl = o.P.Mdl.Cl
if LogErr(o.P.Mdl.CalcLs(o.P.res, o.P.States[idx], o.P.pl, o.divus, true), "AddToKb") {
return
}
ρl = o.P.res.A_ρl
ρ = o.P.res.A_ρ
Cpl = o.P.res.Cpl
Cvs = o.P.res.Cvs
dρdpl = o.P.res.Dρdpl
dpdpl = o.P.res.Dpdpl
dCpldpl = o.P.res.DCpldpl
dCvsdpl = o.P.res.DCvsdpl
dklrdpl = o.P.res.Dklrdpl
dCpldusM = o.P.res.DCpldusM
dρldusM = o.P.res.DρldusM
dρdusM = o.P.res.DρdusM
// Kpu, Kup and Kpp
for n := 0; n < p_nverts; n++ {
for j := 0; j < ndim; j++ {
// Kpu := ∂Rl^n/∂us^m and Kup := ∂Rus^m/∂pl^n; see Eq (47) of [1]
for m := 0; m < u_nverts; m++ {
c = j + m*ndim
// add ∂rlb/∂us^m: Eqs (A.3) and (A.6) of [1]
o.Kpu[n][c] += coef * Sb[n] * (dCpldusM*plt + dc.α4*Cvs) * G[m][j]
// add ∂(ρl.wl)/∂us^m: Eq (A.8) of [1]
for i := 0; i < ndim; i++ {
o.Kpu[n][c] += coef * Gb[n][i] * S[m] * dc.α1 * ρL * klr * o.P.Mdl.Klsat[i][j]
}
// add ∂rl/∂pl^n and ∂p/∂pl^n: Eqs (A.9) and (A.11) of [1]
o.Kup[c][n] += coef * (S[m]*Sb[n]*dρdpl*o.bs[j] - G[m][j]*Sb[n]*dpdpl)
// for seepage face
if o.P.DoExtrap {
o.dρldus_ex[n][c] += o.P.Emat[n][idx] * dρldusM * G[m][j]
}
//.........这里部分代码省略.........
开发者ID:PatrickSchm,项目名称:gofem,代码行数:101,代码来源:e_up.go
注:本文中的github.com/cpmech/gosl/la.Triplet类示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论