Ejemplo n.º 1
0
// nurbs_func implements shape/deriv functions for NURBS
func nurbs_func(u, S []float64, dSdR [][]float64, r []float64, derivs bool, nurbs *gm.Nurbs, ibasis, span []int) {

	// compute mapping to knots space
	nd := nurbs.Gnd()
	var umin, umax float64
	for i := 0; i < nd; i++ {
		umin = nurbs.U(i, span[i*2])
		umax = nurbs.U(i, span[i*2+1])
		u[i] = ((umax-umin)*r[i] + (umax + umin)) / 2.0
		if u[i] < umin || u[i] > umax {
			chk.Panic("cannot compute NURBS shape function outide cell range:\nr[%d]=%v, u[%d]=%v, urange=[%v,%v]", i, r[i], i, u[i], umin, umax)
		}
	}

	// shape and/or derivatives in knots space
	if derivs {
		nurbs.CalcBasisAndDerivs(u)
	} else {
		nurbs.CalcBasis(u)
	}
	for k, l := range ibasis {
		S[k] = nurbs.GetBasisL(l)
	}

	// derivatives in natural space
	if derivs {
		for k, l := range ibasis {
			nurbs.GetDerivL(dSdR[k], l) // dSdR := dSdU
			for i := 0; i < nd; i++ {
				umin = nurbs.U(i, span[i*2])
				umax = nurbs.U(i, span[i*2+1])
				dSdR[k][i] *= (umax - umin) / 2.0 // dSdR[i] := dSdU[i] * du[i]/dr[i] (no sum on i)
			}
		}
	}
	return
}