puts "================================================="
puts "0032863: Cone surface returns wrong v derivative "
puts "================================================="
puts ""

cone c 0.2 2.0

set u 5.23290599890759
set v 5.06498283391571

# reference data
svalue c  $u $v  x y z  dux duy duz  dvx dvy dvz  d2ux d2uy d2uz  d2vx d2vy d2vz  d2uvx d2uvy d2uvz
set dxRef [list [dval x] [dval dux] [dval dvx] [dval d2ux] [dval d2uvx] [dval d2vx]]
set dyRef [list [dval y] [dval duy] [dval dvy] [dval d2uy] [dval d2uvy] [dval d2vy]]
set dzRef [list [dval z] [dval duz] [dval dvz] [dval d2uz] [dval d2uvz] [dval d2vz]]

# compute derivatives till the second order
puts "======================================="
set tolerance 1.e-7
for {set order 1} {$order <= 2} {incr order} {
  for {set nv 0} {$nv <= $order} {incr nv} {
    set nu [expr $order - $nv]
    
    set offset [expr $order * ($order + 1) / 2 + $nv]
    set ref_dx [lindex $dxRef $offset]
    set ref_dy [lindex $dyRef $offset]
    set ref_dz [lindex $dzRef $offset]

    sderivative c  $u $v  $nu $nv  dx dy dz
    set dx [dval dx]
    set dy [dval dy]
    set dz [dval dz]

    puts ""
    puts "Order of derivative: Nu = $nu, Nv = $nv"
    puts "Expected ($ref_dx, $ref_dy, $ref_dz)"
    puts "Actual   ($dx, $dy, $dz)"
    checkreal "dX " $dx $ref_dx $tolerance $tolerance
    checkreal "dY " $dy $ref_dy $tolerance $tolerance
    checkreal "dZ " $dz $ref_dz $tolerance $tolerance
    puts "======================================="
  }
}
