// 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 }