changeset 12696:2f6ebbb02032 octave-forge

nurbs: move to individual hg repository
author carandraug
date Mon, 14 Sep 2015 16:04:44 +0000
parents 1f7c2d121557
children 79e7259c6ff1
files extra/nurbs/CITATION extra/nurbs/COPYING extra/nurbs/DESCRIPTION extra/nurbs/INDEX extra/nurbs/NEWS extra/nurbs/PKG_ADD extra/nurbs/inst/basisfun.m extra/nurbs/inst/basisfunder.m extra/nurbs/inst/basiskntins.m extra/nurbs/inst/bspdegelev.m extra/nurbs/inst/bspderiv.m extra/nurbs/inst/bspeval.m extra/nurbs/inst/bspkntins.m extra/nurbs/inst/crvkntremove.m extra/nurbs/inst/curvederivcpts.m extra/nurbs/inst/curvederiveval.m extra/nurbs/inst/deg2rad.m extra/nurbs/inst/findspan.m extra/nurbs/inst/kntbrkdegmult.m extra/nurbs/inst/kntbrkdegreg.m extra/nurbs/inst/kntrefine.m extra/nurbs/inst/kntuniform.m extra/nurbs/inst/nrb2iges.m extra/nurbs/inst/nrb4surf.m extra/nurbs/inst/nrbbasisfun.m extra/nurbs/inst/nrbbasisfunder.m extra/nurbs/inst/nrbcirc.m extra/nurbs/inst/nrbcoons.m extra/nurbs/inst/nrbcrvderiveval.m extra/nurbs/inst/nrbctrlplot.m extra/nurbs/inst/nrbcylind.m extra/nurbs/inst/nrbdegelev.m extra/nurbs/inst/nrbderiv.m extra/nurbs/inst/nrbdeval.m extra/nurbs/inst/nrbeval.m extra/nurbs/inst/nrbexport.m extra/nurbs/inst/nrbextract.m extra/nurbs/inst/nrbextrude.m extra/nurbs/inst/nrbkntins.m extra/nurbs/inst/nrbkntplot.m extra/nurbs/inst/nrbline.m extra/nurbs/inst/nrbmak.m extra/nurbs/inst/nrbmeasure.m extra/nurbs/inst/nrbmultipatch.m extra/nurbs/inst/nrbnumbasisfun.m extra/nurbs/inst/nrbpermute.m extra/nurbs/inst/nrbplot.m extra/nurbs/inst/nrbrect.m extra/nurbs/inst/nrbreverse.m extra/nurbs/inst/nrbrevolve.m extra/nurbs/inst/nrbruled.m extra/nurbs/inst/nrbsurfderiveval.m extra/nurbs/inst/nrbtestcrv.m extra/nurbs/inst/nrbtestsrf.m extra/nurbs/inst/nrbtform.m extra/nurbs/inst/nrbtransp.m extra/nurbs/inst/nrbunclamp.m extra/nurbs/inst/numbasisfun.m extra/nurbs/inst/private/nrb_crv_basisfun__.m extra/nurbs/inst/private/nrb_crv_basisfun_der__.m extra/nurbs/inst/private/nrb_srf_basisfun__.m extra/nurbs/inst/private/nrb_srf_basisfun_der__.m extra/nurbs/inst/private/nrb_srf_numbasisfun__.m extra/nurbs/inst/private/onebasisfun__.m extra/nurbs/inst/private/onebasisfunder__.m extra/nurbs/inst/rad2deg.m extra/nurbs/inst/surfderivcpts.m extra/nurbs/inst/surfderiveval.m extra/nurbs/inst/tbasisfun.m extra/nurbs/inst/vecangle.m extra/nurbs/inst/veccross.m extra/nurbs/inst/vecdot.m extra/nurbs/inst/vecmag.m extra/nurbs/inst/vecmag2.m extra/nurbs/inst/vecnorm.m extra/nurbs/inst/vecrot.m extra/nurbs/inst/vecrotx.m extra/nurbs/inst/vecroty.m extra/nurbs/inst/vecrotz.m extra/nurbs/inst/vecscale.m extra/nurbs/inst/vectrans.m extra/nurbs/src/Makefile extra/nurbs/src/basisfun.cc extra/nurbs/src/basisfunder.cc extra/nurbs/src/bspderiv.cc extra/nurbs/src/bspeval.cc extra/nurbs/src/curvederivcpts.cc extra/nurbs/src/low_level_functions.cc extra/nurbs/src/low_level_functions.h extra/nurbs/src/nrb_srf_basisfun__.cc extra/nurbs/src/nrb_srf_basisfun_der__.cc extra/nurbs/src/nrbsurfderiveval.cc extra/nurbs/src/surfderivcpts.cc extra/nurbs/src/surfderiveval.cc extra/nurbs/src/tbasisfun.cc
diffstat 95 files changed, 0 insertions(+), 11566 deletions(-) [+]
line wrap: on
line diff
--- a/extra/nurbs/CITATION	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-
-To cite the Octave NURBS package use:
-
-[1] M. Spink, D. Claxton, C. de Falco, R. Vazquez,
-    The NURBS toolbox,
-    http://octave.sourceforge.net/nurbs/index.html.
-
-[2] C. de Falco, A. Reali, and R. Vazquez.
-    Geopdes: A research tool for isogeometric analysis of pdes.
-    Advances in Engineering Software, 42(12):1020-1034, 2011.
-
-BibTeX entries for LaTeX users are:
-
-@misc{NT,
-      Author = {Spink, M. and Claxton, D. and de Falco, C. and V{\'a}zquez, R.},
-      Howpublished = {\url{http://octave.sourceforge.net/nurbs/index.html}},
-      Title = {The {NURBS} toolbox}}
-
-@article{geopdes,
-	Author = {C. de Falco and A. Reali and R. V{\'a}zquez},
-	Journal = {Advances in Engineering Software},
-	Number = {12},
-	Pages = {1020-1034},
-	Title = {GeoPDEs: A research tool for Isogeometric Analysis of PDEs},
-	Volume = {42},
-	Year = {2011}}
--- a/extra/nurbs/COPYING	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,674 +0,0 @@
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
-  The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works.  By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.  We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors.  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
-  To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights.  Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received.  You must make sure that they, too, receive
-or can get the source code.  And you must show them these terms so they
-know their rights.
-
-  Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
-  For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software.  For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
-  Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so.  This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software.  The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable.  Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products.  If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
-  Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary.  To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                       TERMS AND CONDITIONS
-
-  0. Definitions.
-
-  "This License" refers to version 3 of the GNU General Public License.
-
-  "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
-  "The Program" refers to any copyrightable work licensed under this
-License.  Each licensee is addressed as "you".  "Licensees" and
-"recipients" may be individuals or organizations.
-
-  To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy.  The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
-  A "covered work" means either the unmodified Program or a work based
-on the Program.
-
-  To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy.  Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
-  To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies.  Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
-  An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License.  If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
-  1. Source Code.
-
-  The "source code" for a work means the preferred form of the work
-for making modifications to it.  "Object code" means any non-source
-form of a work.
-
-  A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
-  The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form.  A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
-  The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities.  However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work.  For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
-  The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
-  The Corresponding Source for a work in source code form is that
-same work.
-
-  2. Basic Permissions.
-
-  All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met.  This License explicitly affirms your unlimited
-permission to run the unmodified Program.  The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work.  This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
-  You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force.  You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright.  Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
-  Conveying under any other circumstances is permitted solely under
-the conditions stated below.  Sublicensing is not allowed; section 10
-makes it unnecessary.
-
-  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
-  No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
-  When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
-  4. Conveying Verbatim Copies.
-
-  You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
-  You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
-  5. Conveying Modified Source Versions.
-
-  You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
-    a) The work must carry prominent notices stating that you modified
-    it, and giving a relevant date.
-
-    b) The work must carry prominent notices stating that it is
-    released under this License and any conditions added under section
-    7.  This requirement modifies the requirement in section 4 to
-    "keep intact all notices".
-
-    c) You must license the entire work, as a whole, under this
-    License to anyone who comes into possession of a copy.  This
-    License will therefore apply, along with any applicable section 7
-    additional terms, to the whole of the work, and all its parts,
-    regardless of how they are packaged.  This License gives no
-    permission to license the work in any other way, but it does not
-    invalidate such permission if you have separately received it.
-
-    d) If the work has interactive user interfaces, each must display
-    Appropriate Legal Notices; however, if the Program has interactive
-    interfaces that do not display Appropriate Legal Notices, your
-    work need not make them do so.
-
-  A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit.  Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
-  6. Conveying Non-Source Forms.
-
-  You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
-    a) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by the
-    Corresponding Source fixed on a durable physical medium
-    customarily used for software interchange.
-
-    b) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by a
-    written offer, valid for at least three years and valid for as
-    long as you offer spare parts or customer support for that product
-    model, to give anyone who possesses the object code either (1) a
-    copy of the Corresponding Source for all the software in the
-    product that is covered by this License, on a durable physical
-    medium customarily used for software interchange, for a price no
-    more than your reasonable cost of physically performing this
-    conveying of source, or (2) access to copy the
-    Corresponding Source from a network server at no charge.
-
-    c) Convey individual copies of the object code with a copy of the
-    written offer to provide the Corresponding Source.  This
-    alternative is allowed only occasionally and noncommercially, and
-    only if you received the object code with such an offer, in accord
-    with subsection 6b.
-
-    d) Convey the object code by offering access from a designated
-    place (gratis or for a charge), and offer equivalent access to the
-    Corresponding Source in the same way through the same place at no
-    further charge.  You need not require recipients to copy the
-    Corresponding Source along with the object code.  If the place to
-    copy the object code is a network server, the Corresponding Source
-    may be on a different server (operated by you or a third party)
-    that supports equivalent copying facilities, provided you maintain
-    clear directions next to the object code saying where to find the
-    Corresponding Source.  Regardless of what server hosts the
-    Corresponding Source, you remain obligated to ensure that it is
-    available for as long as needed to satisfy these requirements.
-
-    e) Convey the object code using peer-to-peer transmission, provided
-    you inform other peers where the object code and Corresponding
-    Source of the work are being offered to the general public at no
-    charge under subsection 6d.
-
-  A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
-  A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling.  In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage.  For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product.  A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
-  "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source.  The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
-  If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information.  But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
-  The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed.  Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
-  Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
-  7. Additional Terms.
-
-  "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law.  If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
-  When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it.  (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.)  You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
-  Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
-    a) Disclaiming warranty or limiting liability differently from the
-    terms of sections 15 and 16 of this License; or
-
-    b) Requiring preservation of specified reasonable legal notices or
-    author attributions in that material or in the Appropriate Legal
-    Notices displayed by works containing it; or
-
-    c) Prohibiting misrepresentation of the origin of that material, or
-    requiring that modified versions of such material be marked in
-    reasonable ways as different from the original version; or
-
-    d) Limiting the use for publicity purposes of names of licensors or
-    authors of the material; or
-
-    e) Declining to grant rights under trademark law for use of some
-    trade names, trademarks, or service marks; or
-
-    f) Requiring indemnification of licensors and authors of that
-    material by anyone who conveys the material (or modified versions of
-    it) with contractual assumptions of liability to the recipient, for
-    any liability that these contractual assumptions directly impose on
-    those licensors and authors.
-
-  All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10.  If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term.  If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
-  If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
-  Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
-  8. Termination.
-
-  You may not propagate or modify a covered work except as expressly
-provided under this License.  Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
-  However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
-  Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
-  Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License.  If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
-  9. Acceptance Not Required for Having Copies.
-
-  You are not required to accept this License in order to receive or
-run a copy of the Program.  Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance.  However,
-nothing other than this License grants you permission to propagate or
-modify any covered work.  These actions infringe copyright if you do
-not accept this License.  Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
-  10. Automatic Licensing of Downstream Recipients.
-
-  Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License.  You are not responsible
-for enforcing compliance by third parties with this License.
-
-  An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations.  If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
-  You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License.  For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
-  11. Patents.
-
-  A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based.  The
-work thus licensed is called the contributor's "contributor version".
-
-  A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version.  For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
-  Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
-  In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement).  To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
-  If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients.  "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
-  If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
-  A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License.  You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
-  Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
-  12. No Surrender of Others' Freedom.
-
-  If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all.  For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
-  13. Use with the GNU Affero General Public License.
-
-  Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work.  The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
-  14. Revised Versions of this License.
-
-  The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-  Each version is given a distinguishing version number.  If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation.  If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
-  If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
-  Later license versions may give you additional or different
-permissions.  However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
-  15. Disclaimer of Warranty.
-
-  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. Limitation of Liability.
-
-  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
-  17. Interpretation of Sections 15 and 16.
-
-  If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
-                     END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
-  If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
-    <program>  Copyright (C) <year>  <name of author>
-    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
-  You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<http://www.gnu.org/licenses/>.
-
-  The GNU General Public License does not permit incorporating your program
-into proprietary programs.  If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.  But first, please read
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
--- a/extra/nurbs/DESCRIPTION	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-Name: Nurbs
-Version: 1.3.10
-Date: 2015-08-17
-Author: Mark Spink, Daniel Claxton, Carlo de Falco, Rafael Vazquez
-Maintainer: Carlo de Falco and Rafael Vazquez
-Title: Nurbs.
-Description: Collection of routines for the creation, and manipulation of Non-Uniform Rational B-Splines (NURBS), based on the NURBS toolbox by Mark Spink.
-Categories: splines
-Depends: octave (>= 3.8)
-License: GPLv3+
-Url: http://octave.sf.net
--- a/extra/nurbs/INDEX	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-nurbs >> Nurbs
-Basic operations for NURBS curves, surfaces and volumes
- nrbmak
- nrbkntins
- nrbdegelev
- nrbderiv
- nrbdeval
- nrbeval
- crvkntremove
-Operations for constructing NURBS curves and surfaces
- nrbtform
- nrbreverse
- nrbtransp
- nrbpermute
- nrbline
- nrbcirc
- nrbrect
- nrb4surf
- nrbcylind
- nrbextract
- nrbextrude
- nrbrevolve
- nrbruled
- nrbcoons
- nrbtestcrv
- nrbtestsrf
- nrbunclamp
- nrbmultipatch
-Plot and export
- nrbplot
- nrbctrlplot
- nrbkntplot
- nrbexport
- nrb2iges
-B-Spline functions
- bspeval
- bspderiv
- bspkntins
- bspdegelev
- basisfun
- basisfunder
- basiskntins
- findspan
- numbasisfun
- tbasisfun
-B-splines geometric entities
- curvederivcpts
- curvederiveval
- surfderivcpts
- surfderiveval
-NURBS geometric entities and functions
- nrbbasisfun
- nrbmeasure
- nrbbasisfunder
- nrbnumbasisfun
- nrbcrvderiveval
- nrbsurfderiveval
-Knots construction and refinement
- kntuniform
- kntrefine
- kntbrkdegreg
- kntbrkdegmult
-Vector and Transformation Utilities 
- vecnorm
- vecmag
- vecmag2
- vecangle
- vecdot
- veccross
- vecrotx
- vecroty
- vecrotz
- vecrot
- vecscale
- vectrans
-Misc Utilities
- deg2rad
- rad2deg
--- a/extra/nurbs/NEWS	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-Summary of important user-visible changes for nurbs 1.3.10:
--------------------------------------------------------------------
-
- ** 1.3.10 is being released to allow compatibility with Octave 4.0
-
- * src/low_level_functions.cc(findspan): return an error if a point
-                                         is outside the knotspan
-
- * inst/nrbexport: changed the format of geopdes files
-
- * inst/nrbbasisfun: fixed bug to return indices in the 1D case
-
- * inst/basiskntins: added new function to compute subdivision coefficients
-
-Summary of important user-visible changes for nurbs 1.3.9:
--------------------------------------------------------------------
-
- * inst/nrbexport: export multipatch geometries
-
-Summary of important user-visible changes for nurbs 1.3.8:
--------------------------------------------------------------------
-
- * inst/nrbkntremove.m: added new function
-
- * inst/nrbunclamp.m: added new function
-
- * inst/nrbmak.m: adapted for unclamped knot vector
-
- * inst/nrbplot.m: adapted for unclamped knot vector
-
- * inst/nrbkntplot.m: adapted for unclamped knot vector
-
- * inst/nrb2iges: added new function
-
- * inst/nrbmultipatch: added new function
-
-Summary of important user-visible changes for nurbs 1.3.7:
--------------------------------------------------------------------
-
- ** 1.3.7 is mainly a maintainance release to distribute small bug fixes 
-    that accumulated over time.
-
- * inst/nrbpermute.m: added new function
-
- * inst/nrbreverse.m: each direction can now be reversed independently
-
- * inst/nrbkntplot.m: now works for non-unitary interval
-
- * inst/nrbcrvderiveval: code vectorized 
-
- * inst/nrbplot: fixed bug in affecting plot of trivariate nurbs, now works for 
-   non-unitary intervals 
-
- * inst/nrbctrplot.m: plot the points only once
-
- * src/*.cc: avoid use of deprecated array constructors
-
-
- 
- 
\ No newline at end of file
--- a/extra/nurbs/PKG_ADD	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-
--- a/extra/nurbs/inst/basisfun.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-function B = basisfun (iv, uv, p, U)
-
-% BASISFUN:  Basis function for B-Spline
-%
-% Calling Sequence:
-% 
-%   N = basisfun(iv,uv,p,U)
-%   
-%    INPUT:
-%   
-%      iv - knot span  ( from FindSpan() )
-%      uv - parametric points
-%      p  - spline degree
-%      U  - knot sequence
-%   
-%    OUTPUT:
-%   
-%      N - Basis functions vector(numel(uv)*(p+1))
-%   
-%    Adapted from Algorithm A2.2 from 'The NURBS BOOK' pg70.
-%
-% See also: 
-%
-%    numbasisfun, basisfunder, findspan
-%
-% Copyright (C) 2000 Mark Spink
-% Copyright (C) 2007 Daniel Claxton
-% Copyright (C) 2009 Carlo de Falco
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-B = zeros(numel(uv), p+1);
-                                               
-for jj = 1:numel(uv) 
-
-  i = iv(jj) + 1; %% findspan uses 0-based numbering
-  u = uv(jj);
-
-  left = zeros(p+1,1);
-  right = zeros(p+1,1);
-
-  N(1) = 1;
-  for j=1:p
-    left(j+1) = u - U(i+1-j);
-    right(j+1) = U(i+j) - u;
-    saved = 0;
-
-    for r=0:j-1
-      temp = N(r+1)/(right(r+2) + left(j-r+1));
-      N(r+1) = saved + right(r+2)*temp;
-      saved = left(j-r+1)*temp;
-    end
-    
-    N(j+1) = saved;
-  end
-
-  B (jj, :) = N;
-
-end
-
-end
-
-%!test
-%!  n = 3; 
-%!  U = [0 0 0 1/2 1 1 1]; 
-%!  p = 2; 
-%!  u = linspace (0, 1, 10);  
-%!  s = findspan (n, p, u, U);  
-%!  Bref = [1.00000   0.00000   0.00000
-%!          0.60494   0.37037   0.02469
-%!          0.30864   0.59259   0.09877
-%!          0.11111   0.66667   0.22222
-%!          0.01235   0.59259   0.39506
-%!          0.39506   0.59259   0.01235
-%!          0.22222   0.66667   0.11111
-%!          0.09877   0.59259   0.30864
-%!          0.02469   0.37037   0.60494
-%!          0.00000   0.00000   1.00000];
-%!  B = basisfun (s, u, p, U);
-%!  assert (B, Bref, 1e-5);
--- a/extra/nurbs/inst/basisfunder.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,155 +0,0 @@
-function dersv = basisfunder (ii, pl, uu, u_knotl, nders)
-
-% BASISFUNDER:  B-Spline Basis function derivatives.
-%
-% Calling Sequence:
-% 
-%   ders = basisfunder (ii, pl, uu, k, nd)
-%
-%    INPUT:
-%   
-%      ii  - knot span index (see findspan)
-%      pl  - degree of curve
-%      uu  - parametric points
-%      k   - knot vector
-%      nd  - number of derivatives to compute
-%
-%    OUTPUT:
-%   
-%      ders - ders(n, i, :) (i-1)-th derivative at n-th point
-%   
-%    Adapted from Algorithm A2.3 from 'The NURBS BOOK' pg72.
-%
-% See also: 
-%
-%    numbasisfun, basisfun, findspan
-%
-%    Copyright (C) 2009,2011 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-  dersv = zeros(numel(uu), nders+1, pl+1);
-
-  for jj = 1:numel(uu)
-
-    i = ii(jj)+1; %% convert to base-1 numbering of knot spans
-    u = uu(jj);
-
-    ders = zeros(nders+1,pl+1);
-    ndu = zeros(pl+1,pl+1);
-    left = zeros(pl+1);
-    right = zeros(pl+1);
-    a = zeros(2,pl+1);
-    ndu(1,1) = 1;
-    for j = 1:pl
-      left(j+1) = u - u_knotl(i+1-j);
-      right(j+1) = u_knotl(i+j) - u;
-      saved = 0;
-      for r = 0:j-1
-        ndu(j+1,r+1) = right(r+2) + left(j-r+1);
-        temp = ndu(r+1,j)/ndu(j+1,r+1);
-        ndu(r+1,j+1) = saved + right(r+2)*temp;
-        saved = left(j-r+1)*temp;
-      end
-      ndu(j+1,j+1) = saved;
-    end   
-    for j = 0:pl
-      ders(1,j+1) = ndu(j+1,pl+1);
-    end
-    for r = 0:pl
-      s1 = 0;
-      s2 = 1;
-      a(1,1) = 1;
-      for k = 1:nders %compute kth derivative
-        d = 0;
-        rk = r-k;
-        pk = pl-k;
-        if (r >= k)
-          a(s2+1,1) = a(s1+1,1)/ndu(pk+2,rk+1);
-          d = a(s2+1,1)*ndu(rk+1,pk+1);
-        end
-        if (rk >= -1)
-          j1 = 1;
-        else 
-          j1 = -rk;
-        end
-        if ((r-1) <= pk)
-          j2 = k-1;
-        else 
-          j2 = pl-r;
-        end
-        for j = j1:j2
-          a(s2+1,j+1) = (a(s1+1,j+1) - a(s1+1,j))/ndu(pk+2,rk+j+1);
-          d = d + a(s2+1,j+1)*ndu(rk+j+1,pk+1);
-        end
-        if (r <= pk)
-          a(s2+1,k+1) = -a(s1+1,k)/ndu(pk+2,r+1);
-          d = d + a(s2+1,k+1)*ndu(r+1,pk+1);
-        end
-        ders(k+1,r+1) = d;
-        j = s1;
-        s1 = s2;
-        s2 = j;
-      end
-    end
-    r = pl;
-    for k = 1:nders
-      for j = 0:pl
-        ders(k+1,j+1) = ders(k+1,j+1)*r;
-      end
-      r = r*(pl-k);
-    end
-
-    dersv(jj, :, :) = ders;
-    
-  end
-
-end
-
-%!test
-%! k    = [0 0 0 0 1 1 1 1];
-%! p    = 3;
-%! u    = rand (1);
-%! i    = findspan (numel(k)-p-2, p, u, k);
-%! ders = basisfunder (i, p, u, k, 1);
-%! sumders = sum (squeeze(ders), 2);
-%! assert (sumders(1), 1, 1e-15);
-%! assert (sumders(2:end), 0, 1e-15);
-
-%!test
-%! k    = [0 0 0 0 1/3 2/3 1 1 1 1];
-%! p    = 3;
-%! u    = rand (1);
-%! i    = findspan (numel(k)-p-2, p, u, k);
-%! ders = basisfunder (i, p, u, k, 7); 
-%! sumders = sum (squeeze(ders), 2);
-%! assert (sumders(1), 1, 1e-15);
-%! assert (sumders(2:end), zeros(rows(squeeze(ders))-1, 1), 1e-13);
-
-%!test
-%! k    = [0 0 0 0 1/3 2/3 1 1 1 1];
-%! p    = 3;
-%! u    = rand (100, 1);
-%! i    = findspan (numel(k)-p-2, p, u, k);
-%! ders = basisfunder (i, p, u, k, 7);
-%! for ii=1:10
-%!   sumders = sum (squeeze(ders(ii,:,:)), 2);
-%!   assert (sumders(1), 1, 1e-15);
-%!   assert (sumders(2:end), zeros(rows(squeeze(ders(ii,:,:)))-1, 1), 1e-13);
-%! end
-%! assert (ders(:, (p+2):end, :), zeros(numel(u), 8-p-1, p+1), 1e-13)
-%! assert (all(all(ders(:, 1, :) <= 1)), true)
-
-
-
--- a/extra/nurbs/inst/basiskntins.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,172 +0,0 @@
-function S = basiskntins (deg,t,u)
-
-% Compute the coefficient matrix for non-uniform B-splines subdivision.
-%
-% This represents the B-spline basis given by a coarse knot vector
-%  in terms of the B-spline basis of a finer knot vector.
-%
-% The function is implemented for the univariate case. It is based on 
-%  the paper:
-%
-% G. Casciola, L. Romani, A general matrix representation for non-uniform
-%  B-spline subdivision with boundary control, ALMA-DL, University of Bologna (2007)
-%
-% Calling Sequence:
-% 
-%    S = basiskntins (deg, t, u);
-%
-%    INPUT:
-%   
-%      deg - degree of the first knot vector
-%      t   - coarse knot vector
-%      u   - fine knot vector
-%   
-%    OUTPUT:
-%   
-%      B - Value of the basis functions at the points
-%          size(B)=[numel(u),(p+1)] for curves
-%          or [numel(u)*numel(v), (p+1)*(q+1)] for surfaces
-%
-%      N - Indices of the basis functions that are nonvanishing at each
-%          point. size(N) == size(B)
-%   
-%    Copyright (C) 2015 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-nt = length(t);
-nu = length(u);
-S = sparse (nu-deg-1,nt-deg-1);
-[t_mult,t_single,nt_s] = knot_mult(deg,t);
-[u_mult,u_single,nu_s] = knot_mult(deg,u);
-st = deg+1;
-su = deg+1;
-row = 1;
-col = 1;
-Sl = bs2bs(deg,t,u,st,su);
-S(row:deg+row,col:deg+col) = Sl;
-t_single(nt+1) = t(nt-deg);
-i = 1;
-
-for j=1:nu_s
-  if (u_single(j) == t_single(i))
-    st = st+t_mult(i);
-    col = col+t_mult(i);
-    i = i+1;
-  end
-  su = su+u_mult(j);
-  row = row+u_mult(j);
-  Sl = bs2bs(deg,t,u,st,su);
-  S(row:deg+row,col:deg+col) = Sl;
-end
-
-end
-
-
-function [t_mult,t_single,nt_s] = knot_mult(d,t)
-epsilon = 1e-14 * (t(end) - t(1));
-
-nt = length(t);
-nt_s = 0;
-m = 1;
-for i = d+2:nt-d-1
-  if ((t(i+1) - t(i)) > epsilon)
-    nt_s = nt_s+1;
-    t_mult(nt_s) = m;
-    t_single(nt_s) = t(i);
-    m=1;
-  else
-    m = m+1;
-  end
-end
-t_single(nt_s+1)=t(nt-d);
-t_mult(nt_s+1)=0;
-
-end
-
-function S = bs2bs(d,t,u,k,l)
-
-S = zeros(d+1);
-S(1,:) = bs2bs_first_row(d,t,u,k,l);
-
-for ir=1:d
-  S(ir+1,:) = bs2bs_i_row(d,t,u,k,l,ir,S(ir,:));
-end
-end
-
-function S = bs2bs_first_row(d,t,u,k,l)
-
-S = eye(1,d+1);
-for h=1:d
-  beta_2=0.0;
-  uu=u(l+1-h);
-  for j=h:-1:1
-    d1=uu-t(k+j-h);
-    d2=t(k+j)-uu;
-    beta_1=S(j)/(d2+d1);
-    S(j+1)=d1*beta_1+beta_2;
-    beta_2=d2*beta_1;
-  end
-  S(1)=beta_2;
-end
-end
-
-function Si = bs2bs_i_row(d,t,u,k,l,ir,S)
-
-Si(1) = S(1)*(t(k+1)-u(l+ir))/(t(k+1)-u(l+ir-d));
-
-for j=1:d
-  den=t(k+j+1)-u(l+ir-d);
-  fact=(t(k+j+1)-t(k+j-d))/(t(k+j)-t(k+j-d-1));
-  Si(j+1)=(fact*(S(j)*(u(l+ir)-t(k+j-d-1))-Si(j) * ...
-    (u(l+ir-d)-t(k+j-d-1)))+S(j+1)*(t(k+j+1)-u(l+ir)))/den;
-end
-end
-
-%!test
-%! knt1 = [0 0 0 1/2 1 1 1];
-%! knt2 = [0 0 0 1/4 1/2 3/4 1 1 1];
-%! C = basiskntins (2, knt1, knt2);
-%! assert (full(C), [1 0 0 0; 1/2 1/2 0 0; 0 3/4 1/4 0; 0 1/4 3/4 0; 0 0 1/2 1/2; 0 0 0 1]);
-
-%!test
-%! crv = nrbtestcrv;
-%! crv2 = nrbkntins (crv, [0.1, 0.3, 0.4, 0.5, 0.6, 0.8, 0.96 0.98]);
-%! C = basiskntins (crv.order-1,crv.knots,crv2.knots);
-%! for ii = 1:4
-%!   assert (max (abs(C*crv.coefs(ii,:)' - crv2.coefs(ii,:)')) < 1e-14 )
-%! end
-
-%!test
-%! crv = nrbtestcrv;
-%! crv2 = nrbkntins (crv, [0.50000001, 0.5000001, 0.500001, 0.50001, 0.5001]);
-%! C = basiskntins (crv.order-1,crv.knots,crv2.knots);
-%! for ii = 1:4
-%!   assert (max (abs(C*crv.coefs(ii,:)' - crv2.coefs(ii,:)')) < 1e-14 )
-%! end
-
-%!test
-%! crv = nrbtestcrv;
-%! crv2 = nrbkntins (crv, [0.1, 0.3, 0.4, 0.5, 0.6, 0.8, 0.96 0.98]);
-%! C = basiskntins (crv.order-1,crv.knots,crv2.knots);
-%! x = linspace (0, 1, 10);
-%! s = findspan (crv.number-1, crv.order-1, x, crv.knots);
-%! s2 = findspan (crv2.number-1, crv2.order-1, x, crv2.knots);
-%! N = basisfun (s, x, crv.order-1, crv.knots);
-%! N2 = basisfun (s2, x, crv2.order-1, crv2.knots);
-%! c = numbasisfun (s, x, crv.order-1, crv.knots) + 1;
-%! c2 = numbasisfun (s2, x, crv2.order-1, crv2.knots) + 1;
-%! for ii = 1:numel(x)
-%!   assert (abs(N2(ii,:) * C(c2(ii,:),c(ii,:)) - N(ii,:)) < 1e-14)
-%! end
--- a/extra/nurbs/inst/bspdegelev.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,296 +0,0 @@
-function [ic,ik] = bspdegelev(d,c,k,t)
-
-% BSPDEGELEV:  Degree elevate a univariate B-Spline. 
-% 
-% Calling Sequence:
-% 
-%   [ic,ik] = bspdegelev(d,c,k,t)
-% 
-%   INPUT:
-% 
-%   d - Degree of the B-Spline.
-%   c - Control points, matrix of size (dim,nc).
-%   k - Knot sequence, row vector of size nk.
-%   t - Raise the B-Spline degree t times.
-% 
-%   OUTPUT:
-%
-%   ic - Control points of the new B-Spline. 
-%   ik - Knot vector of the new B-Spline.
-% 
-%    Copyright (C) 2000 Mark Spink, 2007 Daniel Claxton
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-[mc,nc] = size(c);
-                                                          %
-                                                          % int bspdegelev(int d, double *c, int mc, int nc, double *k, int nk,
-                                                          %                int t, int *nh, double *ic, double *ik)
-                                                          % {
-                                                          %   int row,col;
-                                                          %
-                                                          %   int ierr = 0;
-                                                          %   int i, j, q, s, m, ph, ph2, mpi, mh, r, a, b, cind, oldr, mul;
-                                                          %   int n, lbz, rbz, save, tr, kj, first, kind, last, bet, ii;
-                                                          %   double inv, ua, ub, numer, den, alf, gam;
-                                                          %   double **bezalfs, **bpts, **ebpts, **Nextbpts, *alfs;
-                                                          %
-                                                          %   double **ctrl  = vec2mat(c, mc, nc);
-% ic = zeros(mc,nc*(t));                                  %   double **ictrl = vec2mat(ic, mc, nc*(t+1));
-                                                          %
-n = nc - 1;                                               %   n = nc - 1;
-                                                          %
-bezalfs =  zeros(d+1,d+t+1);                              %   bezalfs = matrix(d+1,d+t+1);
-bpts = zeros(mc,d+1);                                     %   bpts = matrix(mc,d+1);
-ebpts = zeros(mc,d+t+1);                                  %   ebpts = matrix(mc,d+t+1);
-Nextbpts = zeros(mc,d+1);                                 %   Nextbpts = matrix(mc,d+1);
-alfs = zeros(d,1);                                        %   alfs = (double *) mxMalloc(d*sizeof(double));
-                                                          %
-m = n + d + 1;                                            %   m = n + d + 1;
-ph = d + t;                                               %   ph = d + t;
-ph2 = floor(ph / 2);                                      %   ph2 = ph / 2;
-                                                          %
-                                                          %   // compute bezier degree elevation coefficeients
-bezalfs(1,1) = 1;                                         %   bezalfs[0][0] = bezalfs[ph][d] = 1.0;
-bezalfs(d+1,ph+1) = 1;                                    %
-
-for i=1:ph2                                               %   for (i = 1; i <= ph2; i++) {
-   inv = 1/bincoeff(ph,i);                                %     inv = 1.0 / bincoeff(ph,i);
-   mpi = min(d,i);                                        %     mpi = min(d,i);
-                                                          %
-   for j=max(0,i-t):mpi                                   %     for (j = max(0,i-t); j <= mpi; j++)
-       bezalfs(j+1,i+1) = inv*bincoeff(d,j)*bincoeff(t,i-j);  %       bezalfs[i][j] = inv * bincoeff(d,j) * bincoeff(t,i-j);
-   end                                                       
-end                                                       %   }
-                                                          %
-for i=ph2+1:ph-1                                          %   for (i = ph2+1; i <= ph-1; i++) {
-   mpi = min(d,i);                                        %     mpi = min(d, i);
-   for j=max(0,i-t):mpi                                   %     for (j = max(0,i-t); j <= mpi; j++)
-       bezalfs(j+1,i+1) = bezalfs(d-j+1,ph-i+1);          %       bezalfs[i][j] = bezalfs[ph-i][d-j];
-   end                                                       
-end                                                       %   }
-                                                          %
-mh = ph;                                                  %   mh = ph;      
-kind = ph+1;                                              %   kind = ph+1;
-r = -1;                                                   %   r = -1;
-a = d;                                                    %   a = d;
-b = d+1;                                                  %   b = d+1;
-cind = 1;                                                 %   cind = 1;
-ua = k(1);                                                %   ua = k[0]; 
-                                                          %
-for ii=0:mc-1                                             %   for (ii = 0; ii < mc; ii++)
-   ic(ii+1,1) = c(ii+1,1);                                %     ictrl[0][ii] = ctrl[0][ii];
-end                                                       %
-for i=0:ph                                                %   for (i = 0; i <= ph; i++)
-   ik(i+1) = ua;                                          %     ik[i] = ua;
-end                                                       %
-                                                          %   // initialise first bezier seg
-for i=0:d                                                 %   for (i = 0; i <= d; i++)
-   for ii=0:mc-1                                          %     for (ii = 0; ii < mc; ii++)
-      bpts(ii+1,i+1) = c(ii+1,i+1);                       %       bpts[i][ii] = ctrl[i][ii];
-   end                                                       
-end                                                       %
-                                                          %   // big loop thru knot vector
-while b < m                                               %   while (b < m)  {
-   i = b;                                                 %     i = b;
-   while b < m && k(b+1) == k(b+2)                        %     while (b < m && k[b] == k[b+1])
-      b = b + 1;                                          %       b++;
-   end                                                    %
-   mul = b - i + 1;                                       %     mul = b - i + 1;
-   mh = mh + mul + t;                                     %     mh += mul + t;
-   ub = k(b+1);                                           %     ub = k[b];
-   oldr = r;                                              %     oldr = r;
-   r = d - mul;                                           %     r = d - mul;
-                                                          %
-                                                          %     // insert knot u(b) r times
-   if oldr > 0                                            %     if (oldr > 0)
-      lbz = floor((oldr+2)/2);                            %       lbz = (oldr+2) / 2;
-   else                                                   %     else
-      lbz = 1;                                            %       lbz = 1;
-   end                                                    %
-   
-   if r > 0                                               %     if (r > 0)
-      rbz = ph - floor((r+1)/2);                          %       rbz = ph - (r+1)/2;
-   else                                                   %     else
-      rbz = ph;                                           %       rbz = ph;
-   end                                                    %
-   
-   if r > 0                                               %     if (r > 0) {
-                                                          %       // insert knot to get bezier segment
-      numer = ub - ua;                                    %       numer = ub - ua;
-      for q=d:-1:mul+1                                    %       for (q = d; q > mul; q--)
-         alfs(q-mul) = numer / (k(a+q+1)-ua);             %         alfs[q-mul-1] = numer / (k[a+q]-ua);
-      end                                           
-      
-      for j=1:r                                           %       for (j = 1; j <= r; j++)  {
-         save = r - j;                                    %         save = r - j;
-         s = mul + j;                                     %         s = mul + j;
-                                                          %
-         for q=d:-1:s                                     %         for (q = d; q >= s; q--)
-            for ii=0:mc-1                                 %           for (ii = 0; ii < mc; ii++)
-               tmp1 = alfs(q-s+1)*bpts(ii+1,q+1); 
-               tmp2 = (1-alfs(q-s+1))*bpts(ii+1,q); 
-               bpts(ii+1,q+1) = tmp1 + tmp2;              %             bpts[q][ii] = alfs[q-s]*bpts[q][ii]+(1.0-alfs[q-s])*bpts[q-1][ii];
-            end                                              
-         end                                              %
-         
-         for ii=0:mc-1                                    %         for (ii = 0; ii < mc; ii++)
-            Nextbpts(ii+1,save+1) = bpts(ii+1,d+1);       %           Nextbpts[save][ii] = bpts[d][ii];
-         end                                                 
-      end                                                 %       }
-   end                                                    %     }
-                                                          %     // end of insert knot
-                                                          %
-                                                          %     // degree elevate bezier
-   for i=lbz:ph                                           %     for (i = lbz; i <= ph; i++)  {
-      for ii=0:mc-1                                       %       for (ii = 0; ii < mc; ii++)
-         ebpts(ii+1,i+1) = 0;                             %         ebpts[i][ii] = 0.0;
-      end                                                    
-      mpi = min(d, i);                                    %       mpi = min(d, i);
-      for j=max(0,i-t):mpi                                %       for (j = max(0,i-t); j <= mpi; j++)
-         for ii=0:mc-1                                    %         for (ii = 0; ii < mc; ii++)
-            tmp1 = ebpts(ii+1,i+1); 
-            tmp2 = bezalfs(j+1,i+1)*bpts(ii+1,j+1);
-            ebpts(ii+1,i+1) = tmp1 + tmp2;                %           ebpts[i][ii] = ebpts[i][ii] + bezalfs[i][j]*bpts[j][ii];
-         end                                                 
-      end                                                    
-   end                                                    %     }
-                                                          %     // end of degree elevating bezier
-                                                          %
-   if oldr > 1                                            %     if (oldr > 1)  {
-                                                          %       // must remove knot u=k[a] oldr times
-      first = kind - 2;                                                    %       first = kind - 2;
-      last = kind;                                        %       last = kind;
-      den = ub - ua;                                      %       den = ub - ua;
-      bet = floor((ub-ik(kind)) / den);                   %       bet = (ub-ik[kind-1]) / den;
-                                                          %
-                                                          %       // knot removal loop
-      for tr=1:oldr-1                                     %       for (tr = 1; tr < oldr; tr++)  {
-         i = first;                                       %         i = first;
-         j = last;                                        %         j = last;
-         kj = j - kind + 1;                               %         kj = j - kind + 1;
-         while j-i > tr                                   %         while (j - i > tr)  {
-                                                          %           // loop and compute the new control points
-                                                          %           // for one removal step
-            if i < cind                                   %           if (i < cind)  {
-               alf = (ub-ik(i+1))/(ua-ik(i+1));           %             alf = (ub-ik[i])/(ua-ik[i]);
-               for ii=0:mc-1                              %             for (ii = 0; ii < mc; ii++)
-                  tmp1 = alf*ic(ii+1,i+1); 
-                  tmp2 = (1-alf)*ic(ii+1,i); 
-                  ic(ii+1,i+1) = tmp1 + tmp2;             %               ictrl[i][ii] = alf * ictrl[i][ii] + (1.0-alf) * ictrl[i-1][ii];
-               end                                           
-            end                                           %           }
-            if j >= lbz                                   %           if (j >= lbz)  {
-               if j-tr <= kind-ph+oldr                    %             if (j-tr <= kind-ph+oldr) {
-                  gam = (ub-ik(j-tr+1)) / den;            %               gam = (ub-ik[j-tr]) / den;
-                  for ii=0:mc-1                           %               for (ii = 0; ii < mc; ii++)
-                     tmp1 = gam*ebpts(ii+1,kj+1); 
-                     tmp2 = (1-gam)*ebpts(ii+1,kj+2); 
-                     ebpts(ii+1,kj+1) = tmp1 + tmp2;      %                 ebpts[kj][ii] = gam*ebpts[kj][ii] + (1.0-gam)*ebpts[kj+1][ii];
-                  end                                     %             }
-               else                                       %             else  {
-                  for ii=0:mc-1                           %               for (ii = 0; ii < mc; ii++)
-                     tmp1 = bet*ebpts(ii+1,kj+1);                                     
-                     tmp2 = (1-bet)*ebpts(ii+1,kj+2);                                     
-                     ebpts(ii+1,kj+1) = tmp1 + tmp2;      %                 ebpts[kj][ii] = bet*ebpts[kj][ii] + (1.0-bet)*ebpts[kj+1][ii];
-                  end                                        
-               end                                        %             }
-            end                                           %           }
-            i = i + 1;                                    %           i++;
-            j = j - 1;                                    %           j--;
-            kj = kj - 1;                                  %           kj--;
-         end                                              %         }
-                                                          %
-         first = first - 1;                               %         first--;
-         last = last + 1;                                 %         last++;
-      end                                                 %       }
-   end                                                    %     }
-                                                          %     // end of removing knot n=k[a]
-                                                          %
-                                                          %     // load the knot ua
-   if a ~= d                                              %     if (a != d)
-      for i=0:ph-oldr-1                                   %       for (i = 0; i < ph-oldr; i++)  {
-         ik(kind+1) = ua;                                 %         ik[kind] = ua;
-         kind = kind + 1;                                 %         kind++;
-      end
-   end                                                    %       }
-                                                          %
-                                                          %     // load ctrl pts into ic
-      for j=lbz:rbz                                       %     for (j = lbz; j <= rbz; j++)  {
-         for ii=0:mc-1                                    %       for (ii = 0; ii < mc; ii++)
-            ic(ii+1,cind+1) = ebpts(ii+1,j+1);            %         ictrl[cind][ii] = ebpts[j][ii];
-         end                                                 
-         cind = cind + 1;                                 %       cind++;
-      end                                                 %     }
-                                                          %
-      if b < m                                            %     if (b < m)  {
-                                                          %       // setup for next pass thru loop
-         for j=0:r-1                                      %       for (j = 0; j < r; j++)
-            for ii=0:mc-1                                 %         for (ii = 0; ii < mc; ii++)
-               bpts(ii+1,j+1) = Nextbpts(ii+1,j+1);       %           bpts[j][ii] = Nextbpts[j][ii];
-            end                                           
-         end                                              
-         for j=r:d                                        %       for (j = r; j <= d; j++)
-            for ii=0:mc-1                                 %         for (ii = 0; ii < mc; ii++)
-               bpts(ii+1,j+1) = c(ii+1,b-d+j+1);          %           bpts[j][ii] = ctrl[b-d+j][ii];
-            end                                              
-         end                                                 
-         a = b;                                           %       a = b;
-         b = b+1;                                         %       b++;
-         ua = ub;                                         %       ua = ub;
-                                                          %     }
-      else                                                %     else
-                                                          %       // end knot
-         for i=0:ph                                       %       for (i = 0; i <= ph; i++)
-            ik(kind+i+1) = ub;                            %         ik[kind+i] = ub;
-         end                                                 
-      end                                                    
-end                                                       %   }
-% End big while loop                                      %   // end while loop
-                                                          %
-                                                          %   *nh = mh - ph - 1;
-                                                          %
-                                                          %   freevec2mat(ctrl);
-                                                          %   freevec2mat(ictrl);
-                                                          %   freematrix(bezalfs);
-                                                          %   freematrix(bpts);
-                                                          %   freematrix(ebpts);
-                                                          %   freematrix(Nextbpts);
-                                                          %   mxFree(alfs);
-                                                          %
-                                                          %   return(ierr);
-end                                                       % }
-
-                                                          
-function b = bincoeff(n,k)
-%  Computes the binomial coefficient.
-%
-%      ( n )      n!
-%      (   ) = --------
-%      ( k )   k!(n-k)!
-%
-%  b = bincoeff(n,k)
-%
-%  Algorithm from 'Numerical Recipes in C, 2nd Edition' pg215.
-
-                                                          % double bincoeff(int n, int k)
-                                                          % {
-b = floor(0.5+exp(factln(n)-factln(k)-factln(n-k)));      %   return floor(0.5+exp(factln(n)-factln(k)-factln(n-k)));
-end                                                       % }
-
-function f = factln(n)
-% computes ln(n!)
-if n <= 1, f = 0; return, end
-f = gammaln(n+1); %log(factorial(n));
-end
\ No newline at end of file
--- a/extra/nurbs/inst/bspderiv.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-function [dc,dk] = bspderiv(d,c,k)
-
-% BSPDERIV:  B-Spline derivative.
-% 
-%  MATLAB SYNTAX:
-% 
-%         [dc,dk] = bspderiv(d,c,k)
-%  
-%  INPUT:
-% 
-%    d - degree of the B-Spline
-%    c - control points          double  matrix(mc,nc)
-%    k - knot sequence           double  vector(nk)
-% 
-%  OUTPUT:
-% 
-%    dc - control points of the derivative     double  matrix(mc,nc)
-%    dk - knot sequence of the derivative      double  vector(nk)
-% 
-%  Modified version of Algorithm A3.3 from 'The NURBS BOOK' pg98.
-%
-%    Copyright (C) 2000 Mark Spink, 2007 Daniel Claxton
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-[mc,nc] = size(c);
-nk = numel(k);
-                                                     %
-                                                     % int bspderiv(int d, double *c, int mc, int nc, double *k, int nk, double *dc,
-                                                     %              double *dk)
-                                                     % {
-                                                     %   int ierr = 0;
-                                                     %   int i, j, tmp;
-                                                     %
-                                                     %   // control points
-                                                     %   double **ctrl = vec2mat(c,mc,nc);
-                                                     %
-                                                     %   // control points of the derivative
-dc = zeros(mc,nc-1);                                 %   double **dctrl = vec2mat(dc,mc,nc-1);
-                                                     %
-for i=0:nc-2                                         %   for (i = 0; i < nc-1; i++) {
-   tmp = d / (k(i+d+2) - k(i+2));                    %     tmp = d / (k[i+d+1] - k[i+1]);
-   for j=0:mc-1                                      %     for (j = 0; j < mc; j++) {
-       dc(j+1,i+1) = tmp*(c(j+1,i+2) - c(j+1,i+1));  %       dctrl[i][j] = tmp * (ctrl[i+1][j] - ctrl[i][j]);
-   end                                               %     }
-end                                                  %   }
-                                                     %
-dk = zeros(1,nk-2);                                  %   j = 0;
-for i=1:nk-2                                         %   for (i = 1; i < nk-1; i++)
-   dk(i) = k(i+1);                                   %     dk[j++] = k[i];
-end                                                  %
-                                                     %   freevec2mat(dctrl);
-                                                     %   freevec2mat(ctrl);
-                                                     %
-                                                     %   return ierr;
-end                                                  % }
--- a/extra/nurbs/inst/bspeval.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-function p = bspeval(d,c,k,u)
-
-% BSPEVAL:  Evaluate B-Spline at parametric points.
-% 
-% Calling Sequence:
-% 
-%   p = bspeval(d,c,k,u)
-% 
-%    INPUT:
-% 
-%       d - Degree of the B-Spline.
-%       c - Control Points, matrix of size (dim,nc).
-%       k - Knot sequence, row vector of size nk.
-%       u - Parametric evaluation points, row vector of size nu.
-% 
-%    OUTPUT:
-%
-%       p - Evaluated points, matrix of size (dim,nu)
-% 
-%    Copyright (C) 2000 Mark Spink, 2007 Daniel Claxton, 2010 C. de Falco
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-nu = numel(u);
-[mc,nc] = size(c);
-                                                %   int bspeval(int d, double *c, int mc, int nc, double *k, int nk, double *u,int nu, double *p){
-                                                %   int ierr = 0;
-                                                %   int i, s, tmp1, row, col;
-                                                %   double tmp2;
-                                                %
-                                                %   // Construct the control points
-                                                %   double **ctrl = vec2mat(c,mc,nc);
-                                                %
-                                                %   // Contruct the evaluated points
-                                                %   double **pnt = vec2mat(p,mc,nu);
-                                                %
-                                                %   // space for the basis functions
-%N = zeros(d+1,1);                               %   double *N = (double*) mxMalloc((d+1)*sizeof(double));
-                                                %
-                                                %   // for each parametric point i
-%for col=1:nu                                    %   for (col = 0; col < nu; col++) {
-                                                %     // find the span of u[col]
-    s = findspan(nc-1, d, u(:), k);           %     s = findspan(nc-1, d, u[col], k);
-    N = basisfun(s,u(:),d,k);                 %     basisfun(s, u[col], d, k, N);
-                                                %
-    tmp1 = s - d + 1;                           %     tmp1 = s - d;
-    %for row=1:mc                                %     for (row = 0; row < mc; row++)  {
-        p = zeros (mc, nu);                               %       tmp2 = 0.0;
-        for i=0:d                               %       for (i = 0; i <= d; i++)
-           p = p + repmat (N(:,i+1)', mc, 1).*c(:,tmp1+i);  % 	tmp2 += N[i] * ctrl[tmp1+i][row];
-        end                                     %
-        %p(row,:) = tmp2;                      %       pnt[col][row] = tmp2;
-    %end                                         %     }
-%end                                             %   }
-                                                %
-                                                %   mxFree(N);
-                                                %   freevec2mat(pnt);
-                                                %   freevec2mat(ctrl);
-                                                %
-                                                %   return ierr;
-end                                             %   }
--- a/extra/nurbs/inst/bspkntins.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,112 +0,0 @@
-function [ic,ik] = bspkntins(d,c,k,u)
-
-% BSPKNTINS:  Insert knots into a B-Spline
-%
-% Calling Sequence:
-% 
-%   [ic,ik] = bspkntins(d,c,k,u)
-%
-%  INPUT:
-% 
-%    d - spline degree             integer
-%    c - control points            double  matrix(mc,nc)      
-%    k - knot sequence             double  vector(nk) 
-%    u - new knots                 double  vector(nu)               
-% 
-%  OUTPUT:
-% 
-%    ic - new control points double  matrix(mc,nc+nu) 
-%    ik - new knot sequence  double  vector(nk+nu)
-% 
-%  Modified version of Algorithm A5.4 from 'The NURBS BOOK' pg164.
-% 
-%    Copyright (C) 2000 Mark Spink, 2007 Daniel Claxton, 2010 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-[mc,nc] = size(c);
-u  = sort(u);
-nu = numel(u);
-nk = numel(k);
-                                                     % 
-                                                     % int bspkntins(int d, double *c, int mc, int nc, double *k, int nk,
-                                                     %               double *u, int nu, double *ic, double *ik)
-                                                     % {
-                                                     %   int ierr = 0;
-                                                     %   int a, b, r, l, i, j, m, n, s, q, ind;
-                                                     %   double alfa;
-                                                     %
-                                                     %   double **ctrl  = vec2mat(c, mc, nc);
-ic = zeros(mc,nc+nu);                                %   double **ictrl = vec2mat(ic, mc, nc+nu);
-ik = zeros(1,nk+nu);
-                                                     %
-n = size(c,2) - 1;                                   %   n = nc - 1;
-r = length(u) - 1;                                   %   r = nu - 1;
-                                                     %
-m = n + d + 1;                                       %   m = n + d + 1;
-a = findspan(n, d, u(1), k);                         %   a = findspan(n, d, u[0], k);
-b = findspan(n, d, u(r+1), k);                       %   b = findspan(n, d, u[r], k);
-b = b+1;                                             %   ++b;
-                                                     %
-for q=0:mc-1                                         %   for (q = 0; q < mc; q++)  {
-   for j=0:a-d, ic(q+1,j+1) = c(q+1,j+1); end        %     for (j = 0; j <= a-d; j++) ictrl[j][q] = ctrl[j][q];
-   for j=b-1:n, ic(q+1,j+r+2) = c(q+1,j+1); end      %     for (j = b-1; j <= n; j++) ictrl[j+r+1][q] = ctrl[j][q];
-end                                                  %   }
-
-for j=0:a, ik(j+1) = k(j+1); end                     %   for (j = 0; j <= a; j++)   ik[j] = k[j];
-for j=b+d:m, ik(j+r+2) = k(j+1); end                 %   for (j = b+d; j <= m; j++) ik[j+r+1] = k[j];
-                                                     %
-i = b + d - 1;                                       %   i = b + d - 1;
-s = b + d + r;                                       %   s = b + d + r;
-
-for j=r:-1:0                                         %   for (j = r; j >= 0; j--) {
-   while u(j+1) <= k(i+1) && i > a                   %     while (u[j] <= k[i] && i > a) {
-       for q=0:mc-1                                  %       for (q = 0; q < mc; q++)
-           ic(q+1,s-d) = c(q+1,i-d);                 %         ictrl[s-d-1][q] = ctrl[i-d-1][q];
-       end                                              
-       ik(s+1) = k(i+1);                             %       ik[s] = k[i];
-       s = s - 1;                                    %       --s;
-       i = i - 1;                                    %       --i;
-   end                                               %     }
-   
-   for q=0:mc-1                                      %     for (q = 0; q < mc; q++)
-       ic(q+1,s-d) = ic(q+1,s-d+1);                  %       ictrl[s-d-1][q] = ictrl[s-d][q];
-   end
-
-   for l=1:d                                         %     for (l = 1; l <= d; l++)  {
-       ind = s - d + l;                              %       ind = s - d + l;
-       alfa = ik(s+l+1) - u(j+1);                    %       alfa = ik[s+l] - u[j];
-       if abs(alfa) == 0                             %       if (fabs(alfa) == 0.0)
-           for q=0:mc-1                              %         for (q = 0; q < mc; q++)
-               ic(q+1,ind) = ic(q+1,ind+1);          %           ictrl[ind-1][q] = ictrl[ind][q];
-           end
-       else                                          %       else  {
-           alfa = alfa/(ik(s+l+1) - k(i-d+l+1));     %         alfa /= (ik[s+l] - k[i-d+l]);
-           for q=0:mc-1                              %         for (q = 0; q < mc; q++)
-               tmp = (1-alfa)*ic(q+1,ind+1);
-               ic(q+1,ind) = alfa*ic(q+1,ind) + tmp; %           ictrl[ind-1][q] = alfa*ictrl[ind-1][q]+(1.0-alfa)*ictrl[ind][q];
-           end
-       end                                           %       }
-   end                                               %     }
-   %
-   ik(s+1) = u(j+1);                                 %     ik[s] = u[j];
-   s = s - 1;                                        %     --s;
-end                                                  %   }
-                                                     %
-                                                     %   freevec2mat(ctrl);
-                                                     %   freevec2mat(ictrl);
-                                                     %
-                                                     %   return ierr;
-end                                                  % }
-
--- a/extra/nurbs/inst/crvkntremove.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,173 +0,0 @@
-
-
-function [rcrv, t] = crvkntremove (crv, u, r, s, num, d)
-% 
-% CRVKNTREMOVE: Remove one knot from the knot-vector of a NURBS curve.
-% 
-% Calling Sequence:
-% 
-%   [rcrv, remflag] = crvkntremove (crv, u, r, s, num, d);
-% 
-% INPUT:
-% 
-%   crv		: NURBS curve, see nrbmak.
-% 
-%   u           : knot to be removed.
-% 
-%   r           : index of the knot to be removed.
-% 
-%   s           : multiplicity of the knot to be removed.
-% 
-%   num         : number of knot removals requested.
-%
-%   d           : curve deviation tolerance.
-%
-% OUTPUT:
-%
-%   rcrv        : new NURBS structure for the curve with knot u remuved.
-% 
-%   t           : actual number of knot removals performed.
-% 
-% 
-% 
-% DESCRIPTION:
-% 
-%   Remove knot u from the NURBS curve crv at most num times. 
-%   Check that the maximum deviation of the curve be less than d.
-%   Based on algorithm A5.8 NURBS Book (pag183)
-%  
-% SEE ALSO:
-% 
-%   nrbkntins
-%
-%    Copyright (C) 2013 Jacopo Corno
-%    Copyright (C) 2013 Carlo de Falco
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-  [U, Pw, t] = RemoveCurveKnot (crv.number, crv.order - 1, crv.knots, ...
-                                crv.coefs, u, r, s, num, d);
-  rcrv = nrbmak (Pw, U);
-
-end
-
-%!test 
-%! crv  = nrbdegelev (nrbline (), 3);
-%! acrv = nrbkntins (crv, [.11 .11 .11]);
-%! [rcrv, t] = crvkntremove (acrv, .11, 8, 3, 3, 1e-10);
-%! assert (crv.knots, rcrv.knots, 1e-10);
-%! assert (t, 3);
-
-%!test 
-%! crv  = nrbcirc ();
-%! acrv = nrbkntins (crv, [.3 .3]);
-%! [rcrv, t] = crvkntremove (acrv, .3, 7, 2, 2, 1e-10);
-%! assert (crv.knots, rcrv.knots, 1e-10);
-%! assert (t, 2);
-
-function [U, Pw, t] = RemoveCurveKnot (n, p, U, Pw, u, r, s, num, d)
-% see algorithm A5.8 NURBS Book (pag183)
-  
-  w = min (Pw(4,:));
-  Pmax = max (sqrt (sum (Pw.^2, 1)));
-  TOL = d*w / (1 + Pmax);
-  
-  m     = n + p + 1;
-  ord   = p + 1;
-  fout  = (2*r - s - p) / 2; % first control point out
-  last  = r - s;
-  first = r - p;
-  
-  temp = zeros (4, 2*p + 1);
-  
-  for t = 0:num-1
-    off = first - 1; % diff in index between temp and P
-    temp(:,1) = Pw(:,off);
-    temp(:,last+1-off+1) = Pw(:,last+1);
-    i   = first;
-    j   = last;
-    ii  = 1;
-    jj  = last - off;
-    remflag = 0;
-    while (j - i > t)
-      % compute new control points for one removal step
-      alfi = (u-U(i)) / (U(i+ord+t)-U(i));
-      alfj = (u-U(j-t)) / (U(j+ord)-U(j-t));
-      temp(:,ii+1) = (Pw(:,i)-(1.0-alfi).*temp(:,ii-1+1))./alfi;
-      temp(:,jj+1) = (Pw(:,j)-alfj.*temp(:,jj+1+1))./(1.0-alfj);
-      i   = i + 1;
-      ii  = ii + 1;
-      j   = j - 1;
-      jj  = jj - 1;
-    end
-    if (j - i <= t)
-      % check if knot removable
-      if (norm (temp(:,ii-1+1) - temp(:,jj+1+1)) <= TOL)
-        remflag = 1;
-      else
-        alfi = (u-U(i)) / (U(i+ord+t)-U(i));
-        if (norm (Pw(:,i) - (alfi.*temp(:,ii+t+1+1) + ...
-                           (1-alfi).*temp(:,ii-1+1))) <= TOL)
-          remflag = 1;
-        end%if
-      end%if  
-    end%if
-    if (remflag == 0)
-      break; % cannot remove any more knots -> get out of for loop
-    else
-      % successful removal -> save new control points
-      i = first;
-      j = last;
-      while (j - i > t)
-        Pw(:,i) = temp(:,i-off+1);
-        Pw(:,j) = temp(:,j-off+1);
-        i = i + 1;
-        j = j - 1;
-      end
-    end%if
-    first = first - 1;
-    last = last + 1;
-    t = t + 1;
-  end % end of for loop
-
-  if (t == 0)
-    return;
-  end%if
-  
-  % shift knots
-  for k = r+1:m
-    U(k-t) = U(k);
-  end
-  U = U(1:end-t);
-  
-  j = floor(fout);
-  i = j;
-  for k = 1:t-1
-    if (mod (k, 2) == 1)
-      i = i+1;
-    else
-      j = j-1;
-    end%if
-  end
-  
-  % shift points
-  for k = i+1:n
-    Pw(:,j) = Pw(:,k);
-    j = j+1;
-  end
-  Pw = Pw(:,1:end-t);
-  
-  return;
-end
-
--- a/extra/nurbs/inst/curvederivcpts.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-function pk = curvederivcpts (n, p, U, P, d, r1, r2) 
-% Compute control points of n-th derivatives of a B-spline curve.
-% 
-% usage: pk = curvederivcpts (n, p, U, P, d) 
-%        pk = curvederivcpts (n, p, U, P, d, r1, r2) 
-%
-% If r1, r2 are not given, all the control points are computed.
-%
-%  INPUT:
-%         n+1 = number of control points
-%         p   = degree of the spline
-%         d   = maximum derivative order (d<=p)
-%         U   = knots
-%         P   = control points
-%         r1  = first control point to compute
-%         r2  = auxiliary index for the last control point to compute
-%  OUTPUT:
-%         pk(k,i) = i-th control point of (k-1)-th derivative, r1 <= i <= r2-k
-%
-% Adaptation of algorithm A3.3 from the NURBS book, pg98.
-%
-%    Copyright (C) 2009 Carlo de Falco
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-  if (nargin <= 5)
-    r1 = 0;
-    r2 = n;
-  end
-
-  r = r2 - r1;
-  for i=0:r
-    pk(1, i+1) = P(r1+i+1);
-  end
-  
-  for k=1:d
-    tmp = p - k + 1;
-    for i=0:r-k
-      pk (k+1, i+1) = tmp * (pk(k,i+2)-pk(k,i+1)) / ...
-	  (U(r1+i+p+2)-U(r1+i+k+1));
-    end
-  end
-end
-
-%!test
-%! line = nrbmak([0.0 1.5; 0.0 3.0],[0.0 0.0 1.0 1.0]);
-%! pk   = curvederivcpts (line.number-1, line.order-1, line.knots,...
-%!                        line.coefs(1,:), 2);
-%! assert (pk, [0 3/2; 3/2 0], 100*eps);
--- a/extra/nurbs/inst/curvederiveval.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-function ck = curvederiveval (n, p, U, P, u, d) 
-%
-% CURVEDERIVEVAL: Compute the derivatives of a B-spline curve.
-% 
-% usage: ck = curvederiveval (n, p, U, P, u, d) 
-%
-%  INPUT: 
-%
-%        n+1 = number of control points
-%        p   = spline order
-%        U   = knots
-%        P   = control points
-%        u   = evaluation point
-%        d   = derivative order
-%
-%  OUTPUT:
-%
-%        ck (k+1) =  curve differentiated k times
-%
-% Adaptation of algorithm A3.4 from the NURBS book, pg99
-%
-%    Copyright (C) 2009 Carlo de Falco
-%    Copyright (C) 2010 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-  ck = zeros (d+1, 1);
-  du = min (d, p);   
-
-  span = findspan (n, p, u, U);
-  N = zeros (p+1, p+1);
-  for ip=0:p
-      N(1:ip+1,ip+1) = basisfun (span, u, ip, U)';
-  end
-    
-  pk = curvederivcpts (n, p, U, P, du, span-p, span);
-
-  for k = 0:du
-    for j = 0:p-k
-      ck(k+1) = ck(k+1) + N(j+1,p-k+1)*pk(k+1,j+1);
-    end
-  end
-  
-end
-
-%!test
-%! k = [0 0 0 1 1 1];
-%! coefs(:,1) = [0;0;0;1];
-%! coefs(:,2) = [1;0;1;1];
-%! coefs(:,3) = [1;1;1;1];
-%! crv = nrbmak (coefs, k);
-%! ck = curvederiveval (crv.number-1, crv.order-1, crv.knots, squeeze (crv.coefs(1,:,:)), 0.5, 2);
-%! assert(ck, [0.75; 1; -2]);
-%! ck = curvederiveval (crv.number-1, crv.order-1, crv.knots, squeeze (crv.coefs(2,:,:)), 0.5, 2);
-%! assert(ck, [0.25; 1; 2]);
-%! ck = curvederiveval (crv.number-1, crv.order-1, crv.knots, squeeze (crv.coefs(3,:,:)), 0.5, 2);
-%! assert(ck, [0.75; 1; -2]);
--- a/extra/nurbs/inst/deg2rad.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-function rad = deg2rad(deg)
-  
-% DEG2RAD: Convert degrees to radians.
-% 
-% Calling Sequence:
-% 
-%   rad = deg2rad(deg);
-% 
-% INPUT:
-% 
-%   deg		: Angle in degrees.
-%
-% OUTPUT:
-% 
-%   rad		: Angle in radians. 
-% 
-% Description:
-% 
-%   Convenient utility function for converting degrees to radians, which are
-%   often the required angular units for functions in the NURBS toolbox.
-% 
-% Examples:
-% 
-%   // Convert 35 degrees to radians
-%   rad = deg2rad(35);
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-rad = pi*deg/180.0;
-
-end
\ No newline at end of file
--- a/extra/nurbs/inst/findspan.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-function s = findspan(n,p,u,U)                
-% FINDSPAN  Find the span of a B-Spline knot vector at a parametric point
-%
-% Calling Sequence:
-% 
-%   s = findspan(n,p,u,U)
-% 
-%  INPUT:
-% 
-%    n - number of control points - 1
-%    p - spline degree
-%    u - parametric point
-%    U - knot sequence
-% 
-%  OUTPUT:
-% 
-%    s - knot span index
-%
-%  Modification of Algorithm A2.1 from 'The NURBS BOOK' pg68
-%
-%    Copyright (C) 2010 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.                                                
-
-if (max(u(:))>U(end) || min(u(:))<U(1))
-  error('Some value is outside the knot span')
-end
-
-s = zeros(size(u));
-for j = 1:numel(u)
-  if (u(j)==U(n+2)), s(j)=n; continue, end
-  s(j) = find(u(j) >= U,1,'last')-1;
-end
-
-end
-
-%!test
-%!  n = 3; 
-%!  U = [0 0 0 1/2 1 1 1]; 
-%!  p = 2; 
-%!  u = linspace(0, 1, 10);  
-%!  s = findspan (n, p, u, U);
-%!  assert (s, [2*ones(1, 5) 3*ones(1, 5)]);
-
-%!test
-%! p = 2; m = 7; n = m - p - 1;
-%! U = [zeros(1,p)  linspace(0,1,m+1-2*p) ones(1,p)];
-%! u = [ 0   0.11880   0.55118   0.93141   0.40068   0.35492 0.44392   0.88360   0.35414   0.92186   0.83085   1];
-%! s = [2   2   3   4   3   3   3   4   3   4   4   4];
-%! assert (findspan (n, p, u, U), s, 1e-10);
--- a/extra/nurbs/inst/kntbrkdegmult.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,122 +0,0 @@
-% KNTBRKDEGMULT: Construct an open knot vector by giving the sequence of
-%                knots, the degree and the multiplicity.
-%
-%   knots = kntbrkdegreg (breaks, degree)
-%   knots = kntbrkdegreg (breaks, degree, mult)
-%
-% INPUT:
-%
-%     breaks:  sequence of knots.
-%     degree:  polynomial degree of the splines associated to the knot vector.
-%     mult:    multiplicity of the knots.
-%
-% OUTPUT:
-%
-%     knots:  knot vector.
-%
-% If MULT has as many entries as BREAKS, or as the number of interior
-%   knots, a different multiplicity will be assigned to each knot. If
-%   MULT is not present, it will be taken equal to 1.
-%
-% Copyright (C) 2010 Carlo de Falco, Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-function knots = kntbrkdegmult (breaks, degree, mult)
-
-  if (iscell (breaks))
-    if (nargin == 2)
-      mult = 1;
-    end
-  
-    if (numel(breaks)~=numel(degree) || numel(breaks)~=numel(mult))
-      error('kntbrkdegmult: degree and multiplicity must have the same length as the number of knot vectors')
-    end
-
-    degree = num2cell (degree);
-
-    if (~iscell (mult))
-      mult = num2cell (mult);
-    end
-
-    knots = cellfun (@do_kntbrkdegmult, breaks, degree, mult, 'uniformoutput', false);
-
-  else
-
-    if (nargin == 2)
-      mult = 1;
-    end
-
-    knots = do_kntbrkdegmult (breaks, degree, mult);
-  end
-end
-
-  
-function knots = do_kntbrkdegmult (breaks, degree, mult)  
-
-if (numel (breaks) < 2)
-  error ('kntbrkdegmult: the knots sequence should contain at least two points')
-end
-
-if (numel (mult) == 1)
-  mults = [degree+1, mult(ones (1, numel (breaks) - 2)), degree+1];
-elseif (numel (mult) == numel (breaks))
-  mults = [degree+1 mult(2:end-1) degree+1];
-elseif (numel (mult) == numel (breaks) - 2)
-  mults = [degree+1 mult degree+1];
-else
-  error('kntbrkdegmult: the length of mult should be equal to one or the number of knots')
-end
-
-if (any (mults > degree+1))
-  warning ('kntbrkdegmult: some knots have higher multiplicity than the degree+1')
-end
-
-breaks = sort (breaks);
-
-lm = numel (mults);
-sm = sum (mults);
-
-mm = zeros (1,sm);
-mm (cumsum ([1 reshape(mults (1:end-1), 1, lm-1)])) = ones (1,lm);
-knots = breaks (cumsum (mm));
-
-end
-
-%!test
-%! breaks = [0 1 2 3 4];
-%! degree = 3;
-%! knots = kntbrkdegmult (breaks, degree);
-%! assert (knots, [0 0 0 0 1 2 3 4 4 4 4])
-
-%!test
-%! breaks = [0 1 2 3 4];
-%! degree = 3;
-%! mult   = 2;
-%! knots = kntbrkdegmult (breaks, degree, mult);
-%! assert (knots, [0 0 0 0 1 1 2 2 3 3 4 4 4 4])
-
-%!test
-%! breaks = [0 1 2 3 4];
-%! degree = 3;
-%! mult   = [1 2 3];
-%! knots = kntbrkdegmult (breaks, degree, mult);
-%! assert (knots, [0 0 0 0 1 2 2 3 3 3 4 4 4 4])
-
-%!test
-%! breaks = {[0 1 2 3 4] [0 1 2 3]};
-%! degree = [3 2];
-%! mult   = {[1 2 3] 2};
-%! knots = kntbrkdegmult (breaks, degree, mult);
-%! assert (knots, {[0 0 0 0 1 2 2 3 3 3 4 4 4 4] [0 0 0 1 1 2 2 3 3 3]})
--- a/extra/nurbs/inst/kntbrkdegreg.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,117 +0,0 @@
-% KNTBRKDEGREG: Construct an open knot vector by giving the sequence of
-%                knots, the degree and the regularity.
-%
-%   knots = kntbrkdegreg (breaks, degree)
-%   knots = kntbrkdegreg (breaks, degree, regularity)
-%
-% INPUT:
-%
-%     breaks:     sequence of knots.
-%     degree:     polynomial degree of the splines associated to the knot vector.
-%     regularity: splines regularity.
-%
-% OUTPUT:
-%
-%     knots:  knot vector.
-%
-% If REGULARITY has as many entries as BREAKS, or as the number of interior
-%   knots, a different regularity will be assigned to each knot. If
-%   REGULARITY is not present, it will be taken equal to DEGREE-1.
-%
-% Copyright (C) 2010 Carlo de Falco, Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-function knots = kntbrkdegreg (breaks, degree, reg)
-
-if (iscell (breaks))
-  if (nargin == 2)
-    reg = degree - 1;
-  end
-  
-  if (numel(breaks)~=numel(degree) || numel(breaks)~=numel(reg))
-    error('kntbrkdegreg: degree and regularity must have the same length as the number of knot vectors')
-  end
-
-  degree = num2cell (degree);
-
-  if (~iscell (reg))
-    reg = num2cell (reg);
-  end
-
-  knots = cellfun (@do_kntbrkdegreg, breaks, degree, reg, 'uniformoutput', false);
-else
-
-  if (nargin == 2)
-    reg = degree - 1;
-  end
-
-  knots = do_kntbrkdegreg (breaks, degree, reg);
-end
-
-end
-
-function knots = do_kntbrkdegreg (breaks, degree, reg)
-
-if (numel (breaks) < 2)
-  error ('kntbrkdegreg: the knots sequence should contain at least two points') 
-end
-
-if (numel (reg) == 1)
-  mults = [-1, (degree (ones (1, numel (breaks) - 2)) - reg), -1];
-elseif (numel (reg) == numel (breaks))
-  mults = degree - reg;
-elseif (numel (reg) == numel (breaks) - 2)
-  mults = [-1 degree-reg -1];
-else
-  error('kntbrkdegreg: the length of mult should be equal to one or the number of knots')
-end
-
-if (any (reg < -1))
-  warning ('kntbrkdegreg: for some knots the regularity is lower than -1')
-elseif (any (reg > degree-1))
-  error('kntbrkdegreg: the regularity should be lower than the degree')
-end
-
-knots = kntbrkdegmult (breaks, degree, mults);
-
-end
-
-%!test
-%! breaks = [0 1 2 3 4];
-%! degree = 3;
-%! knots = kntbrkdegreg (breaks, degree);
-%! assert (knots, [0 0 0 0 1 2 3 4 4 4 4])
-
-%!test
-%! breaks = [0 1 2 3 4];
-%! degree = 3;
-%! reg    = 1;
-%! knots = kntbrkdegreg (breaks, degree, reg);
-%! assert (knots, [0 0 0 0 1 1 2 2 3 3 4 4 4 4])
-
-%!test
-%! breaks = [0 1 2 3 4];
-%! degree = 3;
-%! reg    = [0 1 2];
-%! knots = kntbrkdegreg (breaks, degree, reg);
-%! assert (knots, [0 0 0 0 1 1 1 2 2 3 4 4 4 4])
-
-%!test
-%! breaks = {[0 1 2 3 4] [0 1 2 3]};
-%! degree = [3 2];
-%! reg    = {[0 1 2] 0};
-%! knots = kntbrkdegreg (breaks, degree, reg);
-%! assert (knots, {[0 0 0 0 1 1 1 2 2 3 4 4 4 4] [0 0 0 1 1 2 2 3 3 3]})
-
--- a/extra/nurbs/inst/kntrefine.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,158 +0,0 @@
-% KNTREFINE: Refine a given knot vector by dividing each interval uniformly,
-%             maintaining the continuity in previously existing knots.
-%
-%   [rknots]                  = kntrefine (knots, n_sub, degree, regularity)
-%   [rknots, zeta]            = kntrefine (knots, n_sub, degree, regularity)
-%   [rknots, zeta, new_knots] = kntrefine (knots, n_sub, degree, regularity)
-%
-% INPUT:
-%
-%     knots:      initial knot vector.
-%     n_sub:      number of new knots to be added in each interval.
-%     degree:     polynomial degree of the refined knot vector
-%     regularity: maximum global regularity 
-%
-% OUTPUT:
-%
-%     rknots:    refined knot vector
-%     zeta:      refined knot vector without repetitions
-%     new_knots: new knots, to apply the knot insertion
-%
-% The regularity at the new inserted knots is the one given by the user.
-% At previously existing knots, the regularity is the minimum
-%  between the previous regularity, and the one given by the user.
-%  This ensures optimal convergence rates in the context of IGA.
-%
-% Copyright (C) 2010 Carlo de Falco, Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-function varargout = kntrefine (knots, n_sub, degree, regularity)
-
-  if (iscell(knots))
-    if (numel(n_sub)~=numel(degree) || numel(n_sub)~=numel(regularity) || ...
-        numel(n_sub)~=numel(knots))
-      error('kntrefine: n_sub, degree and regularity must have the same length as the number of knot vectors')
-    end
-    aux_knots = knots;
-  else
-    if (numel(n_sub)~=numel(degree) || numel(n_sub)~=numel(regularity) || ...
-        numel(n_sub)~=1)
-      error('kntrefine: n_sub, degree and regularity must have the same length as the number of knot vectors')
-    end
-    aux_knots = {knots};
-  end
-
-  if (nargout == 3)
-    for idim = 1:numel(n_sub)
-      if (degree(idim)+1 ~= sum (aux_knots{idim}==aux_knots{idim}(1)))
-        error ('kntrefine: new_knots is only computed when the degree is maintained');
-      end
-    end
-    for idim = 1:numel(n_sub)
-      min_mult     = degree(idim) - regularity(idim);
-      z            = unique (aux_knots{idim});
-      nz           = numel (z);
-      deg          = sum (aux_knots{idim} == z(1)) - 1;
-      rknots{idim} = z(ones(1, degree(idim)+1));
-      new_knots{idim} = [];
- 
-      for ik = 2:nz
-        insk = linspace (z(ik-1), z(ik), n_sub(idim) + 2);
-        insk = vec (repmat (insk(2:end-1), min_mult, 1))';
-        old_mult = sum (aux_knots{idim} == z(ik));
-        mult = max (min_mult, degree(idim) - deg + old_mult);
-        rknots{idim} = [rknots{idim}, insk, z(ik*ones(1, mult))];
-        new_knots{idim} = [new_knots{idim}, insk, z(ik*ones(1, mult-old_mult))];
-      end
-      zeta{idim} = unique (rknots{idim});
-    end
-    if (~iscell(knots))
-      rknots = rknots{1};
-      zeta = zeta{1};
-      new_knots = new_knots{1};
-    end
-    varargout{1} = rknots;
-    varargout{2} = zeta;
-    varargout{3} = new_knots;
-  else
-    for idim = 1:numel(n_sub)
-      min_mult     = degree(idim) - regularity(idim);
-      z            = unique (aux_knots{idim});
-      nz           = numel (z);
-      deg          = sum (aux_knots{idim} == z(1)) - 1;
-      rknots{idim} = z(ones(1, degree(idim)+1));
- 
-      for ik = 2:nz
-        insk = linspace (z(ik-1), z(ik), n_sub(idim) + 2);
-        insk = vec (repmat (insk(2:end-1), min_mult, 1))';
-        old_mult = sum (aux_knots{idim} == z(ik));
-        mult = max (min_mult, degree(idim) - deg + old_mult);
-        rknots{idim} = [rknots{idim}, insk, z(ik*ones(1, mult))];
-      end
-      zeta{idim} = unique (rknots{idim});
-    end
-    if (~iscell(knots))
-      rknots = rknots{1};
-      zeta = zeta{1};
-    end
-    varargout{1} = rknots;
-    if (nargout == 2)
-      varargout{2} = zeta;
-    end
-  end
-end
-
-function v = vec (in)
-  v = in(:);
-end
-
-%!shared nrbs
-%!test
-%! knots = {[0 0 1 1] [0 0 0 1 1 1]};
-%! coefs(1,:,:) = [1 sqrt(2)/2 0; 2 sqrt(2) 0];
-%! coefs(2,:,:) = [0 sqrt(2)/2 1; 0 sqrt(2) 2];
-%! coefs(4,:,:) = [1 sqrt(2)/2 1; 1 sqrt(2)/2 1];
-%! nrbs = nrbmak (coefs, knots);
-%! nrbs = nrbkntins (nrbs, {[] [0.5 0.6 0.6]});
-%! nrbs = nrbdegelev (nrbs, [0 1]);
-%! nrbs = nrbkntins (nrbs, {[] [0.4]});
-%! rknots = kntrefine (nrbs.knots, [1 1], [1 1], [0 0]);
-%! assert (rknots{1} == [0 0 0.5 1 1]);
-%! assert (rknots{2} == [0 0 0.2 0.4 0.45 0.5 0.55 0.6 0.8 1 1]);
-%!
-%!test
-%! rknots = kntrefine (nrbs.knots, [1 1], [3 3], [0 0]);
-%! assert (rknots{1}, [0 0 0 0 0.5 0.5 0.5 1 1 1 1]);
-%! assert (rknots{2}, [0 0 0 0 0.2 0.2 0.2 0.4 0.4 0.4 0.45 0.45 0.45 0.5 0.5 0.5 0.55 0.55 0.55 0.6 0.6 0.6 0.8 0.8 0.8 1 1 1 1]);
-%!
-%!test
-%! rknots = kntrefine (nrbs.knots, [1 1], [3 3], [2 2]);
-%! assert (rknots{1}, [0 0 0 0 0.5 1 1 1 1]);
-%! assert (rknots{2}, [0 0 0 0 0.2 0.4 0.45 0.5 0.5 0.55 0.6 0.6 0.6 0.8 1 1 1 1]);
-%!
-%!test
-%! rknots = kntrefine (nrbs.knots, [1 1], [4 4], [0 0]);
-%! assert (rknots{1}, [0 0 0 0 0 0.5 0.5 0.5 0.5 1 1 1 1 1]);
-%! assert (rknots{2}, [0 0 0 0 0 0.2 0.2 0.2 0.2 0.4 0.4 0.4 0.4 0.45 0.45 0.45 0.45 0.5 0.5 0.5 0.5 0.55 0.55 0.55 0.55 0.6 0.6 0.6 0.6 0.8 0.8 0.8 0.8 1 1 1 1 1]);
-%!
-%!test
-%! rknots = kntrefine (nrbs.knots, [1 1], [4 4], [3 3]);
-%! assert (rknots{1}, [0 0 0 0 0 0.5 1 1 1 1 1]);
-%! assert (rknots{2}, [0 0 0 0 0 0.2 0.4 0.4 0.45 0.5 0.5 0.5 0.55 0.6 0.6 0.6 0.6 0.8 1 1 1 1 1]);
-%!
-%!test
-%! knots = [0 0 0 0 0.4 0.5 0.5 0.6 0.6 0.6 1 1 1 1];
-%! rknots = kntrefine (knots, 1, 4, 3);
-%! assert (rknots, [0 0 0 0 0 0.2 0.4 0.4 0.45 0.5 0.5 0.5 0.55 0.6 0.6 0.6 0.6 0.8 1 1 1 1 1]);
--- a/extra/nurbs/inst/kntuniform.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-% KNTUNIFORM: generate uniform open knot vectors in the reference domain.
-%
-%   [csi, zeta] = kntuniform (num, degree, regularity)
-%
-% INPUT:
-%     
-%     num:        number of breaks (in each direction)
-%     degree:     polynomial degree (in each direction)
-%     regularity: global regularity (in each direction)
-%
-% OUTPUT:
-%
-%     csi:  knots
-%     zeta: breaks = knots without repetitions
-% 
-% Copyright (C) 2009, 2010 Carlo de Falco
-% Copyright (C) 2011 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-function [csi, zeta] = kntuniform (num, degree, regularity)
-  
-  if (numel(num)~=numel(degree) || numel(num)~=numel(regularity))
-    error('kntuniform: num, degree and regularity must have the same length')
-  else
-    for idim=1:numel(num)
-      zeta{idim} = linspace (0, 1, num(idim));
-      rep  = degree(idim) - regularity(idim);
-      if (rep > 0)
-        csi{idim}  = [zeros(1, degree(idim)+1-rep)...
-          reshape(repmat(zeta{idim}, rep, 1), 1, []) ones(1, degree(idim)+1-rep)];
-      else
-        error ('kntuniform: regularity requested is too high')
-      end
-    end
-    if (numel(num) == 1)
-      csi = csi{1};
-      zeta = zeta{1};
-    end
-  end
-end
--- a/extra/nurbs/inst/nrb2iges.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,303 +0,0 @@
-function nrb2iges (nurbs, filename)
-% NRB2IGES : Write a NURBS curve or surface to an IGES file.
-%
-% Calling Sequence:
-% 
-%   nrb2iges (nurbs, filename);
-% 
-% INPUT:
-% 
-%   nurbs    : NURBS curve or surface, see nrbmak.
-%   filename : name of the output file.
-%  
-% Description:
-% 
-%   The data of the nurbs structure is written in a file following the IGES
-%   format. For a more in-depth explanation see, for example:
-%   <http://engineeronadisk.com/V2/notes_design/engineeronadisk-76.html>.
-%
-%    Copyright (C) 2014 Jacopo Corno
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-%
-%    This file is based on nurbs2iges.m, (C) 2006 Fu Qiang, originally 
-%    released under the MIT license.
-
-  dt = datestr (now, 'yyyy.mm.dd');
-  
-  dim = numel (nurbs(1).order);
-  
-  % START SECTION
-  S{1} = '';
-  S{2} = 'IGES obtained from Nurbs toolbox.';
-  S{3} = 'See <http://octave.sourceforge.net/nurbs/>.';
-  S{4} = '';
-    
-  % GLOBAL SECTION
-  G{1} = '1H,';                           % Parameter Deliminator Character
-  G{2} = '1H;';                           % Record Delimiter Character
-  G{3} = HString ('Nurbs toolbox');       % Product ID from Sender
-  G{4} = HString (filename);              % File Name
-  G{5} = HString ('Octave Nurbs');        % System ID
-  G{6} = HString ('nrb2iges');            % Pre-processor Version
-  G{7} = '32';                            % Number of Bits for Integers (No. of bits present in the integer representation of the sending system)
-  G{8} = '75';                            % Single Precision Magnitude (Maximum power of 10 which may be represented as a single precision floating point number from the sending system)
-  G{9} = '6';                             % Single Precision Significance (No. of significant digits of a single precision floating point number on the sending system)
-  G{10}= '75';                            % Double Precision Magnitude (Maximum power of 10 which may be represented as a double precision floating point number from the sending system)
-  G{11}= '15';                            % Double Precision Significance (No. of significant digits of a double precision floating point number on the sending system)
-  G{12}= HString('Nurbs from Octave');    % Product ID for Receiver
-  G{13}= '1.0';                           % Model Space Scale
-  G{14}= '6';                             % Unit Flag (6 = metres)
-  G{15}= HString('M');                    % Units  (metres = "M")
-  G{16}= '1000';                          % Maximum Number of Line Weights
-  G{17}= '1.0';                           % Size of Maximum Line Width
-  G{18}= HString(dt);                     % Date and Time of file generation
-  G{19}= '0.000001';                      % Minimum User-intended Resolution
-  G{20}= '10000.0';                       % Approximate Maximum Coordinate
-  G{21}= HString('Jacopo Corno');         % Name of Author
-  G{22}= HString('GSCE - TU Darmstadt');  % Author's Organization
-  G{23}= '3';                             % IGES Version Number (3 = IGES version 2.0)
-  G{24}= '0';                             % Drafting Standard Code (0 = no standard)
-  
-  % Convert section array to lines (maximum lenght 72)
-  SectionG = make_section (G, 72);
-  
-  % DIRECTORY ENTRY SECTION
-  % Each directory entry consists of two, 80 character, fixed formatted lines
-  D = [];
-  for ii = 1:length (nurbs)
-    switch (dim)
-      case 1 % NURBS curve
-        D(ii).type = 126;
-      case 2 % NURBS surface
-        D(ii).type = 128;
-      otherwise
-        error ('Only curves and surfaces can be saved in IGES format.')
-    end
-    D(ii).id = 2*ii - 1; % odd counter (see Parameter data section)
-    D(ii).p_start = 0;
-    D(ii).p_count = 0;
-  end
-  
-  % PARAMETER DATA SECTION
-  % The structure is a free formatted data entry from columns 1 to 64.
-  % Each line of free formatted data consists of the entity type number
-  % followed by the parameter data describing the entity.
-  % Columns 65 to 72 are reserved for a parameter data index which is an
-  % odd number counter, right justified in the field, which begins at the
-  % number 1 and progresses in odd increments for each entity entered.
-  % Column 73 is reserved for the letter ‘P’ to indicate the data element
-  % belongs to the parameter data section. 
-  % Columns 74 to 80 are reserved for the sequence number. Each line of 
-  % data corresponds to the entity type as specified in the global section.
-  SectionP = {};
-  for ii = 1:length (nurbs)
-    P = make_section_array (nurbs(ii)); % finish one entity
-    % Convert section array to lines
-    SP = make_section (P, 64);
-    D(ii).p_count = length (SP);
-    if (ii == 1)
-        D(ii).p_start = 1;
-    else
-        D(ii).p_start = D(ii-1).p_start + D(ii-1).p_count;
-    end
-    SectionP{ii} = SP;
-  end
-
-  % SAVE
-  fid = fopen (filename, 'w');
-  
-  % Save Start Section
-  for ii = 1:length (S)
-    fprintf (fid, '%-72sS%7d\n', S{ii}, ii);
-  end
-  
-  % Save Global Section
-  for ii = 1:length (SectionG)
-    fprintf (fid, '%-72sG%7d\n', SectionG{ii}, ii);
-  end
-  
-  % Save Directory Entry Section
-  for i = 1:length (D)
-    fprintf (fid, '%8d%8d%8d%8d%8d%8d%8d%8d%8dD%7d\n', ...
-             D(i).type, D(i).p_start, 0, 0 ,0, 0, 0, 0, 0, i*2-1);
-    fprintf (fid, '%8d%8d%8d%8d%8d%8s%8s%8s%8dD%7d\n', ...
-             D(i).type, 0, 0, D(i).p_count, 0, ' ', ' ', ' ', 0, i*2);
-  end
-  
-  % Save Parameter Data Section
-  lines_p = 0;
-  for jj = 1:length (D)
-    sec = SectionP{jj};
-    for ii = 1:length (sec)
-      lines_p = lines_p + 1;
-      fprintf (fid, '%-64s %7dP%7d\n', sec{ii}, D(jj).id, lines_p);
-    end
-  end
-  
-  % Save Terminate Section
-  sec_t = sprintf ('%7dS%7dG%7dD%7dP%7d', length (S), length(SectionG), 2*length(D), lines_p);
-  fprintf (fid, '%-72sT%7d\n', sec_t, 1);
-  
-  fclose(fid);
-  
-end
-
-function P = make_section_array (nurbs)
-  dim = numel (nurbs.order);
-  
-  % in IGES the control points are stored in the format [x, y, z, w]
-  % instead of [w*x, w*y, w*z, w]
-  for idim = 1:3
-    nurbs.coefs(idim,:) = nurbs.coefs(idim,:) ./ nurbs.coefs(4,:);
-  end
-  
-  P = {};
-  switch dim
-    case 1
-      % Rational B-Spline Curve Entity
-      cp = nurbs.coefs;
-      deg = nurbs.order - 1;
-      knots = nurbs.knots;
-      uspan = [0 1];
-      isplanar = ~any(cp(3,:));
-      P{1} = '126';                       % NURBS curve
-      P{2} = int2str (size (cp, 2) - 1);  % Number of control points
-      P{3} = int2str (deg);               % Degree
-      P{4} = int2str (isplanar);          % Curve on xy plane
-      P{5} = '0';
-      P{6} = '0';
-      P{7} = '0';
-      index = 8;
-      for ii = 1:length (knots)
-        P{index} = sprintf ('%f', knots(ii));
-        index = index + 1;
-      end
-      for ii = 1:size (cp, 2)
-        P{index} = sprintf ('%f', cp(4,ii));
-        index = index + 1;
-      end
-      for ii = 1:size (cp, 2)
-        P{index} = sprintf ('%f', cp(1,ii));
-        index = index + 1;
-        P{index} = sprintf ('%f', cp(2,ii));
-        index = index + 1;
-        P{index} = sprintf ('%f', cp(3,ii));
-        index = index + 1;
-      end
-      P{index} = sprintf ('%f', uspan(1));
-      index = index +1;
-      P{index} = sprintf ('%f', uspan(2));
-      index = index +1;
-      P{index} = '0.0';
-      index = index +1;
-      P{index} = '0.0';
-      index = index +1;
-      if isplanar
-        P{index} = '1.0';
-      else
-        P{index} = '0.0';
-      end
-      index = index + 1;
-      P{index} = '0';
-      index = index + 1;
-      P{index} = '0';
-    case 2
-      % Rational B-Spline Surface Entity
-      cp = nurbs.coefs;
-      degU = nurbs.order(1) - 1;
-      degV = nurbs.order(2) - 1;
-      knotsU = nurbs.knots{1};
-      knotsV = nurbs.knots{2};
-      uspan = [0 1];
-      vspan = [0 1];
-      P{1} = '128';                       % NURBS surface
-      P{2} = int2str (size (cp, 2) - 1);  % Number of control points in U
-      P{3} = int2str (size (cp, 3) - 1);  % Number of control points in V
-      P{4} = int2str (degU);              % Degree in U
-      P{5} = int2str (degV);              % Degree in V
-      P{6} = '0';
-      P{7} = '0';
-      P{8} = '0';
-      P{9} = '0';
-      P{10} = '0';
-      index = 11;
-      for ii = 1:length (knotsU)
-        P{index} = sprintf ('%f', knotsU(ii));
-        index = index + 1;
-      end
-      for ii = 1:length (knotsV)
-        P{index} = sprintf ('%f', knotsV(ii));
-        index = index + 1;
-      end
-      for jj = 1:size (cp, 3)
-        for ii = 1:size (cp, 2)
-          P{index} = sprintf ('%f', cp(4,ii,jj));
-          index = index + 1;
-        end
-      end
-      for jj = 1:size (cp, 3)
-        for ii = 1:size (cp, 2)
-          P{index} = sprintf ('%f',cp(1,ii,jj));
-          index = index + 1;
-          P{index} = sprintf ('%f',cp(2,ii,jj));
-          index = index + 1;
-          P{index} = sprintf ('%f',cp(3,ii,jj));
-          index = index + 1;
-        end
-      end
-      P{index} = sprintf('%f',uspan(1));
-      index = index +1;
-      P{index} = sprintf('%f',uspan(2));
-      index = index +1;
-      P{index} = sprintf('%f',vspan(1));
-      index = index +1;
-      P{index} = sprintf('%f',vspan(2));
-      index = index +1;
-      P{index} = '0';
-      index = index + 1;
-      P{index} = '0';
-    otherwise
-      
-  end
-end
-
-function hs = HString (str)
-% HString : Convert the string STR to the Hollerith format.
-
-  hs = sprintf ('%dH%s', length(str), str);
-end
-
-function sec = make_section (fields, linewidth)
-  sec = {};
-  index = 1;
-  line = '';
-  num = length (fields);
-  for i = 1:num
-    if (i < num)
-      newitem = [fields{i} ','];
-    else
-      newitem = [fields{i} ';'];
-    end
-    len = length (line) + length (newitem);
-    if ( len > linewidth )
-      % new line
-      sec{index} = line;
-      index = index + 1;
-      line = '';
-    end
-    line = [line newitem];
-  end
-  sec{index} = line;
-end
--- a/extra/nurbs/inst/nrb4surf.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-function srf = nrb4surf(p11,p12,p21,p22)
-% 
-% NRB4SURF: Constructs a NURBS bilinear surface.
-% 
-% Calling Sequence:
-% 
-%   srf = nrb4surf(p11,p12,p21,p22)
-% 
-% INPUT:
-% 
-%   p11		: Cartesian coordinate of the lhs bottom corner point.
-% 
-%   p12		: Cartesian coordinate of the rhs bottom corner point.
-% 
-%   p21		: Cartesian coordinate of the lhs top corner point.
-%  
-%   p22		: Cartesian coordinate of the rhs top corner point.
-%
-% OUTPUT:
-% 
-%   srf		: NURBS bilinear surface, see nrbmak. 
-% 
-% Description:
-% 
-%   Constructs a bilinear surface defined by four coordinates.
-% 
-%   The position of the corner points
-% 
-%          ^ V direction
-%          |
-%          ----------------
-%          |p21        p22|
-%          |              |
-%          |    SRF       |
-%          |              |
-%          |p11        p12|
-%          -------------------> U direction
-% 
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if nargin ~= 4
-  error('Four corner points must be defined'); 
-end
-
-coefs = cat (1, zeros (3,2,2), ones (1,2,2));
-coefs(1:length(p11),1,1) = p11(:);    
-coefs(1:length(p12),2,1) = p12(:);
-coefs(1:length(p21),1,2) = p21(:);
-coefs(1:length(p22),2,2) = p22(:);
-             
-knots  = {[0 0 1 1] [0 0 1 1]}; 
-srf = nrbmak(coefs, knots);
-
-end
-
-%!demo
-%! srf = nrb4surf([0.0 0.0 0.5],[1.0 0.0 -0.5],[0.0 1.0 -0.5],[1.0 1.0 0.5]);
-%! nrbplot(srf,[10,10]);
-%! title('Construction of a bilinear surface.');
-%! hold off
--- a/extra/nurbs/inst/nrbbasisfun.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,140 +0,0 @@
-function [B, id] = nrbbasisfun (points, nrb)
-
-% NRBBASISFUN: Basis functions for NURBS
-%
-% Calling Sequence:
-% 
-%    B     = nrbbasisfun (u, crv)
-%    B     = nrbbasisfun ({u, v}, srf)
-%   [B, N] = nrbbasisfun ({u, v}, srf)
-%   [B, N] = nrbbasisfun (pts, srf)
-%
-%    INPUT:
-%   
-%      u   - parametric coordinates along u direction
-%      v   - parametric coordinates along v direction
-%      pts - array of scattered points in parametric domain, array size: (2,num_points)
-%      crv - NURBS curve
-%      srf - NURBS surface
-%   
-%    If the parametric coordinates are given in a cell-array, the values
-%     are computed in a tensor product set of points
-%
-%    OUTPUT:
-%   
-%      B - Value of the basis functions at the points
-%          size(B)=[numel(u),(p+1)] for curves
-%          or [numel(u)*numel(v), (p+1)*(q+1)] for surfaces
-%
-%      N - Indices of the basis functions that are nonvanishing at each
-%          point. size(N) == size(B)
-%   
-%
-%    Copyright (C) 2009 Carlo de Falco
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-  if (   (nargin<2) ...
-      || (nargout>2) ...
-      || (~isstruct(nrb)) ...
-      || (iscell(points) && ~iscell(nrb.knots)) ...
-      || (~iscell(points) && iscell(nrb.knots) && (size(points,1)~=2)) ...
-      )
-    error('Incorrect input arguments in nrbbasisfun');
-  end
-                            
-  if (~iscell(nrb.knots))         %% NURBS curve
-    
-    [B, id] = nrb_crv_basisfun__ (points, nrb);
-    
-  elseif size(nrb.knots,2) == 2 %% NURBS surface
-    if (iscell(points))
-      [v, u] = meshgrid(points{2}, points{1});
-      p = [u(:), v(:)]';
-    else
-      p = points;
-    end
-    
-    [B, id] = nrb_srf_basisfun__ (p, nrb); 
-
-  else                            %% NURBS volume
-    error('The function nrbbasisfun is not yet ready for volumes')
-  end
-end  
-
-%!demo
-%! U = [0 0 0 0 1 1 1 1];
-%! x = [0 1/3 2/3 1] ;
-%! y = [0 0 0 0];
-%! w = [1 1 1 1];
-%! nrb = nrbmak ([x;y;y;w], U);
-%! u = linspace(0, 1, 30);
-%! B = nrbbasisfun (u, nrb);
-%! xplot = sum(bsxfun(@(x,y) x.*y, B, x),2);
-%! plot(xplot, B)
-%! title('Cubic Bernstein polynomials')
-%! hold off
-
-%!test
-%! U = [0 0 0 0 1 1 1 1];
-%! x = [0 1/3 2/3 1] ;
-%! y = [0 0 0 0];
-%! w = rand(1,4);
-%! nrb = nrbmak ([x;y;y;w], U);
-%! u = linspace(0, 1, 30);
-%! B = nrbbasisfun (u, nrb);
-%! xplot = sum(bsxfun(@(x,y) x.*y, B, x),2);
-%!
-%! yy = y; yy(1) = 1;
-%! nrb2 = nrbmak ([x.*w;yy;y;w], U); 
-%! aux = nrbeval(nrb2,u);
-%! %figure, plot(xplot, B(:,1), aux(1,:).', w(1)*aux(2,:).')
-%! assert(B(:,1), w(1)*aux(2,:).', 1e-6)
-%! 
-%! yy = y; yy(2) = 1;
-%! nrb2 = nrbmak ([x.*w;yy;y;w], U);
-%! aux = nrbeval(nrb2, u);
-%! %figure, plot(xplot, B(:,2), aux(1,:).', w(2)*aux(2,:).')
-%! assert(B(:,2), w(2)*aux(2,:).', 1e-6)
-%!
-%! yy = y; yy(3) = 1;
-%! nrb2 = nrbmak ([x.*w;yy;y;w], U);
-%! aux = nrbeval(nrb2,u);
-%! %figure, plot(xplot, B(:,3), aux(1,:).', w(3)*aux(2,:).')
-%! assert(B(:,3), w(3)*aux(2,:).', 1e-6)
-%!
-%! yy = y; yy(4) = 1;
-%! nrb2 = nrbmak ([x.*w;yy;y;w], U);
-%! aux = nrbeval(nrb2,u);
-%! %figure, plot(xplot, B(:,4), aux(1,:).', w(4)*aux(2,:).')
-%! assert(B(:,4), w(4)*aux(2,:).', 1e-6)
-
-%!test
-%! p = 2;   q = 3;   m = 4; n = 5;
-%! Lx  = 1; Ly  = 1; 
-%! nrb = nrb4surf   ([0 0], [1 0], [0 1], [1 1]);
-%! nrb = nrbdegelev (nrb, [p-1, q-1]);
-%! aux1 = linspace(0,1,m); aux2 = linspace(0,1,n);
-%! nrb = nrbkntins  (nrb, {aux1(2:end-1), aux2(2:end-1)});
-%! u = rand (1, 30); v = rand (1, 10);
-%! u = u - min (u); u = u / max (u);
-%! v = v - min (v); v = v / max (v);
-%! [B, N] = nrbbasisfun ({u, v}, nrb);
-%! assert (sum(B, 2), ones(300, 1), 1e-6)
-%! assert (all (all (B<=1)), true)
-%! assert (all (all (B>=0)), true)
-%! assert (all (all (N>0)), true)
-%! assert (all (all (N <= prod (nrb.number))), true)
-%! assert (max (max (N)),prod (nrb.number))
-%! assert (min (min (N)),1)
\ No newline at end of file
--- a/extra/nurbs/inst/nrbbasisfunder.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,127 +0,0 @@
-function varargout = nrbbasisfunder (points, nrb)
-
-% NRBBASISFUNDER:  NURBS basis functions derivatives
-%
-% Calling Sequence:
-% 
-%   Bu          = nrbbasisfunder (u, crv)
-%   [Bu, N]     = nrbbasisfunder (u, crv)
-%   [Bu, Bv]    = nrbbasisfunder ({u, v}, srf)
-%   [Bu, Bv, N] = nrbbasisfunder ({u, v}, srf)
-%   [Bu, Bv, N] = nrbbasisfunder (pts, srf)
-%
-%    INPUT:
-%   
-%      u   - parametric coordinates along u direction
-%      v   - parametric coordinates along v direction
-%      pts - array of scattered points in parametric domain, array size: (2,num_points)
-%      crv - NURBS curve
-%      srf - NURBS surface
-%
-%    If the parametric coordinates are given in a cell-array, the values
-%     are computed in a tensor product set of points
-%   
-%    OUTPUT:
-%   
-%      Bu - Basis functions derivatives WRT direction u
-%           size(Bu)=[numel(u),(p+1)] for curves
-%           or [numel(u)*numel(v), (p+1)*(q+1)] for surfaces
-%
-%      Bv - Basis functions derivatives WRT direction v
-%           size(Bv)=[numel(v),(p+1)] for curves
-%           or [numel(u)*numel(v), (p+1)*(q+1)] for surfaces
-%
-%      N - Indices of the basis functions that are nonvanishing at each
-%          point. size(N) == size(B)
-%   
-%    Copyright (C) 2009 Carlo de Falco
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-  
-  if (   (nargin<2) ...
-      || (nargout>3) ...
-      || (~isstruct(nrb)) ...
-      || (iscell(points) && ~iscell(nrb.knots)) ...
-      || (~iscell(points) && iscell(nrb.knots) && (size(points,1)~=2)) ...
-      || (~iscell(nrb.knots) && (nargout>2)) ...
-      )
-    error('Incorrect input arguments in nrbbasisfun');
-  end
-                            
-  if (~iscell(nrb.knots))         %% NURBS curve
-    
-    [varargout{1}, varargout{2}] = nrb_crv_basisfun_der__ (points, nrb);
-
-  elseif size(nrb.knots,2) == 2 %% NURBS surface
-
-    if (iscell(points))
-      [v, u] = meshgrid(points{2}, points{1});
-      p = [u(:), v(:)]';
-    else
-      p = points;
-    end
-    
-    [varargout{1}, varargout{2}, varargout{3}] = nrb_srf_basisfun_der__ (p, nrb);
-
-  else                            %% NURBS volume
-    error('The function nrbbasisfunder is not yet ready for volumes')
-  end
-end
-  
-%!demo
-%! U = [0 0 0 0 1 1 1 1];
-%! x = [0 1/3 2/3 1] ;
-%! y = [0 0 0 0];
-%! w = [1 1 1 1];
-%! nrb = nrbmak ([x;y;y;w], U);
-%! u = linspace(0, 1, 30);
-%! [Bu, id] = nrbbasisfunder (u, nrb);
-%! plot(u, Bu)
-%! title('Derivatives of the cubic Bernstein polynomials')
-%! hold off
-
-%!test
-%! U = [0 0 0 0 1 1 1 1];
-%! x = [0 1/3 2/3 1] ;
-%! y = [0 0 0 0];
-%! w = rand(1,4);
-%! nrb = nrbmak ([x;y;y;w], U);
-%! u = linspace(0, 1, 30);
-%! [Bu, id] = nrbbasisfunder (u, nrb);
-%! #plot(u, Bu)
-%! assert (sum(Bu, 2), zeros(numel(u), 1), 1e-10), 
-
-%!test
-%! U = [0 0 0 0 1/2 1 1 1 1];
-%! x = [0 1/4 1/2 3/4 1] ;
-%! y = [0 0 0 0 0];
-%! w = rand(1,5);
-%! nrb = nrbmak ([x;y;y;w], U);
-%! u = linspace(0, 1, 300); 
-%! [Bu, id] = nrbbasisfunder (u, nrb); 
-%! assert (sum(Bu, 2), zeros(numel(u), 1), 1e-10)
-
-%!test
-%! p = 2;   q = 3;   m = 4; n = 5;
-%! Lx  = 1; Ly  = 1; 
-%! nrb = nrb4surf   ([0 0], [1 0], [0 1], [1 1]);
-%! nrb = nrbdegelev (nrb, [p-1, q-1]);
-%! aux1 = linspace(0,1,m); aux2 = linspace(0,1,n);
-%! nrb = nrbkntins  (nrb, {aux1(2:end-1), aux2(2:end-1)});
-%! nrb.coefs (4,:,:) = nrb.coefs(4,:,:) + rand (size (nrb.coefs (4,:,:)));
-%! [Bu, Bv, N] = nrbbasisfunder ({rand(1, 20), rand(1, 20)}, nrb);
-%! #plot3(squeeze(u(1,:,:)), squeeze(u(2,:,:)), reshape(Bu(:,10), 20, 20),'o')
-%! assert (sum (Bu, 2), zeros(20^2, 1), 1e-10)
-
--- a/extra/nurbs/inst/nrbcirc.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,123 +0,0 @@
-function curve = nrbcirc(radius,center,sang,eang)
-% 
-% NRBCIRC: Construct a circular arc.
-% 
-% Calling Sequence:
-% 
-%   crv = nrbcirc()
-%   crv = nrbcirc(radius)
-%   crv = nrbcirc(radius,center)
-%   crv = nrbcirc(radius,center,sang,eang)
-% 
-% INPUT:
-% 
-%   radius	: Radius of the circle, default 1.0
-% 
-%   center	: Center of the circle, default (0,0,0)
-% 
-%   sang	: Start angle, default 0 radians (0 degrees)
-% 
-%   eang	: End angle, default 2*pi radians (360 degrees)
-% 
-% OUTPUT:
-%
-%   crv		: NURBS curve for a circular arc.
-% 
-% Description:
-% 
-%   Constructs NURBS data structure for a circular arc in the x-y plane. If
-%   no rhs arguments are supplied a unit circle with center (0.0,0.0) is
-%   constructed. 
-% 
-%   Angles are defined as positive in the anti-clockwise direction.
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if nargin < 1
-  radius = 1;
-end
-
-if nargin < 2
-  center = [];
-end
-   
-if nargin < 4
-  sang = 0;
-  eang = 2*pi;
-end
-
-sweep = eang - sang;       % sweep angle of arc
-if sweep < 0
-  sweep = 2*pi + sweep;
-end
-     
-if abs(sweep) <= pi/2
-  narcs = 1;                % number of arc segments
-  knots = [0 0 0 1 1 1];
-elseif abs(sweep) <= pi
-  narcs = 2;
-  knots = [0 0 0 0.5 0.5 1 1 1];
-elseif abs(sweep) <= 3*pi/2
-  narcs = 3;
-  knots = [0 0 0 1/3 1/3 2/3 2/3 1 1 1];
-else
-  narcs = 4;
-  knots = [0 0 0 0.25 0.25 0.5 0.5 0.75 0.75 1 1 1];
-end
-
-dsweep = sweep/(2*narcs);     % arc segment sweep angle/2
-
-% determine middle control point and weight
-wm = cos(dsweep);
-x  = radius*wm;
-y  = radius*sin(dsweep);
-xm = x+y*tan(dsweep);
-
-% arc segment control points
-ctrlpt = [ x wm*xm x;    % w*x - coordinate
-          -y 0     y;    % w*y - coordinate
-           0 0     0;    % w*z - coordinate
-           1 wm    1];   % w   - coordinate
-      
-% build up complete arc from rotated segments
-coefs = zeros(4,2*narcs+1);   % nurbs control points of arc
-xx = vecrotz(sang + dsweep);
-coefs(:,1:3) = xx*ctrlpt;     % rotate to start angle
-xx = vecrotz(2*dsweep);
-for n = 2:narcs
-   m = 2*n+[0 1];
-   coefs(:,m) = xx*coefs(:,m-2);
-end
-
-% vectrans arc if necessary
-if ~isempty(center) 
-  xx = vectrans(center);
-  coefs = xx*coefs;
-end
-
-curve = nrbmak(coefs,knots);
-
-end
-
-%!demo
-%! for r = 1:9
-%! crv = nrbcirc(r,[],deg2rad(45),deg2rad(315));
-%!   nrbplot(crv,50);
-%!   hold on;
-%! end
-%! hold off;
-%! axis equal;
-%! title('NURBS construction of several 2D arcs.');
--- a/extra/nurbs/inst/nrbcoons.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,190 +0,0 @@
-function srf = nrbcoons(u1, u2, v1, v2)
-% 
-% NRBCOONS: Construction of a Coons patch.
-% 
-% Calling Sequence:
-% 
-%   srf = nrbcoons(ucrv1, ucrv2, vcrv1, vcrv2)
-% 
-% INPUT:
-% 
-%   ucrv1	: NURBS curve defining the bottom U direction boundary of
-% 		the constructed NURBS surface.
-% 
-%   ucrv2	: NURBS curve defining the top U direction boundary of
-% 		the constructed NURBS surface.
-% 
-%   vcrv1	: NURBS curve defining the bottom V direction boundary of
-% 		the constructed NURBS surface.
-% 
-%   vcrv2	: NURBS curve defining the top V direction boundary of
-% 		the constructed NURBS surface.
-%
-% OUTPUT:
-% 
-%   srf		: Coons NURBS surface patch.
-% 
-% Description:
-% 
-%   Construction of a bilinearly blended Coons surface patch from four NURBS
-%   curves that define the boundary.
-% 
-%   The orientation of the four NURBS boundary curves.
-% 
-%          ^ V direction
-%          |
-%          |     ucrv2
-%          ------->--------
-%          |              |
-%          |              |
-%    vcrv1 ^   Surface    ^ vcrv2
-%          |              |
-%          |              |
-%          ------->-----------> U direction
-%                ucrv1
-% 
-% 
-% Examples:
-% 
-%   // Define four NURBS curves and construct a Coons surface patch.
-%   pnts = [ 0.0  3.0  4.5  6.5 8.0 10.0;
-%            0.0  0.0  0.0  0.0 0.0  0.0; 
-%            2.0  2.0  7.0  4.0 7.0  9.0];   
-%   crv1 = nrbmak(pnts, [0 0 0 1/3 0.5 2/3 1 1 1]);
-% 
-%   pnts= [ 0.0  3.0  5.0  8.0 10.0;
-%           10.0 10.0 10.0 10.0 10.0;
-%           3.0  5.0  8.0  6.0 10.0];
-%   crv2 = nrbmak(pnts, [0 0 0 1/3 2/3 1 1 1]);
-% 
-%   pnts= [ 0.0 0.0 0.0 0.0;
-%           0.0 3.0 8.0 10.0;
-%           2.0 0.0 5.0 3.0];
-%   crv3 = nrbmak(pnts, [0 0 0 0.5 1 1 1]);
-% 
-%   pnts= [ 10.0 10.0 10.0 10.0 10.0;
-%           0.0   3.0  5.0  8.0 10.0;
-%           9.0   7.0  7.0 10.0 10.0];
-%   crv4 = nrbmak(pnts, [0 0 0 0.25 0.75 1 1 1]);
-% 
-%   srf = nrbcoons(crv1, crv2, crv3, crv4);
-%   nrbplot(srf,[20 20],220,45);
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if nargin ~= 4
-  error('Incorrect number of input arguments');
-end
-
-if (max (abs (nrbeval (u1, u1.knots(1)) - nrbeval (v1, v1.knots(1)))) > 1e-10 || ...
-    max (abs (nrbeval (u1, u1.knots(end)) - nrbeval (v2, v2.knots(1)))) > 1e-10 || ...
-    max (abs (nrbeval (u2, u2.knots(1)) - nrbeval (v1, v1.knots(end)))) > 1e-10 || ...
-    max (abs (nrbeval (u2, u2.knots(end)) - nrbeval (v2, v2.knots(end)))) > 1e-10)
-  error ('The four curves do not define a closed boundary')
-end
-
-
-
-r1 = nrbruled(u1, u2);
-r2 = nrbtransp(nrbruled(v1, v2));
-t  = nrb4surf(u1.coefs(:,1), u1.coefs(:,end), u2.coefs(:,1), u2.coefs(:,end));
-
-% raise all surfaces to a common degree
-du = max([r1.order(1), r2.order(1), t.order(1)]);
-dv = max([r1.order(2), r2.order(2), t.order(2)]);
-r1 = nrbdegelev(r1, [du - r1.order(1), dv - r1.order(2)]);
-r2 = nrbdegelev(r2, [du - r2.order(1), dv - r2.order(2)]);
-t  = nrbdegelev(t,  [du - t.order(1),  dv - t.order(2)]);
-
-% merge the knot vectors, to obtain a common knot vector
-
-% U knots
-k1 = r1.knots{1};
-k2 = r2.knots{1};
-k3 = t.knots{1};
-k = unique([k1 k2 k3]);
-n = length(k);
-kua = [];
-kub = [];
-kuc = [];
-for i = 1:n
-  i1 = length(find(k1 == k(i)));
-  i2 = length(find(k2 == k(i)));
-  i3 = length(find(k3 == k(i)));
-  m = max([i1, i2, i3]);
-  kua = [kua k(i)*ones(1,m-i1)];  
-  kub = [kub k(i)*ones(1,m-i2)];
-  kuc = [kuc k(i)*ones(1,m-i3)];
-end  
-
-% V knots
-k1 = r1.knots{2};
-k2 = r2.knots{2};
-k3 = t.knots{2};
-k = unique([k1 k2 k3]);
-n = length(k);
-kva = [];
-kvb = [];
-kvc = [];
-for i = 1:n
-  i1 = length(find(k1 == k(i)));
-  i2 = length(find(k2 == k(i)));
-  i3 = length(find(k3 == k(i)));
-  m = max([i1, i2, i3]);
-  kva = [kva k(i)*ones(1,m-i1)];  
-  kvb = [kvb k(i)*ones(1,m-i2)];
-  kvc = [kvc k(i)*ones(1,m-i3)];
-end  
-
-r1 = nrbkntins(r1, {kua, kva});
-r2 = nrbkntins(r2, {kub, kvb});
-t  = nrbkntins(t,  {kuc, kvc});
-
-% combine coefficient to construct Coons surface
-coefs(1,:,:) = r1.coefs(1,:,:) + r2.coefs(1,:,:) - t.coefs(1,:,:);
-coefs(2,:,:) = r1.coefs(2,:,:) + r2.coefs(2,:,:) - t.coefs(2,:,:);
-coefs(3,:,:) = r1.coefs(3,:,:) + r2.coefs(3,:,:) - t.coefs(3,:,:);
-coefs(4,:,:) = r1.coefs(4,:,:) + r2.coefs(4,:,:) - t.coefs(4,:,:);
-srf = nrbmak(coefs, r1.knots);
-
-end
-
-%!demo
-%! pnts = [ 0.0  3.0  4.5  6.5 8.0 10.0;
-%!          0.0  0.0  0.0  0.0 0.0  0.0; 
-%!          2.0  2.0  7.0  4.0 7.0  9.0];   
-%! crv1 = nrbmak(pnts, [0 0 0 1/3 0.5 2/3 1 1 1]);
-%!
-%! pnts= [ 0.0  3.0  5.0  8.0 10.0;
-%!         10.0 10.0 10.0 10.0 10.0;
-%!         3.0  5.0  8.0  6.0 10.0];
-%! crv2 = nrbmak(pnts, [0 0 0 1/3 2/3 1 1 1]);
-%!
-%! pnts= [ 0.0 0.0 0.0 0.0;
-%!         0.0 3.0 8.0 10.0;
-%!         2.0 0.0 5.0 3.0];
-%! crv3 = nrbmak(pnts, [0 0 0 0.5 1 1 1]);
-%!
-%! pnts= [ 10.0 10.0 10.0 10.0 10.0;
-%!         0.0   3.0  5.0  8.0 10.0;
-%!         9.0   7.0  7.0 10.0 10.0];
-%! crv4 = nrbmak(pnts, [0 0 0 0.25 0.75 1 1 1]);
-%!
-%! srf = nrbcoons(crv1, crv2, crv3, crv4);
-%!
-%! nrbplot(srf,[20 20]);
-%! title('Construction of a bilinearly blended Coons surface.');
-%! hold off
--- a/extra/nurbs/inst/nrbcrvderiveval.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,89 +0,0 @@
-% NRBCRVDERIVEVAL: Evaluate n-th order derivatives of a NURBS curve.
-%
-% usage: skl = nrbcrvderiveval (crv, u, d) 
-%
-%   INPUT:
-%
-%   crv : NURBS curve structure, see nrbmak
-%
-%   u   : parametric coordinate of the points where we compute the derivatives
-%
-%   d   : number of partial derivatives to compute
-%
-%
-%   OUTPUT: 
-%
-%   ck (i, j, l) = i-th component derived j-1 times at the l-th point.
-%
-% Adaptation of algorithm A4.2 from the NURBS book, pg127
-%
-%    Copyright (C) 2010 Carlo de Falco, Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-function ck = nrbcrvderiveval (crv, u, d) 
-  ck = arrayfun (@(x) nrbcrvderiveval__ (crv, x, d), u, 'UniformOutput', false);
-  ck = cat (3, ck{:});
-end
-
-function ck = nrbcrvderiveval__ (crv, u, d)
-
-  persistent nc;
-  if isempty (nc)
-    nc = [0 0 0 0 0; 
-          1 0 0 0 0;
-          2 1 0 0 0; 
-          3 3 1 0 0; 
-          4 6 4 1 0];
-  end
-
-  ck = zeros (3, d+1);
-  wders = curvederiveval (crv.number-1, crv.order-1, crv.knots, squeeze (crv.coefs(4, :)), u, d);
-
-  for idim = 1:3
-  
-    Aders = curvederiveval (crv.number-1, crv.order-1, crv.knots, squeeze (crv.coefs(idim, :)), u, d);
-       
-    ck(idim, 1) = Aders(1) / wders(1);
-    for k = 1:d
-      ck(idim, k+1) = (Aders(k+1) - sum (nc(k+1, 1:k) .* wders(2:k+1).' .* squeeze (ck(idim, k:-1:1))))  / wders(1);
-    end
-      
-  end
-
-end
-
-
-%!test
-%! knots = [0 0 0 1 1 1];
-%! coefs(:,1) = [0; 0; 0; 1];
-%! coefs(:,2) = [1; 0; 1; 1];
-%! coefs(:,3) = [1; 1; 1; 2];
-%! crv = nrbmak (coefs, knots);
-%! u = linspace (0, 1, 100);
-%! ck = nrbcrvderiveval (crv, u, 2); 
-%! w  = @(x) 1 + x.^2;
-%! dw = @(x) 2*x;
-%! F1 = @(x) (2*x - x.^2)./w(x);
-%! F2 = @(x) x.^2./w(x);
-%! F3 = @(x) (2*x - x.^2)./w(x);
-%! dF1 = @(x) (2 - 2*x)./w(x) - 2*(2*x - x.^2).*x./w(x).^2;
-%! dF2 = @(x) 2*x./w(x) - 2*x.^3./w(x).^2;
-%! dF3 = @(x) (2 - 2*x)./w(x) - 2*(2*x - x.^2).*x./w(x).^2;
-%! d2F1 = @(x) -2./w(x) - 2*x.*(2-2*x)./w(x).^2 - (8*x-6*x.^2)./w(x).^2 + 8*x.^2.*(2*x-x.^2)./w(x).^3;
-%! d2F2 = @(x) 2./w(x) - 4*x.^2./w(x).^2 - 6*x.^2./w(x).^2 + 8*x.^4./w(x).^3;
-%! d2F3 = @(x) -2./w(x) - 2*x.*(2-2*x)./w(x).^2 - (8*x-6*x.^2)./w(x).^2 + 8*x.^2.*(2*x-x.^2)./w(x).^3;
-%! assert ([F1(u); F2(u); F3(u)], squeeze(ck(:, 1, :)), 1e2*eps);
-%! assert ([dF1(u); dF2(u); dF3(u)], squeeze(ck(:, 2, :)), 1e2*eps);
-%! assert ([d2F1(u); d2F2(u); d2F3(u)], squeeze(ck(:, 3, :)), 1e2*eps);                                   
--- a/extra/nurbs/inst/nrbctrlplot.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,131 +0,0 @@
-function nrbctrlplot (nurbs)
-
-% NRBCTRLPLOT: Plot a NURBS entity along with its control points.
-% 
-% Calling Sequence:
-% 
-%   nrbctrlplot (nurbs)
-% 
-% INPUT:
-% 
-%   nurbs: NURBS curve, surface or volume, see nrbmak.
-% 
-% Example:
-%
-%   Plot the test curve and test surface with their control polygon and
-%    control net, respectively
-%
-%   nrbctrlplot(nrbtestcrv)
-%   nrbctrlplot(nrbtestsrf)
-%
-% See also:
-% 
-%   nrbkntplot
-%
-%    Copyright (C) 2011, 2012 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if (nargin < 1)
-  error ('nrbctrlplot: Need a NURBS to plot!');
-end
-
-% Default values
-light='on';
-cmap='summer';
-
-colormap (cmap);
-
-hold_flag = ishold;
-
-if (iscell (nurbs.knots))
-  if (size (nurbs.knots,2) == 3)
-    nsub = 100;
-    nrbplot (nurbs, [nsub nsub nsub], 'light', light, 'colormap', cmap);
-    hold on
-% Plot the control points
-    coefs = bsxfun (@rdivide, nurbs.coefs(1:3,:,:,:), nurbs.coefs(4,:,:,:));
-    coefs = reshape (coefs, 3, []);
-    plot3 (coefs(1,:), coefs(2,:), coefs(3,:), 'r.','MarkerSize',20);
-% Plot the control net
-    for ii = 1:size (nurbs.coefs, 2)
-     for jj = 1:size (nurbs.coefs, 3)
-      coefs = reshape (nurbs.coefs(1:3,ii,jj,:), 3, []);
-      weights = reshape (nurbs.coefs(4,ii,jj,:), 1, []);
-      plot3 (coefs(1,:)./weights, coefs(2,:)./weights, coefs(3,:)./weights,'k--')
-     end
-     for kk = 1:size (nurbs.coefs, 4)
-      coefs = reshape (nurbs.coefs(1:3,ii,:,kk), 3, []);
-      weights = reshape (nurbs.coefs(4,ii,:,kk), 1, []);
-      plot3 (coefs(1,:)./weights, coefs(2,:)./weights, coefs(3,:)./weights,'k--')
-     end
-    end
-    for jj = 1:size (nurbs.coefs, 3)
-     for kk = 1:size (nurbs.coefs, 4)
-      coefs = reshape (nurbs.coefs(1:3,:,jj,kk), 3, []);
-      weights = reshape (nurbs.coefs(4,:,jj,kk), 1, []);
-      plot3 (coefs(1,:)./weights, coefs(2,:)./weights, coefs(3,:)./weights,'k--')
-     end
-    end
-
-  elseif (size (nurbs.knots,2) == 2) % plot a NURBS surface
-
-    nsub = 100;
-    nrbplot (nurbs, [nsub nsub], 'light', light, 'colormap', cmap);
-    hold on
-
-% And plot the control net
-    for ii = 1:size (nurbs.coefs, 2)
-      coefs = reshape (nurbs.coefs(1:3,ii,:), 3, []);
-      weights = reshape (nurbs.coefs(4,ii,:), 1, []);
-      plot3 (coefs(1,:)./weights, coefs(2,:)./weights, coefs(3,:)./weights,'k--')
-      plot3 (coefs(1,:)./weights, coefs(2,:)./weights, coefs(3,:)./weights,'r.','MarkerSize',20)
-    end
-    for jj = 1:size (nurbs.coefs, 3)
-      coefs = reshape (nurbs.coefs(1:3,:,jj), 3, []);
-      weights = reshape (nurbs.coefs(4,:,jj), 1, []);
-      plot3 (coefs(1,:)./weights, coefs(2,:)./weights, coefs(3,:)./weights,'k--')
-      plot3 (coefs(1,:)./weights, coefs(2,:)./weights, coefs(3,:)./weights,'r.','MarkerSize',20)
-    end
-  end
-else % plot a NURBS curve
-  nsub = 1000;
-  nrbplot (nurbs, nsub);
-  hold on
-
-% And plot the control polygon
-  coefs = nurbs.coefs(1:3,:);
-  weights = nurbs.coefs(4,:);
-  plot3 (coefs(1,:)./weights, coefs(2,:)./weights, coefs(3,:)./weights,'k--')
-  plot3 (coefs(1,:)./weights, coefs(2,:)./weights, coefs(3,:)./weights,'r.','MarkerSize',20)
-end
-
-if (~hold_flag)
-  hold off
-end
-
-end
-
-%!demo
-%! crv = nrbtestcrv;
-%! nrbctrlplot(crv)
-%! title('Test curve')
-%! hold off
-
-%!demo
-%! srf = nrbtestsrf;
-%! nrbctrlplot(srf)
-%! title('Test surface')
-%! hold off
-
--- a/extra/nurbs/inst/nrbcylind.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-function surf = nrbcylind(height,radius,center,sang,eang)
-% 
-% NRBCYLIND: Construct a cylinder or cylindrical patch.
-% 
-% Calling Sequence:
-% 
-%   srf = nrbcylind()
-%   srf = nrbcylind(height)
-%   srf = nrbcylind(height,radius)
-%   srf = nrbcylind(height,radius,center)
-%   srf = nrbcylind(height,radius,center,sang,eang)
-% 
-% INPUT:
-% 
-%   height	: Height of the cylinder along the axis, default 1.0
-% 
-%   radius	: Radius of the cylinder, default 1.0
-% 
-%   center	: Center of the cylinder, default (0,0,0)
-% 
-%   sang	: Start angle relative to the origin, default 0.
-% 
-%   eang	: End angle relative to the origin, default 2*pi.
-%
-% OUTPUT: 
-%
-%   srf     : cylindrical surface patch 
-% 
-% Description:
-% 
-%   Construct a cylinder or cylindrical patch by extruding a circular arc.
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if nargin < 1
-  height = 1;
-end
-
-if nargin < 2
-  radius = 1;
-end
-
-if nargin < 3
-  center = [];
-end
-   
-if nargin < 5
-  sang = 0;
-  eang = 2*pi;
-end
-
-surf = nrbextrude(nrbcirc(radius,center,sang,eang),[0.0 0.0 height]);
-
-end
-
-%!demo
-%! srf = nrbcylind(3,1,[],deg2rad(270),deg2rad(180));
-%! nrbplot(srf,[20,20]);
-%! axis equal;
-%! title('Cylinderical section by extrusion of a circular arc.');
-%! hold off
\ No newline at end of file
--- a/extra/nurbs/inst/nrbdegelev.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,173 +0,0 @@
-function inurbs = nrbdegelev(nurbs, ntimes)
-% 
-% NRBDEGELEV: Elevate the degree of the NURBS curve, surface or volume.
-% 
-% Calling Sequence:
-% 
-%   ecrv = nrbdegelev(crv,utimes);
-%   esrf = nrbdegelev(srf,[utimes,vtimes]);
-%   evol = nrbdegelev(vol,[utimes,vtimes,wtimes]);
-% 
-% INPUT:
-% 
-%   crv		: NURBS curve, see nrbmak.
-% 
-%   srf		: NURBS surface, see nrbmak.
-% 
-%   vol		: NURBS volume, see nrbmak.
-% 
-%   utimes	: Increase the degree along U direction utimes.
-% 
-%   vtimes	: Increase the degree along V direction vtimes.
-% 
-%   wtimes	: Increase the degree along W direction vtimes.
-%
-% OUTPUT:
-%
-%   ecrv	: new NURBS structure for a curve with degree elevated.
-% 
-%   esrf	: new NURBS structure for a surface with degree elevated.
-% 
-%   evol	: new NURBS structure for a volume with degree elevated.
-% 
-% 
-% Description:
-% 
-%   Degree elevates the NURBS curve or surface. This function uses the
-%   B-Spline function bspdegelev, which interface to an internal 'C'
-%   routine.
-% 
-% Examples:
-% 
-%   Increase the NURBS surface twice along the V direction.
-%   esrf = nrbdegelev(srf, [0, 2]); 
-% 
-% See also:
-% 
-%   bspdegelev
-%
-%    Copyright (C) 2000 Mark Spink, 2010 Rafel Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if nargin < 2
-  error('Input argument must include the NURBS and degree increment.');
-end
-
-if ~isstruct(nurbs)
-  error('NURBS representation is not structure!');
-end
-
-if ~strcmp(nurbs.form,'B-NURBS')
-  error('Not a recognised NURBS representation');
-end
-
-degree = nurbs.order-1;
-
-if iscell(nurbs.knots)
- if size(nurbs.knots,2) == 3
-  % NURBS represents a volume
-  [dim,num1,num2,num3] = size(nurbs.coefs);
-
-  % Degree elevate along the w direction
-  if ntimes(3) == 0
-    coefs = nurbs.coefs;
-    knots{3} = nurbs.knots{3};
-  else
-    coefs = reshape(nurbs.coefs,4*num1*num2,num3);
-    [coefs,knots{3}] = bspdegelev(degree(3),coefs,nurbs.knots{3},ntimes(3));
-    num3 = size(coefs,2);
-    coefs = reshape(coefs,[4 num1 num2 num3]);
-  end
-
-  % Degree elevate along the v direction
-  if ntimes(2) == 0
-    knots{2} = nurbs.knots{2};
-  else
-    coefs = permute(coefs,[1 2 4 3]);
-    coefs = reshape(coefs,4*num1*num3,num2);
-    [coefs,knots{2}] = bspdegelev(degree(2),coefs,nurbs.knots{2},ntimes(2));
-    num2 = size(coefs,2);
-    coefs = reshape(coefs,[4 num1 num3 num2]);
-    coefs = permute(coefs,[1 2 4 3]);
-  end
-
-  % Degree elevate along the u direction
-  if ntimes(1) == 0
-    knots{1} = nurbs.knots{1};
-  else
-    coefs = permute(coefs,[1 3 4 2]);
-    coefs = reshape(coefs,4*num2*num3,num1);
-    [coefs,knots{1}] = bspdegelev(degree(1),coefs,nurbs.knots{1},ntimes(1));
-    coefs = reshape(coefs,[4 num2 num3 size(coefs,2)]);
-    coefs = permute(coefs,[1 4 2 3]);
-  end 
-
- elseif size(nurbs.knots,2) == 2
-  % NURBS represents a surface
-  [dim,num1,num2] = size(nurbs.coefs);
-
-  % Degree elevate along the v direction
-  if ntimes(2) == 0
-    coefs = nurbs.coefs;
-    knots{2} = nurbs.knots{2};
-  else
-    coefs = reshape(nurbs.coefs,4*num1,num2);
-    [coefs,knots{2}] = bspdegelev(degree(2),coefs,nurbs.knots{2},ntimes(2));
-    num2 = size(coefs,2);
-    coefs = reshape(coefs,[4 num1 num2]);
-  end
-
-  % Degree elevate along the u direction
-  if ntimes(1) == 0
-    knots{1} = nurbs.knots{1};
-  else
-    coefs = permute(coefs,[1 3 2]);
-    coefs = reshape(coefs,4*num2,num1);
-    [coefs,knots{1}] = bspdegelev(degree(1),coefs,nurbs.knots{1},ntimes(1));
-    coefs = reshape(coefs,[4 num2 size(coefs,2)]);
-    coefs = permute(coefs,[1 3 2]);
-  end 
- end
-else
-
-  % NURBS represents a curve
-  if isempty(ntimes)
-    coefs = nurbs.coefs;
-    knots = nurbs.knots;
-  else
-    [coefs,knots] = bspdegelev(degree,nurbs.coefs,nurbs.knots,ntimes);
-  end
-  
-end
-
-% construct new NURBS
-inurbs = nrbmak(coefs,knots);
-
-end
-
-%!demo
-%! crv = nrbtestcrv;
-%! plot(crv.coefs(1,:),crv.coefs(2,:),'bo')
-%! title('Degree elevation along test curve: curve and control polygons.');
-%! hold on;
-%! plot(crv.coefs(1,:),crv.coefs(2,:),'b--');
-%! nrbplot(crv,48);
-%!
-%! icrv = nrbdegelev(crv, 1);
-%!
-%! plot(icrv.coefs(1,:),icrv.coefs(2,:),'ro')
-%! plot(icrv.coefs(1,:),icrv.coefs(2,:),'r--');
-%! 
-%! hold off;
--- a/extra/nurbs/inst/nrbderiv.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,513 +0,0 @@
-function varargout = nrbderiv (nurbs)
-% 
-% NRBDERIV: Construct the first and second derivative representation of a
-%           NURBS curve, surface or volume.
-% 
-% Calling Sequence:
-% 
-%   ders = nrbderiv (nrb);
-%   [ders, ders2] = nrbderiv (nrb);
-% 
-% INPUT:
-% 
-%   nrb		: NURBS data structure, see nrbmak.
-%
-% OUTPUT:
-% 
-%   ders:  A data structure that represents the first
-% 		    derivatives of a NURBS curve, surface or volume.
-%   ders2: A data structure that represents the second
-% 		    derivatives of a NURBS curve, surface or volume.
-% 
-% Description:
-% 
-%   The derivatives of a B-Spline are themselves a B-Spline of lower degree,
-%   giving an efficient means of evaluating multiple derivatives. However,
-%   although the same approach can be applied to NURBS, the situation for
-%   NURBS is more complex. We have followed in this function the same idea
-%   that was already used for the first derivative in the function nrbderiv.
-%   The second derivative data structure can be evaluated later with the
-%   function nrbdeval.
-% 
-% See also:
-% 
-%       nrbdeval
-%
-% Copyright (C) 2000 Mark Spink
-% Copyright (C) 2010 Carlo de Falco
-% Copyright (C) 2010, 2011 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if (~isstruct(nurbs))
-  error('NURBS representation is not structure!');
-end
-
-if (~strcmp(nurbs.form,'B-NURBS'))
-  error('Not a recognised NURBS representation');
-end
-
-% We raise the degree to avoid errors in the computation of the second
-% derivative
-if (iscell (nurbs.knots))
-  ndim = size(nurbs.knots, 2);
-else
-  ndim = 1;
-end
-
-if (nargout == 2)
-  degelev  = max (2*ones(1, ndim) - (nurbs.order-1), 0);
-  nurbs    = nrbdegelev (nurbs, degelev);
-end
-
-degree = nurbs.order - 1;
-
-if (ndim == 3)
-% NURBS structure represents a volume
-  num1 = nurbs.number(1);
-  num2 = nurbs.number(2);
-  num3 = nurbs.number(3);
-
-% taking derivatives along the u direction
-  dknots = nurbs.knots;
-  dcoefs = permute (nurbs.coefs,[1 3 4 2]);
-  dcoefs = reshape (dcoefs,4*num2*num3,num1);
-  [dcoefs,dknots{1}] = bspderiv (degree(1),dcoefs,nurbs.knots{1});
-  dcoefs = permute (reshape (dcoefs,[4 num2 num3 size(dcoefs,2)]),[1 4 2 3]);
-  dnurbs{1} = nrbmak (dcoefs, dknots);
-
-  if (nargout == 2)
-% taking second derivative along the u direction (duu)
-    dknots2 = dknots;
-    dcoefs2 = permute (dcoefs, [1 3 4 2]);
-    dcoefs2 = reshape (dcoefs2, 4*num2*num3, []);
-    [dcoefs2, dknots2{1}] = bspderiv (degree(1)-1, dcoefs2, dknots{1});
-    dcoefs2 = permute (reshape (dcoefs2, 4, num2, num3, []), [1 4 2 3]);
-    dnurbs2{1,1} = nrbmak (dcoefs2, dknots2); 
-
-% taking second derivative along the v direction (duv and dvu)
-    dknots2 = dknots;
-    dcoefs2 = permute (dcoefs,[1 2 4 3]);
-    dcoefs2 = reshape (dcoefs2, 4*(num1-1)*num3, num2);
-    [dcoefs2, dknots2{2}] = bspderiv (degree(2), dcoefs2, dknots{2});
-    dcoefs2 = permute (reshape (dcoefs2, 4, num1-1, num3, []), [1 2 4 3]);
-    dnurbs2{1,2} = nrbmak (dcoefs2, dknots2);
-    dnurbs2{2,1} = dnurbs2{1,2};
-
-% taking second derivative along the w direction (duw and dwu)
-    dknots2 = dknots;
-    dcoefs2 = reshape (dcoefs, 4*(num1-1)*num2, num3);
-    [dcoefs2, dknots2{3}] = bspderiv (degree(3), dcoefs2, dknots{3});
-    dcoefs2 = reshape (dcoefs2, 4, num1-1, num2, []);
-    dnurbs2{1,3} = nrbmak (dcoefs2, dknots2);
-    dnurbs2{3,1} = dnurbs2{1,3};
-  end
-
-% taking derivatives along the v direction
-  dknots = nurbs.knots;
-  dcoefs = permute (nurbs.coefs,[1 2 4 3]);
-  dcoefs = reshape (dcoefs,4*num1*num3,num2);
-  [dcoefs,dknots{2}] = bspderiv (degree(2),dcoefs,nurbs.knots{2});
-  dcoefs = permute (reshape (dcoefs,[4 num1 num3 size(dcoefs,2)]),[1 2 4 3]);
-  dnurbs{2} = nrbmak (dcoefs, dknots);
-
-  if (nargout == 2)
-% taking second derivative along the v direction (dvv)
-    dknots2 = dknots;
-    dcoefs2 = permute (dcoefs,[1 2 4 3]);
-    dcoefs2 = reshape (dcoefs2, 4*num1*num3, num2-1);
-    [dcoefs2, dknots2{2}] = bspderiv (degree(2)-1, dcoefs2, dknots{2});
-    dcoefs2 = permute (reshape (dcoefs2, 4, num1, num3, []), [1 2 4 3]);
-    dnurbs2{2,2} = nrbmak (dcoefs2, dknots2);
-
-% taking second derivative along the w direction (dvw and dwv)
-    dknots2 = dknots;
-    dcoefs2 = reshape (dcoefs, 4*num1*(num2-1), num3);
-    [dcoefs2, dknots2{3}] = bspderiv (degree(3), dcoefs2, dknots{3});
-    dcoefs2 = reshape (dcoefs2, 4, num1, num2-1, []);
-    dnurbs2{2,3} = nrbmak (dcoefs2, dknots2);
-    dnurbs2{3,2} = dnurbs2{2,3};
-  end
-
-% taking derivatives along the w direction
-  dknots = nurbs.knots;
-  dcoefs = reshape (nurbs.coefs,4*num1*num2,num3);
-  [dcoefs,dknots{3}] = bspderiv (degree(3),dcoefs,nurbs.knots{3});
-  dcoefs = reshape (dcoefs,[4 num1 num2 size(dcoefs,2)]);
-  dnurbs{3} = nrbmak (dcoefs, dknots);
-
-  if (nargout == 2)
-% taking second derivative along the w direction (dww)
-    dknots2 = dknots;
-    dcoefs2 = reshape (dcoefs, 4*num1*num2, num3-1);
-    [dcoefs2, dknots2{3}] = bspderiv (degree(3)-1, dcoefs2, dknots{3});
-    dcoefs2 = reshape (dcoefs2, 4, num1, num2, []);
-    dnurbs2{3,3} = nrbmak (dcoefs2, dknots2);
-  end
-
-elseif (ndim == 2)
-% NURBS structure represents a surface
-  num1 = nurbs.number(1);
-  num2 = nurbs.number(2);
-
-% taking first derivative along the u direction
-  dknots = nurbs.knots;
-  dcoefs = permute (nurbs.coefs,[1 3 2]);
-  dcoefs = reshape (dcoefs,4*num2,num1);
-  [dcoefs,dknots{1}] = bspderiv (degree(1),dcoefs,nurbs.knots{1});
-  dcoefs = permute (reshape (dcoefs,[4 num2 size(dcoefs,2)]),[1 3 2]);
-  dnurbs{1} = nrbmak (dcoefs, dknots);
-
-  if (nargout == 2)
-% taking second derivative along the u direction (duu)
-    dknots2 = dknots;
-    dcoefs2 = permute (dcoefs, [1 3 2]);
-    dcoefs2 = reshape (dcoefs2, 4*num2, []);
-    [dcoefs2, dknots2{1}] = bspderiv (degree(1)-1, dcoefs2, dknots{1});
-    dcoefs2 = permute (reshape (dcoefs2, 4, num2, []), [1 3 2]);
-    dnurbs2{1,1} = nrbmak (dcoefs2, dknots2); 
-
-% taking second derivative along the v direction (duv and dvu)
-    dknots2 = dknots;
-    dcoefs2 = reshape (dcoefs, 4*(num1-1), num2);
-    [dcoefs2, dknots2{2}] = bspderiv (degree(2), dcoefs2, dknots{2});
-    dcoefs2 = reshape (dcoefs2, 4, num1-1, []);
-    dnurbs2{1,2} = nrbmak (dcoefs2, dknots2);
-    dnurbs2{2,1} = dnurbs2{1,2};
-  end
-
-% taking first derivative along the v direction
-  dknots = nurbs.knots;
-  dcoefs = reshape (nurbs.coefs,4*num1,num2);
-  [dcoefs,dknots{2}] = bspderiv (degree(2),dcoefs,nurbs.knots{2});
-  dcoefs = reshape (dcoefs,[4 num1 size(dcoefs,2)]);
-  dnurbs{2} = nrbmak (dcoefs, dknots);
-
-  if (nargout == 2)
-% taking second derivative along the v direction (dvv)
-    dknots2 = dknots;
-    dcoefs2 = reshape (dcoefs, 4*num1, num2-1);
-    [dcoefs2, dknots2{2}] = bspderiv (degree(2)-1, dcoefs2, dknots{2});
-    dcoefs2 = reshape (dcoefs2, 4, num1, []);
-    dnurbs2{2,2} = nrbmak (dcoefs2, dknots2);
-  end
-
-else
-  % NURBS structure represents a curve
-  [dcoefs,dknots] = bspderiv (degree, nurbs.coefs, nurbs.knots);
-  dnurbs = nrbmak (dcoefs, dknots);
-  if (nargout == 2)
-    [dcoefs2,dknots2] = bspderiv (degree-1, dcoefs, dknots);
-    dnurbs2 = nrbmak (dcoefs2, dknots2);
-  end
-end
-
-varargout{1} = dnurbs;
-if (nargout == 2)
-  varargout{2} = dnurbs2;
-  
-  if (iscell (dnurbs2))
-    dnurbs2 = [dnurbs2{:}];
-  end
-  if (any (arrayfun(@(x) any(isnan(x.coefs(:)) | isinf(x.coefs(:))), dnurbs2)))
-    warning ('nrbderiv:SecondDerivative', ...
-        ['The structure for the second derivative contains Inf and/or NaN coefficients, ' ...
-        'probably due to low continuity at repeated knots. This should not affect the ' ...
-        'computation of the second derivatives, except at those knots.'])
-  end
-end
-
-end
-
-%!demo
-%! crv = nrbtestcrv;
-%! nrbplot(crv,48);
-%! title('First derivatives along a test curve.');
-%! 
-%! tt = linspace(0.0,1.0,9);
-%! 
-%! dcrv = nrbderiv(crv);
-%! 
-%! [p1, dp] = nrbdeval(crv,dcrv,tt);
-%! 
-%! p2 = vecnorm(dp);
-%! 
-%! hold on;
-%! plot(p1(1,:),p1(2,:),'ro');
-%! h = quiver(p1(1,:),p1(2,:),p2(1,:),p2(2,:),0);
-%! set(h,'Color','black');
-%! hold off;
-
-%!demo
-%! srf = nrbtestsrf;
-%! p = nrbeval(srf,{linspace(0.0,1.0,20) linspace(0.0,1.0,20)});
-%! h = surf(squeeze(p(1,:,:)),squeeze(p(2,:,:)),squeeze(p(3,:,:)));
-%! set(h,'FaceColor','blue','EdgeColor','blue');
-%! title('First derivatives over a test surface.');
-%!
-%! npts = 5;
-%! tt = linspace(0.0,1.0,npts);
-%! dsrf = nrbderiv(srf);
-%! 
-%! [p1, dp] = nrbdeval(srf, dsrf, {tt, tt});
-%! 
-%! up2 = vecnorm(dp{1});
-%! vp2 = vecnorm(dp{2});
-%! 
-%! hold on;
-%! plot3(p1(1,:),p1(2,:),p1(3,:),'ro');
-%! h1 = quiver3(p1(1,:),p1(2,:),p1(3,:),up2(1,:),up2(2,:),up2(3,:));
-%! h2 = quiver3(p1(1,:),p1(2,:),p1(3,:),vp2(1,:),vp2(2,:),vp2(3,:));
-%! set(h1,'Color','black');
-%! set(h2,'Color','black');
-%! 
-%! hold off;
-
-%!test
-%! knots = [0 0 0 0.5 1 1 1];
-%! coefs(1,:) = [0 2 4 2];
-%! coefs(2,:) = [0 2 2 0];
-%! coefs(3,:) = [0 4 2 0];
-%! coefs(4,:) = [1 2 2 1];
-%! nrb = nrbmak (coefs, knots);
-%! [dnrb, dnrb2] = nrbderiv (nrb);
-%! x = linspace (0, 1, 10);
-%! [pnt, jac, hess] = nrbdeval (nrb, dnrb, dnrb2, x);
-%! w = -4*x.^2 + 4*x + 1;
-%! F = zeros (3,numel(x)); DF = zeros (3, numel(x)); D2F = zeros (3, numel(x));
-%! F(1,:) = (-4*x.*(x-2)./w) .* (x<0.5) + ((4*x - 5)./w + 3) .* (x>0.5);
-%! F(2,:) = (2-2./w);
-%! F(3,:) = (-4*x.*(5*x-4)./w) .* (x<0.5) + (-4*(x.^2 - 1)./w) .* (x>0.5);
-%! DF(1,:) = (8*(2*x.^2-x+1)./w.^2) .* (x<0.5) + (8*(2*x-3).*(x-1)./w.^2) .* (x>0.5);
-%! DF(2,:) = -8*(2*x-1)./w.^2;
-%! DF(3,:) = -(8*(2*x.^2+5*x-2)./w.^2) .* (x<0.5) - (8*(2*x.^2-3*x+2)./w.^2) .* (x>0.5);
-%! D2F(1,:) = 8*(16*x.^3-12*x.^2+24*x-9)./w.^3 .* (x<0.5) + 8*(16*x.^3-60*x.^2+72*x-29)./w.^3 .* (x>0.5);
-%! D2F(2,:) = -16*(12*x.^2-12*x+5)./w.^3;
-%! D2F(3,:) = -8*(16*x.^3+60*x.^2-48*x+21)./w.^3 .* (x<0.5) -8*(16*x.^3-36*x.^2+48*x-19)./w.^3 .* (x>0.5);
-%! assert (F, pnt, 1e3*eps)
-%! assert (DF, jac, 1e3*eps)
-%! assert (D2F, hess, 1e3*eps)
-
-%!test
-%! knots = {[0 0 0 1 1 1], [0 0 0 0.5 1 1 1]};
-%! coefs = ones (4,3,4);
-%! coefs(1,:,:) = reshape ([0 0 0 0; 1 1 1 1; 2 2 4 2], 1, 3, 4);
-%! coefs(2,:,:) = reshape ([0 1 2 3; 0 1 2 3; 0 1 4 3], 1, 3, 4);
-%! coefs(3,:,:) = reshape ([0 1 0 0; 0 0 0 0; 0 0 0 0], 1, 3, 4);
-%! coefs(4,:,:) = reshape ([1 1 1 1; 1 1 1 1; 1 1 2 1], 1, 3, 4);
-%! nrb = nrbmak (coefs, knots);
-%! [dnrb, dnrb2] = nrbderiv (nrb);
-%! X = linspace (0, 1, 4); Y = linspace (0, 1, 4);
-%! [pnt, jac, hess] = nrbdeval (nrb, dnrb, dnrb2, {X Y});
-%! [y, x] = meshgrid (X, Y);
-%! w = (2*x.^2.*y.^2 + 1) .* (y < 0.5) + (-6*x.^2.*y.^2 + 8*x.^2.*y - 2*x.^2 + 1) .* (y > 0.5);
-%! F = zeros ([3,size(x)]);
-%! F(1,:,:) = ((2*x - 2) ./w + 2) .* (y<0.5) + (2 + (2*x-2)./w) .* (y > 0.5);
-%! F(2,:,:) = (2 - (2*(y-1).^2)./w).*(y<0.5) + ...
-%!     ((-12*x.^2.*y.^2 + 16*x.^2.*y - 4*x.^2 + 2*y.^2 + 1)./w).*(y>0.5);
-%! F(3,:,:) = (-2*y.*(3*y - 2).*(x - 1).^2./w) .* (y<0.5) + ...
-%!     (2*(x - 1).^2.*(y - 1).^2./w) .* (y>0.5); 
-%! dFdu = zeros ([3,size(x)]);
-%! dFdu(1,:,:) = (((8*x - 4*x.^2).*y.^2 + 2)./w.^2).*(y<0.5) + ...
-%!     (((12*y.^2 - 16*y + 4).*x.^2 + (-24*y.^2 + 32*y - 8).*x + 2)./w.^2).*(y>0.5);
-%! dFdu(2,:,:) = (8*x.*y.^2.*(y - 1).^2./w.^2).*(y<0.5) + ...
-%!     ((4*x.*(3*y - 1).*(2*y.^2 - 1).*(y - 1))./w.^2).*(y>0.5);
-%! dFdu(3,:,:) = (-4*y.*(2.*x.*y.^2 + 1).*(3*y - 2).*(x - 1)./w.^2).*(y<0.5) + ...
-%!     ((-4*(x - 1).*(y - 1).^2.*(6*x.*y.^2 - 8*x.*y + 2*x - 1))./w.^2).*(y>0.5);
-%! dFdv = zeros ([3,size(x)]);
-%! dFdv(1,:,:) = (-8*x.^2.*y.*(x - 1)./w.^2).*(y<0.5) + ...
-%!     (8*x.^2.*(3*y - 2).*(x - 1)./w.^2).*(y>0.5);
-%! dFdv(2,:,:) = (-4*(2*y.*x.^2 + 1).*(y - 1)./w.^2).*(y<0.5) + ...
-%!     (((16*y.^2 - 20*y + 8).*x.^2 + 4*y)./w.^2).*(y>0.5);
-%! dFdv(3,:,:) = (-4*(x - 1).^2.*(2*x.^2.*y.^2 + 3*y - 1)./w.^2).*(y<0.5) + ...
-%!     (4*(x - 1).^2.*(y - 1).*(2*x.^2 - 2*x.^2.*y + 1)./w.^2).*(y>0.5);
-%! d2Fduu = zeros ([3, size(x)]);
-%! d2Fduu(1,:,:) = (-((48*x.^2 - 16*x.^3).*y.^4 + (24*x - 8).*y.^2)./w.^3).*(y<0.5) + ...
-%!     (((32*(3*y - 1).*(x - 1).*(y - 1))-(8*(3*y - 1).*(x - 3).*(y - 1).*w))./w.^3).*(y>0.5);
-%! d2Fduu(2,:,:) = (-(8*y.^2.*(6*x.^2.*y.^2 - 1).*(y - 1).^2)./w.^3).*(y<0.5) + ...
-%!     ((4*(3*y - 1).*(2*y.^2 - 1).*(y - 1).*(18*x.^2.*y.^2 - 24*x.^2.*y + 6*x.^2 + 1))./w.^3).*(y>0.5);
-%! d2Fduu(3,:,:) =  ((4*y.*(3*y - 2).*(8*x.^3.*y.^4 - 12*x.^2.*y.^4 + 6*x.^2.*y.^2 - 12*x.*y.^2 + 2*y.^2 - 1))./w.^3).*(y<0.5) + ...
-%!  ((4*(y - 1).^2.*(6*y.^2 - 8*y + 3) - 4*x.^3.*(y - 1).^2.*(72*y.^4 - 192*y.^3 + 176*y.^2 - 64*y + 8) + 4*x.^2.*(y - 1).^2.*(108*y.^4 - 288*y.^3 + 282*y.^2 - 120*y + 18) - 4*x.*(y - 1).^2.*(36*y.^2 - 48*y + 12))./w.^3) .* (y>0.5);
-%! d2Fdvv = zeros ([3, size(x)]);
-%! d2Fdvv(1,:,:) = (8*x.^2.*(6*x.^2.*y.^2 - 1).*(x - 1)./w.^3) .* (y<0.5) + ...
-%!      (8*x.^2.*(x - 1).*(54*x.^2.*y.^2 - 72*x.^2.*y + 26*x.^2 + 3)./w.^3) .* (y>0.5);
-%! d2Fdvv(2,:,:) =  (-((48*y.^2 - 32*y.^3).*x.^4 + (- 24*y.^2 + 48*y - 8).*x.^2 + 4)./w.^3) .*(y<0.5) + ...
-%!       (((192*y.^3 - 360*y.^2 + 288*y - 88).*x.^4 + (72*y.^2 - 28).*x.^2 + 4)./w.^3) .* (y>0.5);
-%! d2Fdvv(3,:,:) =  (4*(x - 1).^2.*(8*x.^4.*y.^3 + 18*x.^2.*y.^2 - 12*x.^2.*y - 3))./w.^3 .* (y<0.5) + ...
-%!     ((4*(x - 1).^2.*(24*x.^4 + 18*x.^2 + 1) + 4*y.^2.*(72*x.^4 + 18*x.^2).*(x - 1).^2 - 96*x.^4.*y.^3.*(x - 1).^2 - 4*y.*(72*x.^4 + 36*x.^2).*(x - 1).^2)./w.^3) .* (y>0.5);
-%! d2Fduv = zeros ([3, size(x)]);
-%! d2Fduv(1,:,:) = (-(y.^3.*(32*x.^3 - 16*x.^4) - y.*(16*x - 24*x.^2))./w.^3) .* (y<0.5) + ...
-%!     (-(-8*(3*y - 2).*(6*y.^2 - 8*y + 2).*x.^4 + 8*(3*y - 2).*(12*y.^2 - 16*y + 4).*x.^3 + (48 - 72*y).*x.^2 + (48*y - 32).*x)./w.^3) .* (y>0.5);
-%! d2Fduv(2,:,:) = (16*x.*y.*(y - 1).*(2*x.^2.*y.^2 + 2*y - 1)./w.^3) .* (y<0.5) + ...
-%!     (-(8*x.*(4*y.^2 - 5*y + 2))./w.^2 + (16*x.*(3*y - 2).*(2*y.^2 - 1))./w.^3) .* (y>0.5);
-%! d2Fduv(3,:,:) = (-(8*(x - 1).*(4*x.^3.*y.^4 - 6*x.^2.*y.^3 + 6*x.^2.*y.^2 + 12*x.*y.^3 - 6*x.*y.^2 + 3*y - 1))./w.^3) .* (y<0.5) + ...
-%!     ((8*(x - 1).*(y - 1).*(12*x.^3.*y.^3 - 28*x.^3.*y.^2 + 20*x.^3.*y - 4*x.^3 + 6*x.^2.*y.^2 - 12*x.^2.*y + 6*x.^2 - 12*x.*y.^2 + 18*x.*y - 6*x + 1))./w.^3) .* (y>0.5);
-%! assert (F, pnt, 1e3*eps)
-%! assert (dFdu, jac{1}, 1e3*eps)
-%! assert (dFdv, jac{2}, 1e3*eps)
-%! assert (d2Fduu, hess{1,1}, 1e3*eps)
-%! assert (d2Fduv, hess{1,2}, 1e3*eps)
-%! assert (d2Fduv, hess{2,1}, 1e3*eps)
-%! assert (d2Fdvv, hess{2,2}, 1e3*eps)
-
-%!test
-%! knots = {[0 0 0 1 1 1], [0 0 0 0.5 1 1 1]};
-%! coefs = ones (4,3,4);
-%! coefs(1,:,:) = reshape ([0 0 0 0; 1 1 1 1; 2 2 4 2], 1, 3, 4);
-%! coefs(2,:,:) = reshape ([0 1 2 3; 0 1 2 3; 0 1 4 3], 1, 3, 4);
-%! coefs(3,:,:) = reshape ([0 1 0 0; 0 0 0 0; 0 0 0 0], 1, 3, 4);
-%! coefs(4,:,:) = reshape ([1 1 1 1; 1 1 1 1; 1 1 2 1], 1, 3, 4);
-%! nrb = nrbmak (coefs, knots);
-%! nrb = nrbdegelev (nrbextrude (nrb, [0.4 0.6 2]), [0 0 1]);
-%! nrb.coefs(4,2,3,3) = 1.5;
-%! [dnrb, dnrb2] = nrbderiv (nrb);
-%! X = linspace (0, 1, 4); Y = linspace (0, 1, 4); Z = linspace (0, 1, 4);
-%! [pnt, jac, hess] = nrbdeval (nrb, dnrb, dnrb2, {X Y Z});
-%! [y, x, z] = meshgrid (X, Y, Z);
-%! w = (-2*x.^2.*y.^2.*z.^2 + 2*x.^2.*y.^2 + 2*x.*y.^2.*z.^2 + 1) .* (y < 0.5) + ...
-%!     (6*x.^2.*y.^2.*z.^2 - 6*x.^2.*y.^2 - 8*x.^2.*y.*z.^2 + 8*x.^2.*y + 2*x.^2.*z.^2 - 2*x.^2 - 6*x.*y.^2.*z.^2 + 8*x.*y.*z.^2 - 2*x.*z.^2 + 1) .* (y > 0.5);
-%! F = zeros ([3,size(x)]);
-%! F(1,:,:,:) = ((10*x + 20*x.^2.*y.^2 + z.*(4*x.^2.*y.^2 + 2))./(5*w)) .* (y<0.5) + ...
-%!     (60*x.^2.*y.^2 - 10*x + z.*(12*x.^2.*y.^2 - 16*x.^2.*y + 4*x.^2 - 2) - 80*x.^2.*y + 20*x.^2)./(-5*w) .* (y > 0.5);
-%! F(2,:,:,:) = ((20*y + 20*x.^2.*y.^2 + z.*(6*x.^2.*y.^2 + 3) - 10*y.^2)./(5*w)).*(y<0.5) + ...
-%!     ((60*x.^2.*y.^2 + z.*(18*x.^2.*y.^2 - 24*x.^2.*y + 6*x.^2 - 3) - 80*x.^2.*y + 20*x.^2 - 10*y.^2 - 5)./(-5*w)).*(y>0.5);
-%! F(3,:,:,:) = ((4*y - 6*x.^2.*y.^2 + z.*(4*x.^2.*y.^2 + 2) - 8*x.*y + 12*x.*y.^2 + 4*x.^2.*y - 6*y.^2)./w) .* (y<0.5) + ...
-%!     ((2*z - 4*y - 4*x + 2*x.^2.*y.^2 + 8*x.*y - 4*x.*y.^2 - 4*x.^2.*y - 4*x.^2.*z + 2*x.^2 + 2*y.^2 + 16*x.^2.*y.*z - 12*x.^2.*y.^2.*z + 2)./w) .* (y>0.5); 
-%! dFdu = zeros ([3,size(x)]);
-%! dFdu(1,:,:,:) = ((x.*((8*y.^2.*z.^3)/5 + 8*y.^2) - (4*y.^2.*z.^3)/5 + x.^2.*(z.^2.*(8*y.^4 + 4*y.^2) + (8*y.^4.*z.^3)/5 - 4*y.^2) + 2)./w.^2).*(y<0.5) + ...
-%!     ((z.^3.*(x.^2.*((72*y.^4)/5 - (192*y.^3)/5 + (176*y.^2)/5 - (64*y)/5 + 8/5) - (16*y)/5 - x.*((24*y.^2)/5 - (32*y)/5 + 8/5) + (12*y.^2)/5 + 4/5) - x.*(24*y.^2 - 32*y + 8) + x.^2.*(12*y.^2 - 16*y + 4) + x.^2.*z.^2.*(72*y.^4 - 192*y.^3 + 164*y.^2 - 48*y + 4) + 2)./w.^2).*(y>0.5);
-%! dFdu(2,:,:,:) = ((z.^2.*(8*x.^2.*y.^4 - y.^2.*(8*y - 4*y.^2) + (2*x.*y.^2.*(40*y - 20*y.^2))/5) + z.^3.*((12*x.^2.*y.^4)/5 + (12*x.*y.^2)/5 - (6*y.^2)/5) + (2*x.*y.^2.*(20*y.^2 - 40*y + 20))/5)./w.^2).*(y<0.5) + ...
-%!     (((2*(3*y.^2 - 4*y + 1).*(18*x.^2.*y.^2 - 24*x.^2.*y + 6*x.^2 - 6*x + 3).*z.^3)/5 + (2*(3*y.^2 - 4*y + 1).*(60*x.^2.*y.^2 - 80*x.^2.*y + 20*x.^2 - 20*x.*y.^2 - 10*x + 10*y.^2 + 5).*z.^2)/5 - (2*(10*x - 20*x.*y.^2).*(3*y.^2 - 4*y + 1))/5)./w.^2).*(y>0.5);
-%! dFdu(3,:,:,:) = ((4*y.*(3*y - 2) + z.^3.*(8*x.^2.*y.^4 + 8*x.*y.^2 - 4*y.^2) - z.^2.*(4*y.*(2*y.^2 - 3*y.^3).*x.^2 - 4*y.*(4*y.^2 - 6*y.^3).*x + 4*y.*(2*y.^2 - 3*y.^3)) + 4*x.^2.*y.*(4*y.^2 - 6*y.^3) - 4*x.*y.*(- 6*y.^3 + 4*y.^2 + 3*y - 2)) ./w.^2).*(y<0.5) + ...
-%!     ((z.^2.*(4*(y - 1).*(3*y.^3 - 7*y.^2 + 5*y - 1).*x.^2 - 4*(y - 1).*(6*y.^3 - 14*y.^2 + 10*y - 2).*x + 4*(y - 1).*(3*y.^3 - 7*y.^2 + 5*y - 1)) - 4*(y - 1).^2 + z.^3.*(4*(y - 1).*(18*y.^3 - 30*y.^2 + 14*y - 2).*x.^2 - 4*(6*y - 2).*(y - 1).*x + 4*(3*y - 1).*(y - 1)) + 4*x.*(y - 1).*(6*y.^3 - 14*y.^2 + 11*y - 3) - 4*x.^2.*(y - 1).*(6*y.^3 - 14*y.^2 + 10*y - 2))./w.^2) .* (y > 0.5); 
-%! dFdv = zeros ([3,size(x)]);
-%! dFdv(1,:,:,:) = ((8*x.*y.*(x - 1).*(z.^3 + 5*x.*z.^2 - 5*x))/5./w.^2).*(y<0.5) + ...
-%!     (-(8*x.*(3*y - 2).*(x - 1).*(z.^3 + 5*x.*z.^2 - 5*x))/5./w.^2).*(y>0.5);
-%! dFdv(2,:,:,:) = (-((8*x.*z.^2 - x.^2.*(8*z.^2 - 8)).*y.^2 + ((12*x.*z.^3)/5 - x.^2.*((12*z.^3)/5 + 8) + 4).*y - 4)./w.^2).*(y<0.5) + ...
-%!     ((4*y + z.^3.*(x.*((36*y)/5 - 24/5) - x.^2.*((36*y)/5 - 24/5)) + z.^2.*(x.*(16*y.^2 + 4*y - 8) - x.^2.*(16*y.^2 + 4*y - 8)) + x.^2.*(16*y.^2 - 20*y + 8))./w.^2).*(y>0.5);
-%! dFdv(3,:,:,:) = ((4*(x - 1).^2 - y.*(4*(3*x - 3).*(x - 1) - 8*x.*z.^3.*(x - 1)) + y.^2.*(4*(x - 1).*(2*x.^3 - 4*x.^2 + 2*x).*z.^2 + 4*(2*x.^2 - 2*x.^3).*(x - 1)))./w.^2).*(y<0.5) + ...
-%!     ((y.^2.*(4*(x - 1).*(2*x.^3 - 4*x.^2 + 2*x).*z.^2 + 4*(2*x.^2 - 2*x.^3).*(x - 1)) - 4*(x - 1).*(2*x.^3 - 2*x.^2 + x - 1) - y.*(24*x.*(x - 1).*z.^3 + 4*(x - 1).*(4*x.^3 - 8*x.^2 + 4*x).*z.^2 - 4*(x - 1).*(4*x.^3 - 4*x.^2 + x - 1)) + 16*x.*z.^3.*(x - 1) + 4*z.^2.*(x - 1).*(2*x.^3 - 4*x.^2 + 2*x))./w.^2).*(y>0.5);
-%! dFdw = zeros ([3,size(x)]);
-%! dFdw(1,:,:,:) = ((4*x.^2.*y.^2 + 2)./(- 10*x.^2.*y.^2.*z.^2 + 10*x.^2.*y.^2 + 10*x.*y.^2.*z.^2 + 5) - ((20*x.*y.^2.*z - 20*x.^2.*y.^2.*z).*(10*x + 20*x.^2.*y.^2 + z.*(4*x.^2.*y.^2 + 2)))./(5*w).^2).*(y<0.5) + ...
-%!     ((12*x.^2.*y.^2 - 16*x.^2.*y + 4*x.^2 - 2)./(- 30*x.^2.*y.^2.*z.^2 + 30*x.^2.*y.^2 + 40*x.^2.*y.*z.^2 - 40*x.^2.*y - 10*x.^2.*z.^2 + 10*x.^2 + 30*x.*y.^2.*z.^2 - 40*x.*y.*z.^2 + 10*x.*z.^2 - 5) - ((60*x.^2.*y.^2 - 10*x + z.*(12*x.^2.*y.^2 - 16*x.^2.*y + 4*x.^2 - 2) - 80*x.^2.*y + 20*x.^2).*(- 60*z.*x.^2.*y.^2 + 80*z.*x.^2.*y - 20*z.*x.^2 + 60*z.*x.*y.^2 - 80*z.*x.*y + 20*z.*x))./(5*w).^2).*(y>0.5);
-%! dFdw(2,:,:,:) = ((6*x.^2.*y.^2 + 3)./(- 10*x.^2.*y.^2.*z.^2 + 10*x.^2.*y.^2 + 10*x.*y.^2.*z.^2 + 5) - ((20*x.*y.^2.*z - 20*x.^2.*y.^2.*z).*(20*y + 20*x.^2.*y.^2 + z.*(6*x.^2.*y.^2 + 3) - 10*y.^2))./(5*w).^2).*(y<0.5) + ...
-%!     ((18*x.^2.*y.^2 - 24*x.^2.*y + 6*x.^2 - 3)./(- 30*x.^2.*y.^2.*z.^2 + 30*x.^2.*y.^2 + 40*x.^2.*y.*z.^2 - 40*x.^2.*y - 10*x.^2.*z.^2 + 10*x.^2 + 30*x.*y.^2.*z.^2 - 40*x.*y.*z.^2 + 10*x.*z.^2 - 5) - ((- 60*z.*x.^2.*y.^2 + 80*z.*x.^2.*y - 20*z.*x.^2 + 60*z.*x.*y.^2 - 80*z.*x.*y + 20*z.*x).*(60*x.^2.*y.^2 + z.*(18*x.^2.*y.^2 - 24*x.^2.*y + 6*x.^2 - 3) - 80*x.^2.*y + 20*x.^2 - 10*y.^2 - 5))./(5*w).^2).*(y>0.5);
-%! dFdw(3,:,:,:) = ((4*x.^2.*y.^2 + 2)./(2*x.^2.*y.^2 - z.^2.*(2*x.^2.*y.^2 - 2*x.*y.^2) + 1) + (2*z.*(2*x.^2.*y.^2 - 2*x.*y.^2).*(4*y - 6*x.^2.*y.^2 + z.*(4*x.^2.*y.^2 + 2) - 8*x.*y + 12*x.*y.^2 + 4*x.^2.*y - 6*y.^2))./w.^2).*(y<0.5) + ...
-%!     ((12*x.^2.*y.^2 - 16*x.^2.*y + 4*x.^2 - 2)./(6*x.^2.*y.^2 + z.^2.*(- 6*x.^2.*y.^2 + 8*x.^2.*y - 2*x.^2 + 6*x.*y.^2 - 8*x.*y + 2*x) - 8*x.^2.*y + 2*x.^2 - 1) + (2*z.*(- 6*x.^2.*y.^2 + 8*x.^2.*y - 2*x.^2 + 6*x.*y.^2 - 8*x.*y + 2*x).*(2*z - 4*y - 4*x + 2*x.^2.*y.^2 + 8*x.*y - 4*x.*y.^2 - 4*x.^2.*y - 4*x.^2.*z + 2*x.^2 + 2*y.^2 + 16*x.^2.*y.*z - 12*x.^2.*y.^2.*z + 2))./w.^2).*(y>0.5);
-%! d2Fduu = zeros ([3, size(x)]);
-%! d2Fduu(1,:,:,:) = (((8*y.^2.*z.^3)/5 + 2*x.*(z.^2.*(8*y.^4 + 4*y.^2) + (8*y.^4.*z.^3)/5 - 4*y.^2) + 8*y.^2)./w.^2 - (2*(2*y.^2.*z.^2 + 4*x.*y.^2 - 4*x.*y.^2.*z.^2).*(x.*((8*y.^2.*z.^3)/5 + 8*y.^2) - (4*y.^2.*z.^3)/5 + x.^2.*(z.^2.*(8*y.^4 + 4*y.^2) + (8*y.^4.*z.^3)/5 - 4*y.^2) + 2))./w.^3).*(y<0.5) + ...
-%!     ((32*y + 2*x.*(12*y.^2 - 16*y + 4) + z.^3.*((32*y)/5 + 2*x.*((72*y.^4)/5 - (192*y.^3)/5 + (176*y.^2)/5 - (64*y)/5 + 8/5) - (24*y.^2)/5 - 8/5) - 24*y.^2 + 2*x.*z.^2.*(72*y.^4 - 192*y.^3 + 164*y.^2 - 48*y + 4) - 8)./w.^2 - (2*(z.^3.*(x.^2.*((72*y.^4)/5 - (192*y.^3)/5 + (176*y.^2)/5 - (64*y)/5 + 8/5) - (16*y)/5 - x.*((24*y.^2)/5 - (32*y)/5 + 8/5) + (12*y.^2)/5 + 4/5) - x.*(24*y.^2 - 32*y + 8) + x.^2.*(12*y.^2 - 16*y + 4) + x.^2.*z.^2.*(72*y.^4 - 192*y.^3 + 164*y.^2 - 48*y + 4) + 2).*(4*x + 6*y.^2.*z.^2 - 16*x.*y + 12*x.*y.^2 - 4*x.*z.^2 - 8*y.*z.^2 + 2*z.^2 + 16*x.*y.*z.^2 - 12*x.*y.^2.*z.^2))./(-w).^3).*(y>0.5);
-%! d2Fduu(2,:,:,:) = ((z.^3.*((24*x.*y.^4)/5 + (12*y.^2)/5) + (2*y.^2.*(20*y.^2 - 40*y + 20))/5 + z.^2.*((2*y.^2.*(40*y - 20*y.^2))/5 + 16*x.*y.^4))./w.^2 - (2*(z.^2.*(8*x.^2.*y.^4 - y.^2.*(8*y - 4*y.^2) + (2*x.*y.^2.*(40*y - 20*y.^2))/5) + z.^3.*((12*x.^2.*y.^4)/5 + (12*x.*y.^2)/5 - (6*y.^2)/5) + (2*x.*y.^2.*(20*y.^2 - 40*y + 20))/5).*(2*y.^2.*z.^2 + 4*x.*y.^2 - 4*x.*y.^2.*z.^2))./w.^3).*(y<0.5) + ...
-%!     (((2*(3*y.^2 - 4*y + 1).*(36*x.*y.^2 - 48*x.*y + 12*x - 6).*z.^3)/5 - (2*(3*y.^2 - 4*y + 1).*(160*x.*y - 40*x - 120*x.*y.^2 + 20*y.^2 + 10).*z.^2)/5 + (2*(20*y.^2 - 10).*(3*y.^2 - 4*y + 1))/5)./w.^2 - (2*((2*(3*y.^2 - 4*y + 1).*(18*x.^2.*y.^2 - 24*x.^2.*y + 6*x.^2 - 6*x + 3).*z.^3)/5 + (2*(3*y.^2 - 4*y + 1).*(60*x.^2.*y.^2 - 80*x.^2.*y + 20*x.^2 - 20*x.*y.^2 - 10*x + 10*y.^2 + 5).*z.^2)/5 - (2*(10*x - 20*x.*y.^2).*(3*y.^2 - 4*y + 1))/5).*(4*x + 6*y.^2.*z.^2 - 16*x.*y + 12*x.*y.^2 - 4*x.*z.^2 - 8*y.*z.^2 + 2*z.^2 + 16*x.*y.*z.^2 - 12*x.*y.^2.*z.^2))./(-w).^3).*(y>0.5);
-%! d2Fduu(3,:,:,:) =  (((16*x.*y.^4 + 8*y.^2).*z.^3 + (4*y.*(4*y.^2 - 6*y.^3) - 8*x.*y.*(2*y.^2 - 3*y.^3)).*z.^2 - 4*y.*(- 6*y.^3 + 4*y.^2 + 3*y - 2) + 8*x.*y.*(4*y.^2 - 6*y.^3))./w.^2 - (2*(2*y.^2.*z.^2 + 4*x.*y.^2 - 4*x.*y.^2.*z.^2).*(4*y.*(3*y - 2) + z.^3.*(8*x.^2.*y.^4 + 8*x.*y.^2 - 4*y.^2) - z.^2.*(4*y.*(2*y.^2 - 3*y.^3).*x.^2 - 4*y.*(4*y.^2 - 6*y.^3).*x + 4*y.*(2*y.^2 - 3*y.^3)) + 4*x.^2.*y.*(4*y.^2 - 6*y.^3) - 4*x.*y.*(- 6*y.^3 + 4*y.^2 + 3*y - 2)))./w.^3).*(y<0.5) + ...
-%!  (-((4*(6*y - 2).*(y - 1) - 8*x.*(y - 1).*(18*y.^3 - 30*y.^2 + 14*y - 2)).*z.^3 + (4*(y - 1).*(6*y.^3 - 14*y.^2 + 10*y - 2) - 8*x.*(y - 1).*(3*y.^3 - 7*y.^2 + 5*y - 1)).*z.^2 - 4*(y - 1).*(6*y.^3 - 14*y.^2 + 11*y - 3) + 8*x.*(y - 1).*(6*y.^3 - 14*y.^2 + 10*y - 2))./w.^2 - (2*(z.^2.*(4*(y - 1).*(3*y.^3 - 7*y.^2 + 5*y - 1).*x.^2 - 4*(y - 1).*(6*y.^3 - 14*y.^2 + 10*y - 2).*x + 4*(y - 1).*(3*y.^3 - 7*y.^2 + 5*y - 1)) - 4*(y - 1).^2 + z.^3.*(4*(y - 1).*(18*y.^3 - 30*y.^2 + 14*y - 2).*x.^2 - 4*(6*y - 2).*(y - 1).*x + 4*(3*y - 1).*(y - 1)) + 4*x.*(y - 1).*(6*y.^3 - 14*y.^2 + 11*y - 3) - 4*x.^2.*(y - 1).*(6*y.^3 - 14*y.^2 + 10*y - 2)).*(4*x + 6*y.^2.*z.^2 - 16*x.*y + 12*x.*y.^2 - 4*x.*z.^2 - 8*y.*z.^2 + 2*z.^2 + 16*x.*y.*z.^2 - 12*x.*y.^2.*z.^2))./(-w).^3) .* (y>0.5);
-%! d2Fduv = zeros ([3, size(x)]);
-%! d2Fduv(1,:,:,:) = ((((8.*x.^2.*(6.*z.^3 - 6.*z.^5))/5 + (8.*x.^4.*(10.*z.^4 - 20.*z.^2 + 10))/5 - (8.*x.^3.*(- 4.*z.^5 + 10.*z.^4 + 4.*z.^3 - 30.*z.^2 + 20))/5 + (16.*x.*z.^5)/5).*y.^3 + ((8.*x.*(2.*z.^3 - 10.*z.^2 + 10))/5 + (8.*x.^2.*(15.*z.^2 - 15))/5 - (8.*z.^3)/5).*y)./w.^3) .* (y<0.5) + ...
-%!     (-(x.^4.*((8.*(3.*y - 2).*(30.*y.^2 - 40.*y + 10).*z.^4)/5 - (8.*(3.*y - 2).*(60.*y.^2 - 80.*y + 20).*z.^2)/5 + (8.*(3.*y - 2).*(30.*y.^2 - 40.*y + 10))/5) - x.^3.*(- (8.*(3.*y - 2).*(12.*y.^2 - 16.*y + 4).*z.^5)/5 + (8.*(3.*y - 2).*(30.*y.^2 - 40.*y + 10).*z.^4)/5 + (8.*(3.*y - 2).*(12.*y.^2 - 16.*y + 4).*z.^3)/5 - (8.*(3.*y - 2).*(90.*y.^2 - 120.*y + 30).*z.^2)/5 + (8.*(3.*y - 2).*(60.*y.^2 - 80.*y + 20))/5) + z.^3.*((24.*y)/5 - 16/5) - x.^2.*((8.*(3.*y - 2).*(18.*y.^2 - 24.*y + 6).*z.^5)/5 - (8.*(3.*y - 2).*(18.*y.^2 - 24.*y + 6).*z.^3)/5 + (72.*y - 48).*z.^2 - 72.*y + 48) + x.*((8.*(3.*y - 2).*(6.*y.^2 - 8.*y + 2).*z.^5)/5 + (32/5 - (48.*y)/5).*z.^3 + (48.*y - 32).*z.^2 - 48.*y + 32))./(-w).^3) .* (y>0.5);
-%! d2Fduv(2,:,:,:) = ((((4.*x.^2.*(60.*z.^2 - 60.*z.^4))/5 + (4.*x.^3.*(40.*z.^4 - 80.*z.^2 + 40))/5 + 16.*x.*z.^4).*y.^4 + ((4.*x.^2.*(18.*z.^3 - 18.*z.^5))/5 + (4.*x.^3.*(12.*z.^5 - 12.*z.^3 + 40.*z.^2 - 40))/5 + (4.*x.*(6.*z.^5 - 40.*z.^2 + 40))/5 + 16.*z.^2).*y.^3 + ((4.*x.*(60.*z.^2 - 60))/5 - 24.*z.^2).*y.^2 + ((4.*x.*(6.*z.^3 + 20))/5 - (12.*z.^3)/5).*y)./w.^3) .* (y<0.5) + ...
-%!     ((z.^3.*(((432.*y.^3)/5 - (864.*y.^2)/5 + (528.*y)/5 - 96/5).*x.^3 + (- (648.*y.^3)/5 + (1296.*y.^2)/5 - (792.*y)/5 + 144/5).*x.^2 + ((72.*y)/5 - 48/5).*x - (36.*y)/5 + 24/5) - x.^3.*(192.*y.^4 - 496.*y.^3 + 480.*y.^2 - 208.*y + 32) + z.^4.*((- 192.*y.^4 + 208.*y.^3 + 96.*y.^2 - 144.*y + 32).*x.^3 + (288.*y.^4 - 312.*y.^3 - 144.*y.^2 + 216.*y - 48).*x.^2 + (- 96.*y.^4 + 104.*y.^3 + 48.*y.^2 - 72.*y + 16).*x) + x.*(- 96.*y.^3 + 96.*y.^2 + 8.*y - 16) + z.^2.*(x.^2.*(- 288.*y.^4 + 312.*y.^3 + 144.*y.^2 - 216.*y + 48) - 20.*y - x.^3.*(- 384.*y.^4 + 704.*y.^3 - 384.*y.^2 + 64.*y) + x.*(96.*y.^3 - 96.*y.^2 + 40.*y - 16) + 48.*y.^2 - 48.*y.^3 + 8) - z.^5.*(((432.*y.^3)/5 - (864.*y.^2)/5 + (528.*y)/5 - 96/5).*x.^3 + (- (648.*y.^3)/5 + (1296.*y.^2)/5 - (792.*y)/5 + 144/5).*x.^2 + ((216.*y.^3)/5 - (432.*y.^2)/5 + (264.*y)/5 - 48/5).*x))./(-w).^3) .* (y>0.5);
-%! d2Fduv(3,:,:,:) = (((x.^2.*(48.*z.^2 - 48.*z.^4) - x.^4.*(16.*z.^4 - 48.*z.^2 + 32) + x.^3.*(48.*z.^4 - 96.*z.^2 + 32) + 16.*x.*z.^4).*y.^4 + (x.^2.*(- 48.*z.^5 + 48.*z.^3 + 144.*z.^2 - 144) - x.^3.*(- 32.*z.^5 + 32.*z.^3 + 48.*z.^2 - 48) + x.*(16.*z.^5 - 144.*z.^2 + 96) + 48.*z.^2).*y.^3 + (x.*(96.*z.^2 - 48) + x.^3.*(48.*z.^2 - 48) - x.^2.*(120.*z.^2 - 96) - 24.*z.^2).*y.^2 + (x.*(16.*z.^3 - 24) - 8.*z.^3 + 24).*y + 8.*x - 8)./w.^3) .* (y<0.5) + ...
-%!     ((8.*y - x.^4.*(96.*y.^4 - 320.*y.^3 + 384.*y.^2 - 192.*y + 32) + x.^3.*(96.*y.^4 - 368.*y.^3 + 528.*y.^2 - 336.*y + 80) + z.^3.*((288.*y.^3 - 576.*y.^2 + 352.*y - 64).*x.^3 + (- 432.*y.^3 + 864.*y.^2 - 528.*y + 96).*x.^2 + (48.*y - 32).*x - 24.*y + 16) - x.*(96.*y.^3 - 240.*y.^2 + 200.*y - 56) - z.^4.*((48.*y.^4 - 160.*y.^3 + 192.*y.^2 - 96.*y + 16).*x.^4 + (- 144.*y.^4 + 480.*y.^3 - 576.*y.^2 + 288.*y - 48).*x.^3 + (144.*y.^4 - 480.*y.^3 + 576.*y.^2 - 288.*y + 48).*x.^2 + (- 48.*y.^4 + 160.*y.^3 - 192.*y.^2 + 96.*y - 16).*x) + z.^2.*(x.^4.*(144.*y.^4 - 480.*y.^3 + 576.*y.^2 - 288.*y + 48) - 96.*y + x.^2.*(144.*y.^4 - 624.*y.^3 + 984.*y.^2 - 672.*y + 168) - x.^3.*(288.*y.^4 - 1008.*y.^3 + 1296.*y.^2 - 720.*y + 144) + x.*(144.*y.^3 - 384.*y.^2 + 336.*y - 96) + 120.*y.^2 - 48.*y.^3 + 24) - z.^5.*((288.*y.^3 - 576.*y.^2 + 352.*y - 64).*x.^3 + (- 432.*y.^3 + 864.*y.^2 - 528.*y + 96).*x.^2 + (144.*y.^3 - 288.*y.^2 + 176.*y - 32).*x) + x.^2.*(144.*y.^3 - 384.*y.^2 + 336.*y - 96) - 8)./(-w).^3) .* (y>0.5);
-%! d2Fduw = zeros ([3, size(x)]);
-%! d2Fduw(1,:,:,:) = ((x.^2.*((24.*y.^4.*z.^2)/5 + 2.*z.*(8.*y.^4 + 4.*y.^2)) - (12.*y.^2.*z.^2)/5 + (24.*x.*y.^2.*z.^2)/5)./w.^2 - (2.*(4.*x.*y.^2.*z - 4.*x.^2.*y.^2.*z).*(x.*((8.*y.^2.*z.^3)/5 + 8.*y.^2) - (4.*y.^2.*z.^3)/5 + x.^2.*(z.^2.*(8.*y.^4 + 4.*y.^2) + (8.*y.^4.*z.^3)/5 - 4.*y.^2) + 2))./w.^3) .* (y<0.5) + ...
-%!     (-((- (4.*(3.*y - 1).*(y - 1).*(36.*y.^4 - 96.*y.^3 + 88.*y.^2 - 32.*y + 4).*x.^4)/5 + (4.*(3.*y - 1).*(y - 1).*(36.*y.^4 - 96.*y.^3 + 100.*y.^2 - 48.*y + 8).*x.^3)/5 - (4.*(3.*y - 1).*(y - 1).*(18.*y.^2 - 24.*y + 6).*x.^2)/5 + (4.*(3.*y - 1).*(y - 1).*(6.*y.^2 - 8.*y + 2).*x)/5).*z.^4 + ((4.*x.^3.*(3.*y - 1).*(y - 1).*(360.*y.^4 - 960.*y.^3 + 820.*y.^2 - 240.*y + 20))/5 - (4.*x.^4.*(3.*y - 1).*(y - 1).*(360.*y.^4 - 960.*y.^3 + 820.*y.^2 - 240.*y + 20))/5).*z.^3 + (- (4.*(3.*y - 1).*(y - 1).*(108.*y.^4 - 288.*y.^3 + 264.*y.^2 - 96.*y + 12).*x.^4)/5 + (4.*(3.*y - 1).*(y - 1).*(36.*y.^2 - 48.*y + 12).*x.^3)/5 - (24.*(3.*y - 1).*(y - 1).*x)/5 + (12.*(3.*y - 1).*(y - 1))/5).*z.^2 + (- (4.*(3.*y - 1).*(y - 1).*(360.*y.^4 - 960.*y.^3 + 940.*y.^2 - 400.*y + 60).*x.^4)/5 + (4.*(3.*y - 1).*(y - 1).*(360.*y.^2 - 480.*y + 120).*x.^3)/5 - (4.*(3.*y - 1).*(y - 1).*(180.*y.^2 - 240.*y + 90).*x.^2)/5 + 16.*(3.*y - 1).*(y - 1).*x).*z)./(-w).^3) .* (y>0.5);
-%! d2Fduw(2,:,:,:) = ((2.*z.*(8.*x.^2.*y.^4 - y.^2.*(8.*y - 4.*y.^2) + (2.*x.*y.^2.*(40.*y - 20.*y.^2))/5) + 3.*z.^2.*((12.*x.^2.*y.^4)/5 + (12.*x.*y.^2)/5 - (6.*y.^2)/5))./w.^2 - (2.*(4.*x.*y.^2.*z - 4.*x.^2.*y.^2.*z).*(z.^2.*(8.*x.^2.*y.^4 - y.^2.*(8.*y - 4.*y.^2) + (2.*x.*y.^2.*(40.*y - 20.*y.^2))/5) + z.^3.*((12.*x.^2.*y.^4)/5 + (12.*x.*y.^2)/5 - (6.*y.^2)/5) + (2.*x.*y.^2.*(20.*y.^2 - 40.*y + 20))/5))./w.^3) .* (y<0.5) + ...
-%!     (((6.*(3.*y.^2 - 4.*y + 1).*(18.*x.^2.*y.^2 - 24.*x.^2.*y + 6.*x.^2 - 6.*x + 3).*z.^2)/5 + (4.*(3.*y.^2 - 4.*y + 1).*(60.*x.^2.*y.^2 - 80.*x.^2.*y + 20.*x.^2 - 20.*x.*y.^2 - 10.*x + 10.*y.^2 + 5).*z)/5)./w.^2 - (2.*((2.*(3.*y.^2 - 4.*y + 1).*(18.*x.^2.*y.^2 - 24.*x.^2.*y + 6.*x.^2 - 6.*x + 3).*z.^3)/5 + (2.*(3.*y.^2 - 4.*y + 1).*(60.*x.^2.*y.^2 - 80.*x.^2.*y + 20.*x.^2 - 20.*x.*y.^2 - 10.*x + 10.*y.^2 + 5).*z.^2)/5 - (2.*(10.*x - 20.*x.*y.^2).*(3.*y.^2 - 4.*y + 1))/5).*(- 12.*z.*x.^2.*y.^2 + 16.*z.*x.^2.*y - 4.*z.*x.^2 + 12.*z.*x.*y.^2 - 16.*z.*x.*y + 4.*z.*x))./(-w).^3) .* (y>0.5);
-%! d2Fduw(3,:,:,:) = (- (2.*z.*(4.*y.*(2.*y.^2 - 3.*y.^3).*x.^2 - 4.*y.*(4.*y.^2 - 6.*y.^3).*x + 4.*y.*(2.*y.^2 - 3.*y.^3)) - 3.*z.^2.*(8.*x.^2.*y.^4 + 8.*x.*y.^2 - 4.*y.^2))./w.^2 - (2.*(4.*x.*y.^2.*z - 4.*x.^2.*y.^2.*z).*(4.*y.*(3.*y - 2) + z.^3.*(8.*x.^2.*y.^4 + 8.*x.*y.^2 - 4.*y.^2) - z.^2.*(4.*y.*(2.*y.^2 - 3.*y.^3).*x.^2 - 4.*y.*(4.*y.^2 - 6.*y.^3).*x + 4.*y.*(2.*y.^2 - 3.*y.^3)) + 4.*x.^2.*y.*(4.*y.^2 - 6.*y.^3) - 4.*x.*y.*(- 6.*y.^3 + 4.*y.^2 + 3.*y - 2)))./w.^3) .* (y<0.5) + ...
-%!     ((2.*z.*(4.*(y - 1).*(3.*y.^3 - 7.*y.^2 + 5.*y - 1).*x.^2 - 4.*(y - 1).*(6.*y.^3 - 14.*y.^2 + 10.*y - 2).*x + 4.*(y - 1).*(3.*y.^3 - 7.*y.^2 + 5.*y - 1)) + 3.*z.^2.*(4.*(y - 1).*(18.*y.^3 - 30.*y.^2 + 14.*y - 2).*x.^2 - 4.*(6.*y - 2).*(y - 1).*x + 4.*(3.*y - 1).*(y - 1)))./w.^2 - (2.*(z.^2.*(4.*(y - 1).*(3.*y.^3 - 7.*y.^2 + 5.*y - 1).*x.^2 - 4.*(y - 1).*(6.*y.^3 - 14.*y.^2 + 10.*y - 2).*x + 4.*(y - 1).*(3.*y.^3 - 7.*y.^2 + 5.*y - 1)) - 4.*(y - 1).^2 + z.^3.*(4.*(y - 1).*(18.*y.^3 - 30.*y.^2 + 14.*y - 2).*x.^2 - 4.*(6.*y - 2).*(y - 1).*x + 4.*(3.*y - 1).*(y - 1)) + 4.*x.*(y - 1).*(6.*y.^3 - 14.*y.^2 + 11.*y - 3) - 4.*x.^2.*(y - 1).*(6.*y.^3 - 14.*y.^2 + 10.*y - 2)).*(- 12.*z.*x.^2.*y.^2 + 16.*z.*x.^2.*y - 4.*z.*x.^2 + 12.*z.*x.*y.^2 - 16.*z.*x.*y + 4.*z.*x))./(-w).^3) .* (y>0.5);
-%! d2Fdvv = zeros ([3, size(x)]);
-%! d2Fdvv(1,:,:,:) = (-(8.*x.*(x - 1).*(z.^3 + 5.*x.*z.^2 - 5.*x).*(- 6.*x.^2.*y.^2.*z.^2 + 6.*x.^2.*y.^2 + 6.*x.*y.^2.*z.^2 - 1))/5./w.^3) .* (y<0.5) + ...
-%!     ((8.*x.*(x - 1).*(z.^3 + 5.*x.*z.^2 - 5.*x).*(- 54.*x.^2.*y.^2.*z.^2 + 54.*x.^2.*y.^2 + 72.*x.^2.*y.*z.^2 - 72.*x.^2.*y - 26.*x.^2.*z.^2 + 26.*x.^2 + 54.*x.*y.^2.*z.^2 - 72.*x.*y.*z.^2 + 26.*x.*z.^2 + 3))/5./(-w).^3) .* (y>0.5);
-%! d2Fdvv(2,:,:,:) = ((2.*((8.*x.*z.^2 - x.^2.*(8.*z.^2 - 8)).*y.^2 + ((12.*x.*z.^3)/5 - x.^2.*((12.*z.^3)/5 + 8) + 4).*y - 4).*(- 4.*y.*x.^2.*z.^2 + 4.*y.*x.^2 + 4.*y.*x.*z.^2))./w.^3 - ((12.*x.*z.^3)/5 + 2.*y.*(8.*x.*z.^2 - x.^2.*(8.*z.^2 - 8)) - x.^2.*((12.*z.^3)/5 + 8) + 4)./w.^2) .* (y<0.5) + ...
-%!     ((z.^2.*(x.*(32.*y + 4) - x.^2.*(32.*y + 4)) + x.^2.*(32.*y - 20) + z.^3.*((36.*x)/5 - (36.*x.^2)/5) + 4)./w.^2 - (2.*(4.*y + z.^3.*(x.*((36.*y)/5 - 24/5) - x.^2.*((36.*y)/5 - 24/5)) + z.^2.*(x.*(16.*y.^2 + 4.*y - 8) - x.^2.*(16.*y.^2 + 4.*y - 8)) + x.^2.*(16.*y.^2 - 20.*y + 8)).*(8.*x.^2.*z.^2 + 12.*x.^2.*y - 8.*x.*z.^2 - 8.*x.^2 + 12.*x.*y.*z.^2 - 12.*x.^2.*y.*z.^2))./(-w).^3) .* (y>0.5);
-%! d2Fdvv(3,:,:,:) = ((2.*y.*(4.*(x - 1).*(2.*x.^3 - 4.*x.^2 + 2.*x).*z.^2 + 4.*(2.*x.^2 - 2.*x.^3).*(x - 1)) - 4.*(3.*x - 3).*(x - 1) + 8.*x.*z.^3.*(x - 1))./w.^2 - (2.*(4.*(x - 1).^2 - y.*(4.*(3.*x - 3).*(x - 1) - 8.*x.*z.^3.*(x - 1)) + y.^2.*(4.*(x - 1).*(2.*x.^3 - 4.*x.^2 + 2.*x).*z.^2 + 4.*(2.*x.^2 - 2.*x.^3).*(x - 1))).*(- 4.*y.*x.^2.*z.^2 + 4.*y.*x.^2 + 4.*y.*x.*z.^2))./w.^3) .* (y<0.5) + ...
-%!     ((4.*(x - 1).*(4.*x.^3 - 4.*x.^2 + x - 1) + 2.*y.*(4.*(x - 1).*(2.*x.^3 - 4.*x.^2 + 2.*x).*z.^2 + 4.*(2.*x.^2 - 2.*x.^3).*(x - 1)) - 24.*x.*z.^3.*(x - 1) - 4.*z.^2.*(x - 1).*(4.*x.^3 - 8.*x.^2 + 4.*x))./w.^2 - (2.*(y.^2.*(4.*(x - 1).*(2.*x.^3 - 4.*x.^2 + 2.*x).*z.^2 + 4.*(2.*x.^2 - 2.*x.^3).*(x - 1)) - 4.*(x - 1).*(2.*x.^3 - 2.*x.^2 + x - 1) - y.*(24.*x.*(x - 1).*z.^3 + 4.*(x - 1).*(4.*x.^3 - 8.*x.^2 + 4.*x).*z.^2 - 4.*(x - 1).*(4.*x.^3 - 4.*x.^2 + x - 1)) + 16.*x.*z.^3.*(x - 1) + 4.*z.^2.*(x - 1).*(2.*x.^3 - 4.*x.^2 + 2.*x)).*(8.*x.^2.*z.^2 + 12.*x.^2.*y - 8.*x.*z.^2 - 8.*x.^2 + 12.*x.*y.*z.^2 - 12.*x.^2.*y.*z.^2))./(-w).^3) .* (y>0.5);
-%! d2Fdvw = zeros ([3, size(x)]);
-%! d2Fdvw(1,:,:,:) = (((8.*x.*z.*(x - 1).*(20.*x.^3.*z.^2 - 20.*x.^3 + 2.*x.^2.*z.^3 - 20.*x.^2.*z.^2 + 6.*x.^2.*z + 40.*x.^2 - 2.*x.*z.^3).*y.^3)/5 + (8.*x.*z.*(10.*x + 3.*z).*(x - 1).*y)/5)./w.^3) .* (y<0.5) + ...
-%!     (((8.*x.*(3.*y - 2).*(x - 1).*(- 6.*x.^2.*y.^2 + 8.*x.^2.*y - 2.*x.^2 + 6.*x.*y.^2 - 8.*x.*y + 2.*x).*z.^4)/5 + (8.*x.*(3.*y - 2).*(x - 1).*(- 60.*x.^3.*y.^2 + 80.*x.^3.*y - 20.*x.^3 + 60.*x.^2.*y.^2 - 80.*x.^2.*y + 20.*x.^2).*z.^3)/5 - (8.*x.*(3.*y - 2).*(x - 1).*(18.*x.^2.*y.^2 - 24.*x.^2.*y + 6.*x.^2 - 3).*z.^2)/5 + (8.*x.*(3.*y - 2).*(x - 1).*(60.*x.^3.*y.^2 - 80.*x.^3.*y + 20.*x.^3 - 120.*x.^2.*y.^2 + 160.*x.^2.*y - 40.*x.^2 + 10.*x).*z)/5)./(-w).^3) .* (y>0.5);
-%! d2Fdvw(2,:,:,:) = ((4.*x.*y.*z.*(x - 1).*(40.*x.^2.*y.^3.*z.^2 - 40.*x.^2.*y.^3 + 6.*x.^2.*y.^2.*z.^3 + 18.*x.^2.*y.^2.*z + 80.*x.^2.*y.^2 - 40.*x.*y.^3.*z.^2 - 6.*x.*y.^2.*z.^3 - 40.*y.^2 + 60.*y + 9.*z))/5./w.^3) .* (y<0.5) + ...
-%!     (-((4.*x.*(x - 1).*(54.*x.^2.*y.^3 - 108.*x.^2.*y.^2 + 66.*x.^2.*y - 12.*x.^2 - 54.*x.*y.^3 + 108.*x.*y.^2 - 66.*x.*y + 12.*x).*z.^4)/5 + (4.*x.*(x - 1).*(240.*x.^2.*y.^4 - 260.*x.^2.*y.^3 - 120.*x.^2.*y.^2 + 180.*x.^2.*y - 40.*x.^2 - 240.*x.*y.^4 + 260.*x.*y.^3 + 120.*x.*y.^2 - 180.*x.*y + 40.*x).*z.^3)/5 - (4.*x.*(x - 1).*(- 162.*x.^2.*y.^3 + 324.*x.^2.*y.^2 - 198.*x.^2.*y + 36.*x.^2 + 27.*y - 18).*z.^2)/5 - (4.*x.*(x - 1).*(240.*x.^2.*y.^4 - 980.*x.^2.*y.^3 + 1320.*x.^2.*y.^2 - 700.*x.^2.*y + 120.*x.^2 + 120.*y.^3 - 120.*y.^2 + 50.*y - 20).*z)/5)./(-w).^3) .* (y>0.5);
-%! d2Fdvw(3,:,:,:) = (-(y.^3.*(8.*x.*z.*(x - 1).*(12.*x.^2 - 24.*x + 12) - 48.*x.^3.*z.^2.*(x - 1) + 8.*x.*z.^4.*(2.*x - 2.*x.^2).*(x - 1)) + y.^4.*(8.*x.*(x - 1).*(- 4.*x.^4 + 12.*x.^3 - 12.*x.^2 + 4.*x).*z.^3 + 8.*x.*(x - 1).*(4.*x.^4 - 8.*x.^3 + 4.*x.^2).*z) - 24.*x.*y.*z.^2.*(x - 1) - 8.*x.*y.^2.*z.*(x - 1).*(6.*x.^2 - 12.*x + 6))./w.^3) .* (y<0.5) + ...
-%!     ((8.*z.*(x - 1).*(2.*x.^3 - 4.*x.^2 + 2.*x) - y.*(72.*x.*(x - 1).*z.^2 + 8.*(x - 1).*(4.*x.^3 - 8.*x.^2 + 4.*x).*z) + 48.*x.*z.^2.*(x - 1) + 8.*y.^2.*z.*(x - 1).*(2.*x.^3 - 4.*x.^2 + 2.*x))./w.^2 - (2.*(y.^2.*(4.*(x - 1).*(2.*x.^3 - 4.*x.^2 + 2.*x).*z.^2 + 4.*(2.*x.^2 - 2.*x.^3).*(x - 1)) - 4.*(x - 1).*(2.*x.^3 - 2.*x.^2 + x - 1) - y.*(24.*x.*(x - 1).*z.^3 + 4.*(x - 1).*(4.*x.^3 - 8.*x.^2 + 4.*x).*z.^2 - 4.*(x - 1).*(4.*x.^3 - 4.*x.^2 + x - 1)) + 16.*x.*z.^3.*(x - 1) + 4.*z.^2.*(x - 1).*(2.*x.^3 - 4.*x.^2 + 2.*x)).*(- 12.*z.*x.^2.*y.^2 + 16.*z.*x.^2.*y - 4.*z.*x.^2 + 12.*z.*x.*y.^2 - 16.*z.*x.*y + 4.*z.*x))./(-w).^3) .* (y>0.5);
-%! d2Fdww = zeros ([3, size(x)]);
-%! d2Fdww(1,:,:,:) = ((32.*x.*y.^2.*(2.*x.^2.*y.^2 + 1).*(x - 1).*(5.*x + z + 10.*x.^2.*y.^2 + 2.*x.^2.*y.^2.*z))./(5.*w.^3) - (8.*x.*y.^2.*(x - 1).*(15.*x + z + 30.*x.^2.*y.^2 + 2.*x.^2.*y.^2.*z))/5./w.^2) .* (y<0.5) + ...
-%!     (((8.*x.*(3.*y - 1).*(x - 1).*(y - 1).*(36.*x.^4.*y.^4 - 96.*x.^4.*y.^3 + 88.*x.^4.*y.^2 - 32.*x.^4.*y + 4.*x.^4 - 36.*x.^3.*y.^4 + 96.*x.^3.*y.^3 - 88.*x.^3.*y.^2 + 32.*x.^3.*y - 4.*x.^3 - 6.*x.^2.*y.^2 + 8.*x.^2.*y - 2.*x.^2 + 6.*x.*y.^2 - 8.*x.*y + 2.*x).*z.^3)/5 + (8.*x.*(3.*y - 1).*(x - 1).*(y - 1).*(540.*x.^4.*y.^4 - 1440.*x.^4.*y.^3 + 1320.*x.^4.*y.^2 - 480.*x.^4.*y + 60.*x.^4 - 540.*x.^3.*y.^4 + 1440.*x.^3.*y.^3 - 1410.*x.^3.*y.^2 + 600.*x.^3.*y - 90.*x.^3 + 90.*x.^2.*y.^2 - 120.*x.^2.*y + 30.*x.^2).*z.^2)/5 + (8.*x.*(3.*y - 1).*(x - 1).*(y - 1).*(108.*x.^4.*y.^4 - 288.*x.^4.*y.^3 + 264.*x.^4.*y.^2 - 96.*x.^4.*y + 12.*x.^4 - 36.*x.^2.*y.^2 + 48.*x.^2.*y - 12.*x.^2 + 3).*z)/5 + (8.*x.*(3.*y - 1).*(x - 1).*(y - 1).*(180.*x.^4.*y.^4 - 480.*x.^4.*y.^3 + 440.*x.^4.*y.^2 - 160.*x.^4.*y + 20.*x.^4 - 30.*x.^3.*y.^2 + 40.*x.^3.*y - 10.*x.^3 - 30.*x.^2.*y.^2 + 40.*x.^2.*y - 10.*x.^2 + 5.*x))/5)./(-w).^3) .* (y>0.5);
-%! d2Fdww(2,:,:,:) = ((16.*x.*y.^2.*(2.*x.^2.*y.^2 + 1).*(x - 1).*(20.*y + 3.*z + 20.*x.^2.*y.^2 - 10.*y.^2 + 6.*x.^2.*y.^2.*z))./(5.*w.^3) - (12.*x.*y.^2.*(x - 1).*(20.*y + z + 20.*x.^2.*y.^2 - 10.*y.^2 + 2.*x.^2.*y.^2.*z))/5./w.^2) .* (y<0.5) + ...
-%!     (((4.*x.*(3.*y - 1).*(x - 1).*(y - 1).*(108.*x.^4.*y.^4 - 288.*x.^4.*y.^3 + 264.*x.^4.*y.^2 - 96.*x.^4.*y + 12.*x.^4 - 108.*x.^3.*y.^4 + 288.*x.^3.*y.^3 - 264.*x.^3.*y.^2 + 96.*x.^3.*y - 12.*x.^3 - 18.*x.^2.*y.^2 + 24.*x.^2.*y - 6.*x.^2 + 18.*x.*y.^2 - 24.*x.*y + 6.*x).*z.^3)/5 + (4.*x.*(3.*y - 1).*(x - 1).*(y - 1).*(1080.*x.^4.*y.^4 - 2880.*x.^4.*y.^3 + 2640.*x.^4.*y.^2 - 960.*x.^4.*y + 120.*x.^4 - 1080.*x.^3.*y.^4 + 2880.*x.^3.*y.^3 - 2640.*x.^3.*y.^2 + 960.*x.^3.*y - 120.*x.^3 - 180.*x.^2.*y.^4 + 240.*x.^2.*y.^3 - 150.*x.^2.*y.^2 + 120.*x.^2.*y - 30.*x.^2 + 180.*x.*y.^4 - 240.*x.*y.^3 + 150.*x.*y.^2 - 120.*x.*y + 30.*x).*z.^2)/5 + (4.*x.*(3.*y - 1).*(x - 1).*(y - 1).*(324.*x.^4.*y.^4 - 864.*x.^4.*y.^3 + 792.*x.^4.*y.^2 - 288.*x.^4.*y + 36.*x.^4 - 108.*x.^2.*y.^2 + 144.*x.^2.*y - 36.*x.^2 + 9).*z)/5 + (4.*x.*(3.*y - 1).*(x - 1).*(y - 1).*(360.*x.^4.*y.^4 - 960.*x.^4.*y.^3 + 880.*x.^4.*y.^2 - 320.*x.^4.*y + 40.*x.^4 - 60.*x.^2.*y.^4 + 80.*x.^2.*y.^3 - 110.*x.^2.*y.^2 + 120.*x.^2.*y - 30.*x.^2 + 10.*y.^2 + 5))/5)./(-w).^3) .* (y>0.5);
-%! d2Fdww(3,:,:,:) = ((32.*x.*y.^2.*(2.*x.^2.*y.^2 + 1).*(x - 1).*(2.*y + z - 3.*x.^2.*y.^2 - 4.*x.*y + 6.*x.*y.^2 + 2.*x.^2.*y - 3.*y.^2 + 2.*x.^2.*y.^2.*z))./w.^3 - (8.*x.*y.^2.*(x - 1).*(6.*y + z - 9.*x.^2.*y.^2 - 12.*x.*y + 18.*x.*y.^2 + 6.*x.^2.*y - 9.*y.^2 + 2.*x.^2.*y.^2.*z))./w.^2) .* (y<0.5) + ...
-%!    ((2.*(- 6.*x.^2.*y.^2 + 8.*x.^2.*y - 2.*x.^2 + 6.*x.*y.^2 - 8.*x.*y + 2.*x).*(2.*z - 4.*y - 4.*x + 2.*x.^2.*y.^2 + 8.*x.*y - 4.*x.*y.^2 - 4.*x.^2.*y - 4.*x.^2.*z + 2.*x.^2 + 2.*y.^2 + 16.*x.^2.*y.*z - 12.*x.^2.*y.^2.*z + 2))./w.^2 - (8.*z.^2.*(- 6.*x.^2.*y.^2 + 8.*x.^2.*y - 2.*x.^2 + 6.*x.*y.^2 - 8.*x.*y + 2.*x).^2.*(2.*z - 4.*y - 4.*x + 2.*x.^2.*y.^2 + 8.*x.*y - 4.*x.*y.^2 - 4.*x.^2.*y - 4.*x.^2.*z + 2.*x.^2 + 2.*y.^2 + 16.*x.^2.*y.*z - 12.*x.^2.*y.^2.*z + 2))./(-w).^3 - (4.*z.*(12.*x.^2.*y.^2 - 16.*x.^2.*y + 4.*x.^2 - 2).*(- 6.*x.^2.*y.^2 + 8.*x.^2.*y - 2.*x.^2 + 6.*x.*y.^2 - 8.*x.*y + 2.*x))./w.^2) .* (y>0.5);
-%! assert (F, pnt, 1e3*eps)
-%! assert (dFdu, jac{1}, 1e3*eps)
-%! assert (dFdv, jac{2}, 1e3*eps)
-%! assert (dFdw, jac{3}, 1e3*eps)
-%! assert (d2Fduu, hess{1,1}, 1e3*eps)
-%! assert (d2Fduv, hess{1,2}, 1e3*eps)
-%! assert (d2Fduw, hess{1,3}, 1e3*eps)
-%! assert (d2Fduv, hess{2,1}, 1e3*eps)
-%! assert (d2Fdvv, hess{2,2}, 1e3*eps)
-%! assert (d2Fdvw, hess{2,3}, 1e3*eps)
-%! assert (d2Fduw, hess{3,1}, 1e3*eps)
-%! assert (d2Fdvw, hess{3,2}, 1e3*eps)
-%! assert (d2Fdww, hess{3,3}, 1e3*eps)
-
-
-
-%!test
-%! nrb = nrbextrude (nrb4surf ([0 0], [1 0], [0 1], [1 1]), [0 0 1]);
-%! nrb = nrbdegelev (nrb, [1 1 1]);
-%! nrb.coefs (4,2,2,2) = 1.1;
-%! [dnrb, dnrb2] = nrbderiv (nrb);
-%! X = linspace (0, 1, 24); Y = linspace (0, 1, 24); Z = linspace (0, 1, 24);
-%! [pnt, jac, hess] = nrbdeval (nrb, dnrb, dnrb2, {X Y Z});
-%! [y, x, z] = meshgrid (X, Y, Z);
-%! F = zeros ([3, size(x)]);
-%! F(1,:,:,:) = (5.*x)./((- 4.*x.^2.*y.^2 + 4.*x.^2.*y + 4.*x.*y.^2 - 4.*x.*y).*z.^2 + (4.*x.^2.*y.^2 - 4.*x.^2.*y - 4.*x.*y.^2 + 4.*x.*y).*z + 5);
-%! F(2,:,:,:) = (5.*y)./((- 4.*x.^2.*y.^2 + 4.*x.^2.*y + 4.*x.*y.^2 - 4.*x.*y).*z.^2 + (4.*x.^2.*y.^2 - 4.*x.^2.*y - 4.*x.*y.^2 + 4.*x.*y).*z + 5);
-%! F(3,:,:,:) = (5.*z)./((- 4.*x.^2.*y.^2 + 4.*x.^2.*y + 4.*x.*y.^2 - 4.*x.*y).*z.^2 + (4.*x.^2.*y.^2 - 4.*x.^2.*y - 4.*x.*y.^2 + 4.*x.*y).*z + 5);
-%! dFdu = zeros ([3, size(x)]);
-%! dFdu(1,:,:,:) = ((z.*(20.*y - 20.*y.^2) - z.^2.*(20.*y - 20.*y.^2)).*x.^2 + 25)./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^2;
-%! dFdu(2,:,:,:) = (y.^2.*(5.*z.*(8.*x - 4) - 5.*z.^2.*(8.*x - 4)) - y.^3.*(5.*z.*(8.*x - 4) - 5.*z.^2.*(8.*x - 4)))./((- 4.*x.^2.*y.^2 + 4.*x.^2.*y + 4.*x.*y.^2 - 4.*x.*y).*z.^2 + (4.*x.^2.*y.^2 - 4.*x.^2.*y - 4.*x.*y.^2 + 4.*x.*y).*z + 5).^2;
-%! dFdu(3,:,:,:) = (z.^2.*(5.*y.*(8.*x - 4) - 5.*y.^2.*(8.*x - 4)) - z.^3.*(5.*y.*(8.*x - 4) - 5.*y.^2.*(8.*x - 4)))./((- 4.*x.^2.*y.^2 + 4.*x.^2.*y + 4.*x.*y.^2 - 4.*x.*y).*z.^2 + (4.*x.^2.*y.^2 - 4.*x.^2.*y - 4.*x.*y.^2 + 4.*x.*y).*z + 5).^2;
-%! dFdv = zeros ([3, size(x)]);
-%! dFdv(1,:,:,:) = (x.^2.*(5.*z.*(8.*y - 4) - 5.*z.^2.*(8.*y - 4)) - x.^3.*(5.*z.*(8.*y - 4) - 5.*z.^2.*(8.*y - 4)))./((- 4.*x.^2.*y.^2 + 4.*x.^2.*y + 4.*x.*y.^2 - 4.*x.*y).*z.^2 + (4.*x.^2.*y.^2 - 4.*x.^2.*y - 4.*x.*y.^2 + 4.*x.*y).*z + 5).^2;
-%! dFdv(2,:,:,:) = ((z.*(20.*x - 20.*x.^2) - z.^2.*(20.*x - 20.*x.^2)).*y.^2 + 25)./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^2;
-%! dFdv(3,:,:,:) = (z.^2.*(5.*x.*(8.*y - 4) - 5.*x.^2.*(8.*y - 4)) - z.^3.*(5.*x.*(8.*y - 4) - 5.*x.^2.*(8.*y - 4)))./((- 4.*x.^2.*y.^2 + 4.*x.^2.*y + 4.*x.*y.^2 - 4.*x.*y).*z.^2 + (4.*x.^2.*y.^2 - 4.*x.^2.*y - 4.*x.*y.^2 + 4.*x.*y).*z + 5).^2;
-%! dFdw = zeros ([3, size(x)]);
-%! dFdw(1,:,:,:) = (x.^2.*(y.*(40.*z - 20) - y.^2.*(40.*z - 20)) - x.^3.*(y.*(40.*z - 20) - y.^2.*(40.*z - 20)))./((- 4.*x.^2.*y.^2 + 4.*x.^2.*y + 4.*x.*y.^2 - 4.*x.*y).*z.^2 + (4.*x.^2.*y.^2 - 4.*x.^2.*y - 4.*x.*y.^2 + 4.*x.*y).*z + 5).^2;
-%! dFdw(2,:,:,:) = (y.^2.*(x.*(40.*z - 20) - x.^2.*(40.*z - 20)) - y.^3.*(x.*(40.*z - 20) - x.^2.*(40.*z - 20)))./((- 4.*x.^2.*y.^2 + 4.*x.^2.*y + 4.*x.*y.^2 - 4.*x.*y).*z.^2 + (4.*x.^2.*y.^2 - 4.*x.^2.*y - 4.*x.*y.^2 + 4.*x.*y).*z + 5).^2;
-%! dFdw(3,:,:,:) = ((y.*(20.*x - 20.*x.^2) - y.^2.*(20.*x - 20.*x.^2)).*z.^2 + 25)./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^2;
-%! d2Fduu = zeros ([3, size(x)]);
-%! d2Fduu(1,:,:,:) = (40.*y.*z.*(y - 1).*(z - 1).*(4.*x.^3.*y.^2.*z.^2 - 4.*x.^3.*y.^2.*z - 4.*x.^3.*y.*z.^2 + 4.*x.^3.*y.*z + 15.*x - 5))./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^3;
-%! d2Fduu(2,:,:,:) = (40.*y.^2.*z.*(y - 1).*(z - 1).*(4.*y.^2.*z.^2 - 4.*y.^2.*z - 4.*y.*z.^2 + 4.*y.*z + 5) - 40.*x.*y.^2.*z.*(y - 1).*(z - 1).*(12.*y.^2.*z.^2 - 12.*y.^2.*z - 12.*y.*z.^2 + 12.*y.*z) + 40.*x.^2.*y.^2.*z.*(y - 1).*(z - 1).*(12.*y.^2.*z.^2 - 12.*y.^2.*z - 12.*y.*z.^2 + 12.*y.*z))./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^3;
-%! d2Fduu(3,:,:,:) = (40.*y.*z.^2.*(y - 1).*(z - 1).*(4.*y.^2.*z.^2 - 4.*y.^2.*z - 4.*y.*z.^2 + 4.*y.*z + 5) - 40.*x.*y.*z.^2.*(y - 1).*(z - 1).*(12.*y.^2.*z.^2 - 12.*y.^2.*z - 12.*y.*z.^2 + 12.*y.*z) + 40.*x.^2.*y.*z.^2.*(y - 1).*(z - 1).*(12.*y.^2.*z.^2 - 12.*y.^2.*z - 12.*y.*z.^2 + 12.*y.*z))./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^3;
-%! d2Fduv = zeros ([3, size(x)]);
-%! d2Fduv(1,:,:,:) = (20.*x.*z.*(2.*y - 1).*(z - 1).*(4.*x.^3.*y.^2.*z.^2 - 4.*x.^3.*y.^2.*z - 4.*x.^3.*y.*z.^2 + 4.*x.^3.*y.*z - 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 15.*x - 10))./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^3;
-%! d2Fduv(2,:,:,:) = (20.*y.*z.*(2.*x - 1).*(z - 1).*(4.*x.^2.*y.^3.*z.^2 - 4.*x.^2.*y.^3.*z - 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z - 4.*x.*y.^3.*z.^2 + 4.*x.*y.^3.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z + 15.*y - 10))./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^3;
-%! d2Fduv(3,:,:,:) = (20.*z.^2.*(2.*x - 1).*(2.*y - 1).*(z - 1).*(4.*x.^2.*y.^2.*z.^2 - 4.*x.^2.*y.^2.*z - 4.*x.^2.*y.*z.^2 + 4.*x.^2.*y.*z - 4.*x.*y.^2.*z.^2 + 4.*x.*y.^2.*z + 4.*x.*y.*z.^2 - 4.*x.*y.*z + 5))./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^3;
-%! d2Fduw = zeros ([3, size(x)]);
-%! d2Fduw(1,:,:,:) = (20.*x.*y.*(2.*z - 1).*(y - 1).*(4.*x.^3.*y.^2.*z.^2 - 4.*x.^3.*y.^2.*z - 4.*x.^3.*y.*z.^2 + 4.*x.^3.*y.*z - 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 15.*x - 10))./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^3;
-%! d2Fduw(2,:,:,:) = (20.*y.^2.*(2.*x - 1).*(2.*z - 1).*(y - 1).*(4.*x.^2.*y.^2.*z.^2 - 4.*x.^2.*y.^2.*z - 4.*x.^2.*y.*z.^2 + 4.*x.^2.*y.*z - 4.*x.*y.^2.*z.^2 + 4.*x.*y.^2.*z + 4.*x.*y.*z.^2 - 4.*x.*y.*z + 5))./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^3;
-%! d2Fduw(3,:,:,:) = (20.*y.*z.*(2.*x - 1).*(y - 1).*(4.*x.^2.*y.^2.*z.^3 - 4.*x.^2.*y.^2.*z.^2 - 4.*x.^2.*y.*z.^3 + 4.*x.^2.*y.*z.^2 - 4.*x.*y.^2.*z.^3 + 4.*x.*y.^2.*z.^2 + 4.*x.*y.*z.^3 - 4.*x.*y.*z.^2 + 15.*z - 10))./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^3;
-%! d2Fdvv = zeros ([3, size(x)]);
-%! d2Fdvv(1,:,:,:) = (40.*x.^2.*z.*(x - 1).*(z - 1).*(4.*x.^2.*z.^2 - 4.*x.^2.*z - 4.*x.*z.^2 + 4.*x.*z + 5) + 40.*x.^2.*y.^2.*z.*(x - 1).*(z - 1).*(12.*x.^2.*z.^2 - 12.*x.^2.*z - 12.*x.*z.^2 + 12.*x.*z) - 40.*x.^2.*y.*z.*(x - 1).*(z - 1).*(12.*x.^2.*z.^2 - 12.*x.^2.*z - 12.*x.*z.^2 + 12.*x.*z))./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^3;
-%! d2Fdvv(2,:,:,:) = (40.*x.*z.*(x - 1).*(z - 1).*(4.*x.^2.*y.^3.*z.^2 - 4.*x.^2.*y.^3.*z - 4.*x.*y.^3.*z.^2 + 4.*x.*y.^3.*z + 15.*y - 5))./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^3;
-%! d2Fdvv(3,:,:,:) = (40.*x.*z.^2.*(x - 1).*(z - 1).*(4.*x.^2.*z.^2 - 4.*x.^2.*z - 4.*x.*z.^2 + 4.*x.*z + 5) + 40.*x.*y.^2.*z.^2.*(x - 1).*(z - 1).*(12.*x.^2.*z.^2 - 12.*x.^2.*z - 12.*x.*z.^2 + 12.*x.*z) - 40.*x.*y.*z.^2.*(x - 1).*(z - 1).*(12.*x.^2.*z.^2 - 12.*x.^2.*z - 12.*x.*z.^2 + 12.*x.*z))./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^3;
-%! d2Fdvw = zeros ([3, size(x)]);
-%! d2Fdvw(1,:,:,:) = (20.*x.^2.*(2.*y - 1).*(2.*z - 1).*(x - 1).*(4.*x.^2.*y.^2.*z.^2 - 4.*x.^2.*y.^2.*z - 4.*x.^2.*y.*z.^2 + 4.*x.^2.*y.*z - 4.*x.*y.^2.*z.^2 + 4.*x.*y.^2.*z + 4.*x.*y.*z.^2 - 4.*x.*y.*z + 5))./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^3;
-%! d2Fdvw(2,:,:,:) = (20.*x.*y.*(2.*z - 1).*(x - 1).*(4.*x.^2.*y.^3.*z.^2 - 4.*x.^2.*y.^3.*z - 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z - 4.*x.*y.^3.*z.^2 + 4.*x.*y.^3.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z + 15.*y - 10))./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^3;
-%! d2Fdvw(3,:,:,:) = (20.*x.*z.*(2.*y - 1).*(x - 1).*(4.*x.^2.*y.^2.*z.^3 - 4.*x.^2.*y.^2.*z.^2 - 4.*x.^2.*y.*z.^3 + 4.*x.^2.*y.*z.^2 - 4.*x.*y.^2.*z.^3 + 4.*x.*y.^2.*z.^2 + 4.*x.*y.*z.^3 - 4.*x.*y.*z.^2 + 15.*z - 10))./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^3;
-%! d2Fdww = zeros ([3, size(x)]);
-%! d2Fdww(1,:,:,:) = (40.*x.^2.*y.*(x - 1).*(y - 1).*(4.*x.^2.*y.^2 - 4.*x.^2.*y - 4.*x.*y.^2 + 4.*x.*y + 5) + 40.*x.^2.*y.*z.^2.*(x - 1).*(y - 1).*(12.*x.^2.*y.^2 - 12.*x.^2.*y - 12.*x.*y.^2 + 12.*x.*y) - 40.*x.^2.*y.*z.*(x - 1).*(y - 1).*(12.*x.^2.*y.^2 - 12.*x.^2.*y - 12.*x.*y.^2 + 12.*x.*y))./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^3;
-%! d2Fdww(2,:,:,:) = (40.*x.*y.^2.*(x - 1).*(y - 1).*(4.*x.^2.*y.^2 - 4.*x.^2.*y - 4.*x.*y.^2 + 4.*x.*y + 5) + 40.*x.*y.^2.*z.^2.*(x - 1).*(y - 1).*(12.*x.^2.*y.^2 - 12.*x.^2.*y - 12.*x.*y.^2 + 12.*x.*y) - 40.*x.*y.^2.*z.*(x - 1).*(y - 1).*(12.*x.^2.*y.^2 - 12.*x.^2.*y - 12.*x.*y.^2 + 12.*x.*y))./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^3;
-%! d2Fdww(3,:,:,:) = (40.*x.*y.*(x - 1).*(y - 1).*(4.*x.^2.*y.^2.*z.^3 - 4.*x.^2.*y.*z.^3 - 4.*x.*y.^2.*z.^3 + 4.*x.*y.*z.^3 + 15.*z - 5))./(- 4.*x.^2.*y.^2.*z.^2 + 4.*x.^2.*y.^2.*z + 4.*x.^2.*y.*z.^2 - 4.*x.^2.*y.*z + 4.*x.*y.^2.*z.^2 - 4.*x.*y.^2.*z - 4.*x.*y.*z.^2 + 4.*x.*y.*z + 5).^3;
--- a/extra/nurbs/inst/nrbdeval.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,278 +0,0 @@
-function varargout = nrbdeval (nurbs, dnurbs, varargin)
-
-% NRBDEVAL: Evaluation of the derivative and second derivatives of NURBS curve, surface or volume.
-%
-%     [pnt, jac] = nrbdeval (crv, dcrv, tt)
-%     [pnt, jac] = nrbdeval (srf, dsrf, {tu tv})
-%     [pnt, jac] = nrbdeval (vol, dvol, {tu tv tw})
-%     [pnt, jac, hess] = nrbdeval (crv, dcrv, dcrv2, tt)
-%     [pnt, jac, hess] = nrbdeval (srf, dsrf, dsrf2, {tu tv})
-%     [pnt, jac, hess] = nrbdeval (vol, dvol, {tu tv tw})
-%
-% INPUTS:
-%
-%   crv,   srf,   vol   - original NURBS curve, surface or volume.
-%   dcrv,  dsrf,  dvol  - NURBS derivative representation of crv, srf 
-%                          or vol (see nrbderiv2)
-%   dcrv2, dsrf2, dvol2 - NURBS second derivative representation of crv,
-%                          srf or vol (see nrbderiv2)
-%   tt     - parametric evaluation points
-%            If the nurbs is a surface or a volume then tt is a cell
-%            {tu, tv} or {tu, tv, tw} are the parametric coordinates
-%
-% OUTPUT:
-%
-%   pnt  - evaluated points.
-%   jac  - evaluated first derivatives (Jacobian).
-%   hess - evaluated second derivatives (Hessian).
-%
-% Copyright (C) 2000 Mark Spink 
-% Copyright (C) 2010 Carlo de Falco
-% Copyright (C) 2010, 2011 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if (nargin == 3)
-  tt = varargin{1};
-elseif (nargin == 4)
-  dnurbs2 = varargin{1};
-  tt = varargin{2};
-else 
-  error ('nrbrdeval: wrong number of input parameters')
-end
-
-if (~isstruct(nurbs))
-  error('NURBS representation is not structure!');
-end
-
-if (~strcmp(nurbs.form,'B-NURBS'))
-  error('Not a recognised NURBS representation');
-end
-
-[cp,cw] = nrbeval(nurbs, tt);
-
-if (iscell(nurbs.knots))
-  if (size(nurbs.knots,2) == 3)
-  % NURBS structure represents a volume
-    temp = cw(ones(3,1),:,:,:);
-    pnt = cp./temp;
-  
-    [cup,cuw] = nrbeval (dnurbs{1}, tt);
-    tempu = cuw(ones(3,1),:,:,:);
-    jac{1} = (cup-tempu.*pnt)./temp;
-  
-    [cvp,cvw] = nrbeval (dnurbs{2}, tt);
-    tempv = cvw(ones(3,1),:,:,:);
-    jac{2} = (cvp-tempv.*pnt)./temp;
-
-    [cwp,cww] = nrbeval (dnurbs{3}, tt);
-    tempw = cww(ones(3,1),:,:,:);
-    jac{3} = (cwp-tempw.*pnt)./temp;
-
-% second derivatives
-    if (nargout == 3)
-      if (exist ('dnurbs2'))
-        [cuup, cuuw] = nrbeval (dnurbs2{1,1}, tt);
-        tempuu = cuuw(ones(3,1),:,:,:);
-        hess{1,1} = (cuup - (2*cup.*tempu + cp.*tempuu)./temp + 2*cp.*tempu.^2./temp.^2)./temp;
-        clear cuup cuuw tempuu
-
-        [cvvp, cvvw] = nrbeval (dnurbs2{2,2}, tt);
-        tempvv = cvvw(ones(3,1),:,:,:);
-        hess{2,2} = (cvvp - (2*cvp.*tempv + cp.*tempvv)./temp + 2*cp.*tempv.^2./temp.^2)./temp;
-        clear cvvp cvvw tempvv
-
-        [cwwp, cwww] = nrbeval (dnurbs2{3,3}, tt);
-        tempww = cwww(ones(3,1),:,:,:);
-        hess{3,3} = (cwwp - (2*cwp.*tempw + cp.*tempww)./temp + 2*cp.*tempw.^2./temp.^2)./temp;
-        clear cwwp cwww tempww
-
-        [cuvp, cuvw] = nrbeval (dnurbs2{1,2}, tt);
-        tempuv = cuvw(ones(3,1),:,:,:);
-        hess{1,2} = (cuvp - (cup.*tempv + cvp.*tempu + cp.*tempuv)./temp + 2*cp.*tempu.*tempv./temp.^2)./temp;
-        hess{2,1} = hess{1,2};
-        clear cuvp cuvw tempuv
-
-        [cuwp, cuww] = nrbeval (dnurbs2{1,3}, tt);
-        tempuw = cuww(ones(3,1),:,:,:);
-        hess{1,3} = (cuwp - (cup.*tempw + cwp.*tempu + cp.*tempuw)./temp + 2*cp.*tempu.*tempw./temp.^2)./temp;
-        hess{3,1} = hess{1,3};
-        clear cuwp cuww tempuw
-
-        [cvwp, cvww] = nrbeval (dnurbs2{2,3}, tt);
-        tempvw = cvww(ones(3,1),:,:,:);
-        hess{2,3} = (cvwp - (cvp.*tempw + cwp.*tempv + cp.*tempvw)./temp + 2*cp.*tempv.*tempw./temp.^2)./temp;
-        hess{3,2} = hess{2,3};
-        clear cvwp cvww tempvw
-      else
-        warning ('nrbdeval: dnurbs2 missing. The second derivative is not computed');
-        hess = [];
-      end
-    end
-
-  elseif (size(nurbs.knots,2) == 2)
-  % NURBS structure represents a surface
-    temp = cw(ones(3,1),:,:);
-    pnt = cp./temp;
-  
-    [cup,cuw] = nrbeval (dnurbs{1}, tt);
-    tempu = cuw(ones(3,1),:,:);
-    jac{1} = (cup-tempu.*pnt)./temp;
-  
-    [cvp,cvw] = nrbeval (dnurbs{2}, tt);
-    tempv = cvw(ones(3,1),:,:);
-    jac{2} = (cvp-tempv.*pnt)./temp;
-
-% second derivatives
-    if (nargout == 3) 
-      if (exist ('dnurbs2'))
-        [cuup, cuuw] = nrbeval (dnurbs2{1,1}, tt);
-        tempuu = cuuw(ones(3,1),:,:);
-        hess{1,1} = (cuup - (2*cup.*tempu + cp.*tempuu)./temp + 2*cp.*tempu.^2./temp.^2)./temp;
-
-        [cvvp, cvvw] = nrbeval (dnurbs2{2,2}, tt);
-        tempvv = cvvw(ones(3,1),:,:);
-        hess{2,2} = (cvvp - (2*cvp.*tempv + cp.*tempvv)./temp + 2*cp.*tempv.^2./temp.^2)./temp;
-
-        [cuvp, cuvw] = nrbeval (dnurbs2{1,2}, tt);
-        tempuv = cuvw(ones(3,1),:,:);
-        hess{1,2} = (cuvp - (cup.*tempv + cvp.*tempu + cp.*tempuv)./temp + 2*cp.*tempu.*tempv./temp.^2)./temp;
-        hess{2,1} = hess{1,2};
-      else
-        warning ('nrbdeval: dnurbs2 missing. The second derivative is not computed');
-        hess = [];
-      end
-    end
-
-  end
-else
-
-  % NURBS is a curve
-  temp = cw(ones(3,1),:);
-  pnt = cp./temp;
-  
-  % first derivative
-  [cup,cuw] = nrbeval (dnurbs,tt);
-  temp1 = cuw(ones(3,1),:);
-  jac = (cup-temp1.*pnt)./temp;
-  if (iscell (tt))
-    jac = {jac};
-  end
-
-  % second derivative
-  if (nargout == 3 && exist ('dnurbs2'))
-    [cuup,cuuw] = nrbeval (dnurbs2, tt);
-    temp2 = cuuw(ones(3,1),:);
-    hess = (cuup - (2*cup.*temp1 + cp.*temp2)./temp + 2*cp.*temp1.^2./temp.^2)./temp;
-    if (iscell (tt))
-      hess = {hess};
-    end
-  end
-  
-end
-
-varargout{1} = pnt;
-varargout{2} = jac;
-if (nargout == 3)
-  varargout{3} = hess;
-end
-
-end
-
-%!demo
-%! crv = nrbtestcrv;
-%! nrbplot(crv,48);
-%! title('First derivatives along a test curve.');
-%! 
-%! tt = linspace(0.0,1.0,9);
-%! 
-%! dcrv = nrbderiv(crv);
-%! 
-%! [p1, dp] = nrbdeval(crv,dcrv,tt);
-%! 
-%! p2 = vecnorm(dp);
-%! 
-%! hold on;
-%! plot(p1(1,:),p1(2,:),'ro');
-%! h = quiver(p1(1,:),p1(2,:),p2(1,:),p2(2,:),0);
-%! set(h,'Color','black');
-%! hold off;
-
-%!demo
-%! srf = nrbtestsrf;
-%! p = nrbeval(srf,{linspace(0.0,1.0,20) linspace(0.0,1.0,20)});
-%! h = surf(squeeze(p(1,:,:)),squeeze(p(2,:,:)),squeeze(p(3,:,:)));
-%! set(h,'FaceColor','blue','EdgeColor','blue');
-%! title('First derivatives over a test surface.');
-%!
-%! npts = 5;
-%! tt = linspace(0.0,1.0,npts);
-%! dsrf = nrbderiv(srf);
-%! 
-%! [p1, dp] = nrbdeval(srf, dsrf, {tt, tt});
-%! 
-%! up2 = vecnorm(dp{1});
-%! vp2 = vecnorm(dp{2});
-%! 
-%! hold on;
-%! plot3(p1(1,:),p1(2,:),p1(3,:),'ro');
-%! h1 = quiver3(p1(1,:),p1(2,:),p1(3,:),up2(1,:),up2(2,:),up2(3,:));
-%! h2 = quiver3(p1(1,:),p1(2,:),p1(3,:),vp2(1,:),vp2(2,:),vp2(3,:));
-%! set(h1,'Color','black');
-%! set(h2,'Color','black');
-%! 
-%! hold off;
-
-%!test
-%! knots{1} = [0 0 0 1 1 1];
-%! knots{2} = [0 0 0 .5 1 1 1];
-%! knots{3} = [0 0 0 0 1 1 1 1];
-%! cx = [0 0.5 1]; nx = length(cx);
-%! cy = [0 0.25 0.75 1]; ny = length(cy);
-%! cz = [0 1/3 2/3 1]; nz = length(cz);
-%! coefs(1,:,:,:) = repmat(reshape(cx,nx,1,1),[1 ny nz]);
-%! coefs(2,:,:,:) = repmat(reshape(cy,1,ny,1),[nx 1 nz]);
-%! coefs(3,:,:,:) = repmat(reshape(cz,1,1,nz),[nx ny 1]);
-%! coefs(4,:,:,:) = 1;
-%! nurbs = nrbmak(coefs, knots);
-%! x = rand(5,1); y = rand(5,1); z = rand(5,1);
-%! tt = [x y z]';
-%! ders = nrbderiv(nurbs);
-%! [points,jac] = nrbdeval(nurbs,ders,tt);
-%! assert(points,tt,1e-10)
-%! assert(jac{1}(1,:,:),ones(size(jac{1}(1,:,:))),1e-12)
-%! assert(jac{2}(2,:,:),ones(size(jac{2}(2,:,:))),1e-12)
-%! assert(jac{3}(3,:,:),ones(size(jac{3}(3,:,:))),1e-12)
-%! 
-%!test
-%! knots{1} = [0 0 0 1 1 1];
-%! knots{2} = [0 0 0 0 1 1 1 1];
-%! knots{3} = [0 0 0 1 1 1];
-%! cx = [0 0 1]; nx = length(cx);
-%! cy = [0 0 0 1]; ny = length(cy);
-%! cz = [0 0.5 1]; nz = length(cz);
-%! coefs(1,:,:,:) = repmat(reshape(cx,nx,1,1),[1 ny nz]);
-%! coefs(2,:,:,:) = repmat(reshape(cy,1,ny,1),[nx 1 nz]);
-%! coefs(3,:,:,:) = repmat(reshape(cz,1,1,nz),[nx ny 1]);
-%! coefs(4,:,:,:) = 1;
-%! coefs = coefs([2 1 3 4],:,:,:);
-%! nurbs = nrbmak(coefs, knots);
-%! x = rand(5,1); y = rand(5,1); z = rand(5,1);
-%! tt = [x y z]';
-%! dnurbs = nrbderiv(nurbs);
-%! [points, jac] = nrbdeval(nurbs,dnurbs,tt);
-%! assert(points,[y.^3 x.^2 z]',1e-10);
-%! assert(jac{2}(1,:,:),3*y'.^2,1e-12)
-%! assert(jac{1}(2,:,:),2*x',1e-12)
-%! assert(jac{3}(3,:,:),ones(size(z')),1e-12)
\ No newline at end of file
--- a/extra/nurbs/inst/nrbeval.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,340 +0,0 @@
-function [p,w] = nrbeval(nurbs,tt)
-% 
-% NRBEVAL: Evaluate a NURBS at parametric points.
-% 
-% Calling Sequences:
-% 
-%   [p,w] = nrbeval(crv,ut)
-%   [p,w] = nrbeval(srf,{ut,vt})
-%   [p,w] = nrbeval(vol,{ut,vt,wt})
-%   [p,w] = nrbeval(srf,pts)
-% 
-% INPUT:
-% 
-%   crv		: NURBS curve, see nrbmak.
-% 
-%   srf		: NURBS surface, see nrbmak.
-%
-%   vol		: NURBS volume, see nrbmak.
-% 
-%   ut		: Parametric evaluation points along U direction.
-%
-%   vt		: Parametric evaluation points along V direction.
-% 
-%   wt		: Parametric evaluation points along W direction.
-%
-%   pts     : Array of scattered points in parametric domain
-% 
-% OUTPUT:
-%
-%   p		: Evaluated points on the NURBS curve, surface or volume as 
-% 		Cartesian coordinates (x,y,z). If w is included on the lhs argument
-% 		list the points are returned as homogeneous coordinates (wx,wy,wz).
-% 
-%   w		: Weights of the homogeneous coordinates of the evaluated
-% 		points. Note inclusion of this argument changes the type 
-% 		of coordinates returned in p (see above).
-% 
-% Description:
-% 
-%   Evaluation of NURBS curves, surfaces or volume at parametric points along  
-%   the U, V and W directions. Either homogeneous coordinates are returned
-%   if the weights are requested in the lhs arguments, or as Cartesian coordinates.
-%   This function utilises the 'C' interface bspeval.
-% 
-% Examples:
-% 
-%   Evaluate the NURBS circle at twenty points from 0.0 to 1.0
-% 
-%   nrb = nrbcirc;
-%   ut = linspace(0.0,1.0,20);
-%   p = nrbeval(nrb,ut);
-% 
-% See also:
-%  
-%     bspeval
-%
-% Copyright (C) 2000 Mark Spink 
-% Copyright (C) 2010 Carlo de Falco
-% Copyright (C) 2010, 2011, 2015 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if (nargin < 2)
-  error('Not enough input arguments');
-end
-
-foption = 1;    % output format 3D cartesian coordinates
-if (nargout == 2)
-  foption = 0;  % output format 4D homogenous coordinates 
-end
-   
-if (~isstruct(nurbs))
-  error('NURBS representation is not structure!');
-end
-
-if (~strcmp(nurbs.form,'B-NURBS'))
-  error('Not a recognised NURBS representation');
-end
-
-if (iscell(nurbs.knots))
-  if (size(nurbs.knots,2) == 3)
-    %% NURBS structure represents a volume
-
-    num1 = nurbs.number(1);
-    num2 = nurbs.number(2);
-    num3 = nurbs.number(3);
-    degree = nurbs.order-1;
-
-    if (iscell(tt))
-      nt1 = numel (tt{1});
-      nt2 = numel (tt{2});
-      nt3 = numel (tt{3});
-
-      %% evaluate along the w direction
-      val = reshape (nurbs.coefs, 4*num1*num2, num3);
-      val = bspeval (degree(3), val, nurbs.knots{3}, tt{3});
-      val = reshape (val, [4 num1 num2 nt3]);
-
-      %% Evaluate along the v direction
-      val = permute (val, [1 2 4 3]);
-      val = reshape (val, 4*num1*nt3, num2);
-      val = bspeval (degree(2), val, nurbs.knots{2}, tt{2});
-      val = reshape (val, [4 num1 nt3 nt2]);
-      val = permute (val, [1 2 4 3]);
-
-      %% Evaluate along the u direction
-      val = permute (val, [1 3 4 2]);
-      val = reshape (val, 4*nt2*nt3, num1);
-      val = bspeval (degree(1), val, nurbs.knots{1}, tt{1});
-      val = reshape (val, [4 nt2 nt3 nt1]);
-      val = permute (val, [1 4 2 3]);
-      pnts = val;
-
-      p = pnts(1:3,:,:,:);
-      w = pnts(4,:,:,:);
-      if (foption)
-        p = p./repmat(w,[3 1 1 1]);
-      end
-
-    else
-
-      %% Evaluate at scattered points
-      %% tt(1,:) represents the u direction
-      %% tt(2,:) represents the v direction
-      %% tt(3,:) represents the w direction
-
-      st = size(tt);
-      if (st(1) ~= 3 && st(2) == 3 && numel(st) == 2)
-        tt = tt';
-        st = size (tt);
-      end
-      nt = prod(st(2:end));
-
-      tt = reshape (tt, [3, nt]);
-
-      %% evaluate along the w direction
-      val = reshape(nurbs.coefs,4*num1*num2,num3);
-      val = bspeval(degree(3),val,nurbs.knots{3},tt(3,:));
-      val = reshape(val,[4 num1 num2 nt]);
-
-      %% evaluate along the v direction
-      val2 = zeros(4*num1,nt);
-      for v = 1:nt
-        coefs = reshape(val(:,:,:,v),4*num1,num2);
-        val2(:,v) = bspeval(degree(2),coefs,nurbs.knots{2},tt(2,v));
-      end
-      val2 = reshape(val2,[4 num1 nt]);
-
-      %% evaluate along the u direction
-      pnts = zeros(4,nt);
-      for v = 1:nt
-        coefs = reshape (val2(:,:,v), [4 num1]);
-        pnts(:,v) = bspeval(degree(1),coefs,nurbs.knots{1},tt(1,v));
-      end
-
-      w = pnts(4,:);
-      p = pnts(1:3,:);
-      if (foption)
-        p = p./repmat(w,[3, 1]);
-      end
-
-      if (numel(st) ~= 2)
-        w = reshape (w, [st(2:end)]);
-        p = reshape (p, [3, st(2:end)]);
-      end
-    end
-
-  elseif (size(nurbs.knots,2) == 2)
-    %% NURBS structure represents a surface
-  
-    num1 = nurbs.number(1);
-    num2 = nurbs.number(2);
-    degree = nurbs.order-1;
-
-    if (iscell(tt))
-      %% Evaluate over a [u,v] grid
-      %% tt{1} represents the u direction
-      %% tt{2} represents the v direction
-
-      nt1 = length(tt{1});
-      nt2 = length(tt{2});
-    
-      %% Evaluate along the v direction
-      val = reshape(nurbs.coefs,4*num1,num2);
-      val = bspeval(degree(2),val,nurbs.knots{2},tt{2});
-      val = reshape(val,[4 num1 nt2]);
-    
-      %% Evaluate along the u direction
-      val = permute(val,[1 3 2]);
-      val = reshape(val,4*nt2,num1);
-      val = bspeval(degree(1),val,nurbs.knots{1},tt{1});
-      val = reshape(val,[4 nt2 nt1]);
-      val = permute(val,[1 3 2]);
-
-      w = val(4,:,:);
-      p = val(1:3,:,:);
-      if (foption)
-	p = p./repmat(w,[3 1 1]);
-      end
-
-    else
-
-      %% Evaluate at scattered points
-      %% tt(1,:) represents the u direction
-      %% tt(2,:) represents the v direction
-
-      st = size(tt);
-      if (st(1) ~= 2 && st(2) == 2 && numel(st) == 2)
-        tt = tt';
-        st = size (tt);
-      end
-      nt = prod(st(2:end));
-
-      tt = reshape (tt, [2, nt]);
-
-      val = reshape(nurbs.coefs,4*num1,num2);
-      val = bspeval(degree(2),val,nurbs.knots{2},tt(2,:));
-      val = reshape(val,[4 num1 nt]);
-
-
-      %% evaluate along the u direction
-      pnts = zeros(4,nt);
-      for v = 1:nt
-	coefs = reshape (val(:,:,v), [4 num1]);
-	pnts(:,v) = bspeval(degree(1),coefs,nurbs.knots{1},tt(1,v));
-      end
-
-      w = pnts(4,:);
-      p = pnts(1:3,:);
-      if (foption)
-	p = p./repmat(w,[3, 1]);
-      end
-
-      if (numel(st) ~= 2)
-        w = reshape (w, [st(2:end)]);
-        p = reshape (p, [3, st(2:end)]);
-      end
-        
-    end
-
-  end
-else
-
-  %% NURBS structure represents a curve
-  %%  tt represent a vector of parametric points in the u direction
-
-  if (iscell (tt) && numel (tt) == 1)
-    tt = cell2mat (tt);
-  end
-  
-  st = size (tt);
-  
-  val = bspeval(nurbs.order-1,nurbs.coefs,nurbs.knots,tt(:)');
-
-  w = val(4,:);
-  p = val(1:3,:);
-  if foption
-    p = p./repmat(w,3,1);
-  end
-
-  if (st(1) ~= 1 || numel(st) ~= 2)
-    w = reshape (w, st);
-    p = reshape (p, [3, st]);
-  end
-
-end
-
-end
-
-%!demo
-%! srf = nrbtestsrf;
-%! p = nrbeval(srf,{linspace(0.0,1.0,20) linspace(0.0,1.0,20)});
-%! h = surf(squeeze(p(1,:,:)),squeeze(p(2,:,:)),squeeze(p(3,:,:)));
-%! title('Test surface.');
-%! hold off
-
-%!test
-%! knots{1} = [0 0 0 1 1 1];
-%! knots{2} = [0 0 0 .5 1 1 1];
-%! knots{3} = [0 0 0 0 1 1 1 1];
-%! cx = [0 0.5 1]; nx = length(cx);
-%! cy = [0 0.25 0.75 1]; ny = length(cy);
-%! cz = [0 1/3 2/3 1]; nz = length(cz);
-%! coefs(1,:,:,:) = repmat(reshape(cx,nx,1,1),[1 ny nz]);
-%! coefs(2,:,:,:) = repmat(reshape(cy,1,ny,1),[nx 1 nz]);
-%! coefs(3,:,:,:) = repmat(reshape(cz,1,1,nz),[nx ny 1]);
-%! coefs(4,:,:,:) = 1;
-%! nurbs = nrbmak(coefs, knots);
-%! x = rand(5,1); y = rand(5,1); z = rand(5,1);
-%! tt = [x y z]';
-%! points = nrbeval(nurbs,tt);
-%!
-%! assert(points,tt,1e-10)
-%!
-%!test
-%! knots{1} = [0 0 0 1 1 1];
-%! knots{2} = [0 0 0 0 1 1 1 1];
-%! knots{3} = [0 0 1 1];
-%! cx = [0 0 1]; nx = length(cx);
-%! cy = [0 0 0 1]; ny = length(cy);
-%! cz = [0 1]; nz = length(cz);
-%! coefs(1,:,:,:) = repmat(reshape(cx,nx,1,1),[1 ny nz]);
-%! coefs(2,:,:,:) = repmat(reshape(cy,1,ny,1),[nx 1 nz]);
-%! coefs(3,:,:,:) = repmat(reshape(cz,1,1,nz),[nx ny 1]);
-%! coefs(4,:,:,:) = 1;
-%! nurbs = nrbmak(coefs, knots);
-%! x = rand(5,1); y = rand(5,1); z = rand(5,1);
-%! tt = [x y z]';
-%! points = nrbeval(nurbs,tt);
-%! assert(points,[x.^2 y.^3 z]',1e-10);
-%!
-%!test
-%! knots{1} = [0 0 0 1 1 1];
-%! knots{2} = [0 0 0 0 1 1 1 1];
-%! knots{3} = [0 0 1 1];
-%! cx = [0 0 1]; nx = length(cx);
-%! cy = [0 0 0 1]; ny = length(cy);
-%! cz = [0 1]; nz = length(cz);
-%! coefs(1,:,:,:) = repmat(reshape(cx,nx,1,1),[1 ny nz]);
-%! coefs(2,:,:,:) = repmat(reshape(cy,1,ny,1),[nx 1 nz]);
-%! coefs(3,:,:,:) = repmat(reshape(cz,1,1,nz),[nx ny 1]);
-%! coefs(4,:,:,:) = 1;
-%! coefs = coefs([2 1 3 4],:,:,:);
-%! nurbs = nrbmak(coefs, knots);
-%! x = rand(5,1); y = rand(5,1); z = rand(5,1);
-%! tt = [x y z]';
-%! points = nrbeval(nurbs,tt);
-%! [y.^3 x.^2 z]';
-%! assert(points,[y.^3 x.^2 z]',1e-10);
--- a/extra/nurbs/inst/nrbexport.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,175 +0,0 @@
-function nrbexport (varargin)
-
-%
-% NRBEXPORT: export NURBS geometries to a format compatible with the one used in GeoPDEs.
-% 
-% Calling Sequence:
-% 
-%   nrbexport (nurbs, filename);
-%   nrbexport (nurbs, interfaces, boundaries, filename);
-%   nrbexport (nurbs, interfaces, boundaries, subdomains, filename);
-%   nrbexport (nurbs, filename, version);
-%   nrbexport (nurbs, interfaces, boundaries, filename, version);
-%   nrbexport (nurbs, interfaces, boundaries, subdomains, filename, version);
-% 
-% INPUT:
-% 
-%   nurbs    :  NURBS curve, surface or volume, see nrbmak.
-%   interfaces: interface information for GeoPDEs (see nrbmultipatch)
-%   boundaries: boundary information for GeoPDEs (see nrbmultipatch)
-%   filename :  name of the output file.
-%   version  :  either '-V0.7' or '-V2.1', to select the file format
-% 
-% 
-% Description:
-% 
-%   The data of the nurbs structure is written in the file, in a format 
-%     that can be read by GeoPDEs. By default, the file is saved in the
-%     format used by GeoPDEs 2.1. For the format of GeoPDEs 2.0 use the
-%     option '-v0.7'. Earlier versions of GeoPDEs are not supported.
-%
-%    Copyright (C) 2011, 2014, 2015 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if (strcmpi (varargin{end}, '-v0.7'))
-  version = '0.7';
-else  
-  version = '2.1';
-end
-
-if (nargin == 2 || nargin == 3)
-  nurbs = varargin{1};
-  filename = varargin{2};
-  if (numel (nurbs) > 1)
-    warning ('Automatically creating the interface information with nrbmultipatch')
-    [interfaces, boundaries] = nrbmultipatch (nurbs);
-    subdomains = [];
-  else
-    interfaces = []; boundaries = []; subdomains = [];
-  end
-elseif (nargin == 4 || (nargin == 5 && ischar(varargin{4})))
-  nurbs = varargin{1};
-  interfaces = varargin{2};
-  boundaries = varargin{3};
-  filename = varargin{4};
-  subdomains = [];
-elseif (nargin == 6 || (nargin == 5 && ~ischar(varargin{4})))
-  nurbs = varargin{1};
-  interfaces = varargin{2};
-  boundaries = varargin{3};
-  subdomains = varargin{4};
-  filename = varargin{5};
-else
-  error ('nrbexport: wrong number of input arguments') 
-end
-
-fid = fopen (filename, 'w');
-if (fid < 0)
-  error ('nrbexport: cannot open file %s', filename);
-end
-
-ndim = numel (nurbs(1).order);
-npatch = numel (nurbs);
-rdim = 1;
-
-if (strcmp (version, '0.7'))
-  rdim = ndim;
-else
-  for iptc = 1:npatch
-    if (any (abs(nurbs(iptc).coefs(3,:)) > 1e-12))
-      rdim = 3;
-      break
-    elseif (any (abs(nurbs(iptc).coefs(2,:)) > 1e-12))
-      rdim = 2;
-    end
-  end
-end
-
-if (strcmp (version, '0.7'))
-  fprintf (fid, '%s\n', '# nurbs mesh v.0.7');
-else
-  fprintf (fid, '%s\n', '# nurbs mesh v.2.1');
-end
-fprintf (fid, '%s\n', '#');
-fprintf (fid, '%s\n', ['# ' date]);
-fprintf (fid, '%s\n', '#');
-
-if (strcmp (version, '0.7'))
-  fprintf (fid, '%i ', ndim, npatch, numel(interfaces), numel(subdomains));
-else
-  fprintf (fid, '%i ', ndim, rdim, npatch, numel(interfaces), numel(subdomains));
-end
-fprintf (fid, '\n');
-for iptc = 1:npatch
-  fprintf (fid, '%s %i \n', 'PATCH', iptc);
-  fprintf (fid, '%i ', nurbs(iptc).order-1);
-  fprintf (fid, '\n');
-  fprintf (fid, '%i ', nurbs(iptc).number);
-  fprintf (fid, '\n');
-  if (iscell (nurbs(iptc).knots))
-    for ii = 1:ndim
-      fprintf (fid, '%1.7f   ', nurbs(iptc).knots{ii});
-      fprintf (fid, '\n');
-    end
-  else
-    fprintf (fid, '%1.7f   ', nurbs(iptc).knots);
-    fprintf (fid, '\n');
-  end
-
-  for ii = 1:rdim
-    fprintf (fid, '%1.15f   ', nurbs(iptc).coefs(ii,:,:));
-    fprintf (fid, '\n');
-  end
-  fprintf (fid, '%1.15f   ', nurbs(iptc).coefs(4,:,:));
-  fprintf (fid, '\n');
-end
-
-for intrfc = 1:numel(interfaces)
-  if (isfield (interfaces, 'ref'))
-    fprintf (fid, '%s \n', interfaces(intrfc).ref);
-  else
-    fprintf (fid, '%s %i \n', 'INTERFACE', intrfc);
-  end
-  fprintf (fid, '%i %i \n', interfaces(intrfc).patch1, interfaces(intrfc).side1);
-  fprintf (fid, '%i %i \n', interfaces(intrfc).patch2, interfaces(intrfc).side2);
-  if (ndim == 2)
-    fprintf (fid, '%i \n', interfaces(intrfc).ornt);
-  elseif (ndim == 3)
-    fprintf (fid, '%i %i %i \n', interfaces(intrfc).flag, interfaces(intrfc).ornt1, interfaces(intrfc).ornt2);
-  end
-end
-
-for isubd = 1:numel(subdomains)
-% The subdomain part should be fixed
-  fprintf (fid, '%s \n', subdomains(isubd).name);
-  fprintf (fid, '%i ', subdomains(isubd).patches);
-  fprintf (fid, '\n');  
-end
-    
-
-for ibnd = 1:numel (boundaries)
-  if (isfield (boundaries, 'name'))
-    fprintf (fid, '%s \n', boundaries(ibnd).name);
-  else
-    fprintf (fid, '%s %i \n', 'BOUNDARY', ibnd);
-  end
-  fprintf (fid, '%i \n', boundaries(ibnd).nsides);
-  for ii = 1:boundaries(ibnd).nsides
-    fprintf (fid, '%i %i \n', boundaries(ibnd).patches(ii), boundaries(ibnd).faces(ii));
-  end
-end
-
-fclose (fid);
-end
--- a/extra/nurbs/inst/nrbextract.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-function crvs = nrbextract(srf)
-
-%
-% NRBEXTRACT: construct NURBS curves by extracting the boundaries of a NURBS surface, or NURBS surfaces by extracting the boundary of a NURBS volume.
-% It only works for geometries constructed with open knot vectors.
-% 
-% Calling Sequence:
-% 
-%   crvs = nrbextract(surf);
-% 
-% INPUT:
-% 
-%   surf        : NURBS surface or volume, see nrbmak.
-% 
-% OUTPUT: 
-% 
-%   crvs        : array of NURBS curves or NURBS surfaces extracted.
-% 
-% Description:
-% 
-%  Constructs either an array of four NURBS curves, by extracting the boundaries
-%  of a NURBS surface, or an array of six surfaces, by extracting the boundaries
-%  of a NURBS volume. The new entities are ordered in the following way
-%
-%    1: U = 0
-%    2: U = 1
-%    3: V = 0
-%    4: V = 1
-%    5: W = 0 (only for volumes)
-%    6: W = 1 (only for volumes)
-%
-%    Copyright (C) 2010,2014 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if (~iscell (srf.knots))
-  error('The boundary information is only extracted for NURBS surfaces or volumes');  
-end
-
-for idim = 1:numel(srf.knots)
-  ord = srf.order(idim);
-  if (srf.knots{idim}(1) ~= srf.knots{idim}(ord) || ...
-      srf.knots{idim}(end) ~= srf.knots{idim}(end-ord+1))
-    error ('nrbextract: only working for open knot vectors')
-  end
-end
-
-if (numel (srf.knots) == 2)
-  for ind = 1:2
-    ind2 = mod (ind, 2) + 1;    %ind2 = [2 1];
-    bnd1 = (ind - 1) * 2 + 1;
-    bnd2 = (ind - 1) * 2 + 2;
-    if (ind == 1)
-      coefs1 = squeeze (srf.coefs(:,1,:));
-      coefs2 = squeeze (srf.coefs(:,end,:));
-    elseif (ind == 2)
-      coefs1 = squeeze (srf.coefs(:,:,1));
-      coefs2 = squeeze (srf.coefs(:,:,end));
-    end
-    crvs(bnd1) = nrbmak (coefs1, srf.knots{ind2});
-    crvs(bnd2) = nrbmak (coefs2, srf.knots{ind2});
-  end
-elseif (numel (srf.knots) == 3)
-  for ind = 1:3
-    inds = setdiff (1:3, ind);
-    bnd1 = (ind - 1) * 2 + 1;
-    bnd2 = (ind - 1) * 2 + 2;
-    if (ind == 1)
-      coefs1 = squeeze (srf.coefs(:,1,:,:));
-      coefs2 = squeeze (srf.coefs(:,end,:,:));
-    elseif (ind == 2)
-      coefs1 = squeeze (srf.coefs(:,:,1,:));
-      coefs2 = squeeze (srf.coefs(:,:,end,:));
-    elseif (ind == 3)
-      coefs1 = squeeze (srf.coefs(:,:,:,1));
-      coefs2 = squeeze (srf.coefs(:,:,:,end));
-    end
-    crvs(bnd1) = nrbmak (coefs1, {srf.knots{inds(1)} srf.knots{inds(2)}});
-    crvs(bnd2) = nrbmak (coefs2, {srf.knots{inds(1)} srf.knots{inds(2)}});
-  end
-else
-  error ('The entity is not a surface nor a volume')
-end
-
-end
--- a/extra/nurbs/inst/nrbextrude.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,92 +0,0 @@
-function srf = nrbextrude(curve,vector)
-
-%
-% NRBEXTRUDE: Construct a NURBS surface by extruding a NURBS curve, or 
-%  construct a NURBS volume by extruding a NURBS surface.
-% 
-% Calling Sequence:
-% 
-%   srf = nrbextrude(crv,vec);
-% 
-% INPUT:
-% 
-%   crv		: NURBS curve or surface to extrude, see nrbmak.
-% 
-%   vec		: Vector along which the entity is extruded.
-%
-% OUTPUT: 
-% 
-%   srf		: NURBS surface or volume constructed.
-% 
-% Description:
-% 
-%   Constructs either a NURBS surface by extruding a NURBS curve along a  
-%   defined vector, or a NURBS volume by extruding a NURBS surface. In the 
-%   first case, the NURBS curve forms the U direction of the surface edge, and
-%   is extruded along the vector in the V direction. In the second case, the 
-%   original surface forms the U and V direction of the volume, and is extruded
-%   along the W direction.
-%
-% Examples:
-% 
-%   Form a hollow cylinder by extruding a circle along the z-axis.
-%
-%   srf = nrbextrude(nrbcirc, [0,0,1]);
-%
-%    Copyright (C) 2000 Mark Spink
-%    Copyright (C) 2010 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if (nargin < 2)
-  error('Error too few input arguments!');
-end
-
-if (iscell (curve.knots))
-  if (numel (curve.knots) == 3)
-    error('Nurbs volumes cannot be extruded!');
-  end
-  for ii = 1:size(curve.coefs,3)
-    coefs(:,:,ii) = vectrans(vector) * squeeze (curve.coefs(:,:,ii));
-  end
-  coefs = cat(4,curve.coefs,coefs);
-  srf = nrbmak(coefs,{curve.knots{:}, [0 0 1 1]});
-else
-  coefs = cat(3,curve.coefs,vectrans(vector)*curve.coefs);
-  srf = nrbmak(coefs,{curve.knots, [0 0 1 1]});
-end
-
-end
-
-%!demo
-%! crv = nrbtestcrv;
-%! srf = nrbextrude(crv,[0 0 5]);
-%! nrbplot(srf,[40 10]);
-%! title('Extrusion of a test curve along the z-axis');
-%! hold off
-%
-%!demo
-%! crv1 = nrbcirc (1, [0 0], 0, pi/2);
-%! crv2 = nrbcirc (2, [0 0], 0, pi/2);
-%! srf  = nrbruled (crv1, crv2);
-%! vol  = nrbextrude (srf, [0 0 1]);
-%! nrbplot (vol, [30 10 10])
-%! title ('Extrusion of the quarter of a ring')
-%
-%!demo
-%! srf = nrbtestsrf;
-%! vol = nrbextrude(srf, [0 0 10]);
-%! nrbplot(vol,[20 20 20]);
-%! title('Extrusion of a test surface along the z-axis');
-%! hold off
--- a/extra/nurbs/inst/nrbkntins.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,198 +0,0 @@
-function inurbs = nrbkntins(nurbs,iknots)
-% 
-% NRBKNTINS: Insert a single or multiple knots into a NURBS curve,
-%            surface or volume.
-% 
-% Calling Sequence:
-% 
-%   icrv = nrbkntins(crv,iuknots);
-%   isrf = nrbkntins(srf,{iuknots ivknots});
-%   ivol = nrbkntins(vol,{iuknots ivknots iwknots});
-% 
-% INPUT:
-% 
-%   crv		: NURBS curve, see nrbmak.
-% 
-%   srf		: NURBS surface, see nrbmak.
-% 
-%   srf		: NURBS volume, see nrbmak.
-% 
-%   iuknots	: Knots to be inserted along U direction.
-% 
-%   ivknots	: Knots to be inserted along V direction.
-% 
-%   iwknots	: Knots to be inserted along W direction.
-% 
-% OUTPUT:
-% 
-%   icrv	: new NURBS structure for a curve with knots inserted.
-% 
-%   isrf	: new NURBS structure for a surface with knots inserted.
-% 
-%   ivol	: new NURBS structure for a volume with knots inserted.
-% 
-% Description:
-% 
-%   Inserts knots into the NURBS data structure, these can be knots at
-%   new positions or at the location of existing knots to increase the
-%   multiplicity. Note that the knot multiplicity cannot be increased
-%   beyond the order of the spline. Knots along the V direction can only
-%   inserted into NURBS surfaces, not curve that are always defined along
-%   the U direction. This function use the B-Spline function bspkntins,
-%   which interfaces to an internal 'C' routine.
-% 
-% Examples:
-% 
-%   Insert two knots into a curve, one at 0.3 and another
-%   twice at 0.4
-%
-%   icrv = nrbkntins(crv, [0.3 0.4 0.4])
-% 
-%   Insert into a surface two knots as (1) into the U knot
-%   sequence and one knot into the V knot sequence at 0.5.
-%
-%   isrf = nrbkntins(srf, {[0.3 0.4 0.4] [0.5]})
-% 
-% See also:
-% 
-%   bspkntins
-%
-% Note:
-%
-%   No knot multiplicity will be increased beyond the order of the spline.
-%
-%    Copyright (C) 2000 Mark Spink, 2010 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if nargin < 2
-  error('Input argument must include the NURBS and knots to be inserted');
-end
-
-if ~isstruct(nurbs)
-  error('NURBS representation is not structure!');
-end
-
-if ~strcmp(nurbs.form,'B-NURBS')
-  error('Not a recognised NURBS representation');
-end
-
-degree = nurbs.order-1;
-
-if iscell(nurbs.knots)
- fmax = @(x,y) any (y > max(x)); fmin = @(x,y) any (y < min(x));
- if (any(cellfun(fmax, nurbs.knots, iknots)) || any(cellfun(fmin, nurbs.knots, iknots)))
-   error ('Trying to insert a knot outside the interval of definition')
- end
-    
- if size(nurbs.knots,2)==3
-  % NURBS represents a volume
-  num1 = nurbs.number(1);
-  num2 = nurbs.number(2);
-  num3 = nurbs.number(3);
-
-  % Insert knots along the w direction
-  if isempty(iknots{3})
-    coefs = nurbs.coefs;
-    knots{3} = nurbs.knots{3};
-  else
-    coefs = reshape(nurbs.coefs,4*num1*num2,num3);
-    [coefs,knots{3}] = bspkntins(degree(3),coefs,nurbs.knots{3},iknots{3});
-    num3 = size(coefs,2);
-    coefs = reshape(coefs,[4 num1 num2 num3]);
-  end
-
-  % Insert knots along the v direction
-  if isempty(iknots{2})
-    knots{2} = nurbs.knots{2};
-  else
-    coefs = permute(coefs,[1 2 4 3]);
-    coefs = reshape(coefs,4*num1*num3,num2);
-    [coefs,knots{2}] = bspkntins(degree(2),coefs,nurbs.knots{2},iknots{2});
-    num2 = size(coefs,2);
-    coefs = reshape(coefs,[4 num1 num3 num2]);
-    coefs = permute(coefs,[1 2 4 3]);
-  end
-
-  % Insert knots along the u direction
-  if isempty(iknots{1})
-    knots{1} = nurbs.knots{1};
-  else   
-    coefs = permute(coefs,[1 3 4 2]);
-    coefs = reshape(coefs,4*num2*num3,num1);
-    [coefs,knots{1}] = bspkntins(degree(1),coefs,nurbs.knots{1},iknots{1});
-    coefs = reshape(coefs,[4 num2 num3 size(coefs,2)]);
-    coefs = permute(coefs,[1 4 2 3]);
-  end
-     
- elseif size(nurbs.knots,2)==2
-  % NURBS represents a surface
-  num1 = nurbs.number(1);
-  num2 = nurbs.number(2);
-
-  % Insert knots along the v direction
-  if isempty(iknots{2})
-    coefs = nurbs.coefs;
-    knots{2} = nurbs.knots{2};
-  else
-    coefs = reshape(nurbs.coefs,4*num1,num2);
-    [coefs,knots{2}] = bspkntins(degree(2),coefs,nurbs.knots{2},iknots{2});
-    num2 = size(coefs,2);
-    coefs = reshape(coefs,[4 num1 num2]);
-  end
-
-  % Insert knots along the u direction
-  if isempty(iknots{1})
-    knots{1} = nurbs.knots{1};
-  else   
-    coefs = permute(coefs,[1 3 2]);
-    coefs = reshape(coefs,4*num2,num1);
-    [coefs,knots{1}] = bspkntins(degree(1),coefs,nurbs.knots{1},iknots{1});
-    coefs = reshape(coefs,[4 num2 size(coefs,2)]);
-    coefs = permute(coefs,[1 3 2]);
-  end
- end
-else
-
-  if (any(iknots > max(nurbs.knots)) || any(iknots < min(nurbs.knots)))
-    error ('Trying to insert a knot outside the interval of definition')
-  end
-  % NURBS represents a curve
-  if isempty(iknots)
-    coefs = nurbs.coefs;
-    knots = nurbs.knots;
-  else
-    [coefs,knots] = bspkntins(degree,nurbs.coefs,nurbs.knots,iknots);  
-  end
-
-end
-
-% construct new NURBS
-inurbs = nrbmak(coefs,knots); 
-
-end
-
-%!demo
-%! crv = nrbtestcrv;
-%! plot(crv.coefs(1,:),crv.coefs(2,:),'bo')
-%! title('Knot insertion along test curve: curve and control polygons.');
-%! hold on;
-%! plot(crv.coefs(1,:),crv.coefs(2,:),'b--');
-%!
-%! nrbplot(crv,48);
-%!
-%! icrv = nrbkntins(crv,[0.125 0.375 0.625 0.875] );
-%! plot(icrv.coefs(1,:),icrv.coefs(2,:),'ro')
-%! plot(icrv.coefs(1,:),icrv.coefs(2,:),'r--');
-%! hold off
\ No newline at end of file
--- a/extra/nurbs/inst/nrbkntplot.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,206 +0,0 @@
-function nrbkntplot (nurbs)
-
-% NRBKNTPLOT: Plot a NURBS entity with the knots subdivision.
-% 
-% Calling Sequence:
-% 
-%   nrbkntplot(nurbs)
-% 
-% INPUT:
-% 
-%   nurbs: NURBS curve, surface or volume, see nrbmak.
-% 
-% Example:
-%
-%   Plot the test surface with its knot vector
-%
-%   nrbkntplot(nrbtestsrf)
-%
-% See also:
-% 
-%   nrbctrlplot
-%
-%    Copyright (C) 2011, 2012 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if (nargin < 1)
-  error ('nrbkntplot: Need a NURBS to plot!');
-end
-
-% Default values
-light='on';
-cmap='summer';
-
-colormap (cmap);
-
-hold_flag = ishold;
-
-if (iscell (nurbs.knots))
- if (size (nurbs.knots,2) == 2) % plot a NURBS surface
-   nsub = 100;
-   nrbplot (nurbs, [nsub nsub], 'light', light, 'colormap', cmap);
-   hold on
-
-   % And plot the knots
-   knt1 = unique (nurbs.knots{1}(nurbs.order(1):end-nurbs.order(1)+1));
-   knt2 = unique (nurbs.knots{2}(nurbs.order(2):end-nurbs.order(2)+1));
-   p1 = nrbeval (nurbs, {knt1, linspace(knt2(1),knt2(end),nsub)});
-   p2 = nrbeval (nurbs, {linspace(knt1(1),knt1(end),nsub), knt2});
-
-  if (any (nurbs.coefs(3,:)))
-    % surface in a 3D space
-    for ii = 1:numel(knt1)
-      plot3 (squeeze(p1(1,ii,:)), squeeze(p1(2,ii,:)), squeeze(p1(3,ii,:)),'k');
-    end
-    for ii = 1:numel(knt2)
-      plot3 (squeeze(p2(1,:,ii)), squeeze(p2(2,:,ii)), squeeze(p2(3,:,ii)),'k'); 
-    end
-  else
-    % plain surface
-    for ii = 1:numel(knt1)
-      plot (squeeze(p1(1,ii,:)), squeeze (p1(2,ii,:)),'k'); 
-    end
-    for ii = 1:numel(knt2)
-      plot (p2(1,:,ii),p2(2,:,ii),'k');
-    end
-  end
-
-
-
- elseif (size (nurbs.knots,2) == 3) % plot a NURBS volume
-   % Plot the boundaries
-   bnd = nrbextract (nurbs);
-   nrbkntplot (bnd(1));
-   hold on
-   for iface = 2:6
-     nrbkntplot (bnd(iface));
-   end
- end
-else % plot a NURBS curve
-  nsub = 1000;
-  nrbplot (nurbs, nsub);
-  hold on
-
-  % And plot the knots
-   order = nurbs.order;
-   p = nrbeval (nurbs, unique (nurbs.knots(order:end-order+1)));
-
-   if (any (nurbs.coefs(3,:))) % plot a 3D curve
-     plot3 (p(1,:), p(2,:), p(3,:), 'rx'); 
-   else                     % plot a 2D curve
-     plot (p(1,:), p(2,:), 'rx'); 
-   end
-
-end
-
-if (~hold_flag)
-  hold off
-end
-
-end
-%!demo
-%! crv = nrbtestcrv;
-%! nrbkntplot(crv)
-%! title('Test curve')
-%! hold off
-
-%!demo
-%! sphere = nrbrevolve(nrbcirc(1,[],0.0,pi),[0.0 0.0 0.0],[1.0 0.0 0.0]);
-%! nrbkntplot(sphere);
-%! title('Ball and torus - surface construction by revolution');
-%! hold on;
-%! torus = nrbrevolve(nrbcirc(0.2,[0.9 1.0]),[0.0 0.0 0.0],[1.0 0.0 0.0]);
-%! nrbkntplot(torus);
-%! hold off
-
-%!demo
-%! knots = {[0 0 0 1/2 1 1 1] [0 0 0 1 1 1]...
-%!          [0 0 0 1/6 2/6 1/2 1/2 4/6 5/6 1 1 1]};
-%!
-%! coefs = [-1.0000   -0.9734   -0.7071    1.4290    1.0000    3.4172
-%!          0    2.4172         0    0.0148   -2.0000   -1.9734
-%!          0    2.0000    4.9623    9.4508    4.0000    2.0000
-%!     1.0000    1.0000    0.7071    1.0000    1.0000    1.0000
-%!    -0.8536         0   -0.6036    1.9571    1.2071    3.5000
-%!     0.3536    2.5000    0.2500    0.5429   -1.7071   -1.0000
-%!          0    2.0000    4.4900    8.5444    3.4142    2.0000
-%!     0.8536    1.0000    0.6036    1.0000    0.8536    1.0000
-%!    -0.3536   -4.0000   -0.2500   -1.2929    1.7071    1.0000
-%!     0.8536         0    0.6036   -2.7071   -1.2071   -5.0000
-%!          0    2.0000    4.4900   10.0711    3.4142    2.0000
-%!     0.8536    1.0000    0.6036    1.0000    0.8536    1.0000
-%!          0   -4.0000         0    0.7071    2.0000    5.0000
-%!     1.0000    4.0000    0.7071   -0.7071   -1.0000   -5.0000
-%!          0    2.0000    4.9623   14.4142    4.0000    2.0000
-%!     1.0000    1.0000    0.7071    1.0000    1.0000    1.0000
-%!    -2.5000   -4.0000   -1.7678    0.7071    1.0000    5.0000
-%!          0    4.0000         0   -0.7071   -3.5000   -5.0000
-%!          0    2.0000    6.0418   14.4142    4.0000    2.0000
-%!     1.0000    1.0000    0.7071    1.0000    1.0000    1.0000
-%!    -2.4379         0   -1.7238    2.7071    1.9527    5.0000
-%!     0.9527    4.0000    0.6737    1.2929   -3.4379   -1.0000
-%!          0    2.0000    6.6827   10.0711    4.0000    2.0000
-%!     1.0000    1.0000    0.7071    1.0000    1.0000    1.0000
-%!    -0.9734   -1.0000   -0.6883    0.7071    3.4172    1.0000
-%!     2.4172         0    1.7092   -1.4142   -1.9734   -2.0000
-%!          0    4.0000    6.6827    4.9623    4.0000         0
-%!     1.0000    1.0000    0.7071    0.7071    1.0000    1.0000
-%!          0   -0.8536         0    0.8536    3.5000    1.2071
-%!     2.5000    0.3536    1.7678   -1.2071   -1.0000   -1.7071
-%!          0    3.4142    6.0418    4.4900    4.0000         0
-%!     1.0000    0.8536    0.7071    0.6036    1.0000    0.8536
-%!    -4.0000   -0.3536   -2.8284    1.2071    1.0000    1.7071
-%!          0    0.8536         0   -0.8536   -5.0000   -1.2071
-%!          0    3.4142    7.1213    4.4900    4.0000         0
-%!     1.0000    0.8536    0.7071    0.6036    1.0000    0.8536
-%!    -4.0000         0   -2.8284    1.4142    5.0000    2.0000
-%!     4.0000    1.0000    2.8284   -0.7071   -5.0000   -1.0000
-%!          0    4.0000   10.1924    4.9623    4.0000         0
-%!     1.0000    1.0000    0.7071    0.7071    1.0000    1.0000
-%!    -4.0000   -2.5000   -2.8284    0.7071    5.0000    1.0000
-%!     4.0000         0    2.8284   -2.4749   -5.0000   -3.5000
-%!          0    4.0000   10.1924    6.0418    4.0000         0
-%!     1.0000    1.0000    0.7071    0.7071    1.0000    1.0000
-%!          0   -2.4379         0    1.3808    5.0000    1.9527
-%!     4.0000    0.9527    2.8284   -2.4309   -1.0000   -3.4379
-%!          0    4.0000    7.1213    6.6827    4.0000         0
-%!     1.0000    1.0000    0.7071    0.7071    1.0000    1.0000
-%!    -1.0000   -0.9734    0.2071    2.4163    1.0000    3.4172
-%!          0    2.4172   -1.2071   -1.3954   -2.0000   -1.9734
-%!     2.0000    4.0000    7.0178    6.6827    2.0000         0
-%!     1.0000    1.0000    1.0000    0.7071    1.0000    1.0000
-%!    -0.8536         0    0.3536    2.4749    1.2071    3.5000
-%!     0.3536    2.5000   -0.8536   -0.7071   -1.7071   -1.0000
-%!     1.7071    4.0000    6.3498    6.0418    1.7071         0
-%!     0.8536    1.0000    0.8536    0.7071    0.8536    1.0000
-%!    -0.3536   -4.0000    0.8536    0.7071    1.7071    1.0000
-%!     0.8536         0   -0.3536   -3.5355   -1.2071   -5.0000
-%!     1.7071    4.0000    6.3498    7.1213    1.7071         0
-%!     0.8536    1.0000    0.8536    0.7071    0.8536    1.0000
-%!          0   -4.0000    1.2071    3.5355    2.0000    5.0000
-%!     1.0000    4.0000   -0.2071   -3.5355   -1.0000   -5.0000
-%!     2.0000    4.0000    7.0178   10.1924    2.0000         0
-%!     1.0000    1.0000    1.0000    0.7071    1.0000    1.0000
-%!    -2.5000   -4.0000   -0.5429    3.5355    1.0000    5.0000
-%!          0    4.0000   -1.9571   -3.5355   -3.5000   -5.0000
-%!     2.0000    4.0000    8.5444   10.1924    2.0000         0
-%!     1.0000    1.0000    1.0000    0.7071    1.0000    1.0000
-%!    -2.4379         0   -0.0355    3.5355    1.9527    5.0000
-%!     0.9527    4.0000   -1.4497   -0.7071   -3.4379   -1.0000
-%!     2.0000    4.0000    9.4508    7.1213    2.0000         0
-%!     1.0000    1.0000    1.0000    0.7071    1.0000    1.0000];
-%! coefs = reshape (coefs, 4, 4, 3, 9);
-%! horseshoe = nrbmak (coefs, knots);
-%! nrbkntplot (horseshoe);
--- a/extra/nurbs/inst/nrbline.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-function curve = nrbline(p1,p2)
-% 
-% NRBLINE: Construct a straight line.
-% 
-% Calling Sequence:
-% 
-%   crv = nrbline()
-%   crv = nrbline(p1,p2)
-% 
-% INPUT:
-% 
-% p1		: 2D or 3D cartesian coordinate of the start point.
-% 
-% p2            : 2D or 3D cartesian coordinate of the end point.
-%
-% OUTPUT:
-% 
-% crv		: NURBS curve for a straight line.
-% 
-% Description:
-% 
-%   Constructs NURBS data structure for a straight line. If no rhs 
-%   coordinates are included the function returns a unit straight
-%   line along the x-axis.
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-coefs = [zeros(3,2); ones(1,2)];
-
-if nargin < 2
-  coefs(1,2) = 1.0;  
-else
-  coefs(1:length(p1),1) = p1(:);    
-  coefs(1:length(p2),2) = p2(:);
-end
-
-curve = nrbmak(coefs, [0 0 1 1]);
-
-end
-
-%!demo
-%! crv = nrbline([0.0 0.0 0.0]',[5.0 4.0 2.0]');
-%! nrbplot(crv,1);
-%! grid on;
-%! title('3D straight line.');
-%! hold off
--- a/extra/nurbs/inst/nrbmak.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,250 +0,0 @@
-function nurbs = nrbmak(coefs,knots)
-%
-% NRBMAK: Construct the NURBS structure given the control points
-%            and the knots.
-% 
-% Calling Sequence:
-% 
-%   nurbs   = nrbmak(cntrl,knots);
-% 
-% INPUT:
-% 
-%   cntrl       : Control points, these can be either Cartesian or
-% 		homogeneous coordinates.
-% 
-% 		For a curve the control points are represented by a
-% 		matrix of size (dim,nu), for a surface a multidimensional
-% 		array of size (dim,nu,nv), for a volume a multidimensional array
-% 		of size (dim,nu,nv,nw). Where nu is number of points along
-% 		the parametric U direction, nv the number of points along
-% 		the V direction and nw the number of points along the W direction. 
-% 		dim is the dimension. Valid options
-% 		are
-% 		2 .... (x,y)        2D Cartesian coordinates
-% 		3 .... (x,y,z)      3D Cartesian coordinates
-% 		4 .... (wx,wy,wz,w) 4D homogeneous coordinates
-% 
-%   knots	: Non-decreasing knot sequence spanning the interval
-%               [0.0,1.0]. It's assumed that the geometric entities
-%               are clamped to the start and end control points by knot
-%               multiplicities equal to the spline order (open knot vector).
-%               For curve knots form a vector and for surfaces (volumes)
-%               the knots are stored by two (three) vectors for U and V (and W)
-%               in a cell structure {uknots vknots} ({uknots vknots wknots}).
-%               
-% OUTPUT:
-% 
-%   nurbs 	: Data structure for representing a NURBS entity
-% 
-% NURBS Structure:
-% 
-%   Both curves and surfaces are represented by a structure that is
-%   compatible with the Spline Toolbox from Mathworks
-% 
-% 	nurbs.form   .... Type name 'B-NURBS'
-% 	nurbs.dim    .... Dimension of the control points
-% 	nurbs.number .... Number of Control points
-%       nurbs.coefs  .... Control Points
-%       nurbs.order  .... Order of the spline
-%       nurbs.knots  .... Knot sequence
-% 
-%   Note: the control points are always converted and stored within the
-%   NURBS structure as 4D homogeneous coordinates. A curve is always stored 
-%   along the U direction, and the vknots element is an empty matrix. For
-%   a surface the spline order is a vector [du,dv] containing the order
-%   along the U and V directions respectively. For a volume the order is
-%   a vector [du dv dw]. Recall that order = degree + 1.
-% 
-% Description:
-% 
-%   This function is used as a convenient means of constructing the NURBS
-%   data structure. Many of the other functions in the toolbox rely on the 
-%   NURBS structure been correctly defined as shown above. The nrbmak not
-%   only constructs the proper structure, but also checks for consistency.
-%   The user is still free to build his own structure, in fact a few
-%   functions in the toolbox do this for convenience.
-% 
-% Examples:
-% 
-%   Construct a 2D line from (0.0,0.0) to (1.5,3.0).
-%   For a straight line a spline of order 2 is required.
-%   Note that the knot sequence has a multiplicity of 2 at the
-%   start (0.0,0.0) and end (1.0 1.0) in order to clamp the ends.
-% 
-%   line = nrbmak([0.0 1.5; 0.0 3.0],[0.0 0.0 1.0 1.0]);
-%   nrbplot(line, 2);
-% 
-%   Construct a surface in the x-y plane i.e
-%     
-%     ^  (0.0,1.0) ------------ (1.0,1.0)
-%     |      |                      |
-%     | V    |                      |
-%     |      |      Surface         |
-%     |      |                      |
-%     |      |                      |
-%     |  (0.0,0.0) ------------ (1.0,0.0)
-%     |
-%     |------------------------------------>
-%                                       U 
-%
-%   coefs = cat(3,[0 0; 0 1],[1 1; 0 1]);
-%   knots = {[0 0 1 1]  [0 0 1 1]}
-%   plane = nrbmak(coefs,knots);
-%   nrbplot(plane, [2 2]);
-%
-%    Copyright (C) 2000 Mark Spink, 2010 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-nurbs = struct ('form', 'B-NURBS', 'dim', 4, 'number', [], 'coefs', [], ...
-                'knots', [], 'order', []);
-
-nurbs.form   = 'B-NURBS';
-nurbs.dim    = 4;
-np = size(coefs);
-dim = np(1);
-if iscell(knots)
-  if size(knots,2) == 3
-   if (numel(np) == 3)
-     np(4) = 1;
-   elseif (numel(np)==2)
-     np(3:4) = 1;
-   end
-  % constructing a volume 
-   nurbs.number = np(2:4);
-   if (dim < 4)
-     nurbs.coefs = repmat([0.0 0.0 0.0 1.0]',[1 np(2:4)]);
-     nurbs.coefs(1:dim,:,:,:) = coefs;  
-   else
-     nurbs.coefs = coefs;
-   end
-   uorder = size(knots{1},2)-np(2);
-   vorder = size(knots{2},2)-np(3);
-   worder = size(knots{3},2)-np(4);
-   uknots = sort(knots{1});
-   vknots = sort(knots{2});
-   wknots = sort(knots{3});
-%   uknots = (uknots-uknots(uorder))/(uknots(end-uorder+1)-uknots(uorder));
-%   vknots = (vknots-vknots(vorder))/(vknots(end-vorder+1)-vknots(vorder));
-%   wknots = (wknots-wknots(worder))/(wknots(end-worder+1)-wknots(worder));
-   nurbs.knots = {uknots vknots wknots};
-   nurbs.order = [uorder vorder worder];
-
-  elseif size(knots,2) == 2
-   if (numel(np)==2); np(3) = 1; end
-   % constructing a surface 
-   nurbs.number = np(2:3);
-   if (dim < 4)
-     nurbs.coefs = repmat([0.0 0.0 0.0 1.0]',[1 np(2:3)]);
-     nurbs.coefs(1:dim,:,:) = coefs;  
-   else
-     nurbs.coefs = coefs;
-   end
-   uorder = size(knots{1},2)-np(2);
-   vorder = size(knots{2},2)-np(3);
-   uknots = sort(knots{1});
-   vknots = sort(knots{2});
-%   uknots = (uknots-uknots(uorder))/(uknots(end-uorder+1)-uknots(uorder));
-%   vknots = (vknots-vknots(vorder))/(vknots(end-vorder+1)-vknots(vorder));
-   nurbs.knots = {uknots vknots};
-   nurbs.order = [uorder vorder];
-   
-  end
-
-else
-
-  % constructing a curve
-  nurbs.number = np(2);
-  if (dim < 4)
-    nurbs.coefs = repmat([0.0 0.0 0.0 1.0]',[1 np(2)]);
-    nurbs.coefs(1:dim,:) = coefs;  
-  else
-    nurbs.coefs = coefs;
-  end
-  order = size (knots,2) - np(2);
-  nurbs.order = order;
-  knots = sort(knots);
-%  nurbs.knots = (knots-knots(order))/(knots(end-order+1)-knots(order));
-  nurbs.knots = knots;
-
-end
-
-end
-
-%!demo
-%! pnts = [0.5 1.5 4.5 3.0 7.5 6.0 8.5;
-%!         3.0 5.5 5.5 1.5 1.5 4.0 4.5;
-%!         0.0 0.0 0.0 0.0 0.0 0.0 0.0];
-%! crv = nrbmak(pnts,[0 0 0 1/4 1/2 3/4 3/4 1 1 1]);
-%! nrbplot(crv,100)
-%! title('Test curve')
-%! hold off
-
-%!demo
-%! pnts = [0.5 1.5 4.5 3.0 7.5 6.0 8.5;
-%!         3.0 5.5 5.5 1.5 1.5 4.0 4.5;
-%!         0.0 0.0 0.0 0.0 0.0 0.0 0.0];
-%! crv = nrbmak(pnts,[0 0 0 0.1 1/2 3/4 3/4 1 1 1]);
-%! nrbplot(crv,100)
-%! title('Test curve with a slight variation of the knot vector')
-%! hold off
-
-%!demo
-%! pnts = zeros(3,5,5);
-%! pnts(:,:,1) = [ 0.0  3.0  5.0  8.0 10.0; 
-%!                 0.0  0.0  0.0  0.0  0.0; 
-%!                 2.0  2.0  7.0  7.0  8.0];
-%! pnts(:,:,2) = [ 0.0  3.0  5.0  8.0 10.0;
-%!                 3.0  3.0  3.0  3.0  3.0;
-%!                 0.0  0.0  5.0  5.0  7.0];
-%! pnts(:,:,3) = [ 0.0  3.0  5.0  8.0 10.0;
-%!                 5.0  5.0  5.0  5.0  5.0;
-%!                 0.0  0.0  5.0  5.0  7.0];
-%! pnts(:,:,4) = [ 0.0  3.0  5.0  8.0 10.0;
-%!                 8.0  8.0  8.0  8.0  8.0;
-%!                 5.0  5.0  8.0  8.0 10.0];
-%! pnts(:,:,5) = [ 0.0  3.0  5.0  8.0 10.0;
-%!                10.0 10.0 10.0 10.0 10.0;
-%!                 5.0  5.0  8.0  8.0 10.0];
-%!
-%! knots{1} = [0 0 0 1/3 2/3 1 1 1];
-%! knots{2} = [0 0 0 1/3 2/3 1 1 1];
-%!
-%! srf = nrbmak(pnts,knots);
-%! nrbplot(srf,[20 20])
-%! title('Test surface')
-%! hold off
-
-%!demo
-%! coefs =[ 6.0  0.0  6.0  1;
-%!         -5.5  0.5  5.5  1;
-%!         -5.0  1.0 -5.0  1;
-%!          4.5  1.5 -4.5  1;
-%!          4.0  2.0  4.0  1;
-%!         -3.5  2.5  3.5  1;
-%!         -3.0  3.0 -3.0  1;
-%!          2.5  3.5 -2.5  1;
-%!          2.0  4.0  2.0  1;
-%!         -1.5  4.5  1.5  1;
-%!         -1.0  5.0 -1.0  1;
-%!          0.5  5.5 -0.5  1;
-%!          0.0  6.0  0.0  1]';
-%! knots = [0 0 0 0 .1 .2 .3 .4 .5 .6 .7 .8 .9 1 1 1 1];
-%!
-%! crv = nrbmak(coefs,knots);
-%! nrbplot(crv,100);
-%! grid on;
-%! title('3D helical curve.');
-%! hold off
-
--- a/extra/nurbs/inst/nrbmeasure.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,115 +0,0 @@
-% NRBMEASURE: Compute the distance between two given points along a NURBS curve.
-% 
-% Calling Sequence:
-% 
-%  [dist, ddistds, ddistde] = nrbmeasure (nrb)
-%  [dist, ddistds, ddistde] = nrbmeasure (nrb, s, e)
-%  [dist, ddistds, ddistde] = nrbmeasure (nrb, s, e, tol)
-% 
-% INPUT:
-% 
-%   nrb	: a NURBS curve, see nrbmak.
-%   s   : starting point in the parametric domain.
-%   e   : ending point in the parametric domain.
-%   tol : tolerance for numerical quadrature, to be used in quad.
-% 
-% OUTPUT:
-% 
-%   dist   : distance between the two points along the NURBS curve.
-%   ddistds: derivative of the distance function with respect to the point s.
-%   ddistde: derivative of the distance function with respect to the point e.
-% 
-% Description:
-% 
-%   Compute the distance between two given points along a NURBS curve, using 
-%   quad for numerical integration. The points are given by their coordinates
-%   in the parametric domain.
-%
-% Examples:
-%
-%  Compute the length of a circular arc constructed as a NURBS.
-%
-%   c = nrbcirc (1, [0 0], 0, pi/2);
-%   s = 0; e = 1;
-%   l = nrbmeasure (c, s, e, 1e-7);
-%
-% Copyright (C) 2013 Carlo de Falco
-% 
-%   This program is free software; you can redistribute it and/or modify
-%   it under the terms of the GNU General Public License as published by
-%   the Free Software Foundation; either version 3 of the License, or
-%   (at your option) any later version.
-   
-%   This program is distributed in the hope that it will be useful,
-%   but WITHOUT ANY WARRANTY; without even the implied warranty of
-%   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%   GNU General Public License for more details.
-%   
-%   You should have received a copy of the GNU General Public License
-%   along with Octave; see the file COPYING.  If not, see
-%   <http://www.gnu.org/licenses/>.  
-
-function [dist, ddistds, ddistde] = nrbmeasure (nrb, s, e, tol)
-  
-  if (nargin < 4)
-    tol = 1e-6;
-    if (nargin < 3)
-      e = 1;
-      if (nargin < 2)
-        s = 0;
-      end
-    end
-  end
-
-  nrb.knots = (nrb.knots - nrb.knots(1)) / (nrb.knots(end) - nrb.knots(1));
-
-  if (numel (s) > 1 && isscalar (e))
-    e = e * ones (size(s));
-  elseif (numel (e) > 1 && isscalar (s))
-    s = s * ones (size(e));
-  end
-
-  ders = nrbderiv (nrb);
-  dist = arrayfun (@(x, y) quad (@(u) len (u, nrb, ders), x, ...
-                                 y, tol), s, e);
-  
-  if (nargout > 1)
-    ddistds = -len (s, nrb, ders);
-    if (nargout > 2)
-      ddistde = +len (e, nrb, ders);
-    end
-  end
-
-end
-
-function l = len (u, nrb, ders)
-  [~, d] = nrbdeval (nrb, ders, u);
-  f = d(1, :);
-  g = d(2, :);
-  h = d(3, :);
-  l = sqrt (f.^2 + g.^2 + h.^2);
-end
-
-%!test 
-%! c = nrbcirc (1, [0 0], 0,  pi/3);
-%! l = nrbmeasure(c, 0, 1, 1e-7);
-%! assert (l, pi/3, 1e-7)
-
-%!test 
-%! c = nrbcirc (1, [0 0], 0,  pi/2);
-%! s = zeros (1, 100); e = linspace (0, 1, 100);
-%! for ii = 1:100
-%!   l(ii) = nrbmeasure (c, s(ii), e(ii), 1e-7);
-%! endfor
-%! xx = nrbeval (c, e);
-%! theta = atan2 (xx(2,:), xx(1,:));
-%! assert (l, theta, 1e-7)
-
-%!test 
-%! c = nrbcirc (1, [0 0], 0,  pi/2);
-%! s = 0; e = linspace (0, 1, 100);
-%! for ii = 1:100
-%!   l(ii) = nrbmeasure (c, s, e(ii), 1e-7);
-%! endfor
-%! l2 = nrbmeasure (c, s, e, 1e-7);
-%! assert (l, l2, eps)
--- a/extra/nurbs/inst/nrbmultipatch.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,177 +0,0 @@
-function [interfaces, boundary] = nrbmultipatch (nurbs)
-
-%
-% NRBMULTIPATCH: construct the information for gluing conforming NURBS patches, using the same format as in GeoPDEs.
-% 
-% Calling Sequence:
-% 
-%   [interfaces, boundary] = nrbmultipatch (nurbs);
-% 
-% INPUT:
-% 
-%   nurbs   : an array of NURBS surfaces or volumes (not both), see nrbmak.
-% 
-% OUTPUT: 
-% 
-%   interfaces: array with the information for each interface, that is:
-%      - number of the first patch (patch1), and the local side number (side1)
-%      - number of the second patch (patch2), and the local side number (side2)
-%      - flag (faces and volumes), ornt1, ornt2 (only volumes): information
-%        on how the two patches match, see below.
-%   boundary:   array with the boundary faces that do not belong to any interface
-%      - nsides:  total number of sides on the boundary array (numel(boundary))
-%      - patches: number of the patch to which the boundary belongs to
-%      - sides:   number of the local side on the patch
-% 
-%    Copyright (C) 2014 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-
-npatch = numel (nurbs);
-if (~iscell (nurbs(1).knots))
-  error ('Multipatch only works for 2D and 3D geometries')
-elseif (size(nurbs(1).knots,2) == 2)
-  ndim = 2;
-  face_corners = @(x) x.coefs(:, [1 end]);
-  compare_corners = @(nrb1, nrb2) compare_corners_univariate (nrb1, nrb2);
-elseif (size(nurbs(1).knots,2) == 3)
-  ndim = 3;
-  face_corners = @(x) x.coefs(:, [1 end], [1 end]);
-  compare_corners = @(nrb1, nrb2) compare_corners_bivariate (nrb1, nrb2);
-end
-
-non_set_faces = cell (npatch, 1);
-for ii = 1:npatch
-  if (~iscell (nurbs(ii).knots))
-    error ('Multipatch only works for 2D and 3D geometries')
-  elseif (ndim ~= size(nurbs(ii).knots,2))
-    error ('All the patches must have the same dimension (at least for now)')
-  end
-  non_set_faces{ii} = 1:2*ndim;
-end
-
-num_interfaces = 0;
-
-boundary.nsides = 0;
-boundary.patches = [];
-boundary.faces = [];
-
-for i1 = 1:npatch
-  nrb_faces1 = nrbextract (nurbs(i1));
-  for j1 = non_set_faces{i1}
-    
-% This is to fix a bug when two faces of the same patch form an interface
-%  (for instance, in a ring or a torus)
-    if (isempty (intersect (non_set_faces{i1}, j1))); continue; end
-
-    nrb1 = nrb_faces1(j1);
-    corners1 = face_corners (nrb1);
-
-    non_set_faces{i1} = setdiff (non_set_faces{i1}, j1);
-    flag = 0;
-
-    i2 = i1 - 1;
-    while (~flag && i2 < npatch)
-      i2 = i2 + 1;
-      nrb_faces2 = nrbextract (nurbs(i2));
-      j2 = 0;
-      while (~flag && j2 < numel (non_set_faces{i2}))
-        j2 = j2 + 1;
-        nrb2 = nrb_faces2(non_set_faces{i2}(j2));
-        if (numel(nrb1.coefs) ~= numel(nrb2.coefs))
-          continue
-        else
-          corners2 = face_corners (nrb2);
-          if (ndim == 2)
-            flag = compare_corners (corners1, corners2);
-          elseif (ndim == 3)
-            [flag, ornt1, ornt2] = compare_corners (corners1, corners2);
-          end
-        end
-      end
-    end
-
-    if (flag)
-      intrfc.patch1 = i1;
-      intrfc.side1 = j1;
-      intrfc.patch2 = i2;
-      intrfc.side2 = non_set_faces{i2}(j2);
-      if (ndim ==3)
-        intrfc.flag = flag;
-        intrfc.ornt1 = ornt1;
-        intrfc.ornt2 = ornt2;
-      else
-        intrfc.ornt = flag;
-      end
-
-      non_set_faces{i2} = setdiff (non_set_faces{i2}, non_set_faces{i2}(j2));
-      num_interfaces = num_interfaces + 1;
-      interfaces(num_interfaces) = intrfc;
-    else
-      boundary.nsides = boundary.nsides + 1;
-      boundary.patches = [boundary.patches; i1];
-      boundary.faces = [boundary.faces; j1];
-    end
-  end
-end
-
-if (num_interfaces == 0)
-   interfaces = []; 
-end
-if (boundary.nsides == 0)
-  boundary = [];
-end
-
-end
-
-
-
-function [flag, ornt1, ornt2] = compare_corners_bivariate (coefs1, coefs2)
-  coefs1 = reshape (coefs1, 4, []);
-  coefs2 = reshape (coefs2, 4, []);
-% Should use some sort of relative error
-  if (max (max (abs (coefs1 - coefs2))) < 1e-13)
-    flag = 1; ornt1 = 1; ornt2 = 1;
-  elseif (max (max (abs (coefs1 - coefs2(:,[1 3 2 4])))) < 1e-13)
-    flag = -1; ornt1 = 1; ornt2 = 1;
-  elseif (max (max (abs (coefs1 - coefs2(:,[3 1 4 2])))) < 1e-13)
-    flag = -1; ornt1 = -1; ornt2 = 1;
-  elseif (max (max (abs (coefs1 - coefs2(:,[2 1 4 3])))) < 1e-13)
-    flag = 1; ornt1 = -1; ornt2 = 1;
-  elseif (max (max (abs (coefs1 - coefs2(:,[4 3 2 1])))) < 1e-13)
-    flag = 1; ornt1 = -1; ornt2 = -1;
-  elseif (max (max (abs (coefs1 - coefs2(:,[4 2 3 1])))) < 1e-13)
-    flag = -1; ornt1 = -1; ornt2 = -1;
-  elseif (max (max (abs (coefs1 - coefs2(:,[2 4 1 3])))) < 1e-13)
-    flag = -1; ornt1 = 1; ornt2 = -1;
-  elseif (max (max (abs (coefs1 - coefs2(:,[3 4 1 2])))) < 1e-13)
-    flag = 1; ornt1 = 1; ornt2 = -1;
-  else
-    flag = 0; ornt1 = 0; ornt2 = 0;
-  end
-end
-
-function flag = compare_corners_univariate (coefs1, coefs2)
-  coefs1 = reshape (coefs1, 4, []);
-  coefs2 = reshape (coefs2, 4, []);
-% Should use some sort of relative error
-  if (max (max (abs (coefs1 - coefs2))) < 1e-13)
-    flag = 1;
-  elseif (max (max (abs (coefs1 - coefs2(:,[end 1])))) < 1e-13)
-    flag = -1;
-  else
-    flag = 0;
-  end
-end
--- a/extra/nurbs/inst/nrbnumbasisfun.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-function idx = nrbnumbasisfun (points, nrb)
-%
-% NRBNUMBASISFUN:  Numbering of basis functions for NURBS
-%
-% Calling Sequence:
-% 
-%   N      = nrbnumbasisfun (u, crv)
-%   N      = nrbnumbasisfun ({u, v}, srf)
-%   N      = nrbnumbasisfun (p, srf)
-%
-%    INPUT:
-%   
-%      u or p(1,:,:)  - parametric points along u direction
-%      v or p(2,:,:)  - parametric points along v direction
-%      crv - NURBS curve
-%      srf - NURBS surface
-%   
-%    OUTPUT:
-%
-%      N - Indices of the basis functions that are nonvanishing at each
-%          point. size(N) == size(B)
-%
-%    Copyright (C) 2009 Carlo de Falco
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-  if (   (nargin<2) ...
-      || (nargout>1) ...
-      || (~isstruct(nrb)) ...
-      || (iscell(points) && ~iscell(nrb.knots)) ...
-      || (~iscell(points) && iscell(nrb.knots) && (size(points,1)~=2)) ...
-      )
-    error('Incorrect input arguments in nrbnumbasisfun');
-  end
-
-
-  if (~iscell(nrb.knots))          %% NURBS curve
-    
-    iv  = findspan (nrb.number-1, nrb.order-1, points, nrb.knots);
-    idx = numbasisfun (iv, points, nrb.order-1, nrb.knots);
-    
-  elseif size(nrb.knots,2) == 2  %% NURBS surface
-
-    if (iscell(points))
-      [v, u] = meshgrid(points{2}, points{1});
-      p(1,:,:) = u;
-      p(2,:,:) = v;
-      p = reshape(p, 2, []);
-    else
-      p = points;
-    end
-    
-    idx = nrb_srf_numbasisfun__ (p, nrb); 
-  else
-    error('The function nrbnumbasisfun is not yet ready for volumes')      
-  end
-  
-end
-
-
-%!test
-%! p = 2;   q = 3;   m = 4; n = 5;
-%! Lx  = 1; Ly  = 1; 
-%! nrb = nrb4surf   ([0 0], [1 0], [0 1], [1 1]);
-%! nrb = nrbdegelev (nrb, [p-1, q-1]);
-%! ikx = linspace(0,1,m); iky = linspace(0,1,n);
-%! nrb = nrbkntins  (nrb, {ikx(2:end-1), iky(2:end-1)});
-%! nrb.coefs (4,:,:) = nrb.coefs (4,:,:) + rand (size (nrb.coefs (4,:,:)));
-%! u = rand (1, 30); v = rand (1, 10);
-%! u = (u-min (u))/max (u-min (u));
-%! v = (v-min (v))/max (v-min (v));
-%! N = nrbnumbasisfun ({u, v}, nrb);
-%! assert (all (all (N>0)), true)
-%! assert (all (all (N <= prod (nrb.number))), true)
-%! assert (max (max (N)), prod (nrb.number))
-%! assert (min (min (N)), 1)
\ No newline at end of file
--- a/extra/nurbs/inst/nrbpermute.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-function tvol = nrbpermute (vol, ord)
-% 
-% NRBPERMUTE: Rearrange the directions of a NURBS volume or surface.
-% 
-% Calling Sequence:
-% 
-%   tvol = nrbpermute(vol,order)
-%
-% INPUT:
-% 
-%   vol		: NURBS volume or surface, see nrbmak.
-%   order   : the order to rearrange the directions of the NURBS entity.
-%
-% OUTPUT:
-% 
-%   tvol	: NURBS volume or surface with rearranged directions.
-% 
-% Description:
-% 
-%   Utility function that rearranges the directions of a NURBS volume or
-%   surface. For surfaces, nrbpermute(srf,[1 2]) is the same as
-%   nrbtransp(srf). NURBS curves cannot be rearranged.
-%
-% Example:
-%
-%    nrbpermute (vol, [1 3 2])
-%
-%    Copyright (C) 2013 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if (~iscell(vol.knots))
-  error('A NURBS curve cannot be rearranged.');
-end
-
-tvol = nrbmak (permute (vol.coefs, [1, ord+1]), {vol.knots{ord}});
-
-%!demo
-%! vol = nrbrevolve (nrb4surf ([1 0], [2 0], [1 1], [2 1]), [0 0 0], [0 1 0], pi/8);
-%! nrbplot(vol,[5 10 20]);
-%! title('NURBS volume and the same after reordering the directions')
-%! hold on
-%! vol.coefs(1,:,:) = vol.coefs(1,:,:) + 2;
-%! vol = nrbpermute(vol,[2 3 1]);
-%! nrbplot(vol,[5 10 20]);
-%! hold off
-
-%!test
-%! vol = nrbrevolve (nrb4surf ([1 0], [2 0], [1 1], [2 1]), [0 0 0], [0 1 0], pi/8);
-%! perm1 = [1 3 2];
-%! perm2 = [2 1 3];
-%! vol2 = nrbpermute (vol, perm1);
-%! vol3 = nrbpermute (vol, perm2);
-%! assert (vol.number(perm1), vol2.number)
-%! assert (vol.order(perm1), vol2.order)
-%! assert ({vol.knots{perm1}}, vol2.knots)
-%! assert (permute(vol.coefs, [1, perm1+1]), vol2.coefs)
-%! assert (vol.number(perm2), vol3.number)
-%! assert (vol.order(perm2), vol3.order)
-%! assert ({vol.knots{perm2}}, vol3.knots)
-%! assert (permute(vol.coefs, [1, perm2+1]), vol3.coefs)
--- a/extra/nurbs/inst/nrbplot.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,269 +0,0 @@
-function nrbplot (nurbs, subd, varargin)
-% 
-% NRBPLOT: Plot a NURBS curve or surface, or the boundary of a NURBS volume.
-% 
-% Calling Sequence:
-% 
-%   nrbplot (nrb, subd)
-%   nrbplot (nrb, subd, p, v)
-% 
-% INPUT:
-% 
-%   nrb		: NURBS curve, surface or volume, see nrbmak.
-% 
-%   npnts	: Number of evaluation points, for a surface or volume, a row 
-%       vector with the number of points along each direction.
-% 
-%   [p,v]       : property/value options
-%
-%               Valid property/value pairs include:
-%
-%               Property        Value/{Default}
-%               -----------------------------------
-%               light           {off} | on
-%               colormap        {'copper'}
-%
-% Example:
-%
-%   Plot the test surface with 20 points along the U direction
-%   and 30 along the V direction
-%
-%   nrbplot(nrbtestsrf, [20 30])
-%
-%    Copyright (C) 2000 Mark Spink
-%    Copyright (C) 2010 Carlo de Falco, Rafael Vazquez
-%    Copyright (C) 2012 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-nargs = nargin;
-if nargs < 2
-  error ('Need a NURBS to plot and the number of subdivisions!');
-elseif rem(nargs+2,2)
-  error ('Param value pairs expected')
-end
-
-% Default values
-light='off';
-cmap='summer';
-
-% Recover Param/Value pairs from argument list
-for i=1:2:nargs-2
-  Param = varargin{i};
-  Value = varargin{i+1};
-  if (~ischar (Param))
-    error ('Parameter must be a string')
-  elseif size(Param,1)~=1
-    error ('Parameter must be a non-empty single row string.')
-  end
-  switch lower (Param)
-  case 'light'
-    light = lower (Value);
-    if (~ischar (light))
-      error ('light must be a string.')
-    elseif ~(strcmp(light,'off') | strcmp(light,'on'))
-      error ('light must be off | on')
-    end
-  case 'colormap'
-    if ischar (Value)
-      cmap = lower(Value);
-    elseif size (Value, 2) ~= 3
-      error ('colormap must be a string or have exactly three columns.')
-    else
-      cmap=Value;
-    end
-  otherwise
-    error ('Unknown parameter: %s', Param)
-  end
-end
-
-colormap (cmap);
-
-% convert the number of subdivisions in number of points
-subd = subd+1;
-
-% plot the curve or surface
-if (iscell (nurbs.knots))
- if (size (nurbs.knots,2) == 2) % plot a NURBS surface
-  knt = nurbs.knots;
-  order = nurbs.order;
-  p = nrbeval (nurbs, {linspace(knt{1}(order(1)),knt{1}(end-order(1)+1),subd(1)) ...
-                       linspace(knt{2}(order(2)),knt{2}(end-order(2)+1),subd(2))});
-  if (strcmp (light,'on'))
-    % light surface
-    surfl (squeeze(p(1,:,:)), squeeze(p(2,:,:)), squeeze(p(3,:,:)));
-    shading interp;
-  else 
-    surf (squeeze (p(1,:,:)), squeeze (p(2,:,:)), squeeze (p(3,:,:)));
-    shading faceted;
-  end
- elseif (size (nurbs.knots,2) == 3) % plot the boundaries of a NURBS volume
-  bnd = nrbextract (nurbs);
-  hold_flag = ishold;
-  nrbplot (bnd(1), subd(2:3), varargin{:});
-  hold on
-  nrbplot (bnd(2), subd(2:3), varargin{:});
-  nrbplot (bnd(3), subd([1 3]), varargin{:});
-  nrbplot (bnd(4), subd([1 3]), varargin{:});
-  nrbplot (bnd(5), subd(1:2), varargin{:});
-  nrbplot (bnd(6), subd(1:2), varargin{:});
-  
-  if (~hold_flag)
-    hold off
-  end
- 
- else
-  error ('nrbplot: some argument is not correct')
- end
-else
-  % plot a NURBS curve
-  order = nurbs.order;
-  p = nrbeval (nurbs, linspace (nurbs.knots(order), nurbs.knots(end-order+1), subd));
-
-  if (any (nurbs.coefs(3,:)))
-    % 3D curve
-    plot3 (p(1,:), p(2,:), p(3,:)); 
-    grid on;
-  else
-    % 2D curve
-    plot (p(1,:), p(2,:));
-  end
-end
-axis equal;
-
-end
-
-% plot the control surface
-% hold on;
-% mesh(squeeze(pnts(1,:,:)),squeeze(pnts(2,:,:)),squeeze(pnts(3,:,:)));
-% hold off;
-
-%!demo
-%! crv = nrbtestcrv;
-%! nrbplot(crv,100)
-%! title('Test curve')
-%! hold off
-
-%!demo
-%! coefs = [0.0 7.5 15.0 25.0 35.0 30.0 27.5 30.0;
-%!          0.0 2.5  0.0 -5.0  5.0 15.0 22.5 30.0];
-%! knots = [0.0 0.0 0.0 1/6 1/3 1/2 2/3 5/6 1.0 1.0 1.0];
-%!
-%! geom = [
-%! nrbmak(coefs,knots)
-%! nrbline([30.0 30.0],[20.0 30.0])
-%! nrbline([20.0 30.0],[20.0 20.0])
-%! nrbcirc(10.0,[10.0 20.0],1.5*pi,0.0)
-%! nrbline([10.0 10.0],[0.0 10.0])
-%! nrbline([0.0 10.0],[0.0 0.0])
-%! nrbcirc(5.0,[22.5 7.5])
-%! ];
-%!
-%! ng = length(geom);
-%! for i = 1:ng
-%!   nrbplot(geom(i),500);
-%!   hold on;
-%! end
-%! hold off;
-%! axis equal;
-%! title('2D Geometry formed by a series of NURBS curves');
-
-%!demo
-%! sphere = nrbrevolve(nrbcirc(1,[],0.0,pi),[0.0 0.0 0.0],[1.0 0.0 0.0]);
-%! nrbplot(sphere,[40 40],'light','on');
-%! title('Ball and torus - surface construction by revolution');
-%! hold on;
-%! torus = nrbrevolve(nrbcirc(0.2,[0.9 1.0]),[0.0 0.0 0.0],[1.0 0.0 0.0]);
-%! nrbplot(torus,[40 40],'light','on');
-%! hold off
-
-%!demo
-%! knots = {[0 0 0 1/2 1 1 1] [0 0 0 1 1 1]...
-%!          [0 0 0 1/6 2/6 1/2 1/2 4/6 5/6 1 1 1]};
-%!
-%! coefs = [-1.0000   -0.9734   -0.7071    1.4290    1.0000    3.4172
-%!          0    2.4172         0    0.0148   -2.0000   -1.9734
-%!          0    2.0000    4.9623    9.4508    4.0000    2.0000
-%!     1.0000    1.0000    0.7071    1.0000    1.0000    1.0000
-%!    -0.8536         0   -0.6036    1.9571    1.2071    3.5000
-%!     0.3536    2.5000    0.2500    0.5429   -1.7071   -1.0000
-%!          0    2.0000    4.4900    8.5444    3.4142    2.0000
-%!     0.8536    1.0000    0.6036    1.0000    0.8536    1.0000
-%!    -0.3536   -4.0000   -0.2500   -1.2929    1.7071    1.0000
-%!     0.8536         0    0.6036   -2.7071   -1.2071   -5.0000
-%!          0    2.0000    4.4900   10.0711    3.4142    2.0000
-%!     0.8536    1.0000    0.6036    1.0000    0.8536    1.0000
-%!          0   -4.0000         0    0.7071    2.0000    5.0000
-%!     1.0000    4.0000    0.7071   -0.7071   -1.0000   -5.0000
-%!          0    2.0000    4.9623   14.4142    4.0000    2.0000
-%!     1.0000    1.0000    0.7071    1.0000    1.0000    1.0000
-%!    -2.5000   -4.0000   -1.7678    0.7071    1.0000    5.0000
-%!          0    4.0000         0   -0.7071   -3.5000   -5.0000
-%!          0    2.0000    6.0418   14.4142    4.0000    2.0000
-%!     1.0000    1.0000    0.7071    1.0000    1.0000    1.0000
-%!    -2.4379         0   -1.7238    2.7071    1.9527    5.0000
-%!     0.9527    4.0000    0.6737    1.2929   -3.4379   -1.0000
-%!          0    2.0000    6.6827   10.0711    4.0000    2.0000
-%!     1.0000    1.0000    0.7071    1.0000    1.0000    1.0000
-%!    -0.9734   -1.0000   -0.6883    0.7071    3.4172    1.0000
-%!     2.4172         0    1.7092   -1.4142   -1.9734   -2.0000
-%!          0    4.0000    6.6827    4.9623    4.0000         0
-%!     1.0000    1.0000    0.7071    0.7071    1.0000    1.0000
-%!          0   -0.8536         0    0.8536    3.5000    1.2071
-%!     2.5000    0.3536    1.7678   -1.2071   -1.0000   -1.7071
-%!          0    3.4142    6.0418    4.4900    4.0000         0
-%!     1.0000    0.8536    0.7071    0.6036    1.0000    0.8536
-%!    -4.0000   -0.3536   -2.8284    1.2071    1.0000    1.7071
-%!          0    0.8536         0   -0.8536   -5.0000   -1.2071
-%!          0    3.4142    7.1213    4.4900    4.0000         0
-%!     1.0000    0.8536    0.7071    0.6036    1.0000    0.8536
-%!    -4.0000         0   -2.8284    1.4142    5.0000    2.0000
-%!     4.0000    1.0000    2.8284   -0.7071   -5.0000   -1.0000
-%!          0    4.0000   10.1924    4.9623    4.0000         0
-%!     1.0000    1.0000    0.7071    0.7071    1.0000    1.0000
-%!    -4.0000   -2.5000   -2.8284    0.7071    5.0000    1.0000
-%!     4.0000         0    2.8284   -2.4749   -5.0000   -3.5000
-%!          0    4.0000   10.1924    6.0418    4.0000         0
-%!     1.0000    1.0000    0.7071    0.7071    1.0000    1.0000
-%!          0   -2.4379         0    1.3808    5.0000    1.9527
-%!     4.0000    0.9527    2.8284   -2.4309   -1.0000   -3.4379
-%!          0    4.0000    7.1213    6.6827    4.0000         0
-%!     1.0000    1.0000    0.7071    0.7071    1.0000    1.0000
-%!    -1.0000   -0.9734    0.2071    2.4163    1.0000    3.4172
-%!          0    2.4172   -1.2071   -1.3954   -2.0000   -1.9734
-%!     2.0000    4.0000    7.0178    6.6827    2.0000         0
-%!     1.0000    1.0000    1.0000    0.7071    1.0000    1.0000
-%!    -0.8536         0    0.3536    2.4749    1.2071    3.5000
-%!     0.3536    2.5000   -0.8536   -0.7071   -1.7071   -1.0000
-%!     1.7071    4.0000    6.3498    6.0418    1.7071         0
-%!     0.8536    1.0000    0.8536    0.7071    0.8536    1.0000
-%!    -0.3536   -4.0000    0.8536    0.7071    1.7071    1.0000
-%!     0.8536         0   -0.3536   -3.5355   -1.2071   -5.0000
-%!     1.7071    4.0000    6.3498    7.1213    1.7071         0
-%!     0.8536    1.0000    0.8536    0.7071    0.8536    1.0000
-%!          0   -4.0000    1.2071    3.5355    2.0000    5.0000
-%!     1.0000    4.0000   -0.2071   -3.5355   -1.0000   -5.0000
-%!     2.0000    4.0000    7.0178   10.1924    2.0000         0
-%!     1.0000    1.0000    1.0000    0.7071    1.0000    1.0000
-%!    -2.5000   -4.0000   -0.5429    3.5355    1.0000    5.0000
-%!          0    4.0000   -1.9571   -3.5355   -3.5000   -5.0000
-%!     2.0000    4.0000    8.5444   10.1924    2.0000         0
-%!     1.0000    1.0000    1.0000    0.7071    1.0000    1.0000
-%!    -2.4379         0   -0.0355    3.5355    1.9527    5.0000
-%!     0.9527    4.0000   -1.4497   -0.7071   -3.4379   -1.0000
-%!     2.0000    4.0000    9.4508    7.1213    2.0000         0
-%!     1.0000    1.0000    1.0000    0.7071    1.0000    1.0000];
-%! coefs = reshape (coefs, 4, 4, 3, 9);
-%! horseshoe = nrbmak (coefs, knots);
-%! nrbplot (horseshoe, [6, 6, 50], 'light', 'on');
--- a/extra/nurbs/inst/nrbrect.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-function curve = nrbrect(w,h)
-% 
-% NRBRECT: Construct NURBS representation of a rectangular curve.
-% 
-% Calling Sequence:
-% 
-%   crv = nrbrect()
-%   crv = nrbrect(size)
-%   crv = nrbrect(width, height)
-% 
-% INPUT:
-% 
-%   size	: Size of the square (width = height).
-% 
-%   width	: Width of the rectangle (along x-axis).
-% 
-%   height	: Height of the rectangle (along y-axis).
-%
-% OUTPUT:
-%
-%   crv		: NURBS curve, see nrbmak. 
-%  
-% 
-% Description:
-% 
-%   Construct a rectangle or square in the x-y plane with the bottom
-%   lhs corner at (0,0,0). If no rhs arguments provided the function
-%   constructs a unit square.
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if nargin < 1
-   w = 1;
-   h = 1;
-end
-
-if nargin < 2
-   h = w;
-end
-
-coefs  = [0 w w w w 0 0 0;
-          0 0 0 h h h h 0;
-          0 0 0 0 0 0 0 0;
-          1 1 1 1 1 1 1 1];
-
-knots  = [0 0 0.25 0.25 0.5 0.5 0.75 0.75 1 1];
-
-curve = nrbmak(coefs, knots);
-
-end
-
-%!demo
-%! crv = nrbtform(nrbrect(2,1), vecrotz(deg2rad(35)));
-%! nrbplot(crv,4);
-%! axis equal
-%! title('Construction and rotation of a rectangular curve.');
-%! hold off
\ No newline at end of file
--- a/extra/nurbs/inst/nrbreverse.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-function nrb = nrbreverse(nrb, idir)
-%
-% NRBREVERSE: Reverse the evaluation directions of a NURBS geometry.
-% 
-% Calling Sequence:
-% 
-%   rnrb = nrbreverse(nrb);
-%   rnrb = nrbreverse(nrb, idir);
-% 
-% INPUT:
-% 
-%   nrb		: NURBS data structure, see nrbmak.
-%   idir        : vector of directions to reverse.
-%
-% OUTPUT:
-% 
-%   rnrb	: Reversed NURBS.
-% 
-% Description:
-% 
-%   Utility function to reverse the evaluation direction of a NURBS
-%   curve or surface.
-%
-%    Copyright (C) 2000 Mark Spink
-%    Copyright (C) 2013 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if (nargin > 2)
-  error('Incorrect number of input arguments');
-end
-
-if (iscell(nrb.knots))
-  % reverse a NURBS surface or volume
-  ndim = numel (nrb.knots);
-  if (nargin == 1 || isempty (idir))
-    idir = 1:ndim;
-  end
-  for ii = idir
-    nrb.knots{ii} = sort (nrb.knots{ii}(end) - nrb.knots{ii});
-    nrb.coefs = flipdim (nrb.coefs, ii+1);
-  end
-
-else
-  % reverse a NURBS curve
-  nrb.knots = sort (nrb.knots(end) - nrb.knots);
-  nrb.coefs = fliplr (nrb.coefs);
-end
-
-end
-
-%!demo
-%! pnts = [0.5 1.5 3.0 7.5 8.5;
-%!         3.0 5.5 1.5 4.0 4.5;
-%!         0.0 0.0 0.0 0.0 0.0];
-%! crv1 = nrbmak(pnts,[0 0 0 1/2 3/4 1 1 1]);
-%! crv2 = nrbreverse(crv1);
-%! fprintf('Knots of the original curve\n')
-%! disp(crv1.knots)
-%! fprintf('Knots of the reversed curve\n')
-%! disp(crv2.knots)
-%! fprintf('Control points of the original curve\n')
-%! disp(crv1.coefs(1:2,:))
-%! fprintf('Control points of the reversed curve\n')
-%! disp(crv2.coefs(1:2,:))
-%! nrbplot(crv1,100)
-%! hold on
-%! nrbplot(crv2,100)
-%! title('The curve and its reverse are the same')
-%! hold off
-
-%!test
-%! srf  = nrbrevolve(nrbline([1 0],[2 0]), [0 0 0], [0 0 1], pi/2);
-%! srf  = nrbkntins (srf, {0.3, 0.6});
-%! srf2 = nrbreverse (srf);
-%! assert (srf.knots, cellfun(@(x) sort(1-x), srf2.knots, 'UniformOutput', false), 1e-15)
-%! assert (srf.coefs, srf2.coefs(:,end:-1:1,end:-1:1))
-
-%!test
-%! srf  = nrbrevolve(nrbline([1 0],[2 0]), [0 0 0], [0 0 1], pi/2);
-%! srf  = nrbkntins (srf, {0.3, 0.6});
-%! srf2 = nrbreverse (srf, 1);
-%! knt{1} = sort(1-srf2.knots{1}); knt{2} = srf2.knots{2};
-%! assert (srf.knots, knt, 1e-15)
-%! assert (srf.coefs, srf2.coefs(:,end:-1:1,:))
-%! srf2 = nrbreverse (srf, 2);
-%! knt{1} = srf2.knots{1}; knt{2} = sort(1-srf2.knots{2});
-%! assert (srf.knots, knt, 1e-15)
-%! assert (srf.coefs, srf2.coefs(:,:,end:-1:1))
--- a/extra/nurbs/inst/nrbrevolve.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,180 +0,0 @@
-function surf = nrbrevolve(curve,pnt,vec,theta)
-
-% 
-% NRBREVOLVE: Construct a NURBS surface by revolving a NURBS curve, or
-%  construct a NURBS volume by revolving a NURBS surface.
-% 
-% Calling Sequence:
-% 
-%   srf = nrbrevolve(crv,pnt,vec[,ang])
-% 
-% INPUT:
-% 
-%   crv		: NURBS curve or surface to revolve, see nrbmak.
-% 
-%   pnt		: Coordinates of the point used to define the axis
-%               of rotation.
-% 
-%   vec		: Vector defining the direction of the rotation axis.
-% 
-%   ang		: Angle to revolve the curve, default 2*pi
-%
-% OUTPUT:
-%
-%   srf		: constructed surface or volume
-% 
-% Description:
-% 
-%   Construct a NURBS surface by revolving the profile NURBS curve around
-%   an axis defined by a point and vector.
-% 
-% Examples:
-% 
-%   Construct a sphere by rotating a semicircle around a x-axis.
-%
-%   crv = nrbcirc(1.0,[0 0 0],0,pi);
-%   srf = nrbrevolve(crv,[0 0 0],[1 0 0]);
-%   nrbplot(srf,[20 20]);
-%
-% NOTE:
-%
-%   The algorithm:
-%
-%     1) vectrans the point to the origin (0,0,0)
-%     2) rotate the vector into alignment with the z-axis
-%
-%     for each control point along the curve
-%
-%     3) determine the radius and angle of control
-%        point to the z-axis
-%     4) construct a circular arc in the x-y plane with 
-%        this radius and start angle and sweep angle theta 
-%     5) combine the arc and profile, coefs and weights.
-%  
-%     next control point
-%
-%     6) rotate and vectrans the surface back into position
-%        by reversing 1 and 2.
-%
-%
-%    Copyright (C) 2000 Mark Spink
-%    Copyright (C) 2010 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if (nargin < 3)
-  error('Not enough arguments to construct revolved surface');
-end
-
-if (nargin < 4)
-  theta = 2.0*pi;
-end
-
-if (iscell (curve.knots) && numel(curve.knots) == 3)
-  error('The function nrbrevolve is not yet ready to create volumes') 
-end
-
-% Translate curve the center point to the origin
-if isempty(pnt)
-  pnt = zeros(3,1);
-end
-
-if length(pnt) ~= 3
-  error('All point and vector coordinates must be 3D');
-end
-
-% Translate and rotate the original curve or surface into alignment with the z-axis
-T  = vectrans(-pnt);
-angx = vecangle(vec(1),vec(3));
-RY = vecroty(-angx);
-vectmp = RY*[vecnorm(vec(:));1.0];
-angy = vecangle(vectmp(2),vectmp(3));
-RX = vecrotx(angy);
-curve = nrbtform(curve,RX*RY*T);
-
-% Construct an arc 
-arc = nrbcirc(1.0,[],0.0,theta);
-
-if (iscell (curve.knots))
-% Construct the revolved volume
-  coefs = zeros([4 arc.number curve.number]);
-  angle = squeeze (vecangle(curve.coefs(2,:,:),curve.coefs(1,:,:)));
-  radius = squeeze (vecmag(curve.coefs(1:2,:,:)));
-  for i = 1:curve.number(1)  
-    for j = 1:curve.number(2)  
-      coefs(:,:,i,j) = vecrotz(angle(i,j))*vectrans([0.0 0.0 curve.coefs(3,i,j)])*...
-          vecscale([radius(i,j) radius(i,j)])*arc.coefs;
-      coefs(4,:,i,j) = coefs(4,:,i,j)*curve.coefs(4,i,j);
-	end
-  end
-  surf = nrbmak(coefs,{arc.knots, curve.knots{:}});
-else
-% Construct the revolved surface
-  coefs = zeros(4, arc.number, curve.number);
-  angle = vecangle(curve.coefs(2,:),curve.coefs(1,:));
-  radius = vecmag(curve.coefs(1:2,:));
-  for i = 1:curve.number  
-    coefs(:,:,i) = vecrotz(angle(i))*vectrans([0.0 0.0 curve.coefs(3,i)])*...
-          vecscale([radius(i) radius(i)])*arc.coefs;
-    coefs(4,:,i) = coefs(4,:,i)*curve.coefs(4,i);
-  end
-  surf = nrbmak(coefs,{arc.knots, curve.knots});
-end
-
-% Rotate and vectrans the surface back into position
-T = vectrans(pnt);
-RX = vecrotx(-angy);
-RY = vecroty(angx);
-surf = nrbtform(surf,T*RY*RX);  
-
-end
-
-%!demo
-%! sphere = nrbrevolve(nrbcirc(1,[],0.0,pi),[0.0 0.0 0.0],[1.0 0.0 0.0]);
-%! nrbplot(sphere,[40 40],'light','on');
-%! title('Ball and tori - surface construction by revolution');
-%! hold on;
-%! torus = nrbrevolve(nrbcirc(0.2,[0.9 1.0]),[0.0 0.0 0.0],[1.0 0.0 0.0]);
-%! nrbplot(torus,[40 40],'light','on');
-%! nrbplot(nrbtform(torus,vectrans([-1.8])),[20 10],'light','on');
-%! hold off;
-
-%!demo
-%! pnts = [3.0 5.5 5.5 1.5 1.5 4.0 4.5;
-%!         0.0 0.0 0.0 0.0 0.0 0.0 0.0;
-%!         0.5 1.5 4.5 3.0 7.5 6.0 8.5];
-%! crv = nrbmak(pnts,[0 0 0 1/4 1/2 3/4 3/4 1 1 1]);
-%! 
-%! xx = vecrotz(deg2rad(25))*vecroty(deg2rad(15))*vecrotx(deg2rad(20));
-%! nrb = nrbtform(crv,vectrans([5 5])*xx);
-%!
-%! pnt = [5 5 0]';
-%! vec = xx*[0 0 1 1]';
-%! srf = nrbrevolve(nrb,pnt,vec(1:3));
-%!
-%! p = nrbeval(srf,{linspace(0.0,1.0,100) linspace(0.0,1.0,100)});
-%! surfl(squeeze(p(1,:,:)),squeeze(p(2,:,:)),squeeze(p(3,:,:)));
-%! title('Construct of a 3D surface by revolution of a curve.');
-%! shading interp;
-%! colormap(copper);
-%! axis equal;
-%! hold off
-
-%!demo
-%! crv1 = nrbcirc(1,[0 0],0, pi/2);
-%! crv2 = nrbcirc(2,[0 0],0, pi/2);
-%! srf = nrbruled (crv1, crv2);
-%! srf = nrbtform (srf, [1 0 0 0; 0 1 0 1; 0 0 1 0; 0 0 0 1]);
-%! vol = nrbrevolve (srf, [0 0 0], [1 0 0], pi/2);
-%! nrbplot(vol, [30 30 30], 'light', 'on')
--- a/extra/nurbs/inst/nrbruled.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,89 +0,0 @@
-function srf = nrbruled (crv1, crv2)
-
-% NRBRULED: Construct a ruled surface between two NURBS curves.
-% 
-% Calling Sequence:
-% 
-%   srf = nrbruled(crv1, crv2)
-% 
-% INPUT:
-% 
-%   crv1	: First NURBS curve, see nrbmak.
-% 
-%   crv2	: Second NURBS curve, see nrbmak.
-%
-% OUTPUT:
-% 
-%   srf		: Ruled NURBS surface.
-% 
-% Description:
-% 
-%   Constructs a ruled surface between two NURBS curves. The ruled surface is
-%   ruled along the V direction.
-% 
-% Examples:
-% 
-%   Construct a ruled surface between a semicircle and a straight line.
-% 
-%   cir = nrbcirc(1,[0 0 0],0,pi);
-%   line = nrbline([-1 0.5 1],[1 0.5 1]);
-%   srf = nrbruled(cir,line);
-%   nrbplot(srf,[20 20]);
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if (iscell(crv1.knots) || iscell(crv2.knots))
-  error ('Both NURBS must be curves');
-end
-
-% ensure both curves have a common degree
-d = max ([crv1.order, crv2.order]);
-crv1 = nrbdegelev (crv1, d - crv1.order);
-crv2 = nrbdegelev (crv2, d - crv2.order);
-
-% merge the knot vectors, to obtain a common knot vector
-k1 = crv1.knots;
-k2 = crv2.knots;
-ku = unique ([k1 k2]);
-n = length (ku);
-ka = [];
-kb = [];
-for i = 1:n
-  i1 = length (find (k1 == ku(i)));
-  i2 = length (find (k2 == ku(i)));
-  m = max (i1, i2);
-  ka = [ka ku(i)*ones(1,m-i1)];
-  kb = [kb ku(i)*ones(1,m-i2)];
-end
-crv1 = nrbkntins (crv1, ka);
-crv2 = nrbkntins (crv2, kb);
-
-coefs(:,:,1) = crv1.coefs;
-coefs(:,:,2) = crv2.coefs;
-srf = nrbmak (coefs, {crv1.knots, [0 0 1 1]});
-
-end
-
-%!demo
-%! pnts = [0.5 1.5 4.5 3.0 7.5 6.0 8.5;
-%!         3.0 5.5 5.5 1.5 1.5 4.0 4.5;
-%!         0.0 0.0 0.0 0.0 0.0 0.0 0.0];
-%! crv1 = nrbmak (pnts,[0 0 0 1/4 1/2 3/4 3/4 1 1 1]);
-%! crv2 = nrbtform (nrbcirc (4,[4.5;0],pi,0.0),vectrans([0.0 4.0 -4.0]));
-%! srf = nrbruled (crv1,crv2);
-%! nrbplot (srf,[40 20]);
-%! title ('Ruled surface construction from two NURBS curves.');
-%! hold off
\ No newline at end of file
--- a/extra/nurbs/inst/nrbsurfderiveval.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,294 +0,0 @@
-function skl = nrbsurfderiveval (srf, uv, d) 
-
-%
-% NRBSURFDERIVEVAL: Evaluate n-th order derivatives of a NURBS surface
-%
-% usage: skl = nrbsurfderiveval (srf, [u; v], d) 
-%
-%   INPUT:
-%
-%   srf   : NURBS surface structure, see nrbmak
-%
-%   u, v  : parametric coordinates of the point where we compute the
-%      derivatives
-%
-%   d     : number of partial derivatives to compute
-%
-%
-%   OUTPUT: 
-%
-%   skl (i, j, k, l) = i-th component derived j-1,k-1 times at the
-%     l-th point.
-%
-% Adaptation of algorithm A4.4 from the NURBS book, pg137
-%
-%    Copyright (C) 2009 Carlo de Falco
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-  
- skl = zeros (3, d+1, d+1, size (uv, 2));
- 
- for iu = 1:size(uv, 2);
-    wders = squeeze  (surfderiveval (srf.number(1)-1, srf.order(1)-1,  ...
-				     srf.knots{1}, srf.number(2)-1,  ...
-				     srf.order(2)-1, srf.knots{2},  ...
-				     squeeze (srf.coefs(4, :, :)), uv(1,iu), ...
-				     uv(2,iu), d));      
-
-  for idim = 1:3
-      Aders = squeeze  (surfderiveval (srf.number(1)-1, srf.order(1)-1,  ...
-			srf.knots{1}, srf.number(2)-1,  ...
-			srf.order(2)-1, srf.knots{2},  ...
-			squeeze (srf.coefs(idim, :, :)), uv(1,iu),...
-			uv(2,iu), d));      
-      
-   for k=0:d
-    for l=0:d-k
-	  v = Aders(k+1, l+1);
-      for j=1:l
-	    v = v - nchoosek(l,j)*wders(1,j+1)*skl(idim, k+1, l-j+1,iu);
-      end
-      for i=1:k
-	    v = v - nchoosek(k,i)*wders(i+1,1)*skl(idim, k-i+1, l+1, iu);
-	    v2 =0;
-        for j=1:l
-	      v2 = v2 + nchoosek(l,j)*wders(i+1,j+1)*skl(idim, k-i+1, l-j+1, iu);
-        end
-	    v = v - nchoosek(k,i)*v2;
-      end
-	  skl(idim, k+1, l+1, iu) = v/wders(1,1);
-    end
-   end
-  end
-    
- end
-
-end
-
-%!test
-%! k = [0 0 1 1];
-%! c = [0 1];
-%! [coef(2,:,:), coef(1,:,:)] = meshgrid (c, c);
-%! coef(3,:,:) = coef(1,:,:);
-%! srf = nrbmak (coef, {k, k});
-%! [u, v] = meshgrid (linspace(0,1,11));
-%! uv = [u(:)';v(:)'];
-%! skl = nrbsurfderiveval (srf, uv, 0);
-%! aux = nrbeval(srf,uv);
-%! assert (squeeze (skl (1:2,1,1,:)), aux(1:2,:), 1e3*eps)
-
-
-%!test
-%! k = [0 0 1 1];
-%! c = [0 1];
-%! [coef(2,:,:), coef(1,:,:)] = meshgrid (c, c);
-%! coef(3,:,:) = coef(1,:,:);
-%! srf = nrbmak (coef, {k, k});
-%! srf = nrbkntins (srf, {[], rand(2,1)});
-%! [u, v] = meshgrid (linspace(0,1,11));
-%! uv = [u(:)';v(:)'];
-%! skl = nrbsurfderiveval (srf, uv, 0);
-%! aux = nrbeval(srf,uv);
-%! assert (squeeze (skl (1:2,1,1,:)), aux(1:2,:), 1e3*eps)
-
-%!shared srf, uv
-%!test 
-%! k = [0 0 0 1 1 1];
-%! c = [0 1/2 1];
-%! [coef(1,:,:), coef(2,:,:)] = meshgrid (c, c);
-%! coef(3,:,:) = coef(1,:,:);
-%! srf = nrbmak (coef, {k, k});
-%! ders= nrbderiv (srf);
-%! [u, v] = meshgrid (linspace(0,1,11));
-%! uv = [u(:)';v(:)'];
-%! skl = nrbsurfderiveval (srf, uv, 1);
-%! [fun, der] = nrbdeval (srf, ders, uv);
-%! assert (squeeze (skl (1:2,1,1,:)), fun(1:2,:), 1e3*eps)
-%! assert (squeeze (skl (1:2,2,1,:)), der{1}(1:2,:), 1e3*eps)
-%! assert (squeeze (skl (1:2,1,2,:)), der{2}(1:2,:), 1e3*eps)
-%!
-%!test 
-%! srf = nrbdegelev (srf, [3, 1]);
-%! ders= nrbderiv (srf);
-%! [fun, der] = nrbdeval (srf, ders, uv);
-%! skl = nrbsurfderiveval (srf, uv, 1);
-%! assert (squeeze (skl (1:2,1,1,:)), fun(1:2,:), 1e3*eps)
-%! assert (squeeze (skl (1:2,2,1,:)), der{1}(1:2,:), 1e3*eps)
-%! assert (squeeze (skl (1:2,1,2,:)), der{2}(1:2,:), 1e3*eps)
-
-%!shared uv
-%!test 
-%! k = [0 0 0 1 1 1];
-%! c = [0 1/2 1];
-%! [coef(2,:,:), coef(1,:,:)] = meshgrid (c, c);
-%! coef(3,:,:) = coef(1,:,:);
-%! srf = nrbmak (coef, {k, k});
-%! ders= nrbderiv (srf);
-%! [u, v] = meshgrid (linspace(0,1,11));
-%! uv = [u(:)';v(:)'];
-%! skl = nrbsurfderiveval (srf, uv, 1);
-%! [fun, der] = nrbdeval (srf, ders, uv);
-%! assert (squeeze (skl (1:2,1,1,:)), fun(1:2,:), 1e3*eps)
-%! assert (squeeze (skl (1:2,2,1,:)), der{1}(1:2,:), 1e3*eps)
-%! assert (squeeze (skl (1:2,1,2,:)), der{2}(1:2,:), 1e3*eps)
-%!
-%!test 
-%! p = 3;  q = 3;
-%! mcp = 5; ncp = 5;
-%! Lx  = 10*rand(1); Ly  = Lx;
-%! srf = nrbdegelev (nrb4surf ([0 0], [Lx, 0], [0 Ly], [Lx Ly]), [p-1, q-1]);
-%! %%srf = nrbkntins (srf, {linspace(0,1,mcp-p+2)(2:end-1), linspace(0,1,ncp-q+2)(2:end-1)});
-%! %%srf.coefs = permute (srf.coefs, [1 3 2]);
-%! ders= nrbderiv (srf);
-%! [fun, der] = nrbdeval (srf, ders, uv);
-%! skl = nrbsurfderiveval (srf, uv, 1);
-%! assert (squeeze (skl (1:2,1,1,:)), fun(1:2,:), 1e3*eps)
-%! assert (squeeze (skl (1:2,2,1,:)), der{1}(1:2,:), 1e3*eps)
-%! assert (squeeze (skl (1:2,1,2,:)), der{2}(1:2,:), 1e3*eps)
-
-%!shared srf, uv, P, dPdx, d2Pdx2, c1, c2
-%!test
-%! [u, v] = meshgrid (linspace(0,1,10));
-%! uv = [u(:)';v(:)'];
-%! c1 = nrbmak([0 1/2 1; 0 1 0],[0 0 0 1 1 1]);
-%! c1 = nrbtform (c1, vecrotx (pi/2));
-%! c2  = nrbtform(c1, vectrans([0 1 0]));
-%! srf = nrbdegelev (nrbruled (c1, c2), [3, 1]);
-%! skl = nrbsurfderiveval (srf, uv, 2);
-%! P = squeeze(skl(:,1,1,:));
-%! dPdx = squeeze(skl(:,2,1,:));
-%! d2Pdx2 = squeeze(skl(:,3,1,:));
-%!assert(P(3,:), 2*(P(1,:)-P(1,:).^2),100*eps)
-%!assert(dPdx(3,:), 2-4*P(1,:), 100*eps)
-%!assert(d2Pdx2(3,:), -4+0*P(1,:), 100*eps)
-%! srf = nrbdegelev (nrbruled (c1, c2), [5, 6]);
-%! skl = nrbsurfderiveval (srf, uv, 2);
-%! P = squeeze(skl(:,1,1,:));
-%! dPdx = squeeze(skl(:,2,1,:));
-%! d2Pdx2 = squeeze(skl(:,3,1,:));
-%! aux = nrbeval(srf,uv);
-%! assert (squeeze (skl (1:2,1,1,:)), aux(1:2,:), 1e3*eps)
-%!assert(P(3,:), 2*(P(1,:)-P(1,:).^2),100*eps)
-%!assert(dPdx(3,:), 2-4*P(1,:), 100*eps)
-%!assert(d2Pdx2(3,:), -4+0*P(1,:), 100*eps)
-%!
-%!test
-%! skl = nrbsurfderiveval (srf, uv, 0);
-%! aux = nrbeval (srf, uv);
-%! assert (squeeze (skl (1:2,1,1,:)), aux(1:2,:), 1e3*eps)
-
-%!shared dPdu, d2Pdu2, P, srf, uv
-%!test
-%! [u, v] = meshgrid (linspace(0,1,10));
-%! uv = [u(:)';v(:)'];
-%! c1 = nrbmak([0 1/2 1; 0.1 1.6 1.1; 0 0 0],[0 0 0 1 1 1]);
-%! c2 = nrbmak([0 1/2 1; 0.1 1.6 1.1; 1 1 1],[0 0 0 1 1 1]);
-%! srf = nrbdegelev (nrbruled (c1, c2), [0, 1]);
-%! skl = nrbsurfderiveval (srf, uv, 2);
-%! P = squeeze(skl(:,1,1,:));
-%! dPdu = squeeze(skl(:,2,1,:));
-%! dPdv = squeeze(skl(:,1,2,:));
-%! d2Pdu2 = squeeze(skl(:,3,1,:));
-%! aux = nrbeval(srf,uv);
-%! assert (squeeze (skl (1:2,1,1,:)), aux(1:2,:), 1e3*eps)
-%!assert(dPdu(2,:), 3-4*P(1,:),100*eps)
-%!assert(d2Pdu2(2,:), -4+0*P(1,:),100*eps)
-%!
-%!test
-%! skl = nrbsurfderiveval (srf, uv, 0);
-%! aux = nrbeval(srf,uv);
-%! assert (squeeze (skl (1:2,1,1,:)), aux(1:2,:), 1e3*eps)
-
-%!test
-%! srf = nrb4surf([0 0], [1 0], [0 1], [1 1]);
-%! geo = nrbdegelev (srf, [3 3]);
-%1 geo.coefs (4, 2:end-1, 2:end-1) = geo.coefs (4, 2:end-1, 2:end-1) + .1 * rand (1, geo.number(1)-2, geo.number(2)-2);
-%! geo = nrbkntins (geo, {[.1:.1:.9], [.2:.2:.8]});
-%! [u, v] = meshgrid (linspace(0,1,10));
-%! uv = [u(:)';v(:)'];
-%! skl = nrbsurfderiveval (geo, uv, 2);
-%! dgeo = nrbderiv (geo);
-%! [pnts, ders] = nrbdeval (geo, dgeo, uv);
-%! assert (ders{1}, squeeze(skl(:,2,1,:)), 1e-9)
-%! assert (ders{2}, squeeze(skl(:,1,2,:)), 1e-9)
-
-%!test
-%! crv = nrbline ([1 0], [2 0]);
-%! srf = nrbrevolve (crv, [0 0 0], [0 0 1], pi/2);
-%! srf = nrbtransp (srf);
-%! [v, u] = meshgrid (linspace (0, 1, 11));
-%! uv = [u(:)'; v(:)'];
-%! skl = nrbsurfderiveval (srf, uv, 2);
-%! c = sqrt(2);
-%! w      = @(x, y) (2 - c)*y.^2 + (c-2)*y + 1;
-%! dwdy   = @(x, y) 2*(2-c)*y + c - 2;
-%! d2wdy2 = @(x, y) 2*(2-c);
-%! F1 = @(x, y) (x+1) .* ((1-y).^2 + c*y.*(1-y)) ./ w(x,y);
-%! F2 = @(x, y) (x+1) .* (y.^2 + c*y.*(1-y)) ./ w(x,y);
-%! dF1dx = @(x, y) ((1-y).^2 + c*y.*(1-y)) ./ w(x,y);
-%! dF2dx = @(x, y) (y.^2 + c*y.*(1-y)) ./ w(x,y);
-%! dF1dy = @(x, y) (x+1) .* ((2 - 2*c)*y + c - 2) ./ w(x,y) - (x+1) .* ((1-y).^2 + c*y.*(1-y)) .* dwdy(x,y) ./ w(x,y).^2;
-%! dF2dy = @(x, y) (x+1) .* ((2 - 2*c)*y + c) ./ w(x,y) - (x+1) .* (y.^2 + c*y.*(1-y)) .* dwdy(x,y) ./ w(x,y).^2;
-%! d2F1dx2 = @(x, y) zeros (size (x));
-%! d2F2dx2 = @(x, y) zeros (size (x));
-%! d2F1dxdy = @(x, y) ((2 - 2*c)*y + c - 2) ./ w(x,y) - ((1-y).^2 + c*y.*(1-y)) .* dwdy(x,y) ./ w(x,y).^2;
-%! d2F2dxdy = @(x, y) ((2 - 2*c)*y + c) ./ w(x,y) - (y.^2 + c*y.*(1-y)) .* dwdy(x,y) ./ w(x,y).^2;
-%! d2F1dy2  = @(x, y) (x+1)*(2 - 2*c) ./ w(x,y) - 2*(x+1) .* ((2 - 2*c)*y + c - 2) .* dwdy(x,y) ./ w(x,y).^2 - ...
-%!                    (x+1) .* ((1-y).^2 + c*y.*(1-y)) * d2wdy2(x,y) ./ w(x,y).^2 + ...
-%!                    2 * (x+1) .* ((1-y).^2 + c*y.*(1-y)) .* w(x,y) .*dwdy(x,y).^2 ./ w(x,y).^4;
-%! d2F2dy2  = @(x, y) (x+1)*(2 - 2*c) ./ w(x,y) - 2*(x+1) .* ((2 - 2*c)*y + c) .* dwdy(x,y) ./ w(x,y).^2 - ...
-%!                    (x+1) .* (y.^2 + c*y.*(1-y)) * d2wdy2(x,y) ./ w(x,y).^2 + ...
-%!                    2 * (x+1) .* (y.^2 + c*y.*(1-y)) .* w(x,y) .*dwdy(x,y).^2 ./ w(x,y).^4;
-%! assert ([F1(u(:),v(:)), F2(u(:),v(:))], squeeze(skl(1:2,1,1,:))', 1e2*eps);
-%! assert ([dF1dx(u(:),v(:)), dF2dx(u(:),v(:))], squeeze(skl(1:2,2,1,:))', 1e2*eps);
-%! assert ([dF1dy(u(:),v(:)), dF2dy(u(:),v(:))], squeeze(skl(1:2,1,2,:))', 1e2*eps);
-%! assert ([d2F1dx2(u(:),v(:)), d2F2dx2(u(:),v(:))], squeeze(skl(1:2,3,1,:))', 1e2*eps);
-%! assert ([d2F1dxdy(u(:),v(:)), d2F2dxdy(u(:),v(:))], squeeze(skl(1:2,2,2,:))', 1e2*eps);
-%! assert ([d2F1dy2(u(:),v(:)), d2F2dy2(u(:),v(:))], squeeze(skl(1:2,1,3,:))', 1e2*eps);
-
-%!test
-%! knots = {[0 0 1 1] [0 0 1 1]};
-%! coefs(:,1,1) = [0;0;0;1];
-%! coefs(:,2,1) = [1;0;0;1];
-%! coefs(:,1,2) = [0;1;0;1];
-%! coefs(:,2,2) = [1;1;1;2];
-%! srf = nrbmak (coefs, knots);
-%! [v, u] = meshgrid (linspace (0, 1, 3));
-%! uv = [u(:)'; v(:)'];
-%! skl = nrbsurfderiveval (srf, uv, 2);
-%! w = @(x, y) x.*y + 1;
-%! F1 = @(x, y) x ./ w(x,y);
-%! F2 = @(x, y) y ./ w(x,y);
-%! F3 = @(x, y) x .* y ./ w(x,y);
-%! dF1dx = @(x, y) 1./w(x,y) - x.*y./w(x,y).^2;
-%! dF1dy = @(x, y)  - x.^2./w(x,y).^2;
-%! dF2dx = @(x, y)  - y.^2./w(x,y).^2;
-%! dF2dy = @(x, y) 1./w(x,y) - x.*y./w(x,y).^2;
-%! dF3dx = @(x, y) y./w(x,y) - x.*(y./w(x,y)).^2;
-%! dF3dy = @(x, y) x./w(x,y) - y.*(x./w(x,y)).^2;
-%! d2F1dx2  = @(x, y) -2*y./w(x,y).^2 + 2*x.*y.^2./w(x,y).^3;
-%! d2F1dy2  = @(x, y) 2*x.^3./w(x,y).^3;
-%! d2F1dxdy = @(x, y) -x./w(x,y).^2 - x./w(x,y).^2 + 2*x.^2.*y./w(x,y).^3;
-%! d2F2dx2  = @(x, y) 2*y.^3./w(x,y).^3;
-%! d2F2dy2  = @(x, y) -2*x./w(x,y).^2 + 2*y.*x.^2./w(x,y).^3;
-%! d2F2dxdy = @(x, y) -y./w(x,y).^2 - y./w(x,y).^2 + 2*y.^2.*x./w(x,y).^3;
-%! d2F3dx2  = @(x, y) -2*y.^2./w(x,y).^2 + 2*x.*y.^3./w(x,y).^3;
-%! d2F3dy2  = @(x, y) -2*x.^2./w(x,y).^2 + 2*y.*x.^3./w(x,y).^3;
-%! d2F3dxdy = @(x, y) 1./w(x,y) - 3*x.*y./w(x,y).^2 + 2*(x.*y).^2./w(x,y).^3;
-%! assert ([F1(u(:),v(:)), F2(u(:),v(:)), F3(u(:),v(:))], squeeze(skl(1:3,1,1,:))', 1e2*eps);
-%! assert ([dF1dx(u(:),v(:)), dF2dx(u(:),v(:)), dF3dx(u(:),v(:))], squeeze(skl(1:3,2,1,:))', 1e2*eps);
-%! assert ([dF1dy(u(:),v(:)), dF2dy(u(:),v(:)), dF3dy(u(:),v(:))], squeeze(skl(1:3,1,2,:))', 1e2*eps);
-%! assert ([d2F1dx2(u(:),v(:)), d2F2dx2(u(:),v(:)), d2F3dx2(u(:),v(:))], squeeze(skl(1:3,3,1,:))', 1e2*eps);
-%! assert ([d2F1dy2(u(:),v(:)), d2F2dy2(u(:),v(:)), d2F3dy2(u(:),v(:))], squeeze(skl(1:3,1,3,:))', 1e2*eps);
-%! assert ([d2F1dxdy(u(:),v(:)), d2F2dxdy(u(:),v(:)), d2F3dxdy(u(:),v(:))], squeeze(skl(1:3,2,2,:))', 1e2*eps);
--- a/extra/nurbs/inst/nrbtestcrv.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-function crv = nrbtestcrv
-% NRBTESTCRV: Constructs a simple test curve. 
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-pnts = [0.5 1.5 4.5 3.0 7.5 6.0 8.5;
-        3.0 5.5 5.5 1.5 1.5 4.0 4.5;
-        0.0 0.0 0.0 0.0 0.0 0.0 0.0];
-crv = nrbmak(pnts,[0 0 0 1/4 1/2 3/4 3/4 1 1 1]);
-
-end
-
-%!demo
-%! crv = nrbtestcrv;
-%! nrbplot(crv,100)
-%! title('Test curve')
-%! hold off
-
--- a/extra/nurbs/inst/nrbtestsrf.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-function srf = nrbtestsrf
-% NRBTESTSRF: Constructs a simple test surface.
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-% allocate multi-dimensional array of control points
-pnts = zeros(3,5,5);
-
-% define a grid of control points
-% in this case a regular grid of u,v points
-% pnts(3,u,v)
-%
-
-pnts(:,:,1) = [ 0.0  3.0  5.0  8.0 10.0;     % w*x
-                0.0  0.0  0.0  0.0  0.0;     % w*y
-                2.0  2.0  7.0  7.0  8.0];    % w*z
-
-pnts(:,:,2) = [ 0.0  3.0  5.0  8.0 10.0;
-                3.0  3.0  3.0  3.0  3.0;
-                0.0  0.0  5.0  5.0  7.0];
-
-pnts(:,:,3) = [ 0.0  3.0  5.0  8.0 10.0;
-                5.0  5.0  5.0  5.0  5.0;
-                0.0  0.0  5.0  5.0  7.0];
-
-pnts(:,:,4) = [ 0.0  3.0  5.0  8.0 10.0;
-                8.0  8.0  8.0  8.0  8.0;
-                5.0  5.0  8.0  8.0 10.0];
-
-pnts(:,:,5) = [ 0.0  3.0  5.0  8.0 10.0;
-               10.0 10.0 10.0 10.0 10.0;
-                5.0  5.0  8.0  8.0 10.0];
-
-% knots
-knots{1} = [0 0 0 1/3 2/3 1 1 1]; % knots along u
-knots{2} = [0 0 0 1/3 2/3 1 1 1]; % knots along v
-
-% make and draw nurbs surface
-srf = nrbmak(pnts,knots);
-
-end
-
-%!demo
-%! srf = nrbtestsrf;
-%! nrbplot(srf,[20 30])
-%! title('Test surface')
-%! hold off
-
--- a/extra/nurbs/inst/nrbtform.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,82 +0,0 @@
-function nurbs = nrbtform(nurbs,tmat)
-% 
-% NRBTFORM: Apply transformation matrix to the NURBS.
-% 
-% Calling Sequence:
-% 
-%   tnurbs = nrbtform(nurbs,tmatrix);
-% 
-% INPUT:
-% 
-%   nurbs	: NURBS data structure (see nrbmak for details).
-% 
-%   tmatrix     : Transformation matrix, a matrix of size (4,4) defining
-%                 a single or multiple transformations.
-%
-% OUTPUT:
-%
-%   tnurbs	: The return transformed NURBS data structure.
-% 
-% Description:
-% 
-%   The NURBS is transform as defined a transformation matrix of size (4,4),
-%   such as a rotation, translation or change in scale. The transformation
-%   matrix can define a single transformation or multiple series of
-%   transformations. The matrix can be simply constructed by the functions
-%   vecscale, vectrans and vecrot, and also vecrotx, vecroty, and vecrotz.
-%     
-% Examples:
-% 
-%   Rotate a square by 45 degrees about the z axis.
-%
-%   rsqr = nrbtform(nrbrect(), vecrotz(deg2rad(45)));
-%   nrbplot(rsqr, 1000);
-% 
-% See also:
-% 
-%   vecscale, vectrans, vecrot, vecrotx, vecroty, vecrotz
-%
-%    Copyright (C) 2000 Mark Spink
-%    Copyright (C) 2010 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if nargin < 2
-  error('Not enough input arguments!');
-end;
-
-if iscell(nurbs.knots)
- if size(nurbs.knots,2) == 2
-  % NURBS is a surface
-  [dim,nu,nv] = size(nurbs.coefs);
-  nurbs.coefs = reshape(tmat*reshape(nurbs.coefs,dim,nu*nv),[dim nu nv]);
- elseif size(nurbs.knots,2) == 3
-  % NURBS is a volume
-  [dim,nu,nv,nw] = size(nurbs.coefs);
-  nurbs.coefs = reshape(tmat*reshape(nurbs.coefs,dim,nu*nv*nw),[dim nu nv nw]);
- end
-else
-  % NURBS is a curve
-  nurbs.coefs = tmat*nurbs.coefs;
-end
-
-end
-
-%!demo
-%! xx = vectrans([2.0 1.0])*vecroty(pi/8)*vecrotx(pi/4)*vecscale([1.0 2.0]);
-%! c0 = nrbtform(nrbcirc, xx);
-%! nrbplot(c0,50);
-%! grid on
-%! title('Construction of an ellipse by transforming a unit circle.');
-%! hold off
\ No newline at end of file
--- a/extra/nurbs/inst/nrbtransp.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-function tsrf = nrbtransp(srf)
-% 
-% NRBTRANSP: Transpose a NURBS surface, by swapping U and V directions.
-% 
-% Calling Sequence:
-% 
-%   tsrf = nrbtransp(srf)
-%
-% INPUT:
-% 
-%   srf		: NURBS surface, see nrbmak.
-%
-% OUTPUT:
-% 
-%   tsrf	: NURBS surface with U and V diretions transposed.
-% 
-% Description:
-% 
-%   Utility function that transposes a NURBS surface, by swapping U and
-%   V directions. NURBS curves cannot be transposed.
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if ~iscell(srf.knots)
-  error(' A NURBS curve cannot be transposed.');
-elseif size(srf.knots,2) == 3
-  error('The transposition of NURBS volumes has not been implemented.');
-end  
-
-tsrf = nrbmak(permute(srf.coefs,[1 3 2]), fliplr(srf.knots));
-
-end
-
-%!demo
-%! srf = nrb4surf([0 0 0], [1 0 1], [0 1 1], [1 1 2]);
-%! nrbplot(srf,[20 5]);
-%! title('Plane surface and its transposed (translated)')
-%! hold on
-%! srf.coefs(3,:,:) = srf.coefs(3,:,:) + 10;
-%! srf = nrbtransp(srf);
-%! nrbplot(srf,[20 5]);
-%! hold off
-
-%!test
-%! srf  = nrbrevolve(nrbline([1 0],[2 0]), [0 0 0], [0 0 1], pi/2);
-%! srft = nrbtransp(srf);
-%! assert (srf.number, fliplr(srft.number));
-%! assert (srf.order, fliplr(srft.order));
-%! assert (srf.knots, fliplr(srft.knots));
-%! assert (srf.coefs, permute(srft.coefs, [1 3 2]));
\ No newline at end of file
--- a/extra/nurbs/inst/nrbunclamp.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,130 +0,0 @@
-function ucrv = nrbunclamp (crv, k, xdim)
-
-% NRBUNCLAMP: Compute the knot vector and control points of the unclamped curve
-%
-% Calling Sequence:
-% 
-%   ucrv = nrbrunclamp (crv, k)
-%   ucrv = nrbrunclamp (crv, k, dim)
-% 
-% INPUT:
-% 
-%   crv	: NURBS curve, see nrbmak.
-%   k   : continuity for the unclamping (from 0 up to p-1)
-%   dim : dimension in which to unclamp (all by default).
-%
-% OUTPUT:
-% 
-%   ucrv: NURBS curve with unclamped knot vector, see nrbmak
-% 
-% Description:
-% 
-%   Unclamps a curve, removing the open knot vector. Computes the new
-%     knot vector and control points of the unclamped curve.
-%
-%    Adapted from Algorithm A12.1 from 'The NURBS BOOK' pg577.
-% 
-%    Copyright (C) 2013, 2014 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if (iscell (crv.knots))
-  knt = crv.knots;
-  curve = false;
-else
-  knt = {crv.knots};
-  curve = true;
-end
-
-ndim = numel (knt);
-if (nargin < 3)
-  xdim = 1:ndim;
-end
-
-%if (iscell (crv.knots))
-  if (numel(k) ~= ndim)
-    k = k * ones(1, ndim);
-  end
-
-  Pw = crv.coefs;
-  for idim = xdim
-    p  = crv.order(idim) - 1;
-    U  = knt{idim};
-    n  = crv.number(idim);
-    m = n + p + 1;
-    kk = k(idim);
-
-    if (kk >= p)
-      warning ('Taking the maximum k allowed, degree - 1')
-      kk = p - 1;
-    end
-
-  % Unclamp at left end
-    for ii=0:kk
-      U(kk-ii+1) = U(kk-ii+2) - (U(n+1-ii) - U(n-ii));
-    end
-
-    Pw = permute (Pw, [1, circshift([2 3 4], [0, 1-idim])]);
-    for ii = p-kk-1:p-2
-      for jj = ii:-1:0
-        alpha = (U(p+1) - U(p+jj-ii)) / (U(p+jj+2) - U(p+jj-ii));
-        Pw(:,jj+1,:,:) = (Pw(:,jj+1,:,:) - alpha*Pw(:,jj+2,:,:))/(1-alpha);
-      end
-    end
-
-
-  % Unclamp at right end
-    for ii=0:kk
-      U(m-kk+ii) = U(m-kk+ii-1) + U(p+ii+1+1) - U(p+ii+1);
-    end
-    
-    for ii = p-kk-1:p-2
-      for jj = ii:-1:0
-        alpha = (U(n+1)-U(n-jj))/(U(n+2-jj+ii)-U(n-jj));
-        Pw(:,n-jj,:,:) = (Pw(:,n-jj,:,:) - (1-alpha)*Pw(:,n-jj-1,:,:))/alpha;
-      end
-    end
-    
-    Pw = permute (Pw, [1, circshift([2 3 4], [0, idim-1])]);
-    knt{idim} = U;
-
-  end
-  if (~curve)
-    ucrv = nrbmak (Pw, knt);
-  else
-    ucrv = nrbmak (Pw, knt{:});
-  end
-  
-%!demo
-%! crv = nrbcirc (1,[],0,2*pi/3);
-%! crv = nrbdegelev (crv, 2);
-%! figure
-%! nrbctrlplot (crv); hold on
-%! nrbctrlplot (nrbtform (nrbunclamp (crv, 1), vectrans([-0.4, -0.4])));
-%! nrbctrlplot (nrbtform (nrbunclamp (crv, 2), vectrans([-0.8, -0.8])));
-%! nrbctrlplot (nrbtform (nrbunclamp (crv, 3), vectrans([-1.6, -1.6])));
-%! title ('Original curve and unclamped versions')
-
-%!test
-%! crv = nrbdegelev (nrbtestcrv,2);
-%! x = linspace (0, 1, 100);
-%! F = nrbeval (crv, x);
-%! ucrv = nrbunclamp (crv, 0);
-%! assert (F, nrbeval(ucrv, x));
-%! ucrv = nrbunclamp (crv, 1);
-%! assert (F, nrbeval(ucrv, x), 1e-14);
-%! ucrv = nrbunclamp (crv, 2);
-%! assert (F, nrbeval(ucrv, x), 1e-14);
-%! ucrv = nrbunclamp (crv, 3);
-%! assert (F, nrbeval(ucrv, x), 1e-14);
--- a/extra/nurbs/inst/numbasisfun.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-function B = numbasisfun (iv, uv, p, U)
-
-% NUMBASISFUN:  List non-zero Basis functions for B-Spline in a given knot-span
-%
-% Calling Sequence:
-% 
-%   N = numbasisfun(i,u,p,U)
-%   
-%    INPUT:
-%   
-%      i - knot span  ( from FindSpan() )
-%      u - parametric point
-%      p - spline degree
-%      U - knot sequence
-%   
-%    OUTPUT:
-%   
-%      N - Basis functions (numel(u)x(p+1))
-%   
-% See also: 
-%
-%    basisfun, basisfunder
-%
-%    Copyright (C) 2009 Carlo de Falco
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-B = bsxfun (@(a, b) a+b,iv-p, (0:p).').';
-
-end
-
-%!test
-%!  n = 3; 
-%!  U = [0 0 0 1/2 1 1 1]; 
-%!  p = 2; 
-%!  u = linspace (0, 1, 10);  
-%!  s = findspan (n, p, u, U); 
-%!  Bref = [0   0   0   0   0   1   1   1   1   1; ...
-%!          1   1   1   1   1   2   2   2   2   2; ...
-%!          2   2   2   2   2   3   3   3   3   3].';
-%!  B = numbasisfun (s, u, p, U);
-%!  assert (B, Bref)
\ No newline at end of file
--- a/extra/nurbs/inst/private/nrb_crv_basisfun__.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-  function [B, nbfu] = nrb_crv_basisfun__ (points, nrb);
-%  __NRB_CRV_BASISFUN__: Undocumented internal function
-%
-%   Copyright (C) 2009 Carlo de Falco
-%   This software comes with ABSOLUTELY NO WARRANTY; see the file
-%   COPYING for details.  This is free software, and you are welcome
-%   to distribute it under the conditions laid out in COPYING.
-    n    = size (nrb.coefs, 2) -1;
-    p    = nrb.order -1;
-    u    = points;
-    U    = nrb.knots;
-    w    = nrb.coefs(4,:);
-    
-    spu  =  findspan (n, p, u, U); 
-    nbfu =  numbasisfun (spu, u, p, U);
-    
-    N     = w(nbfu+1) .* basisfun (spu, u, p, U);
-    B     = bsxfun (@(x,y) x./y, N, sum (N,2));
-
-  end
--- a/extra/nurbs/inst/private/nrb_crv_basisfun_der__.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-  function [Bu, nbfu] = nrb_crv_basisfun_der__ (points, nrb)
-%  __NRB_CRV_BASISFUN_DER__: Undocumented internal function
-%
-%   Copyright (C) 2009 Carlo de Falco
-%   Copyright (C) 2013 Rafael Vazquez
-%
-%   This software comes with ABSOLUTELY NO WARRANTY; see the file
-%   COPYING for details.  This is free software, and you are welcome
-%   to distribute it under the conditions laid out in COPYING.
-
-    n    = size (nrb.coefs, 2) -1;
-    p    = nrb.order -1;
-    u    = points;
-    U    = nrb.knots;
-    w    = nrb.coefs(4,:);
-    
-    spu  =  findspan (n, p, u, U);
-    nbfu =  numbasisfun (spu, u, p, U);
-
-    Nprime = basisfunder (spu, p, u, U, 1);
-    N = reshape (Nprime(:,1,:), numel(u), p+1);
-    Nprime = reshape (Nprime(:,2,:), numel(u), p+1);
-
-
-    [Dpc, Dpk]  = bspderiv (p, w, U);
-    D           = bspeval  (p, w, U, u);
-    Dprime      = bspeval  (p-1, Dpc, Dpk, u);
-
-
-    Bu1   = bsxfun (@(np, d) np/d , Nprime.', D);
-    Bu2   = bsxfun (@(n, dp)  n*dp, N.', Dprime./D.^2);
-    Bu    = w(nbfu+1) .* (Bu1 - Bu2).';
-
-  end
--- a/extra/nurbs/inst/private/nrb_srf_basisfun__.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-function [B, N] = nrb_srf_basisfun__ (points, nrb);
-
-%  __NRB_SRF_BASISFUN__: Undocumented internal function
-%
-%   Copyright (C) 2009 Carlo de Falco
-%   This software comes with ABSOLUTELY NO WARRANTY; see the file
-%   COPYING for details.  This is free software, and you are welcome
-%   to distribute it under the conditions laid out in COPYING.
-
-    m    = size (nrb.coefs, 2) -1;
-    n    = size (nrb.coefs, 3) -1;
-    
-    p    = nrb.order(1) -1;
-    q    = nrb.order(2) -1;
-
-    u = points(1,:);
-    v = points(2,:);
-    npt = length(u);
-
-    U    = nrb.knots{1};
-    V    = nrb.knots{2};
-    
-    w    = squeeze(nrb.coefs(4,:,:));
-
-    spu    = findspan (m, p, u, U); 
-    spv    = findspan (n, q, v, V);
-    NuIkuk = basisfun (spu, u, p, U);
-    NvJkvk = basisfun (spv, v, q, V);
-
-    indIkJk = nrbnumbasisfun (points, nrb);
-
-    for k=1:npt
-      wIkaJkb(1:p+1, 1:q+1) = reshape (w(indIkJk(k, :)), p+1, q+1); 
-      NuIkukaNvJkvk(1:p+1, 1:q+1) = (NuIkuk(k, :).' * NvJkvk(k, :));
-      RIkJk(k, :) = reshape((NuIkukaNvJkvk .* wIkaJkb ./ sum(sum(NuIkukaNvJkvk .* wIkaJkb))),1,[]);
-    end
-    
-    B = RIkJk;
-    N = indIkJk;
-    
-  end
\ No newline at end of file
--- a/extra/nurbs/inst/private/nrb_srf_basisfun_der__.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-function [Bu, Bv, N] = nrb_srf_basisfun_der__ (points, nrb);
-
-%  __NRB_SRF_BASISFUN_DER__: Undocumented internal function
-%
-%   Copyright (C) 2009 Carlo de Falco
-%   This software comes with ABSOLUTELY NO WARRANTY; see the file
-%   COPYING for details.  This is free software, and you are welcome
-%   to distribute it under the conditions laid out in COPYING.
-
-  m    = size (nrb.coefs, 2) -1;
-  n    = size (nrb.coefs, 3) -1;
-  
-  p    = nrb.order(1) -1;
-  q    = nrb.order(2) -1;
-  
-  u = points(1,:);
-  v = points(2,:);
-  npt = length(u);
-  
-  U    = nrb.knots{1};
-  V    = nrb.knots{2};
-  
-  w    = squeeze(nrb.coefs(4,:,:));
-  
-  spu  =  findspan (m, p, u, U); 
-  spv  =  findspan (n, q, v, V);
-  N    =  nrbnumbasisfun (points, nrb);
-
-  NuIkuk = basisfun (spu, u, p, U); 
-  NvJkvk = basisfun (spv, v, q, V);
-  
-  NuIkukprime = basisfunder (spu, p, u, U, 1);
-  NuIkukprime = reshape (NuIkukprime(:,2,:), npt, []);
-  
-  NvJkvkprime = basisfunder (spv, q, v, V, 1);
-  NvJkvkprime = reshape (NvJkvkprime(:,2,:), npt, []);
-  
-  for k=1:npt
-    wIkaJkb(1:p+1, 1:q+1) = reshape (w(N(k, :)), p+1, q+1);
-    
-    Num    = (NuIkuk(k, :).' * NvJkvk(k, :)) .* wIkaJkb;
-    Num_du = (NuIkukprime(k, :).' * NvJkvk(k, :)) .* wIkaJkb;
-    Num_dv = (NuIkuk(k, :).' * NvJkvkprime(k, :)) .* wIkaJkb;
-    Denom  = sum(sum(Num));
-    Denom_du = sum(sum(Num_du));
-    Denom_dv = sum(sum(Num_dv));
-    
-    Bu(k, :) = reshape((Num_du/Denom - Denom_du.*Num/Denom.^2),1,[]);
-    Bv(k, :) = reshape((Num_dv/Denom - Denom_dv.*Num/Denom.^2),1,[]);
-  end
-  
-end
\ No newline at end of file
--- a/extra/nurbs/inst/private/nrb_srf_numbasisfun__.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-function idx = nrb_srf_numbasisfun__ (points, nrb)
-
-%  __NRB_SRF_NUMBASISFUN__: Undocumented internal function
-%
-%   Copyright (C) 2009 Carlo de Falco
-%   This software comes with ABSOLUTELY NO WARRANTY; see the file
-%   COPYING for details.  This is free software, and you are welcome
-%   to distribute it under the conditions laid out in COPYING.
-  
-  m   = nrb.number(1)-1;
-  n   = nrb.number(2)-1;
-  
-  npt = size(points,2);
-  u   = points(1,:);
-  v   = points(2,:);
-
-  U   = nrb.knots{1};
-  V   = nrb.knots{2};
-
-  p   = nrb.order(1)-1;
-  q   = nrb.order(2)-1;
-
-  spu = findspan (m, p, u, U); 
-  Ik  = numbasisfun (spu, u, p, U);
-
-  spv = findspan (n, q, v, V);
-  Jk  = numbasisfun (spv, v, q, V);
-  
-  for k=1:npt
-    [Jkb, Ika] = meshgrid(Jk(k, :), Ik(k, :)); 
-    idx(k, :)  = sub2ind([m+1, n+1], Ika(:)+1, Jkb(:)+1);
-  end
-
-end
--- a/extra/nurbs/inst/private/onebasisfun__.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-function Nip = onebasisfun__ (u, p, U)
-
-%  __ONEBASISFUN__: Undocumented internal function
-%
-%   Adapted from Algorithm A2.4 from 'The NURBS BOOK' pg74.
-%
-%   Copyright (C) 2009 Carlo de Falco
-%   Copyright (C) 2012 Rafael Vazquez
-%   This software comes with ABSOLUTELY NO WARRANTY; see the file
-%   COPYING for details.  This is free software, and you are welcome
-%   to distribute it under the conditions laid out in COPYING.
-
-  Nip = zeros (size (u));
-  N = zeros (p+1, 1);
-
-  for ii = 1:numel(u)
-    if ((u(ii) == U(1)) && (U(1) == U(end-1)) || ...
-        (u(ii) == U(end)) && (U(end) == U(2)))
-      Nip(ii) = 1;
-      continue
-    end
-    if (~ any (U <= u(ii))) || (~ any (U > u(ii)))
-      continue;
-    end
-    for jj = 1:p+1 % Initialize zero-th degree functions
-      if (u(ii) >= U(jj) && u(ii) < U(jj+1))
-        N(jj) = 1;
-      else
-        N(jj) = 0;
-      end
-    end
-    for k = 1:p
-      if (N(1) == 0)
-        saved = 0;
-      else
-        saved = (u(ii) - U(1))*N(1) / (U(k+1)-U(1));
-      end
-
-      for jj = 1:p-k+1
-        Uleft = U(1+jj);
-        Uright = U(1+jj+k);
-        if (N(jj+1) == 0)
-          N(jj) = saved;
-          saved = 0;
-        else
-          temp = N(jj+1)/(Uright-Uleft);
-          N(jj) = saved + (Uright - u(ii))*temp;
-          saved = (u(ii) - Uleft)*temp;
-        end
-      end
-    end
-    Nip(ii) = N(1);
-  end
-
-
-end
--- a/extra/nurbs/inst/private/onebasisfunder__.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-function [N, Nder] = onebasisfunder__ (u, p, U)
-
-%  __ONEBASISFUNDER__: Undocumented internal function
-%
-%   Copyright (C) 2012 Rafael Vazquez
-%   This software comes with ABSOLUTELY NO WARRANTY; see the file
-%   COPYING for details.  This is free software, and you are welcome
-%   to distribute it under the conditions laid out in COPYING.
-
-  N = zeros (size (u));
-  Nder = zeros (size (u));
-
-  for ii = 1:numel (u)
-    if (~ any (U <= u(ii))) || (~ any (U > u(ii)))
-      continue;
-    elseif (p == 0)
-      N(ii) = 1;
-      Nder(ii) = 0;
-      continue;
-    else
-      ln = u(ii) - U(1);
-      ld = U(end-1) - U(1);
-      if (ld ~= 0)
-        aux = onebasisfun__ (u(ii), p-1, U(1:end-1))/ ld;
-        N(ii) = N(ii) + ln * aux;
-        Nder(ii) = Nder(ii) + p * aux;
-      end
-
-      dn = U(end) - u(ii);
-      dd = U(end) - U(2);
-      if (dd ~= 0)
-        aux = onebasisfun__ (u(ii), p-1, U(2:end))/ dd;
-        N(ii) = N(ii) + dn * aux;
-        Nder(ii) = Nder(ii) - p * aux;
-      end
-    end
-  end
-  
-end
--- a/extra/nurbs/inst/rad2deg.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-function deg = rad2deg(rad)
-% 
-% RAD2DEG: Convert radians to degrees.
-% 
-% Calling Sequence:
-% 
-%   rad = rad2deg(deg);
-% 
-% INPUT:
-% 
-%   rad		: Angle in radians.
-%
-% OUTPUT:
-%
-%   deg		: Angle in degrees.
-% 
-% Description:
-% 
-%   Convenient utility function for converting radians to degrees, which are
-%   often the required angular units for functions in the NURBS toolbox.
-% 
-% Examples:
-% 
-%   Convert 0.3 radians to degrees
-% 
-%   deg = rad2deg(0.3);
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-deg = 180.0*rad/pi;
-
-end
--- a/extra/nurbs/inst/surfderivcpts.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-function pkl = surfderivcpts (n, p, U, m, q, V, P, d, r1, r2, s1, s2) 
-%
-% SURFDERIVCPTS: Compute control points of n-th derivatives of a NURBS surface.
-% 
-% usage: pkl = surfderivcpts (n, p, U, m, q, V, P, d) 
-%
-%  INPUT: 
-%
-%        n+1, m+1 = number of control points
-%        p, q     = spline order
-%        U, V     = knots
-%        P        = control points
-%        d        = derivative order
-%
-%  OUTPUT:
-%
-%        pkl (k+1, l+1, i+1, j+1) = i,jth control point
-%                                   of the surface differentiated k
-%                                   times in the u direction and l
-%                                   times in the v direction
-%
-% Adaptation of algorithm A3.7 from the NURBS book, pg114
-%
-%    Copyright (C) 2009 Carlo de Falco
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-  
-  if (nargin <= 8)
-    r1 = 0; r2 = n;
-    s1 = 0; s2 = m;
-  end
-  r = r2-r1;
-  s = s2-s1;
-
-  du = min (d, p);   dv = min (d, q); 
-
-  for j=s1:s2
-    temp = curvederivcpts (n, p, U, P(:,j+1:end), du, r1, r2);
-    for k=0:du
-      for i=0:r-k
-       pkl (k+1, 1, i+1, j-s1+1) = temp (k+1, i+1);
-      end
-    end
-  end
-  
-  for k=0:du
-    for i=0:r-k
-      dd = min (d-k, dv);
-      temp = curvederivcpts (m, q, V(s1+1:end), pkl(k+1, 1, i+1, :),  ...
-			     dd, 0, s);
-      for l=1:dd
-       for j=0:s-l
-        pkl (k+1, l+1, i+1, j+1) = temp (l+1, j+1);
-       end
-      end
-    end
-  end
-
-end
-
-%!test
-%! coefs = cat(3,[0 0; 0 1],[1 1; 0 1]);
-%! knots = {[0 0 1 1]  [0 0 1 1]};
-%! plane = nrbmak(coefs,knots);
-%! pkl = surfderivcpts (plane.number(1)-1, plane.order(1)-1,...
-%!                       plane.knots{1}, plane.number(2)-1,...
-%!                       plane.order(2)-1, plane.knots{2}, ...
-%!                       squeeze (plane.coefs(1,:,:)), 1);
--- a/extra/nurbs/inst/surfderiveval.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,95 +0,0 @@
-function skl = surfderiveval (n, p, U, m, q, V, P, u, v, d) 
-%
-% SURFDERIVEVAL: Compute the derivatives of a B-spline surface
-% 
-% usage: skl = surfderiveval (n, p, U, m, q, V, P, u, v, d) 
-%
-%  INPUT: 
-%
-%        n+1, m+1 = number of control points
-%        p, q     = spline order
-%        U, V     = knots
-%        P        = control points
-%        u,v      = evaluation points
-%        d        = derivative order
-%
-%  OUTPUT:
-%
-%        skl (k+1, l+1) =  surface differentiated k
-%                          times in the u direction and l
-%                          times in the v direction
-%
-% Adaptation of algorithm A3.8 from the NURBS book, pg115
-%
-%    Copyright (C) 2009 Carlo de Falco
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-  skl = zeros (d+1, d+1);
-  du = min (d, p);   
-  dv = min (d, q);   
-
-  uspan = findspan (n, p, u, U);
-  for ip=0:p
-      Nu(1:ip+1,ip+1) = basisfun (uspan, u, ip, U)';
-  end
-  
-  vspan = findspan (m, q, v, V);
-  for ip=0:q
-      Nv(1:ip+1,ip+1) = basisfun (vspan, v, ip, V)';
-  end
-
-  pkl = surfderivcpts (n, p, U, m, q, V, P, d, uspan-p, uspan,  ...
-		       vspan-q, vspan);
-
-  for k = 0:du
-    dd = min (d-k, dv);
-    for l = 0:dd
-      skl(k+1,l+1) =0;
-      for i=0:q-l
-       tmp = 0;
-       for j = 0:p-k
-        tmp = tmp + Nu(j+1,p-k+1) * pkl(k+1,l+1,j+1,i+1);
-       end
-       skl(k+1,l+1) = skl(k+1,l+1) + Nv(i+1,q-l+1)*tmp;
-      end
-    end
-  end
-  
-end
-
-%!shared srf
-%!test
-%! k = [0 0 0 1 1 1];
-%! c = [0 1/2 1];
-%! [coef(2,:,:), coef(1,:,:)] = meshgrid (c, c);
-%! srf = nrbmak (coef, {k, k});
-%! skl = surfderiveval (srf.number(1)-1, ...
-%!                      srf.order(1)-1, ...
-%!                      srf.knots{1}, ...
-%!                      srf.number(2)-1, ...
-%!                      srf.order(2)-1, ...
-%!                      srf.knots{2},...
-%!                      squeeze(srf.coefs(1,:,:)), .5, .5, 1) ;
-%! assert (skl, [.5 0; 1 0])
-%!test
-%! srf = nrbkntins (srf, {[], rand(1,2)});
-%! skl = surfderiveval (srf.number(1)-1,... 
-%!                      srf.order(1)-1, ...
-%!                      srf.knots{1},...
-%!                      srf.number(2)-1,... 
-%!                      srf.order(2)-1, ...
-%!                      srf.knots{2},...
-%!                      squeeze(srf.coefs(1,:,:)), .5, .5, 1) ;
-%! assert (skl, [.5 0; 1 0], 100*eps)
\ No newline at end of file
--- a/extra/nurbs/inst/tbasisfun.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,131 +0,0 @@
-function [N, Nder] = tbasisfun (u, p, U)
-%
-% TBASISFUN: Compute a B- or T-Spline basis function, and its derivatives, from its local knot vector.
-%
-% usage:
-%
-% [N, Nder] = tbasisfun (u, p, U)
-% [N, Nder] = tbasisfun ([u; v], [p q], {U, V})
-% [N, Nder] = tbasisfun ([u; v; w], [p q r], {U, V, W})
-% 
-% INPUT:
-%
-%  u or [u; v] : points in parameter space where the basis function is to be
-%  evaluated 
-%  
-%  U or {U, V} : local knot vector
-%
-% p or [p q] : polynomial order of the basis function
-%
-% OUTPUT:
-%
-%  N    : basis function evaluated at the given parametric points 
-%  Nder : basis function gradient evaluated at the given parametric points 
-%
-%    Copyright (C) 2009 Carlo de Falco
-%    Copyright (C) 2012 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-  
-  if (~ iscell (U))
-    U = sort (U);
-    if (numel (U) ~= p+2)
-      error ('tbasisfun: knot vector and degree do not correspond')
-    end
-    
-    if (nargout == 1)
-      N = onebasisfun__ (u, p, U);
-    else
-      [N, Nder] = onebasisfunder__ (u, p, U);
-    end
-    
-  elseif (size(U,2) == 2)
-    U{1} = sort(U{1}); U{2} = sort(U{2});
-    if (numel(U{1}) ~= p(1)+2 || numel(U{2}) ~= p(2)+2)
-      error ('tbasisfun: knot vector and degree do not correspond')
-    end
-    
-    if (nargout == 1)
-      Nu = onebasisfun__ (u(1,:), p(1), U{1});
-      Nv = onebasisfun__ (u(2,:), p(2), U{2});
-
-      N = Nu.*Nv;
-    elseif (nargout == 2)
-      [Nu, Ndu] = onebasisfunder__ (u(1,:), p(1), U{1});
-      [Nv, Ndv] = onebasisfunder__ (u(2,:), p(2), U{2});
-
-      N = Nu.*Nv;
-      Nder(1,:) = Ndu.*Nv;
-      Nder(2,:) = Nu.*Ndv;
-    end
-    
-  elseif (size(U,2) == 3)
-    U{1} = sort(U{1}); U{2} = sort(U{2}); U{3} = sort(U{3});
-    if (numel(U{1}) ~= p(1)+2 || numel(U{2}) ~= p(2)+2 || numel(U{3}) ~= p(3)+2)
-      error ('tbasisfun: knot vector and degree do not correspond')
-    end
-
-    if (nargout == 1)
-      Nu = onebasisfun__ (u(1,:), p(1), U{1});
-      Nv = onebasisfun__ (u(2,:), p(2), U{2});
-      Nw = onebasisfun__ (u(3,:), p(3), U{3});
-
-      N = Nu.*Nv.*Nw;
-    else
-      [Nu, Ndu] = onebasisfunder__ (u(1,:), p(1), U{1});
-      [Nv, Ndv] = onebasisfunder__ (u(2,:), p(2), U{2});
-      [Nw, Ndw] = onebasisfunder__ (u(3,:), p(3), U{3});
-      
-      N = Nu.*Nv.*Nw;
-      Nder(1,:) = Ndu.*Nv.*Nw;
-      Nder(2,:) = Nu.*Ndv.*Nw;
-      Nder(3,:) = Nu.*Nv.*Ndw;
-    end
-  end
-
-end
-
-%!demo
-%! U = {[0 0 1/2 1 1], [0 0 0 1 1]};
-%! p = [3, 3];
-%! [X, Y] = meshgrid (linspace(0, 1, 30));
-%! u = [X(:), Y(:)]';
-%! N = tbasisfun (u, p, U);
-%! surf (X, Y, reshape (N, size(X)))
-%! title('Basis function associated to a local knot vector')
-%! hold off
-
-%!test
-%! U = [0 1/2 1];
-%! p = 1;
-%! u = [0.3 0.4 0.6 0.7];
-%! [N, Nder] = tbasisfun (u, p, U);
-%! assert (N, [0.6 0.8 0.8 0.6], 1e-12);
-%! assert (Nder, [2 2 -2 -2], 1e-12);
-
-%!test
-%! U = {[0 1/2 1] [0 1/2 1]};
-%! p = [1 1];
-%! u = [0.3 0.4 0.6 0.7; 0.3 0.4 0.6 0.7];
-%! [N, Nder] = tbasisfun (u, p, U);
-%! assert (N, [0.36 0.64 0.64 0.36], 1e-12);
-%! assert (Nder, [1.2 1.6 -1.6 -1.2; 1.2 1.6 -1.6 -1.2], 1e-12);
-
-%!test
-%! U = {[0 1/2 1] [0 1/2 1] [0 1/2 1]};
-%! p = [1 1 1];
-%! u = [0.4 0.4 0.6 0.6; 0.4 0.4 0.6 0.6; 0.4 0.6 0.4 0.6];
-%! [N, Nder] = tbasisfun (u, p, U);
-%! assert (N, [0.512 0.512 0.512 0.512], 1e-12);
-%! assert (Nder, [1.28 1.28 -1.28 -1.28; 1.28 1.28 -1.28 -1.28; 1.28 -1.28 1.28 -1.28], 1e-12);
--- a/extra/nurbs/inst/vecangle.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-function ang = vecangle(num,den)
-
-% 
-% VECANGLE: An alternative to atan, returning an arctangent in the 
-%             range 0 to 2*pi.
-% 
-% Calling Sequence:
-% 
-%   ang = vecmag2(num,dum)
-% 
-% INPUT:
-% 
-%   num		: Numerator, vector of size (1,nv).
-%   dem		: Denominator, vector of size (1,nv).
-%
-% OUTPUT:
-%   ang		: Arctangents, row vector of angles.
-% 
-% Description:
-% 
-%   The components of the vector ang are the arctangent of the corresponding
-%   enties of num./dem. This function is an alternative for 
-%   atan, returning an angle in the range 0 to 2*pi.
-% 
-% Examples:
-% 
-%   Find the atan(1.2,2.0) and atan(1.5,3.4) using vecangle
-% 
-%   ang = vecangle([1.2 1.5], [2.0 3.4]);
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-ang = atan2(num,den);
-index = find(ang < 0.0);
-ang(index) = 2*pi+ang(index);
-
-end
--- a/extra/nurbs/inst/veccross.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-function cross = veccross(vec1,vec2)
-% 
-% VECCROSS: The cross product of two vectors.
-% 
-% Calling Sequence:
-% 
-%   cross = veccross(vec1,vec2);
-% 
-% INPUT:
-% 
-%   vec1	: An array of column vectors represented by a matrix of
-%   vec2	size (dim,nv), where is the dimension of the vector and
-% 		nv the number of vectors.
-%
-% OUTPUT:
-% 
-%   cross	: Array of column vectors, each element is corresponding
-% 		to the cross product of the respective components in vec1
-% 		and vec2.
-% 
-% Description:
-% 
-%   Cross product of two vectors.
-% 
-% Examples:
-% 
-%   Determine the cross products of:
-%   (2.3,3.4,5.6) and (1.2,4.5,1.2)
-%   (5.1,0.0,2.3) and (2.5,3.2,4.0)
-% 
-%   cross = veccross([2.3 5.1; 3.4 0.0; 5.6 2.3],[1.2 2.5; 4.5 3.2; 1.2 4.0]);
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if size(vec1,1) == 2
-  % 2D vector
-  cross = zeros(size(vec1));
-  cross(3,:) = vec1(1,:).*vec2(2,:)-vec1(2,:).*vec2(1,:);
-else
-  % 3D vector
-  cross = [vec1(2,:).*vec2(3,:)-vec1(3,:).*vec2(2,:);
-           vec1(3,:).*vec2(1,:)-vec1(1,:).*vec2(3,:);
-           vec1(1,:).*vec2(2,:)-vec1(2,:).*vec2(1,:)];
-end
-
-end
--- a/extra/nurbs/inst/vecdot.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-function dot = vecdot(vec1,vec2)
-% 
-% VECDOT: The dot product of two vectors.
-% 
-% Calling Sequence:
-% 
-%   dot = vecdot(vec1,vec2);
-% 
-% INPUT:
-% 
-%   vec1	: An array of column vectors represented by a matrix of
-%   vec2	size (dim,nv), where is the dimension of the vector and
-% 		nv the number of vectors.
-%
-% OUTPUT:
-%
-%   dot		: Row vector of scalars, each element corresponding to
-% 		the dot product of the respective components in vec1 and
-% 		vec2.
-% 
-% Description:
-% 
-%   Scalar dot product of two vectors.
-% 
-% Examples:
-% 
-%   Determine the dot product of
-%   (2.3,3.4,5.6) and (1.2,4.5,1.2)
-%   (5.1,0.0,2.3) and (2.5,3.2,4.0)
-%
-%   dot = vecdot([2.3 5.1; 3.4 0.0; 5.6 2.3],[1.2 2.5; 4.5 3.2; 1.2 4.0]);
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-dot = sum(vec1.*vec2);
-
-end
--- a/extra/nurbs/inst/vecmag.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-function mag = vecmag(vec)
-% 
-% VECMAG: Magnitude of the vectors.
-% 
-% Calling Sequence:
-% 
-%   mvec = vecmag(vec)
-% 
-% INPUT:
-% 
-%   vec		: An array of column vectors represented by a matrix of
-% 		size (dim,nv), where is the dimension of the vector and
-% 		nv the number of vectors.
-%
-% OUTPUT:
-%
-%   mvec	: Magnitude of the vectors, vector of size (1,nv).
-% 
-% Description:
-% 
-%   Determines the magnitude of the vectors.
-% 
-% Examples:
-% 
-%   Find the magnitude of the two vectors (0.0,2.0,1.3) and (1.5,3.4,2.3)
-% 
-%   mvec = vecmag([0.0 1.5; 2.0 3.4; 1.3 2.3]);
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-mag = sqrt(sum(vec.^2));
-
-end
--- a/extra/nurbs/inst/vecmag2.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-function mag = vecmag2(vec)
-% 
-% VECMAG2: Squared magnitude of a set of vectors.
-% 
-% Calling Sequence:
-% 
-%   mvec = vecmag2(vec)
-% 
-% INPUT:
-% 
-%   vec		: An array of column vectors represented by a matrix of
-% 		size (dim,nv), where dim is the dimension of the vector and
-% 		nv the number of vectors.
-%
-% OUTPUT:
-% 
-%   mvec	: Squared magnitude of the vectors, vector of size (1,nv).
-% 
-% Description:
-% 
-%   Determines the squared magnitude of the vectors.
-% 
-% Examples:
-% 
-%   Find the squared magnitude of the two vectors (0.0,2.0,1.3)
-%   and (1.5,3.4,2.3)
-% 
-%   mvec = vecmag2([0.0 1.5; 2.0 3.4; 1.3 2.3]);
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-mag = sum(vec.^2);
-
-end
--- a/extra/nurbs/inst/vecnorm.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-function nvec = vecnorm(vec)
-% 
-% VECNORM: Normalise the vectors.
-% 
-% Calling Sequence:
-% 
-%   nvec = vecnorn(vec);
-% 
-% INPUT:
-% 
-%   vec		: An array of column vectors represented by a matrix of
-% 		size (dim,nv), where is the dimension of the vector and
-% 		nv the number of vectors.
-%
-% OUTPUT:
-% 
-%   nvec		: Normalised vectors, matrix the smae size as vec.
-% 
-% Description:
-% 
-%   Normalises the array of vectors, returning the unit vectors.
-% 
-% Examples:
-% 
-%   Normalise the two vectors (0.0,2.0,1.3) and (1.5,3.4,2.3)
-%
-%   nvec = vecnorm([0.0 1.5; 2.0 3.4; 1.3 2.3]);
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-nvec = vec./repmat(sqrt(sum(vec.^2)),[size(vec,1) ones(1,ndims(vec)-1)]);
-
-end
--- a/extra/nurbs/inst/vecrot.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-function rx = vecrot(angle, vector)
-% 
-% VECROT: Transformation matrix for a rotation around the axis given by a vector. 
-% 
-% Calling Sequence:
-% 
-%   rx = vecrot (angle, vector);
-% 
-% INPUT:
-% 
-%   angle : rotation angle defined in radians
-%   vector: vector defining the rotation axis
-%
-% OUTPUT:
-% 
-%   rx: (4x4) Transformation matrix.
-% 
-% 
-% Description:
-% 
-%   Return the (4x4) Transformation matrix for a rotation about the axis
-%   defined by vector, and by the given angle.
-% 
-% See also:
-% 
-%    nrbtform
-%
-%    Copyright (C) 2011 Rafael Vazquez
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-% Normalize the vector
-vec = vector / norm (vector);
-
-sn = sin (angle);
-cn = cos (angle);
-rx = [cn+vec(1)^2*(1-cn), vec(1)*vec(2)*(1-cn)-vec(3)*sn, vec(1)*vec(3)*(1-cn)+vec(2)*sn, 0; 
-    vec(1)*vec(2)*(1-cn)+vec(3)*sn, cn+vec(2)^2*(1-cn), vec(2)*vec(3)*(1-cn)-vec(1)*sn, 0; 
-    vec(1)*vec(3)*(1-cn)-vec(2)*sn, vec(2)*vec(3)*(1-cn)+vec(1)*sn, cn+vec(3)^2*(1-cn), 0; 
-    0 0 0 1];
-
-end
--- a/extra/nurbs/inst/vecrotx.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-function rx = vecrotx(angle)
-% 
-% VECROTX: Transformation matrix for a rotation around the x axis. 
-% 
-% Calling Sequence:
-% 
-%   rx = vecrotx(angle);
-% 
-% INPUT:
-% 
-%   angle		: rotation angle defined in radians
-%
-% OUTPUT:
-% 
-%   rx		: (4x4) Transformation matrix.
-% 
-% 
-% Description:
-% 
-%   Return the (4x4) Transformation matrix for a rotation about the x axis
-%   by the defined angle.
-% 
-%   The matrix is:
-% 
-%         [ 1         0            0          0]
-%         [ 0     cos(angle)  -sin(angle)     0]
-%         [ 0     sin(angle)   cos(angle)     0]
-%         [ 0         0            0          1]
-% 
-% Examples:
-% 
-%    Rotate the NURBS line (0.0 0.0 0.0) - (3.0 3.0 3.0) by 45 degrees
-%    around the x-axis
-% 
-%    line = nrbline([0.0 0.0 0.0],[3.0 3.0 3.0]);
-%    trans = vecrotx(%pi/4);
-%    rline = nrbtform(line, trans);
-% 
-% See also:
-% 
-%    nrbtform
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-sn = sin(angle);
-cn = cos(angle);
-rx = [1 0 0 0; 0 cn -sn 0; 0 sn cn 0; 0 0 0 1];
-
-end
--- a/extra/nurbs/inst/vecroty.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-function ry = vecroty(angle)
-% 
-% VECROTY: Transformation matrix for a rotation around the y axis. 
-% 
-% Calling Sequence:
-% 
-%   ry = vecroty(angle);
-% 
-% INPUT:
-% 
-%   angle		: rotation angle defined in radians
-% 
-% OUTPUT:
-%
-%   ry		: (4x4) Transformation matrix.
-% 
-% 
-% Description:
-% 
-%   Return the (4x4) Transformation matrix for a rotation about the y axis
-%   by the defined angle.
-% 
-%   The matrix is:
-% 
-%         [  cos(angle)       0        sin(angle)       0]
-%         [      0            1            0            0]
-%         [ -sin(angle)       0        cos(angle)       0]
-%         [      0            0            0            1]
-% 
-% Examples:
-% 
-%    Rotate the NURBS line (0.0 0.0 0.0) - (3.0 3.0 3.0) by 45 degrees
-%    around the y-axis
-% 
-%    line = nrbline([0.0 0.0 0.0],[3.0 3.0 3.0]);
-%    trans = vecroty(%pi/4);
-%    rline = nrbtform(line, trans);
-% 
-% See also:
-% 
-%    nrbtform
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-sn = sin(angle);
-cn = cos(angle);
-ry = [cn 0 sn 0; 0 1 0 0; -sn 0 cn 0; 0 0 0 1];
-
-end
--- a/extra/nurbs/inst/vecrotz.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-function rz = vecrotz(angle)
-% 
-% VECROTZ: Transformation matrix for a rotation around the z axis. 
-% 
-% Calling Sequence:
-% 
-%   rz = vecrotz(angle);
-% 
-% INPUT:
-% 
-%   angle	: rotation angle defined in radians
-%
-% OUTPUT:
-% 
-%   rz		: (4x4) Transformation matrix.
-% 
-% 
-% Description:
-% 
-%   Return the (4x4) Transformation matrix for a rotation about the z axis
-%   by the defined angle.
-% 
-%   The matrix is:
-% 
-%         [  cos(angle)  -sin(angle)       0          0]
-%         [ -sin(angle)   cos(angle)       0          0]
-%         [      0            0            1          0]
-%         [      0            0            0          1]
-% 
-% Examples:
-% 
-%  Rotate the NURBS line (0.0 0.0 0.0) - (3.0 3.0 3.0) by 45 degrees
-%  around the z-axis
-% 
-%    line = nrbline([0.0 0.0 0.0],[3.0 3.0 3.0]);
-%    trans = vecrotz(%pi/4);
-%    rline = nrbtform(line, trans);
-% 
-% See also:
-% 
-%    nrbtform
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-sn = sin(angle);
-cn = cos(angle);
-rz = [cn -sn 0 0; sn cn 0 0; 0 0 1 0; 0 0 0 1];
-
-end
--- a/extra/nurbs/inst/vecscale.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-function ss = vecscale(vector)
-
-%
-% VECSCALE: Transformation matrix for a scaling.
-% 
-% Calling Sequence:
-% 
-%   ss = vecscale(svec)
-% 
-% INPUT:
-% 
-%   svec    : A vectors defining the scaling along the x,y and z axes.
-%             i.e. [sx, sy, sy]
-%
-% OUTPUT:
-% 
-%   ss	    : Scaling Transformation Matrix
-% 
-% Description:
-% 
-%   Returns a (4x4) Transformation matrix for scaling.
-% 
-%   The matrix is:
-% 
-%         [ sx  0   0   0]
-%         [ 0   sy  0   0]
-%         [ 0   0   sz  0]
-%         [ 0   0   0   1]
-% 
-% Example:
-% 
-%   Scale up the NURBS line (0.0,0.0,0.0) - (1.0,1.0,1.0) by 3 along
-%   the x-axis, 2 along the y-axis and 4 along the z-axis.
-% 
-%   line = nrbline([0.0 0.0 0.0],[1.0 1.0 1.0]);
-%   trans = vecscale([3.0 2.0 4.0]);
-%   sline = nrbtform(line, trans);
-% 
-% See also:
-% 
-%    nrbtform
-%
-%    Copyright (C) 2000 Mark Spink, 2007 Daniel Claxton
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-if nargin < 1
-  error('Scaling vector not specified');
-end   
-
-s = [vector(:);0;0];
-ss = [s(1) 0 0 0; 0 s(2) 0 0; 0 0 s(3) 0; 0 0 0 1];
-
-end
--- a/extra/nurbs/inst/vectrans.m	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-function dd = vectrans(vector)
-% 
-% VECTRANS: Transformation matrix for a translation.
-% 
-% Calling Sequence:
-% 
-%   st = vectrans(tvec)
-% 
-% INPUT:
-% 
-%   tvec	: A vectors defining the translation along the x,y and
-%                   z axes. i.e. [tx, ty, ty]
-%
-% OUTPUT:
-% 
-%   st		: Translation Transformation Matrix
-% 
-% Description:
-% 
-%   Returns a (4x4) Transformation matrix for translation.
-% 
-%   The matrix is:
-% 
-%         [ 1   0   0   tx ]
-%         [ 0   1   0   ty ]
-%         [ 0   0   1   tz ]
-%         [ 0   0   0   1  ]
-% 
-% Examples:
-% 
-%   Translate the NURBS line (0.0,0.0,0.0) - (1.0,1.0,1.0) by 3 along
-%   the x-axis, 2 along the y-axis and 4 along the z-axis.
-%
-%   line = nrbline([0.0 0.0 0.0],[1.0 1.0 1.0]);
-%   trans = vectrans([3.0 2.0 4.0]);
-%   tline = nrbtform(line, trans);
-% 
-% See also:
-% 
-%    nrbtform
-%
-%    Copyright (C) 2000 Mark Spink
-%
-%    This program is free software: you can redistribute it and/or modify
-%    it under the terms of the GNU General Public License as published by
-%    the Free Software Foundation, either version 3 of the License, or
-%    (at your option) any later version.
-
-%    This program is distributed in the hope that it will be useful,
-%    but WITHOUT ANY WARRANTY; without even the implied warranty of
-%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-%    GNU General Public License for more details.
-%
-%    You should have received a copy of the GNU General Public License
-%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-
-if nargin < 1
-  error('Translation vector required');
-end   
-
-v = [vector(:);0;0];
-dd = [1 0 0 v(1); 0 1 0 v(2); 0 0 1 v(3); 0 0 0 1];
-
-end
--- a/extra/nurbs/src/Makefile	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-OCTFILES=basisfun.oct bspeval.oct nrb_srf_basisfun__.oct surfderivcpts.oct basisfunder.oct \
-curvederivcpts.oct nrb_srf_basisfun_der__.oct surfderiveval.oct bspderiv.oct \
-nrbsurfderiveval.oct tbasisfun.oct
-
-MKOCTFILE ?= mkoctfile
-
-all: $(OCTFILES)
-
-low_level_functions.o: low_level_functions.cc
-	$(MKOCTFILE) -c $<
-
-%.oct:  %.cc low_level_functions.o
-	$(MKOCTFILE) $< low_level_functions.o
-
-clean:
-	-rm -f *.o core octave-core *.oct *~
-
--- a/extra/nurbs/src/basisfun.cc	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-/* Copyright (C) 2009 Carlo de Falco
-  
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <octave/oct.h>
-#include "low_level_functions.h"
-
-DEFUN_DLD(basisfun, args, nargout, "\n\
- BASISFUN: Compute B-Spline Basis Functions \n\
-\n\
-Calling Sequence:\n\
-\n\
-  N = basisfun(iv,uv,p,U)\n\
-\n\
- INPUT:\n\
-\n\
-   iv - knot span  ( from FindSpan() )\n\
-   uv - parametric point\n\
-   p - spline degree\n\
-   U - knot sequence\n\
-\n\
- OUTPUT:\n\
-\n\
-   N - Basis functions vector(numel(uv)*(p+1))\n\
-\n\
- Algorithm A2.2 from 'The NURBS BOOK' pg70.\n\
-\n\
-")
-{
-
-  octave_value_list retval;
-  const NDArray   i = args(0).array_value();
-  const NDArray   u = args(1).array_value();
-  int       p = args(2).idx_type_value();
-  const RowVector U = args(3).row_vector_value();
-  RowVector N(p+1, 0.0);
-  Matrix    B(u.numel (), p+1, 0.0);
-  
-  if (!error_state)
-    {
-      for (octave_idx_type ii(0); ii < u.numel (); ii++)
-	{
-	  basisfun(int(i(ii)), u(ii), p, U, N);
-	  B.insert(N, ii, 0);
-	}
-      
-      retval(0) = octave_value(B);
-    }
-  return retval;
-} 
-
-/*
-%!shared n, U, p, u, s
-%!test
-%!  n = 3; 
-%!  U = [0 0 0 1/2 1 1 1]; 
-%!  p = 2; 
-%!  u = linspace(0, 1, 10);  
-%!  s = findspan(n, p, u, U); 
-%!  assert (s, [2*ones(1, 5) 3*ones(1, 5)]);
-%!test
-%!  Bref = [1.00000   0.00000   0.00000
-%!          0.60494   0.37037   0.02469
-%!          0.30864   0.59259   0.09877
-%!          0.11111   0.66667   0.22222
-%!          0.01235   0.59259   0.39506
-%!          0.39506   0.59259   0.01235
-%!          0.22222   0.66667   0.11111
-%!          0.09877   0.59259   0.30864
-%!          0.02469   0.37037   0.60494
-%!          0.00000   0.00000   1.00000];
-%!  B = basisfun(s, u, p, U);
-%!  assert (B, Bref, 1e-5);
-*/
--- a/extra/nurbs/src/basisfunder.cc	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-/* Copyright (C) 2009 Carlo de Falco
-
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <octave/oct.h>
-#include "low_level_functions.h"
-
-DEFUN_DLD(basisfunder, args, nargout,"\n\
- BASISFUNDER:  B-Spline Basis function derivatives\n\
-\n\
- Calling Sequence:\n\
-\n\
-   ders = basisfunder (ii, pl, uu, k, nd)\n\
-\n\
-    INPUT:\n\
-\n\
-      ii  - knot span\n\
-      pl  - degree of curve\n\
-      uu  - parametric points\n\
-      k   - knot vector\n\
-      nd  - number of derivatives to compute\n\
-\n\
-    OUTPUT:\n\
-\n\
-      ders - ders(n, i, :) (i-1)-th derivative at n-th point\n\
-\n\
-   Adapted from Algorithm A2.3 from 'The NURBS BOOK' pg72. \n\
-\n\
-")
-{
-  octave_value_list retval;
-
-  const NDArray i = args(0).array_value ();
-  int pl = args(1).int_value ();
-  const NDArray u = args(2).array_value ();
-  const RowVector U = args(3).row_vector_value ();
-  int nd = args(4).int_value ();
-
-  if (!error_state)
-    {
-      if (i.numel () != u.numel ())
-	print_usage ();
- 
-      NDArray dersv (dim_vector (i.numel (), nd+1, pl+1), 0.0);
-      NDArray ders(dim_vector(nd+1, pl+1), 0.0);
-      for ( octave_idx_type jj(0); jj < i.numel (); jj++)
-	{
-	  basisfunder (int (i(jj)), pl, u(jj), U, nd, ders);
-
-	  for (octave_idx_type kk(0); kk < nd+1; kk++)
-	    for (octave_idx_type ll(0); ll < pl+1; ll++)
-	      {
-		dersv(jj, kk, ll) = ders(kk, ll);
-	      }
-	}
-      retval(0) = dersv;
-    }
-  return retval;
-}
--- a/extra/nurbs/src/bspderiv.cc	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-/* Copyright (C) 2009 Carlo de Falco
-  
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <octave/oct.h>
-#include "low_level_functions.h"
-
-DEFUN_DLD(bspderiv, args, nargout,"\n\
- BSPDERIV:  B-Spline derivative\n\
-\n\
-\n\
- Calling Sequence:\n\
-\n\
-          [dc,dk] = bspderiv(d,c,k)\n\
-\n\
-  INPUT:\n\
- \n\
-    d - degree of the B-Spline\n\
-    c - control points   double matrix(mc,nc)\n\
-    k - knot sequence    double vector(nk)\n\
- \n\
-  OUTPUT:\n\
- \n\
-    dc - control points of the derivative     double  matrix(mc,nc)\n\
-    dk - knot sequence of the derivative      double  vector(nk)\n\
- \n\
-  Modified version of Algorithm A3.3 from 'The NURBS BOOK' pg98.\n\
-")
-{
-  //if (bspderiv_bad_arguments(args, nargout)) 
-  //  return octave_value_list(); 
-  
-  int       d = args(0).int_value();
-  const Matrix    c = args(1).matrix_value();
-  const RowVector k = args(2).row_vector_value();
-  octave_value_list retval;
-  octave_idx_type mc = c.rows(), nc = c.cols(), nk = k.numel();
-  Matrix dc (mc, nc-1, 0.0);
-  RowVector dk(nk-2, 0.0);
-
-  if (!error_state)
-    {      
-      double tmp;
-      
-      for (octave_idx_type i(0); i<=nc-2; i++)
-	{
-	  tmp = (double)d / (k(i+d+1) - k(i+1));
-	  for ( octave_idx_type j(0); j<=mc-1; j++)
-	    dc(j,i) = tmp*(c(j,i+1) - c(j,i));        
-	}
-      
-      for ( octave_idx_type i(1); i <= nk-2; i++)
-	dk(i-1) = k(i);
-      
-      if (nargout>1)
-	retval(1) = octave_value(dk);
-      retval(0) = octave_value(dc);
-    }
-
-  return(retval);
-}
--- a/extra/nurbs/src/bspeval.cc	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,122 +0,0 @@
-/* Copyright (C) 2009 Carlo de Falco
-  
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <octave/oct.h>
-#include "low_level_functions.h"
-#include <omp.h>
-
-static bool bspeval_bad_arguments(const octave_value_list& args);
-
-DEFUN_DLD(bspeval, args, nargout,"\
- BSPEVAL:  Evaluate B-Spline at parametric points\n\
-\n\
-\n\
- Calling Sequence:\n\
-\n\
-   p = bspeval(d,c,k,u)\n\
-\n\
-    INPUT:\n\
-\n\
-       d - Degree of the B-Spline.\n\
-       c - Control Points, matrix of size (dim,nc).\n\
-       k - Knot sequence, row vector of size nk.\n\
-       u - Parametric evaluation points, row vector of size nu.\n\
- \n\
-    OUTPUT:\n\
-\n\
-       p - Evaluated points, matrix of size (dim,nu)\n\
-")
-{
-
-  octave_value_list retval;
-  if (!bspeval_bad_arguments (args))
-    {      
-      int       d = args(0).int_value();
-      Matrix    c = args(1).matrix_value();
-      RowVector k = args(2).row_vector_value();
-      NDArray   u = args(3).array_value();
-      
-      octave_idx_type nu = u.numel ();
-      octave_idx_type mc = c.rows(),
-        nc = c.cols();
-      
-      Matrix p(mc, nu, 0.0);
-      
-      if (!error_state)
-        {
-          if (nc + d == k.numel () - 1) 
-            {	 
-              //#pragma omp parallel default (none) shared (d, c, k, u, nu, mc, nc, p)
-              {
-                RowVector N(d+1,0.0);
-                int s, tmp1;
-                double tmp2;
-                //#pragma omp for 
-                for (octave_idx_type col=0; col<nu; col++)
-                  {	
-                    //printf ("thread %d, col %d\n", omp_get_thread_num (), col);
-                    s = findspan (nc-1, d, u(col), k);
-                    basisfun (s, u(col), d, k, N);    
-                    tmp1 = s - d;                
-                    for (octave_idx_type row(0); row<mc; row++)
-                      {
-                        tmp2 = 0.0;
-                        for ( octave_idx_type i(0); i<=d; i++)                   
-                          tmp2 +=  N(i)*c(row,tmp1+i);	  
-                        p(row,col) = tmp2;
-                      }             
-                  }   
-              }// end omp 
-            }
-          else 
-            {
-              error("inconsistent bspline data, d + columns(c) != numel(k) - 1.");
-            }
-          retval(0) = octave_value(p);
-        }
-    }      
-  return retval;
-} 
-
-static bool bspeval_bad_arguments (const octave_value_list& args) 
-{ 
-  if (args.length () != 4)
-    {
-      error("bspeval: wrong number of input arguments.");
-      return true;
-    }
-  if (!args(0).is_real_scalar()) 
-    { 
-      error("bspeval: degree should be a scalar."); 
-      return true; 
-    } 
-  if (!args(1).is_real_matrix()) 
-    { 
-      error("bspeval: the control net should be a matrix of doubles."); 
-      return true; 
-    } 
-  if (!args(2).is_real_matrix()) 
-    { 
-      error("bspeval: the knot vector should be a real vector."); 
-      return true; 
-    } 
-  if (!args(3).is_real_type()) 
-    { 
-      error("bspeval: the set of parametric points should be an array of doubles."); 
-      return true; 
-    } 
-  return false; 
-} 
--- a/extra/nurbs/src/curvederivcpts.cc	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-/* Copyright (C) 2009 Carlo de Falco
-
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <octave/oct.h>
-#include "low_level_functions.h"
-
-
-DEFUN_DLD(curvederivcpts, args, nargout,"\
-\nCURVEDERIVCPTS: Compute control points of n-th derivatives of a B-spline curve.\n \
-\n \
-\n usage: pk = curvederivcpts (n, p, U, P, d) \
-\n        pk = curvederivcpts (n, p, U, P, d, r1 r2) \
-\n \
-\n If r1, r2 are not given, all the control points are computed. \
-\n \
-\n  INPUT: \
-\n         n+1 = number of control points \
-\n         p   = degree of the spline \
-\n         d   = maximum derivative order (d<=p) \
-\n         U   = knots \
-\n         P   = control points \
-\n         r1  = first control point to compute \
-\n         r2  = auxiliary index for the last control point to compute \
-\n\
-\n  OUTPUT: \
-\n         pk(k,i) = i-th control point (k-1)-th derivative, r1 <= i <= r2-k \
-\n \
-\n Adaptation of algorithm A3.3 from the NURBS book\n")
-
-{
-  
-  octave_value_list retval;
-
-  octave_idx_type n = args(0).idx_type_value ();
-  octave_idx_type p = args(1).idx_type_value ();
-  RowVector U = args(2).row_vector_value (false, true);
-  NDArray P = args(3).array_value ();
-  octave_idx_type d = args(4).idx_type_value ();
-
-  octave_idx_type r1(0), r2(n);
-  if (args.length () == 7)
-    {
-      r1 = args (5).idx_type_value ();
-      r2 = args (6).idx_type_value ();
-    }
-  else  if (args.length () > 5)
-    print_usage ();
-
-  if (! error_state)  
-    {
-      octave_idx_type r = r2 - r1;
-      Matrix pk (d+1 <= r+1 ? d+1 : r+1, r+1, 0.0);
-
-      curvederivcpts (n, p, U, P, d, r1, r2, pk);
-
-      retval(0) = octave_value (pk);
-    }
-  return retval;
-}
-
-/*
-%!test
-%! line = nrbmak([0.0 1.5; 0.0 3.0],[0.0 0.0 1.0 1.0]);
-%! pk   = curvederivcpts (line.number-1, line.order-1, line.knots,
-%!                        line.coefs(1,:), 2);
-%! assert (pk, [0 3/2; 3/2 0], 100*eps);
-*/
--- a/extra/nurbs/src/low_level_functions.cc	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,385 +0,0 @@
-/* Copyright (C) 2009 Carlo de Falco
-   some functions are adapted from the m-file implementation which is
-   Copyright (C) 2000 Mark Spink, 2007 Daniel Claxton
-
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-
-#include <octave/oct.h>
-#include "low_level_functions.h"
-#include <iostream>
-
-octave_idx_type
-findspan (int n, int p, double u, const RowVector& U)
-
-// Find the knot span of the parametric point u. 
-//
-// INPUT:
-//
-//   n - number of control points - 1
-//   p - spline degree       
-//   u - parametric point    
-//   U - knot sequence
-//
-// RETURN:
-//
-//   s - knot span
-//
-// Note: This is NOT
-// Algorithm A2.1 from 'The NURBS BOOK' pg68
-// as that algorithm only works for nonperiodic
-// knot vectors, nonetheless the results should 
-// be EXACTLY the same if U is nonperiodic
-
-/*
-Below is the original implementation from the NURBS Book
-{
-  int low, high, mid;
-  // special case
-  if (u == U(n+1)) return(n);
-
-  // do binary search
-  low = p;
-  high = n + 1;
-  mid = (low + high) / 2;
-  while (u < U(mid) || u >= U(mid+1))
-    {
-
-      if (u < U(mid))
-	high = mid;
-      else
-	low = mid;
-      mid = (low + high) / 2;
-    }  
-
-  return(mid);
-}
-*/
-
-{
-  // FIXME : this implementation has linear, rather than log complexity
-  int ret = 0;
-  
-  if (u > U.xelem (U.numel () - 1) || u < U.xelem (0))
-    error ("Value %g is outside the knot span", u);
-  else
-    while ((ret++ < n) && (U(ret) <= u)) { };
-
-  return (ret-1);
-}
-
-void
-basisfun (int i, double u, int p, const RowVector& U, RowVector& N)
-
-// Basis Function. 
-//
-// INPUT:
-//
-//   i - knot span  ( from FindSpan() )
-//   u - parametric point
-//   p - spline degree
-//   U - knot sequence
-//
-// OUTPUT:
-//
-//   N - Basis functions vector[p+1]
-//
-// Algorithm A2.2 from 'The NURBS BOOK' pg70.
-{
-  int j,r;
-  double saved, temp;
-
-  // work space
-  OCTAVE_LOCAL_BUFFER(double, left,  p+1);
-  OCTAVE_LOCAL_BUFFER(double, right, p+1);
-  
-  N(0) = 1.0;
-  for (j = 1; j <= p; j++)
-    {
-      left[j]  = u - U(i+1-j);
-      right[j] = U(i+j) - u;
-      saved = 0.0;
-      
-      for (r = 0; r < j; r++)
-	{
-	  temp = N(r) / (right[r+1] + left[j-r]);
-	  N(r) = saved + right[r+1] * temp;
-	  saved = left[j-r] * temp;
-	} 
-      
-      N(j) = saved;
-    }
-
-}
-
-
-void basisfunder (int i, int pl, double u, const RowVector& u_knotl, int nders, NDArray& ders)
-{
-  
-//    BASISFUNDER:  B-Spline Basis function derivatives
-//
-//     INPUT:
-//
-//       i   - knot span
-//       pl  - degree of curve
-//       u   - parametric points
-//       k   - knot vector
-//       nd  - number of derivatives to compute
-//
-//     OUTPUT:
-//
-//       ders - ders(n, i, :) (i-1)-th derivative at n-th point
-
-
-  //     ders = zeros(nders+1,pl+1);
-  Matrix ndu(octave_idx_type(pl+1), octave_idx_type(pl+1), 0.0); // ndu = zeros(pl+1,pl+1);
-  RowVector left(octave_idx_type(pl+1), 0.0);                    // left = zeros(pl+1);
-  RowVector right(left);                                         // right = zeros(pl+1);
-  Matrix a(2, octave_idx_type(pl+1), 0.0);                       // a = zeros(2,pl+1);
-  double saved = 0.0, d = 0.0, temp = 1.0;
-  octave_idx_type s1(0), s2(1), rk, pk, j, k, r, j1, j2;
-
-  
-  ndu(0,0) = 1;                                                   // ndu(1,1) = 1;
-  
-  for (j=1; j<=pl; j++)                                           // for j = 1:pl
-    {
-      left(j) = u - u_knotl(i+1-j);                               // left(j+1) = u - u_knotl(i+1-j);
-      right(j) = u_knotl(i+j) - u;                                // right(j+1) = u_knotl(i+j) - u;
-      saved = 0.0;                                                // saved = 0;
-      for (r=0; r<=j-1; r++)                                      // for r = 0:j-1
-	{
-	  ndu(j, r) = right(r+1) + left(j-r);                     // ndu(j+1,r+1) = right(r+2) + left(j-r+1);
-	  temp = ndu(r,j-1)/ndu(j,r);                             // temp = ndu(r+1,j)/ndu(j+1,r+1);
-	  ndu(r,j) = saved + right(r+1)*temp;                     // ndu(r+1,j+1) = saved + right(r+2)*temp;
-	  saved = left(j-r)*temp;                                 // saved = left(j-r+1)*temp;
-	}                                                         // end
-      ndu(j,j) = saved;                                           // ndu(j+1,j+1) = saved;
-    }                                                             // end
-
-  for (j=0; j<=pl; j++)                                           // for j = 0:pl
-    ders(0,j) = ndu(j,pl);                                        // ders(1,j+1) = ndu(j+1,pl+1);
-                                                                  // end
-      
-  for (r=0; r<=pl; r++)                                           // for r = 0:pl
-    {
-      s1 = 0;                                                     // s1 = 0;
-      s2 = 1;                                                     // s2 = 1;
-      a(0,0) = 1;                                                 // a(1,1) = 1;
-        for (k=1; k<=nders; k++)                                  // for k = 1:nders %compute kth derivative
-	  {
-
-	    d = 0.0;                                              // d = 0;
-	    rk = r-k;                                             // rk = r-k;
-	    pk = pl - k;                                          // pk = pl-k;
-	    
-	    if (r >= k)                                           // if (r >= k)
-	      {
-		a(s2, 0) = a(s1, 0)/ndu(pk+1,rk);                 // a(s2+1,1) = a(s1+1,1)/ndu(pk+2,rk+1);
-		d = a(s2, 0)*ndu(rk,pk);                          // d = a(s2+1,1)*ndu(rk+1,pk+1);
-	      }                                                   // end
-	    
-	    if (rk >= -1)                                         // if (rk >= -1)
-	      j1 = 1;                                             // j1 = 1;
-	    else                                                  // else 
-	      j1 = -rk;                                           // j1 = -rk;
-	                                                          // end
-
-	    if ((r-1) <= pk)                                      // if ((r-1) <= pk)
-	      j2 = k-1;                                           // j2 = k-1;
-	    else                                                  // else 
-	     j2 = pl-r;                                           // j2 = pl-r;
-                                                                  // end
-
-	    for (j=j1; j <= j2; j++)                              // for j = j1:j2
-	      {
-		a(s2,j) = (a(s1,j) - a(s1,j-1))/ndu(pk+1,rk+j);   // a(s2+1,j+1) = (a(s1+1,j+1) - a(s1+1,j))/ndu(pk+2,rk+j+1);
-		d += a(s2,j)*ndu(rk+j,pk);                        // d = d + a(s2+1,j+1)*ndu(rk+j+1,pk+1);
-	      }                                                   // end
-
-	    if (r <= pk)                                          // if (r <= pk)
-	      {
-		a(s2,k) = -a(s1,k-1)/ndu(pk+1,r);                 // a(s2+1,k+1) = -a(s1+1,k)/ndu(pk+2,r+1);
-		d += a(s2,k)*ndu(r,pk);                           // d = d + a(s2+1,k+1)*ndu(r+1,pk+1);
-	      }	                                                  // end
-	    
-	    ders(k,r) = d;                                        // ders(k+1,r+1) = d;
-	    j = s1;                                               // j = s1;
-	    s1 = s2;                                              // s1 = s2;
-	    s2 = j;                                               // s2 = j;
-	  }                                                       // end
-    }                                                             // end
-
-  r = pl;                                                         // r = pl;
-  for (k=1; k <= nders; k++)                                      // for k = 1:nders
-    {
-      for (j=0; j<=pl; j++)                                       // for j = 0:pl
-	ders(k,j) = ders(k,j)*r;                                  // ders(k+1,j+1) = ders(k+1,j+1)*r;
-                                                                  // end
-      r = r*(pl-k);                                               // r = r*(pl-k);
-    }                                                             // end
-  
-}
-
-
-int curvederivcpts (octave_idx_type n, octave_idx_type p, 
-		    const RowVector &U, const NDArray &P, 
-		    octave_idx_type  d, octave_idx_type r1, 
-		    octave_idx_type r2, Matrix &pk)
-{
-  octave_idx_type r = r2 - r1;
-  for (octave_idx_type i(0); i<=r; i++)
-    pk(0, i) = P(r1+i);
-
-  for (octave_idx_type k (1); k<=d; k++)
-    {
-      octave_idx_type tmp = p - k + 1;
-      for (octave_idx_type i (0); i<=r-k; i++)
-	{
-	  pk (k, i) = tmp * (pk(k-1,i+1)-pk(k-1,i)) / 
-	    (U(r1+i+p+1)-U(r1+i+k));
-	}
-    }
-  return 0;
-}
-
-
-
-int surfderivcpts (octave_idx_type n, octave_idx_type  p, const RowVector& U, 
-		   octave_idx_type m, octave_idx_type q, const RowVector& V, 
-		   const Matrix& P, octave_idx_type d, octave_idx_type r1, 
-		   octave_idx_type r2, octave_idx_type s1, 
-		   octave_idx_type s2, NDArray &pkl)
-{
-  octave_idx_type r = r2-r1, s = s2-s1;  
-  
-  octave_idx_type du = d <= p ? d : p;   
-  octave_idx_type dv = d <= q ? d : q; 
-  
-  dim_vector idxa (4, 1);
-
-  Array<octave_idx_type> idxta (idxa, 0);
-  Array<idx_vector> idxva (idxa, idx_vector (':'));
-  
-  idxa.resize (4);
-  idxa(0) = (du+1); idxa(1) = (dv+1); 
-  idxa(2) = (r+1);  idxa(3) = (s+1); 
-  
-  pkl.resize (idxa, 0.0); 
-      
-  for (octave_idx_type j(s1); j<=s2; j++)
-    {
-    
-      Matrix temp (du <= n ? (du+1) : (n+1), n+1, 0.0);
-      curvederivcpts (n, p, U, P.extract (0, j, P.rows()-1, P.cols ()-1), du, r1, r2, temp);
-      for (octave_idx_type k(0); k<=du; k++)
-	{
-
-	  for ( octave_idx_type i(0); i<=r-k; i++)
-	    {
-	      assert (k<idxa(0) && i<idxa(2) && j-s1<idxa(3));
-	      idxta (0) = k; idxta (1) = 0;
-	      idxta (2) = i; idxta (3) = j-s1;
-	      pkl(idxta) = temp (k, i);
-	    }
-	}
-    }
-
-  for (octave_idx_type k (0); k<=du; k++)
-    {
-
-      for (octave_idx_type i(0); i<=r-k; i++)
-	{
-
-	  octave_idx_type dd = (d-k) <= dv ? (d-k) : dv;
-	  Matrix temp (dd <= m ? (dd+1) : (m+1), m+1, 0.0);
-	  
-	  idxva (0) = idx_vector(k); idxva (1) = idx_vector(0);
-	  idxva (2) = idx_vector(i); idxva (3) = idx_vector(':');
-	  NDArray temp2 (pkl.index (idxva));
-	  curvederivcpts (m, q, V.extract (s1, V.numel () - 1),
-                          temp2.squeeze (), dd, 0, s, temp);
-	  
-	  for (octave_idx_type l(1); l<=dd; l++)
-	    {
-
-	      for (octave_idx_type j(0); j<=s-l; j++)
-		{
-		  assert (k<idxa(0) && l<idxa(1)
-                          && i<idxa(2) && j<idxa(3));
-		  idxta (0) = k; idxta (1) = l;
-		  idxta (2) = i; idxta (3) = j;
-		  pkl(idxta) = temp (l, j);
-		}
-	    }
-	}
-    }
-  return (0);
-}
-
-
-int surfderiveval (octave_idx_type n, octave_idx_type p, const RowVector &U, 
-		   octave_idx_type m, octave_idx_type q, const RowVector &V, 
-		   const Matrix &P, double u, double v, octave_idx_type d, 
-		   Matrix &skl)
-{
-
-  
-  Array<octave_idx_type> idx(dim_vector (4, 1), 0);
-  octave_idx_type du = d <= p ? d: p;   
-  octave_idx_type dv = d <= q ? d: q;
-  
-  skl.resize (d+1, d+1, 0.0);
-  
-  octave_idx_type uspan = findspan (n, p, u, U);
-  Matrix Nu (p+1, p+1, 0.0);
-  for (octave_idx_type ip(0); ip<=p; ip++)
-    {
-      RowVector temp (ip+1, 0.0);
-      basisfun (uspan, u, ip, U, temp);
-      Nu.insert (temp.transpose (), 0,ip);
-    }
-  
-  octave_idx_type vspan = findspan (m, q, v, V);
-  Matrix Nv (q+1, q+1, 0.0);
-  for (octave_idx_type iq(0); iq<=q; iq++)
-    {
-      RowVector temp (iq+1, 0.0);
-      basisfun (vspan, v, iq, V, temp);
-      Nv.insert (temp.transpose (), 0, iq);
-    }
-  NDArray pkl;
-  surfderivcpts (n, p, U, m, q, V, P, d, uspan-p, uspan, vspan-q, vspan, pkl);
-  
-  for (octave_idx_type k(0); k<=du; k++)
-    {
-      octave_idx_type dd = d-k <= dv ? d-k : dv;
-      for (octave_idx_type l(0);l <= dd; l++)
-	{
-	  skl(k,l) = 0.0;
-	  for (octave_idx_type i(0); i<=q-l; i++)
-	    {
-	      double tmp = 0.0;
-	      for (octave_idx_type j(0); j<=p-k; j++)
-		{
-		  idx(0) = k; idx(1)=l; idx(2)=j; idx(3) =i;
-		  tmp += Nu(j,p-k) * pkl(idx);
-		}
-	      skl(k,l) += Nv(i,q-l) * tmp;
-	    }
-	}
-    }
-  return (0);
-}
--- a/extra/nurbs/src/low_level_functions.h	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/* Copyright (C) 2009 Carlo de Falco
-
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-octave_idx_type findspan(int n, int p, double u, const RowVector& U);
-
-void basisfun(int i, double u, int p, const RowVector& U, RowVector& N);
-
-void basisfunder (int i, int pl, double uu, const RowVector& u_knotl, 
-		  int nders, NDArray& dersv);
-
-int curvederivcpts (octave_idx_type n, octave_idx_type p, 
-		    const RowVector &U, const NDArray &P, 
-		    octave_idx_type  d, octave_idx_type r1, 
-		    octave_idx_type r2, 
-		    Matrix &pk);
-
-int surfderivcpts (octave_idx_type n, octave_idx_type  p, const RowVector& U, 
-		   octave_idx_type m, octave_idx_type q, const RowVector& V, 
-		   const Matrix& P, octave_idx_type d, octave_idx_type r1, 
-		   octave_idx_type r2, octave_idx_type s1, 
-		   octave_idx_type s2, NDArray &pkl);
-
-int surfderiveval (octave_idx_type n, octave_idx_type p, const RowVector &U, 
-		   octave_idx_type m, octave_idx_type q, const RowVector &V, 
-		   const Matrix &P, double u, double v, octave_idx_type d, 
-		   Matrix &skl);
--- a/extra/nurbs/src/nrb_srf_basisfun__.cc	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,129 +0,0 @@
-/* Copyright (C) 2009 Carlo de Falco
-  
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <octave/oct.h>
-#include <octave/oct-map.h>
-#include <octave/parse.h>
-#include "low_level_functions.h"
-
-DEFUN_DLD(nrb_srf_basisfun__, args, nargout,"\
- NRB_SRF_BASISFUN__:  Undocumented private function\
-")
-{
-
-  octave_value_list retval, newargs;
-
-  const NDArray points = args(0).array_value();
-  const octave_scalar_map nrb = args(1).scalar_map_value();
-
-  if (!error_state) 
-    {
-
-      const Cell knots = nrb.contents("knots").cell_value();
-      const NDArray coefs = nrb.contents("coefs").array_value();
-      octave_idx_type m   = static_cast<octave_idx_type> ((nrb.contents("number").vector_value())(0)) - 1; // m    = size (nrb.coefs, 2) -1;
-      octave_idx_type n   = static_cast<octave_idx_type> ((nrb.contents("number").vector_value())(1)) - 1; // n    = size (nrb.coefs, 3) -1;
-      octave_idx_type p   = static_cast<octave_idx_type> ((nrb.contents("order").vector_value())(0)) - 1;  // p    = nrb.order(1) -1;
-      octave_idx_type q   = static_cast<octave_idx_type> ((nrb.contents("order").vector_value())(1)) - 1;  // q    = nrb.order(2) -1;
-
-      Array<idx_vector> idx(dim_vector (2, 1), idx_vector(':')); 
-      idx(0) = 0;
-      const NDArray u(points.index (idx).squeeze ()); // u = points(1,:);
-
-      idx(0) = 1;
-      const NDArray v(points.index (idx).squeeze ()); // v = points(2,:);      
-
-      octave_idx_type npt = u.numel (); // npt = length(u);
-      RowVector M(p+1, 0.0), N (q+1, 0.0);
-      Matrix RIkJk(npt, (p+1)*(q+1), 0.0);
-      Matrix indIkJk(npt, (p+1)*(q+1), 0.0);
-      RowVector denom(npt, 0.0);
-
-      const RowVector U(knots(0).row_vector_value ()); // U = nrb.knots{1};
-
-      const RowVector V(knots(1).row_vector_value ()); // V = nrb.knots{2};
-      
-      Array<idx_vector> idx2(dim_vector (3, 1), idx_vector(':')); idx2(0) = 3;
-      NDArray w (coefs.index (idx2).squeeze ()); // w = squeeze(nrb.coefs(4,:,:));
-      
-      RowVector spu(u);
-      for (octave_idx_type ii(0); ii < npt; ii++)
-	{
-	  spu(ii) = findspan(m, p, u(ii), U);
-	} // spu  =  findspan (m, p, u, U); 
-
-      newargs(3) = U; newargs(2) = p; newargs(1) = u; newargs(0) = spu;
-      Matrix Ik = feval (std::string("numbasisfun"), newargs, 1)(0).matrix_value (); // Ik = numbasisfun (spu, u, p, U);
-
-      RowVector spv(v);
-      for (octave_idx_type ii(0); ii < v.numel (); ii++)
-	{
-	  spv(ii) = findspan(n, q, v(ii), V);
-	} // spv  =  findspan (n, q, v, V);
-
-      newargs(3) = V; newargs(2) = q; newargs(1) = v; newargs(0) = spv;
-      Matrix Jk = feval (std::string("numbasisfun"), newargs, 1)(0).matrix_value (); // Jk = numbasisfun (spv, v, q, V);
-
-      Matrix NuIkuk(npt, p+1, 0.0);
-      for (octave_idx_type ii(0); ii < npt; ii++)
-	{
-	  basisfun (int(spu(ii)), u(ii), p, U, M);
-	  NuIkuk.insert (M, ii, 0);
-	} // NuIkuk = basisfun (spu, u, p, U);
-
-      Matrix NvJkvk(v.numel (), q+1, 0.0);
-      for (octave_idx_type ii(0); ii < npt; ii++)
-	{
-	  basisfun(int(spv(ii)), v(ii), q, V, N);
-	  NvJkvk.insert (N, ii, 0);
-	} // NvJkvk = basisfun (spv, v, q, V);
-
-
-      for (octave_idx_type k(0); k < npt; k++) 
-	for (octave_idx_type ii(0); ii < p+1; ii++) 
-	  for (octave_idx_type jj(0); jj < q+1; jj++) 
-	    denom(k) += NuIkuk(k, ii) * NvJkvk(k, jj) * 
-              w(static_cast<octave_idx_type> (Ik(k, ii)), 
-                static_cast<octave_idx_type> (Jk(k, jj)));
-
-      
-      for (octave_idx_type k(0); k < npt; k++) 
-	for (octave_idx_type ii(0); ii < p+1; ii++) 
-	  for (octave_idx_type jj(0); jj < q+1; jj++) 
-	    {
-
-	      RIkJk(k, octave_idx_type(ii+(p+1)*jj))  = NuIkuk(k, ii) * NvJkvk(k, jj) * 
-                w(static_cast<octave_idx_type> (Ik(k, ii)), static_cast<octave_idx_type> (Jk(k, jj)))
-                / denom(k); 
-
-	      indIkJk(k, octave_idx_type(ii+(p+1)*jj))= Ik(k, ii) + (m+1) * Jk(k, jj) + 1;
-	    }
-
-      // for k=1:npt
-      //       [Jkb, Ika] = meshgrid(Jk(k, :), Ik(k, :)); 
-      //       indIkJk(k, :)    = sub2ind([m+1, n+1], Ika(:)+1, Jkb(:)+1);
-      //       wIkaJkb(1:p+1, 1:q+1) = reshape (w(indIkJk(k, :)), p+1, q+1); 
-      
-      //       NuIkukaNvJkvk(1:p+1, 1:q+1) = (NuIkuk(k, :).' * NvJkvk(k, :));
-      //       RIkJk(k, :) = (NuIkukaNvJkvk .* wIkaJkb ./ sum(sum(NuIkukaNvJkvk .* wIkaJkb)))(:).';
-      //     end
-      
-      retval(0) = RIkJk; // B = RIkJk;
-      retval(1) = indIkJk; // N = indIkJk;
-
-    }
-  return retval;
-}
--- a/extra/nurbs/src/nrb_srf_basisfun_der__.cc	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,164 +0,0 @@
-/* Copyright (C) 2009 Carlo de Falco
-  
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <octave/oct.h>
-#include <octave/oct-map.h>
-#include <octave/parse.h>
-#include "low_level_functions.h"
-
-DEFUN_DLD(nrb_srf_basisfun_der__, args, nargout,"\
- NRB_SRF_BASISFUN_DER__:  Undocumented private function	\
-")
-{
-  //function [Bu, Bv, N] = nrb_srf_basisfun_der__ (points, nrb);
-
-  octave_value_list retval, newargs;
-
-  const NDArray points = args(0).array_value();
-  const octave_scalar_map nrb = args(1).scalar_map_value();
-
-  if (!error_state) 
-    {
-      const Cell knots = nrb.contents("knots").cell_value();
-      const NDArray coefs = nrb.contents("coefs").array_value();
-      octave_idx_type m   = static_cast<octave_idx_type> ((nrb.contents("number").vector_value())(0)) - 1; // m    = size (nrb.coefs, 2) -1;
-      octave_idx_type n   = static_cast<octave_idx_type> ((nrb.contents("number").vector_value())(1)) - 1; // n    = size (nrb.coefs, 3) -1;
-      octave_idx_type p   = static_cast<octave_idx_type> ((nrb.contents("order").vector_value())(0)) - 1;  // p    = nrb.order(1) -1;
-      octave_idx_type q   = static_cast<octave_idx_type> ((nrb.contents("order").vector_value())(1)) - 1;  // q    = nrb.order(2) -1;
-
-      Array<idx_vector> idx(dim_vector (2, 1), idx_vector(':')); 
-      idx(0) = 0;
-      const NDArray u(points.index (idx).squeeze ()); // u = points(1,:);
-      
-      idx(0) = 1;
-      const NDArray v(points.index (idx).squeeze ()); // v = points(2,:);      
-      
-      octave_idx_type npt = u.numel (); // npt = length(u);
-
-      RowVector M(p+1, 0.0), N (q+1, 0.0);
-      Matrix Nout(npt, (p+1)*(q+1), 0.0);
-      Matrix Bu(npt, (p+1)*(q+1), 0.0);
-      Matrix Bv(npt, (p+1)*(q+1), 0.0);
-      RowVector Denom(npt, 0.0);
-      RowVector Denom_du(npt, 0.0);
-      RowVector Denom_dv(npt, 0.0);
-      Matrix Num(npt, (p+1)*(q+1), 0.0);
-      Matrix Num_du(npt, (p+1)*(q+1), 0.0);
-      Matrix Num_dv(npt, (p+1)*(q+1), 0.0);
-
-      const RowVector U(knots(0).row_vector_value ()); // U = nrb.knots{1};
-
-      const RowVector V(knots(1).row_vector_value ()); // V = nrb.knots{2};
-      
-      Array<idx_vector> idx2(dim_vector (3, 1), idx_vector(':')); idx2(0) = 3;
-      NDArray w (coefs.index (idx2).squeeze ()); // w = squeeze(nrb.coefs(4,:,:));
-      
-      RowVector spu(u);
-      for (octave_idx_type ii(0); ii < npt; ii++)
-	{
-	  spu(ii) = findspan(m, p, u(ii), U);
-	} // spu  =  findspan (m, p, u, U); 
-
-      newargs(3) = U; newargs(2) = p; newargs(1) = u; newargs(0) = spu;
-      Matrix Ik = feval (std::string("numbasisfun"), newargs, 1)(0).matrix_value (); // Ik = numbasisfun (spu, u, p, U);
-
-      RowVector spv(v);
-      for (octave_idx_type ii(0); ii < v.numel (); ii++)
-	{
-	  spv(ii) = findspan(n, q, v(ii), V);
-	} // spv  =  findspan (n, q, v, V);
-
-      newargs(3) = V; newargs(2) = q; newargs(1) = v; newargs(0) = spv;
-      Matrix Jk = feval (std::string("numbasisfun"), newargs, 1)(0).matrix_value (); // Jk = numbasisfun (spv, v, q, V);
-
-      Matrix NuIkuk(npt, p+1, 0.0);
-      for (octave_idx_type ii(0); ii < npt; ii++)
-	{
-	  basisfun (int(spu(ii)), u(ii), p, U, M);
-	  NuIkuk.insert (M, ii, 0);
-	} // NuIkuk = basisfun (spu, u, p, U);
-
-      Matrix NvJkvk(v.numel (), q+1, 0.0);
-      for (octave_idx_type ii(0); ii < npt; ii++)
-	{
-	  basisfun(int(spv(ii)), v(ii), q, V, N);
-	  NvJkvk.insert (N, ii, 0);
-	} // NvJkvk = basisfun (spv, v, q, V);
-
-     
-      newargs(4) = 1; newargs(3) = U; newargs(2) = u; newargs(1) = p; newargs(0) = spu;
-      NDArray NuIkukprime = feval (std::string("basisfunder"), newargs, 1)(0).array_value (); //   NuIkukprime = basisfunder (spu, p, u, U, 1);
-                                                                                              //   NuIkukprime = squeeze(NuJkukprime(:,2,:));
-      
-      newargs(4) = 1; newargs(3) = V; newargs(2) = v; newargs(1) = q; newargs(0) = spv;
-      NDArray NvJkvkprime = feval (std::string("basisfunder"), newargs, 1)(0).array_value (); //   NvJkvkprime = basisfunder (spv, q, v, V, 1);
-                                                                                              //   NvJkvkprime = squeeze(NvJkvkprime(:,2,:));
-      
-      for (octave_idx_type k(0); k < npt; k++) 
-	for (octave_idx_type ii(0); ii < p+1; ii++) 
-	  for (octave_idx_type jj(0); jj < q+1; jj++) 
-	    {
-	      Num(k, ii+jj*(p+1)) = NuIkuk(k, ii) * NvJkvk(k, jj) * 
-                w(static_cast<octave_idx_type> (Ik(k, ii)), 
-                  static_cast<octave_idx_type> (Jk(k, jj)));
-	      Denom(k) += Num(k, ii+jj*(p+1));
-
-	      Num_du(k, ii+jj*(p+1)) = NuIkukprime(k, 1, ii) * NvJkvk(k, jj) * 
-                w(static_cast<octave_idx_type> (Ik(k, ii)), 
-                  static_cast<octave_idx_type> (Jk(k, jj)));
-	      Denom_du(k) += Num_du(k, ii+jj*(p+1));
-
-	      Num_dv(k, ii+jj*(p+1)) = NuIkuk(k, ii) * NvJkvkprime(k, 1, jj) * 
-                w(static_cast<octave_idx_type> (Ik(k, ii)), 
-                  static_cast<octave_idx_type> (Jk(k, jj)));
-
-	      Denom_dv(k) += Num_dv(k, ii + jj * (p+1));
-	    }
-
-      for (octave_idx_type k(0); k < npt; k++) 
-	for (octave_idx_type ii(0); ii < p+1; ii++) 
-	  for (octave_idx_type jj(0); jj < q+1; jj++) 
-	    {
-	      Bu(k, octave_idx_type(ii+(p+1)*jj))  = (Num_du(k, ii+jj*(p+1))/Denom(k) - Denom_du(k)*Num(k, ii+jj*(p+1))/(Denom(k)*Denom(k))); 
-	      Bv(k, octave_idx_type(ii+(p+1)*jj))  = (Num_dv(k, ii+jj*(p+1))/Denom(k) - Denom_dv(k)*Num(k, ii+jj*(p+1))/(Denom(k)*Denom(k))); 
-	      Nout(k, octave_idx_type(ii+(p+1)*jj))= Ik(k, ii)+(m+1)*Jk(k, jj)+1;
-	    }
-
-      //   for k=1:npt
-      //     [Ika, Jkb] = meshgrid(Ik(k, :), Jk(k, :)); 
-      
-      //     N(k, :)    = sub2ind([m+1, n+1], Ika(:)+1, Jkb(:)+1);
-      //     wIkaJkb(1:p+1, 1:q+1) = reshape (w(N(k, :)), p+1, q+1); 
-      
-      //     Num    = (NuIkuk(k, :).' * NvJkvk(k, :)) .* wIkaJkb;
-      //     Num_du = (NuIkukprime(k, :).' * NvJkvk(k, :)) .* wIkaJkb;
-      //     Num_dv = (NuIkuk(k, :).' * NvJkvkprime(k, :)) .* wIkaJkb;
-      //     Denom  = sum(sum(Num));
-      //     Denom_du = sum(sum(Num_du));
-      //     Denom_dv = sum(sum(Num_dv));
-      
-      //     Bu(k, :) = (Num_du/Denom - Denom_du.*Num/Denom.^2)(:).';
-      //     Bv(k, :) = (Num_dv/Denom - Denom_dv.*Num/Denom.^2)(:).';
-      //   end
-      
-
-      retval(2) = Nout;
-      retval(1) = Bv;
-      retval(0) = Bu;
-
-    }
-  return retval;
-}
--- a/extra/nurbs/src/nrbsurfderiveval.cc	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,442 +0,0 @@
-/* Copyright (C) 2009 Carlo de Falco
-
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <iostream>
-#include <octave/oct.h>
-#include <octave/oct-map.h>
-#include "low_level_functions.h"
-
-static double gammaln(double xx)
-// Compute logarithm of the gamma function
-// Algorithm from 'Numerical Recipes in C, 2nd Edition' pg214.
-{
-  double x,y,tmp,ser;
-  static double cof[6] = {76.18009172947146,-86.50532032291677,
-			  24.01409824083091,-1.231739572450155,
-			  0.12086650973866179e-2, -0.5395239384953e-5};
-  int j;
-  y = x = xx;
-  tmp = x + 5.5;
-  tmp -= (x+0.5) * log(tmp);
-  ser = 1.000000000190015;
-  for (j=0; j<=5; j++) ser += cof[j]/++y;
-  return -tmp+log(2.5066282746310005*ser/x);
-}
-
-
-static double factln(int n)
-// computes ln(n!)
-// Numerical Recipes in C
-// Algorithm from 'Numerical Recipes in C, 2nd Edition' pg215.
-{
-  static int ntop = 0;
-  static double a[101];
-  
-  if (n <= 1) return 0.0;
-  while (n > ntop)
-    {
-      ++ntop;
-      a[ntop] = gammaln(ntop+1.0);
-    }
-  return a[n];
-}
-
-static double bincoeff(int n, int k)
-// Computes the binomial coefficient.
-//
-//     ( n )      n!
-//     (   ) = --------
-//     ( k )   k!(n-k)!
-//
-// Algorithm from 'Numerical Recipes in C, 2nd Edition' pg215.
-{
-  return floor(0.5+exp(factln(n)-factln(k)-factln(n-k)));
-}  
-   
-
-DEFUN_DLD(nrbsurfderiveval, args, nargout,"\
-\nNRBSURFDERIVEVAL: Evaluate n-th order derivatives of a NURBS surface.\n\
-\n\
-\n usage: skl = nrbsurfderiveval (srf, [u; v], d) \
-\n\
-\n   INPUT  :\
-\n\
-\n    srf   : NURBS surface structure, see nrbmak\
-\n\
-\n    u, v  : parametric coordinates of the point where we compute the\
-\n      derivatives\
-\n\
-\n    d     : number of partial derivatives to compute\
-\n\
-\n   OUTPUT :\
-\n\
-\n    skl (i, j, k, l) = i-th component derived j-1,k-1 times at the\
-\n      l-th point.\
-\n\
-\n Adaptation of algorithm A4.4 from the NURBS book\n")
-{
-  //function skl = nrbsurfderiveval (srf, uv, d) 
-  octave_value_list retval;
-
-  octave_scalar_map srf = args(0).scalar_map_value();
-  Matrix            uv = args(1).matrix_value ();
-  octave_idx_type   d = args(2).idx_type_value ();
-
-  if (! error_state)
-    {
-      Array<octave_idx_type> idxta (dim_vector (4, 1), 0);
-      dim_vector idxa; idxa.resize (4);
-      idxa(0) = 3; idxa(1) = d+1; 
-      idxa(2) = d+1; idxa(3) = uv.columns (); 
-      NDArray skl (idxa, 0.0);
-      
-      octave_idx_type n = octave_idx_type 
-	((srf.contents("number").row_vector_value())(0) - 1);
-      octave_idx_type m = octave_idx_type 
-	((srf.contents("number").row_vector_value())(1) - 1);
-      octave_idx_type p = octave_idx_type 
-	((srf.contents("order").row_vector_value())(0) - 1);
-      octave_idx_type q = octave_idx_type 
-	((srf.contents("order").row_vector_value())(1) - 1);
-      
-      Cell knots = srf.contents("knots").cell_value();
-      RowVector knotsu = knots.elem (0).row_vector_value ();
-      RowVector knotsv = knots.elem (1).row_vector_value ();
-      
-      NDArray coefs  = srf.contents("coefs").array_value();
-      
-      Array<idx_vector> idx(dim_vector (3, 1), idx_vector(':'));	 
-      idx (0) = idx_vector (3);
-      Matrix weights (NDArray (coefs.index (idx).squeeze ()));
-
-      for (octave_idx_type iu(0); iu<uv.cols (); iu++)
-	{
-	  
-	  Matrix wders;
-	  surfderiveval (n, p, knotsu, m, q, knotsv, weights, uv(0,iu), uv(1,iu), d, wders);      
-	  
-	  for (octave_idx_type idim (0); idim<=2; idim++)
-	    {
-
-	      Matrix Aders; idx(0) = idx_vector (idim);
-	      Matrix P (NDArray (coefs.index (idx).squeeze ()));
-	      surfderiveval (n, p, knotsu, m, q, knotsv, P, uv(0,iu), uv(1,iu), d, Aders);;      
-	      
-	      for (octave_idx_type k(0); k<=d; k++)
-		{
-		  for (octave_idx_type l(0); l<=d-k; l++)
-		    {
-		      assert (k < Aders.rows () && l < Aders.cols ());
-		      double v = Aders(k, l);
-		      for (octave_idx_type j(1); j<=l; j++)
-			{
-			  assert (idim<idxa(0) && k<idxa(1) && l<idxa(2) && iu<idxa(3));
-			  idxta(0) = idim; idxta(1) = k; idxta(2) = l-j; idxta(3) = iu;
-			  assert (j < wders.cols ());
-			  v -= bincoeff(l,j) * wders(0,j) * skl(idxta);
-			}
-		      for (octave_idx_type i(1); i<=k; i++)
-			{
-			  assert (idim<idxa(0) && k-i<idxa(1) && l<idxa(2) && iu<idxa(3));
-			  idxta(0) = idim; idxta(1) = k-i; idxta(2) = l; idxta(3) = iu;
-			  assert (i < wders.cols ());
-			  v -= bincoeff(k,i) * wders(i,0) * skl(idxta);
-			  double v2 = 0.0;
-			  for (octave_idx_type j(1);j<=l;j++)
-			    {
-			      idxta(0) = idim; idxta(1) = k-i; idxta(2) = l-j; idxta(3) = iu;
-			      v2 += bincoeff(l,j) * wders(i,j) * skl(idxta);
-			    }
-			  v -= bincoeff(k,i) * v2;
-			}
-		      assert (idim<idxa(0) && k<idxa(1) && l<idxa(2) && iu<idxa(3));
-		      idxta(0) = idim; idxta(1) = k; idxta(2) = l; idxta(3) = iu;
-		      skl(idxta) = v/wders(0,0);
-		    }
-		}
-	    }
-	  
-	} 
-      retval(0) = octave_value (skl);
-    }
-  return retval;
-}
-/*
-%!test
-%! k = [0 0  1 1];
-%! c = [0 1];
-%! [coef(2,:,:), coef(1,:,:)] = meshgrid (c, c);
-%! coef(3,:,:) = coef(1,:,:);
-%! srf = nrbmak (coef, {k, k});
-%! [u, v] = meshgrid (linspace(0,1,11));
-%! uv = [u(:)';v(:)'];
-%! skl = nrbsurfderiveval (srf, uv, 0);
-%! assert (squeeze (skl (1:2,1,1,:)), nrbeval (srf, uv)(1:2,:), 1e3*eps)
-
-
-%!test
-%! k = [0 0  1 1];
-%! c = [0 1];
-%! [coef(2,:,:), coef(1,:,:)] = meshgrid (c, c);
-%! coef(3,:,:) = coef(1,:,:);
-%! srf = nrbmak (coef, {k, k});
-%! srf = nrbkntins (srf, {[], rand(2,1)});
-%! [u, v] = meshgrid (linspace(0,1,11));
-%! uv = [u(:)';v(:)'];
-%! skl = nrbsurfderiveval (srf, uv, 0);
-%! assert (squeeze (skl (1:2,1,1,:)), nrbeval (srf, uv)(1:2,:), 1e3*eps)
-
-%!shared srf, uv
-%!test 
-%! k = [0 0 0 1 1 1];
-%! c = [0 1/2 1];
-%! [coef(1,:,:), coef(2,:,:)] = meshgrid (c, c);
-%! coef(3,:,:) = coef(1,:,:);
-%! srf = nrbmak (coef, {k, k});
-%! ders= nrbderiv (srf);
-%! [u, v] = meshgrid (linspace(0,1,11));
-%! uv = [u(:)';v(:)'];
-%! skl = nrbsurfderiveval (srf, uv, 1);
-%! [fun, der] = nrbdeval (srf, ders, uv);
-%! assert (squeeze (skl (1:2,1,1,:)), fun(1:2,:), 1e3*eps)
-%! assert (squeeze (skl (1:2,2,1,:)), der{1}(1:2,:), 1e3*eps)
-%! assert (squeeze (skl (1:2,1,2,:)), der{2}(1:2,:), 1e3*eps)
-%!
-%!test 
-%! srf = nrbdegelev (srf, [3, 1]);
-%! ders= nrbderiv (srf);
-%! [fun, der] = nrbdeval (srf, ders, uv);
-%! skl = nrbsurfderiveval (srf, uv, 1);
-%! assert (squeeze (skl (1:2,1,1,:)), fun(1:2,:), 1e3*eps)
-%! assert (squeeze (skl (1:2,2,1,:)), der{1}(1:2,:), 1e3*eps)
-%! assert (squeeze (skl (1:2,1,2,:)), der{2}(1:2,:), 1e3*eps)
-
-%!shared uv
-%!test 
-%! k = [0 0 0 1 1 1];
-%! c = [0 1/2 1];
-%! [coef(2,:,:), coef(1,:,:)] = meshgrid (c, c);
-%! coef(3,:,:) = coef(1,:,:);
-%! srf = nrbmak (coef, {k, k});
-%! ders= nrbderiv (srf);
-%! [u, v] = meshgrid (linspace(0,1,11));
-%! uv = [u(:)';v(:)'];
-%! skl = nrbsurfderiveval (srf, uv, 1);
-%! [fun, der] = nrbdeval (srf, ders, uv);
-%! assert (squeeze (skl (1:2,1,1,:)), fun(1:2,:), 1e3*eps)
-%! assert (squeeze (skl (1:2,2,1,:)), der{1}(1:2,:), 1e3*eps)
-%! assert (squeeze (skl (1:2,1,2,:)), der{2}(1:2,:), 1e3*eps)
-%!
-%!test 
-%! p = q = 3;
-%! mcp = 5; ncp = 5;
-%! Lx  = Ly  = 10*rand(1);
-%! srf = nrbdegelev (nrb4surf ([0 0], [Lx, 0], [0 Ly], [Lx Ly]), [p-1, q-1]);
-%! %%srf = nrbkntins (srf, {linspace(0,1,mcp-p+2)(2:end-1), linspace(0,1,ncp-q+2)(2:end-1)});
-%! %%srf.coefs = permute (srf.coefs, [1 3 2]);
-%! ders= nrbderiv (srf);
-%! [fun, der] = nrbdeval (srf, ders, uv);
-%! skl = nrbsurfderiveval (srf, uv, 1);
-%! assert (squeeze (skl (1:2,1,1,:)), fun(1:2,:), 1e3*eps)
-%! assert (squeeze (skl (1:2,2,1,:)), der{1}(1:2,:), 1e3*eps)
-%! assert (squeeze (skl (1:2,1,2,:)), der{2}(1:2,:), 1e3*eps)
-
-%!shared srf, uv, P, dPdx, d2Pdx2, c1, c2
-%!test
-%! [u, v] = meshgrid (linspace(0,1,10));
-%! uv = [u(:)';v(:)'];
-%! c1 = nrbmak([0 1/2 1; 0 1 0],[0 0 0 1 1 1]);
-%! c1 = nrbtform (c1, vecrotx (pi/2));
-%! c2  = nrbtform(c1, vectrans([0 1 0]));
-%! srf = nrbdegelev (nrbruled (c1, c2), [3, 1]);
-%! skl = nrbsurfderiveval (srf, uv, 2);
-%! P = squeeze(skl(:,1,1,:));
-%! dPdx = squeeze(skl(:,2,1,:));
-%! d2Pdx2 = squeeze(skl(:,3,1,:));
-%!assert(P(3,:), 2*(P(1,:)-P(1,:).^2),100*eps)
-%!assert(dPdx(3,:), 2-4*P(1,:), 100*eps)
-%!assert(d2Pdx2(3,:), -4+0*P(1,:), 100*eps)
-%! srf = nrbdegelev (nrbruled (c1, c2), [5, 6]);
-%! skl = nrbsurfderiveval (srf, uv, 2);
-%! P = squeeze(skl(:,1,1,:));
-%! dPdx = squeeze(skl(:,2,1,:));
-%! d2Pdx2 = squeeze(skl(:,3,1,:));
-%! assert (squeeze (skl (1:2,1,1,:)), nrbeval (srf, uv)(1:2,:), 1e3*eps)
-%!assert(P(3,:), 2*(P(1,:)-P(1,:).^2),100*eps)
-%!assert(dPdx(3,:), 2-4*P(1,:), 100*eps)
-%!assert(d2Pdx2(3,:), -4+0*P(1,:), 100*eps)
-%!
-%!test
-%! skl = nrbsurfderiveval (srf, uv, 0);
-%! assert (squeeze (skl (1:2,1,1,:)), nrbeval (srf, uv)(1:2,:), 1e3*eps)
-
-%!shared dPdu, d2Pdu2, P, srf, uv
-%!test
-%! [u, v] = meshgrid (linspace(0,1,10));
-%! uv = [u(:)';v(:)'];
-%! c1 = nrbmak([0 1/2 1; 0.1 1.6 1.1; 0 0 0],[0 0 0 1 1 1]);
-%! c2 = nrbmak([0 1/2 1; 0.1 1.6 1.1; 1 1 1],[0 0 0 1 1 1]);
-%! srf = nrbdegelev (nrbruled (c1, c2), [0, 1]);
-%! skl = nrbsurfderiveval (srf, uv, 2);
-%! P = squeeze(skl(:,1,1,:));
-%! dPdu = squeeze(skl(:,2,1,:));
-%! dPdv = squeeze(skl(:,1,2,:));
-%! d2Pdu2 = squeeze(skl(:,3,1,:));
-%! assert (squeeze (skl (1:2,1,1,:)), nrbeval (srf, uv)(1:2,:), 1e3*eps)
-%!assert(dPdu(2,:), 3-4*P(1,:),100*eps)
-%!assert(d2Pdu2(2,:), -4+0*P(1,:),100*eps)
-%!
-%!test
-%! skl = nrbsurfderiveval (srf, uv, 0);
-%! assert (squeeze (skl (1:2,1,1,:)), nrbeval (srf, uv)(1:2,:), 1e3*eps)
-
-%!test
-%! srf = nrb4surf([0 0], [1 0], [0 1], [1 1]);
-%! geo = nrbdegelev (srf, [3 3]);
-%! geo.coefs (4, 2:end-1, 2:end-1) += .1 * rand (1, geo.number(1)-2, geo.number(2)-2);
-%! geo = nrbkntins (geo, {[.1:.1:.9], [.2:.2:.8]});
-%! [u, v] = meshgrid (linspace(0,1,10));
-%! uv = [u(:)';v(:)'];
-%! skl = nrbsurfderiveval (geo, uv, 2);
-%! dgeo = nrbderiv (geo);
-%! [pnts, ders] = nrbdeval (geo, dgeo, uv);
-%! assert (ders{1}, squeeze(skl(:,2,1,:)), 1e-9)
-%! assert (ders{2}, squeeze(skl(:,1,2,:)), 1e-9)
-
-%!test
-%! ku = kv = [0 0 0 1 1 1];
-%! c(1,:,:) = [1 1 1]'*[0 0 1] - 1;
-%! c(2,:,:) = (1+[1 1 1]'*[0 1/2 1]) .* ([0 1/2 1]'*[1 1 1]);
-%! c(3,:,:) = ([1 1 1]'*[0 1/2 1]) .* ([0 1/2 1]'*[1 1 1]) ;
-%! c(4,:,:) = (1+[1 1 1]'*[0 1/2 1]);
-%! c = permute (c, [1 3 2]);
-%! geo = nrbmak (c, {ku, kv});
-%!
-%! [u, v] = meshgrid (linspace(0,1,50));
-%! uv = [u(:), v(:)]';
-%! dF = nrbsurfderiveval (geo, uv, 2);
-%!
-%! assert (dF(1,1,1,:)(:), u(:)-1, 10*eps)
-%! assert (dF(2,1,1,:)(:), v(:), 10*eps)
-%! assert (dF(3,1,1,:)(:), u(:).*v(:)./(u(:)+1), 10*eps)
-%! assert (dF(1,2,1,:)(:), ones (size (u(:))), 10*eps)
-%! assert (dF(1,1,2,:)(:), zeros (size (u(:))), 10*eps)
-%! assert (dF(2,2,1,:)(:), zeros (size (u(:))), 10*eps)
-%! assert (dF(2,1,2,:)(:), ones (size (u(:))), 10*eps)
-%! assert (dF(3,1,2,:)(:), u(:)./(u(:)+1), 10*eps)
-%! assert (dF(3,2,1,:)(:), v(:)./(u(:)+1) - u(:).*v(:)./(u(:)+1).^2, 10*eps)
-%! assert (dF(1:2,3,:,:)(:), zeros (size (dF(1:2,3,:,:)(:))), 10*eps)
-%! assert (dF(1:2,:,3,:)(:), zeros (size (dF(1:2,:,3,:)(:))), 10*eps)
-%! assert (dF(3,3,1,:)(:),  -2*v(:)./(u(:)+1).^3, 10*eps)
-%! assert (dF(3,1,3,:)(:), zeros (size (dF(3,1,3,:)(:))), 10*eps)
-
-%!test
-%! ku = kv = [0 0 0 1 1 1];
-%! c(1,:,:) = [1 1 1]'*[0 0 1] - 1;
-%! c(2,:,:) = ([1 1 1]'*[0 1/2 1]) .* ([0 1/2 1]'*[1 1 1]) ;
-%! c(4,:,:) = (1+[1 1 1]'*[0 1/2 1]);
-%! c = permute (c, [1 3 2]);
-%! geo = nrbmak (c, {ku, kv});
-%!
-%! [u, v] = meshgrid (linspace(0,1,50));
-%! uv = [u(:), v(:)]';
-%! dF = nrbsurfderiveval (geo, uv, 2);
-%!
-%! assert (dF(1,1,1,:)(:), u(:)-1, 10*eps)
-%! assert (dF(3,1,1,:)(:), zeros (size (u(:))), 10*eps)
-%! assert (dF(2,1,1,:)(:), u(:).*v(:)./(u(:)+1), 10*eps)
-%! assert (dF(1,2,1,:)(:), ones (size (u(:))), 10*eps)
-%! assert (dF(1,1,2,:)(:), zeros (size (u(:))), 10*eps)
-%! assert (dF(3,2,1,:)(:), zeros (size (u(:))), 10*eps)
-%! assert (dF(3,1,2,:)(:), zeros (size (u(:))), 10*eps)
-%! assert (dF(2,1,2,:)(:), u(:)./(u(:)+1), 10*eps)
-%! assert (dF(2,2,1,:)(:), v(:)./(u(:)+1) - u(:).*v(:)./(u(:)+1).^2, 10*eps)
-%! assert (dF([1 3],3,:,:)(:), zeros (size (dF([1 3],3,:,:)(:))), 10*eps)
-%! assert (dF([1 3],:,3,:)(:), zeros (size (dF([1 3],:,3,:)(:))), 10*eps)
-%! assert (dF(2,3,1,:)(:),  -2*v(:)./(u(:)+1).^3, 10*eps)
-%! assert (dF(2,1,3,:)(:), zeros (size (dF(3,1,3,:)(:))), 10*eps)
-
-%!test
-%! crv = nrbline ([1 0], [2 0]);
-%! srf = nrbrevolve (crv, [0 0 0], [0 0 1], pi/2);
-%! srf = nrbtransp (srf);
-%! [v, u] = meshgrid (linspace (0, 1, 11));
-%! uv = [u(:)'; v(:)'];
-%! skl = nrbsurfderiveval (srf, uv, 2);
-%! c = sqrt(2);
-%! w      = @(x, y) (2 - c)*y.^2 + (c-2)*y + 1;
-%! dwdy   = @(x, y) 2*(2-c)*y + c - 2;
-%! d2wdy2 = @(x, y) 2*(2-c);
-%! F1 = @(x, y) (x+1) .* ((1-y).^2 + c*y.*(1-y)) ./ w(x,y);
-%! F2 = @(x, y) (x+1) .* (y.^2 + c*y.*(1-y)) ./ w(x,y);
-%! dF1dx = @(x, y) ((1-y).^2 + c*y.*(1-y)) ./ w(x,y);
-%! dF2dx = @(x, y) (y.^2 + c*y.*(1-y)) ./ w(x,y);
-%! dF1dy = @(x, y) (x+1) .* ((2 - 2*c)*y + c - 2) ./ w(x,y) - (x+1) .* ((1-y).^2 + c*y.*(1-y)) .* dwdy(x,y) ./ w(x,y).^2;
-%! dF2dy = @(x, y) (x+1) .* ((2 - 2*c)*y + c) ./ w(x,y) - (x+1) .* (y.^2 + c*y.*(1-y)) .* dwdy(x,y) ./ w(x,y).^2;
-%! d2F1dx2 = @(x, y) zeros (size (x));
-%! d2F2dx2 = @(x, y) zeros (size (x));
-%! d2F1dxdy = @(x, y) ((2 - 2*c)*y + c - 2) ./ w(x,y) - ((1-y).^2 + c*y.*(1-y)) .* dwdy(x,y) ./ w(x,y).^2;
-%! d2F2dxdy = @(x, y) ((2 - 2*c)*y + c) ./ w(x,y) - (y.^2 + c*y.*(1-y)) .* dwdy(x,y) ./ w(x,y).^2;
-%! d2F1dy2  = @(x, y) (x+1)*(2 - 2*c) ./ w(x,y) - 2*(x+1) .* ((2 - 2*c)*y + c - 2) .* dwdy(x,y) ./ w(x,y).^2 - ...
-%!                    (x+1) .* ((1-y).^2 + c*y.*(1-y)) * d2wdy2(x,y) ./ w(x,y).^2 + ...
-%!                    2 * (x+1) .* ((1-y).^2 + c*y.*(1-y)) .* w(x,y) .*dwdy(x,y).^2 ./ w(x,y).^4;
-%! d2F2dy2  = @(x, y) (x+1)*(2 - 2*c) ./ w(x,y) - 2*(x+1) .* ((2 - 2*c)*y + c) .* dwdy(x,y) ./ w(x,y).^2 - ...
-%!                    (x+1) .* (y.^2 + c*y.*(1-y)) * d2wdy2(x,y) ./ w(x,y).^2 + ...
-%!                    2 * (x+1) .* (y.^2 + c*y.*(1-y)) .* w(x,y) .*dwdy(x,y).^2 ./ w(x,y).^4;
-%! assert ([F1(u(:),v(:)), F2(u(:),v(:))], squeeze(skl(1:2,1,1,:))', 1e2*eps);
-%! assert ([dF1dx(u(:),v(:)), dF2dx(u(:),v(:))], squeeze(skl(1:2,2,1,:))', 1e2*eps);
-%! assert ([dF1dy(u(:),v(:)), dF2dy(u(:),v(:))], squeeze(skl(1:2,1,2,:))', 1e2*eps);
-%! assert ([d2F1dx2(u(:),v(:)), d2F2dx2(u(:),v(:))], squeeze(skl(1:2,3,1,:))', 1e2*eps);
-%! assert ([d2F1dxdy(u(:),v(:)), d2F2dxdy(u(:),v(:))], squeeze(skl(1:2,2,2,:))', 1e2*eps);
-%! assert ([d2F1dy2(u(:),v(:)), d2F2dy2(u(:),v(:))], squeeze(skl(1:2,1,3,:))', 1e2*eps);
-
-%!test
-%! knots = {[0 0 1 1] [0 0 1 1]};
-%! coefs(:,1,1) = [0;0;0;1];
-%! coefs(:,2,1) = [1;0;0;1];
-%! coefs(:,1,2) = [0;1;0;1];
-%! coefs(:,2,2) = [1;1;1;2];
-%! srf = nrbmak (coefs, knots);
-%! [v, u] = meshgrid (linspace (0, 1, 3));
-%! uv = [u(:)'; v(:)'];
-%! skl = nrbsurfderiveval (srf, uv, 2);
-%! w = @(x, y) x.*y + 1;
-%! F1 = @(x, y) x ./ w(x,y);
-%! F2 = @(x, y) y ./ w(x,y);
-%! F3 = @(x, y) x .* y ./ w(x,y);
-%! dF1dx = @(x, y) 1./w(x,y) - x.*y./w(x,y).^2;
-%! dF1dy = @(x, y)  - x.^2./w(x,y).^2;
-%! dF2dx = @(x, y)  - y.^2./w(x,y).^2;
-%! dF2dy = @(x, y) 1./w(x,y) - x.*y./w(x,y).^2;
-%! dF3dx = @(x, y) y./w(x,y) - x.*(y./w(x,y)).^2;
-%! dF3dy = @(x, y) x./w(x,y) - y.*(x./w(x,y)).^2;
-%! d2F1dx2  = @(x, y) -2*y./w(x,y).^2 + 2*x.*y.^2./w(x,y).^3;
-%! d2F1dy2  = @(x, y) 2*x.^3./w(x,y).^3;
-%! d2F1dxdy = @(x, y) -x./w(x,y).^2 - x./w(x,y).^2 + 2*x.^2.*y./w(x,y).^3;
-%! d2F2dx2  = @(x, y) 2*y.^3./w(x,y).^3;
-%! d2F2dy2  = @(x, y) -2*x./w(x,y).^2 + 2*y.*x.^2./w(x,y).^3;
-%! d2F2dxdy = @(x, y) -y./w(x,y).^2 - y./w(x,y).^2 + 2*y.^2.*x./w(x,y).^3;
-%! d2F3dx2  = @(x, y) -2*y.^2./w(x,y).^2 + 2*x.*y.^3./w(x,y).^3;
-%! d2F3dy2  = @(x, y) -2*x.^2./w(x,y).^2 + 2*y.*x.^3./w(x,y).^3;
-%! d2F3dxdy = @(x, y) 1./w(x,y) - 3*x.*y./w(x,y).^2 + 2*(x.*y).^2./w(x,y).^3;
-%! assert ([F1(u(:),v(:)), F2(u(:),v(:)), F3(u(:),v(:))], squeeze(skl(1:3,1,1,:))', 1e2*eps);
-%! assert ([dF1dx(u(:),v(:)), dF2dx(u(:),v(:)), dF3dx(u(:),v(:))], squeeze(skl(1:3,2,1,:))', 1e2*eps);
-%! assert ([dF1dy(u(:),v(:)), dF2dy(u(:),v(:)), dF3dy(u(:),v(:))], squeeze(skl(1:3,1,2,:))', 1e2*eps);
-%! assert ([d2F1dx2(u(:),v(:)), d2F2dx2(u(:),v(:)), d2F3dx2(u(:),v(:))], squeeze(skl(1:3,3,1,:))', 1e2*eps);
-%! assert ([d2F1dy2(u(:),v(:)), d2F2dy2(u(:),v(:)), d2F3dy2(u(:),v(:))], squeeze(skl(1:3,1,3,:))', 1e2*eps);
-%! assert ([d2F1dxdy(u(:),v(:)), d2F2dxdy(u(:),v(:)), d2F3dxdy(u(:),v(:))], squeeze(skl(1:3,2,2,:))', 1e2*eps);
-
-*/
--- a/extra/nurbs/src/surfderivcpts.cc	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,101 +0,0 @@
-/* Copyright (C) 2009 Carlo de Falco
-
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <octave/oct.h>
-#include "low_level_functions.h"
-#include <iostream>
-
-
-DEFUN_DLD(surfderivcpts, args, nargout,"\
-\nSURFDERIVCPTS: Compute control points of n-th derivatives of a NURBS surface.\n \
-\n \
-\nusage: pkl = surfderivcpts (n, p, U, m, q, V, P, d)  \
-\n \
-\n  INPUT:  \
-\n\
-\n        n+1, m+1 = number of control points \
-\n        p, q     = spline order \
-\n        U, V     = knots \
-\n        P        = control points \
-\n        d        = derivative order \
-\n\
-\n  OUTPUT: \
-\n\
-\n        pkl (k+1, l+1, i+1, j+1) = i,jth control point \
-\n                                   of the surface differentiated k \
-\n                                   times in the u direction and l \
-\n                                   times in the v direction \
-\n \
-\n Adaptation of algorithm A3.7 from the NURBS book\n")
-{
-  //function pkl = surfderivcpts (n, p, U, m, q, V, P, d, r1, r2, s1, s2) 
-  
-  octave_value_list retval;
-
-  octave_idx_type n = args(0).idx_type_value ();
-  octave_idx_type p = args(1).idx_type_value ();
-  RowVector U = args(2).row_vector_value (false, true);
-  octave_idx_type m = args(3).idx_type_value ();
-  octave_idx_type q = args(4).idx_type_value ();
-  RowVector V = args(5).row_vector_value (false, true);
-  Matrix P = args(6).matrix_value ();
-  octave_idx_type d = args(7).idx_type_value ();
-  
-  octave_idx_type r1(0), r2 (n), s1 (0), s2 (m);
-  
-  
-  if (args.length () == 12)
-    {
-      r1 = args (8).idx_type_value ();
-      r2 = args (9).idx_type_value ();
-      s1 = args (10).idx_type_value ();
-      s2 = args (11).idx_type_value ();      
-    } 
-  else if  (args.length () > 8) 
-    print_usage ();
-
-  if (! error_state)
-    {
-      
-      NDArray pkl;
-
-      surfderivcpts (n, p, U, m, q, V, P, d, r1, r2, s1, s2,  pkl);
-
-      retval(0) = octave_value (pkl);
-    }
-  return retval;
-}
-
-
-/*
-%!test
-%! plane = nrbdegelev(nrb4surf([0 0], [0 1], [1 0], [1 1]), [1, 1]);
-%! 
-%! pkl = surfderivcpts (plane.number(1)-1, plane.order(1)-1,
-%!                       plane.knots{1}, plane.number(2)-1,
-%!                     plane.order(2)-1, plane.knots{2}, 
-%!                       squeeze (plane.coefs(1,:,:)), 2);
-%! 
-%! 
-%! pkl2 = [  0   0   0   1   0   0   0   0   0   0   0   0   1   0 ...
-%! 	0   0   0   0   0   0   0   1   0   0   0   0   0 0.5   0 ...
-%! 	0   1   0   0   0   0   0 0.5   0   0   1   0   0   0   0 ...
-%! 	0 0.5  0   0   1   0   0   0   0   0   1   0   0   0   0 ...
-%! 	0   0   0   0   1   0   0   0   0   0   0   0   0   1   0 ...
-%! 	0   0   0   0   0   0   0]';
-%! 
-%! assert (pkl(:),pkl2);
-*/
--- a/extra/nurbs/src/surfderiveval.cc	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,94 +0,0 @@
-/* Copyright (C) 2009 Carlo de Falco
-
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <octave/oct.h>
-#include "low_level_functions.h"
-#include <iostream>
-
-
-DEFUN_DLD(surfderiveval, args, nargout,"\
-\nSURFDERIVEVAL: Compute the derivatives of a B-spline surface\
-\n\
-\n usage: skl = surfderiveval (n, p, U, m, q, V, P, u, v, d) \
-\n\
-\n  INPUT: \
-\n\
-\n        n+1, m+1 = number of control points\
-\n        p, q     = spline order\
-\n        U, V     = knots\
-\n        P        = control points\
-\n        u,v      = evaluation points\
-\n        d        = derivative order\
-\n\
-\n  OUTPUT:\
-\n\
-\n        skl (k+1, l+1) =  surface differentiated k\
-\n                          times in the u direction and l\
-\n                          times in the v direction\
-\n\
-\n Adaptation of algorithm A3.8 from the NURBS book\n")
-{
-
-  //function skl = surfderiveval (n, p, U, m, q, V, P, u, v, d) 
-  
-  octave_value_list retval;
-
-  octave_idx_type n = args(0).idx_type_value ();
-  octave_idx_type p = args(1).idx_type_value ();
-  RowVector U = args(2).row_vector_value (false, true);
-  octave_idx_type m = args(3).idx_type_value ();
-  octave_idx_type q = args(4).idx_type_value ();
-  RowVector V = args(5).row_vector_value (false, true);
-  Matrix P = args(6).matrix_value ();
-  double u = args(7).double_value ();
-  double v = args(8).double_value ();
-  octave_idx_type d = args(9).idx_type_value ();
-
-  if (! error_state)
-    {
-      Matrix skl;
-      surfderiveval (n, p, U, m, q, V, P, u, v, d, skl);
-      retval(0) = octave_value (skl);
-    }
-  return retval;
-}
-
-/*
-%!shared srf
-%!test
-%! k = [0 0 0 1 1 1];
-%! c = [0 1/2 1];
-%! [coef(2,:,:), coef(1,:,:)] = meshgrid (c, c);
-%! srf = nrbmak (coef, {k, k});
-%! skl = surfderiveval (srf.number(1)-1, 
-%!                      srf.order(1)-1, 
-%!                      srf.knots{1}, 
-%!                      srf.number(2)-1, 
-%!                      srf.order(2)-1, 
-%!                      srf.knots{2},
-%!                      squeeze(srf.coefs(1,:,:)), .5, .5, 1) ;
-%! assert (skl, [.5 0; 1 0])
-%!test
-%! srf = nrbkntins (srf, {[], rand(1,2)});
-%! skl = surfderiveval (srf.number(1)-1, 
-%!                      srf.order(1)-1, 
-%!                      srf.knots{1},
-%!                      srf.number(2)-1, 
-%!                      srf.order(2)-1, 
-%!                      srf.knots{2},
-%!                      squeeze(srf.coefs(1,:,:)), .5, .5, 1) ;
-%! assert (skl, [.5 0; 1 0], 100*eps)
-*/
--- a/extra/nurbs/src/tbasisfun.cc	Sat Sep 12 19:47:29 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,296 +0,0 @@
-/* Copyright (C) 2009 Carlo de Falco
-   Copyright (C) 2012 Rafael Vazquez
-
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <octave/oct.h>
-#include <iostream>
-
-void onebasisfun__ (double u, octave_idx_type p, RowVector U, double *N)
-{
-  *N = 0.0;
-  if ((u <= U.min ()) || ( u > U.max ()))
-    return;
-  else if (p == 0)
-    {
-      *N = 1.0;
-      return;
-    }
-  else if (p == 1) 
-    {
-      if (u < U(1)) 
-        {
-          *N = (u - U(0)) / (U(1) - U(0));
-          return;
-        }
-      else 
-        {
-          *N = (U(2) - u) / (U(2) - U(1));
-          return;
-        }
-    }
-  else if (p == 2) 
-    {
-      double ln = u - U(0);
-      double dn = U(3) - u;
-      double ld = U(2) - U(0); 
-      double dd = U(3) - U(1);
-      if (u < U(1)) 
-        {
-          *N = ln*ln / (ld * (U(1) - U(0)));
-          return;
-        }
-      else if (u > U(2)) 
-        {
-          *N = dn*dn / (dd * (U(3) - U(2)));
-          return;
-        }
-      else 
-        {
-          if (ld != 0)            
-            *N += ln * (U(2) - u) / ((U(2) - U(1)) * ld);
-          
-          if (dd != 0)
-            *N += dn * (u - U(1)) / ((U(2) - U(1)) * dd);
-          return;
-        }
-    }
- 
-  double ln = u - U(0);
-  double ld = U(U.numel () - 2) - U(0);
-  if (ld != 0)
-    {
-      double tmp;
-      onebasisfun__ (u, p-1, U.extract (0, U.numel () - 2), &tmp);
-      *N += ln * tmp / ld; 
-    }
-  double dn = U(U.numel () - 1) - u;
-  double dd = U(U.numel () - 1) - U(1);
-  if (dd != 0)
-    {
-      double tmp;
-      onebasisfun__ (u, p-1, U.extract (1, U.numel () - 1), &tmp);
-      *N += dn * tmp / dd;
-    }
-  return;
-}
-
-void onebasisfun__ (double u, double p, RowVector U, double *N)
-{ onebasisfun__ (u, static_cast<octave_idx_type> (p), U, N); }
-
-void onebasisfunder__ (double u, octave_idx_type p, RowVector U, double *N, double *Nder)
-{
-  double aux;
-  *N = 0.0; *Nder = 0.0;
-  if ((u <= U.min ()) || ( u > U.max ()))       
-    return;
-  else if (p == 0)
-    {
-      *N = 1.0;
-      *Nder = 0.0;
-      return;
-    }  
-  else {    
-    double ln = u - U(0);
-    double ld = U(U.numel () - 2) - U(0);
-
-    if (ld != 0)
-      {
-        onebasisfun__ (u, p-1, U.extract (0, U.numel () - 2), &aux);
-        aux = aux / ld;
-        *N += ln * aux;
-        *Nder += p * aux;
-      }
-    
-    double dn = U(U.numel () - 1) - u;
-    double dd = U(U.numel () - 1) - U(1);
-
-    if (dd != 0)
-      { 
-        onebasisfun__ (u, p-1, U.extract (1, U.numel () - 1), &aux);
-        aux = aux / dd;
-        *N    += dn *aux;
-        *Nder -= p * aux;
-      } 
-  }
-}
-   
-DEFUN_DLD(tbasisfun, args, nargout,"\
-TBASISFUN: Compute a B- or T-Spline basis function, and its derivatives, from its local knot vector.\n\
-\n\
- usage:\n\
-\n\
- [N, Nder] = tbasisfun (u, p, U)\n\
- [N, Nder] = tbasisfun ([u; v], [p q], {U, V})\n\
- [N, Nder] = tbasisfun ([u; v; w], [p q r], {U, V, W})\n\
- \n\
- INPUT:\n\
-  u or [u; v] : points in parameter space where the basis function is to be\n\
-  evaluated \n\
-  \n\
-  U or {U, V} : local knot vector\n\
-\n\
-  p or [p q] : polynomial order of the basis function\n\
-\n\
- OUTPUT:\n\
-  N : basis function evaluated at the given parametric points\n\
-  Nder : gradient of the basis function evaluated at the given points\n")
-
-{
-  
-  octave_value_list retval;
-  Matrix u = args(0).matrix_value ();
-
-  RowVector N(u.cols ());
-  double *Nptr = N.fortran_vec ();
-
-  if (! args(2).is_cell ())
-    {
-
-      double p = args(1).idx_type_value ();
-      RowVector U = args(2).row_vector_value (true, true);
-      assert (U.numel () == p+2);
-      
-      if (nargout == 1)
-        for (octave_idx_type ii = 0; ii < u.numel (); ii++)
-          onebasisfun__ (u(ii), p, U, &(Nptr[ii]));
-
-      if (nargout == 2) 
-        {
-          RowVector Nder(u.cols ());
-          double *Nderptr = Nder.fortran_vec ();
-
-          for (octave_idx_type ii=0; ii<u.numel (); ii++)
-            onebasisfunder__ (u(ii), p, U, &(Nptr[ii]), &(Nderptr[ii]));
-
-          retval(1) = Nder;
-        }      
-    } 
-  else 
-    {
-      RowVector p = args(1).row_vector_value ();
-      if (p.numel () == 2) 
-        {
-          Cell C = args(2).cell_value ();
-          RowVector U = C(0).row_vector_value (true, true);
-          RowVector V = C(1).row_vector_value (true, true);
-          
-          if (nargout == 1) 
-            {
-              for (octave_idx_type ii=0; ii<u.cols (); ii++)
-                {
-                  double Nu, Nv;
-                  onebasisfun__ (u(0, ii), octave_idx_type(p(0)), U, &Nu);
-                  onebasisfun__ (u(1, ii), octave_idx_type(p(1)), V, &Nv);
-                  Nptr[ii] = Nu * Nv;
-                }
-            }
-          else if (nargout == 2) 
-            {
-              double Nu, Nv, Ndu, Ndv;
-              Matrix Nder (2, u.cols());
-              double *Nderptr = Nder.fortran_vec ();
-              for (octave_idx_type ii = 0; ii < u.cols (); ii++)
-                {
-                  onebasisfunder__ (u(0, ii), octave_idx_type(p(0)), U, &Nu, &Ndu);
-                  onebasisfunder__ (u(1, ii), octave_idx_type(p(1)), V, &Nv, &Ndv);
-                  Nptr[ii] = Nu * Nv;
-                
-                  Nderptr[0 + (2 * ii)] = Ndu * Nv;
-                  Nderptr[1 + (2 * ii)] = Ndv * Nu;
-                }
-              retval(1) = Nder;
-            }
-        
-        } 
-      else if (p.numel () == 3) 
-        {
-          Cell C = args(2).cell_value ();
-          RowVector U = C(0).row_vector_value (true, true);
-          RowVector V = C(1).row_vector_value (true, true);
-          RowVector W = C(2).row_vector_value (true, true);
-        
-          if (nargout == 1)
-            {
-              for (octave_idx_type ii = 0; ii < u.cols (); ii++)
-                {
-                  double Nu, Nv, Nw;
-                  onebasisfun__ (u(0, ii), octave_idx_type(p(0)), U, &Nu);
-                  onebasisfun__ (u(1, ii), octave_idx_type(p(1)), V, &Nv);
-                  onebasisfun__ (u(2, ii), octave_idx_type(p(2)), W, &Nw);
-                  Nptr[ii] = Nu * Nv * Nw;
-                }
-            }
-          else if (nargout == 2) 
-            {
-              double Nu, Nv, Nw, Ndu, Ndv, Ndw;
-              Matrix Nder (3, u.cols());
-              double *Nderptr = Nder.fortran_vec ();
-              for (octave_idx_type ii=0; ii<u.cols (); ii++)
-              {
-                onebasisfunder__ (u(0, ii), octave_idx_type(p(0)), U, &Nu, &Ndu);
-                onebasisfunder__ (u(1, ii), octave_idx_type(p(1)), V, &Nv, &Ndv);
-                onebasisfunder__ (u(2, ii), octave_idx_type(p(2)), W, &Nw, &Ndw);
-                Nptr[ii] = Nu * Nv * Nw;
-                Nderptr[0 + (3 * ii)] = Ndu * Nv * Nw;
-                Nderptr[1 + (3 * ii)] = Ndv * Nu * Nw;
-                Nderptr[2 + (3 * ii)] = Ndw * Nu * Nv;
-              }
-            retval(1) = Nder;
-          }
-        
-      }
-    }
-  retval(0) = octave_value (N);
-  return retval;
-}
-
-/*
-
-%!demo
-%! U = {[0 0 1/2 1 1], [0 0 0 1 1]};
-%! p = [3, 3];
-%! [X, Y] = meshgrid (linspace(0, 1, 30));
-%! u = [X(:), Y(:)]';
-%! N = tbasisfun (u, p, U);
-%! surf (X, Y, reshape (N, size(X)))
-%! title('Basis function associated to a local knot vector')
-%! hold off
-
-%!test
-%! U = [0 1/2 1];
-%! p = 1;
-%! u = [0.3 0.4 0.6 0.7];
-%! [N, Nder] = tbasisfun (u, p, U);
-%! assert (N, [0.6 0.8 0.8 0.6], 1e-12);
-%! assert (Nder, [2 2 -2 -2], 1e-12);
-
-%!test
-%! U = {[0 1/2 1] [0 1/2 1]};
-%! p = [1 1];
-%! u = [0.3 0.4 0.6 0.7; 0.3 0.4 0.6 0.7];
-%! [N, Nder] = tbasisfun (u, p, U);
-%! assert (N, [0.36 0.64 0.64 0.36], 1e-12);
-%! assert (Nder, [1.2 1.6 -1.6 -1.2; 1.2 1.6 -1.6 -1.2], 1e-12);
-
-%!test
-%! U = {[0 1/2 1] [0 1/2 1] [0 1/2 1]};
-%! p = [1 1 1];
-%! u = [0.4 0.4 0.6 0.6; 0.4 0.4 0.6 0.6; 0.4 0.6 0.4 0.6];
-%! [N, Nder] = tbasisfun (u, p, U);
-%! assert (N, [0.512 0.512 0.512 0.512], 1e-12);
-%! assert (Nder, [1.28 1.28 -1.28 -1.28; 1.28 1.28 -1.28 -1.28; 1.28 -1.28 1.28 -1.28], 1e-12);
-
-*/