/*
* Copyright (C) 1998, 2000-2007, 2010, 2011, 2012, 2013 SINTEF ICT,
* Applied Mathematics, Norway.
*
* Contact information: E-mail: tor.dokken@sintef.no
* SINTEF ICT, Department of Applied Mathematics,
* P.O. Box 124 Blindern,
* 0314 Oslo, Norway.
*
* This file is part of SISL.
*
* SISL is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* SISL 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with SISL. If not, see
* .
*
* In accordance with Section 7(b) of the GNU Affero General Public
* License, a covered work must retain the producer line in every data
* file that is created or manipulated using SISL.
*
* Other Usage
* You can be released from the requirements of the license by purchasing
* a commercial license. Buying such a license is mandatory as soon as you
* develop commercial activities involving the SISL library without
* disclosing the source code of your own applications.
*
* This file may be used in accordance with the terms contained in a
* written agreement between you and SINTEF ICT.
*/
#include "sisl-copyright.h"
#define S1537
#include "sislP.h"
#if defined(SISLNEEDPROTOTYPES)
void s1537(double points[],int im1,int im2,int idim,double par1[],
double par2[],int con1,int con2,int con3,int con4,
int order1, int order2,int iopen1,int iopen2,
SISLSurf **rsurf,int *jstat)
#else
void s1537(points,im1,im2,idim,par1, par2,con1,con2,con3,
con4,order1, order2,iopen1,iopen2,rsurf,jstat)
double points[];
int im1;
int im2;
int idim;
double par1[];
double par2[];
int con1;
int con2;
int con3;
int con4;
int order1;
int order2;
int iopen1;
int iopen2;
SISLSurf **rsurf;
int *jstat;
#endif
/*
************************************************************************
*
* PURPOSE: To compute a B-spline tensor surface interpolating a set
* of points.
*
* INPUT:
* points - Array of dimension idim*im1*im2 containing
* the positions of the nodes (using the same ordering
* as ecoef in the SISLSurf structure).
*
* im1 - The number of interpolation points in the
* first parameter direction.
*
* im2 - The number of interpolation points in the
* second parameter direction.
*
* idim - Dimension of the space we are working in.
*
* par1 - Parametrization in first parameter direction.
* For closed curves, one additional parameter value
* must be spesified. The last entry contains
* the parametrization of the repeted start point.
* (if the endpoint is equal to the startpoint of
* the interpolation the lenght of the array could
* be equal to im1 also in the closed case).
*
* par2 - Parametrization in second parameter direction.
* For closed curves, one additional parameter value
* must be spesified. The last entry contains
* the parametrization of the repeted start point.
* (if the endpoint is equal to the startpoint of
* the interpolation the lenght of the array could
* be equal to im2 also in the closed case).
*
*
* ^ Second par. direction
* |
* | (2.)
* |-----------|
* | |
* (3.) | | (4.)
* | |
* | |
* |-----------|-> First par. direction
* (1.)
*
* con1 - Additional condition along edge 1:
* = 0: No additional condition.
* = 1: Zero curvature.
*
* con2 - Additional condition along edge 2:
* = 0: No additional condition.
* = 1: Zero curvature.
*
* con3 - Additional condition along edge 3:
* = 0: No additional condition.
* = 1: Zero curvature.
*
* con4 - Additional condition along edge 4:
* = 0: No additional condition.
* = 1: Zero curvature.
*
* order1 - Order of surface in first parameter direction.
*
* order2 - Order of surface in second parameter direction.
*
* iopen1 - Open/close parameter in first parameter direction.
* = 1 : open surface.
* = 0 : closed, non-periodic surface.
* = -1 : periodic surface.
*
* iopen2 - Open/close parameter in second parameter direction.
* = 1 : open surface.
* = 0 : closed, non-periodic surface.
* = -1 : periodic surface.
*
*
* Output:
* rsurf - Pointer to the surf produced
* jstat - Status variable
* < 0 - Error.
*
* Method:
* The interpolation is accomplished by using a one dimensional
* routine for spline interpolation called several times.
* First, the datapoints
* are considered to be idim*im1 dimentional and so on...
*
*
* REFERENCES :
*
* CALLS : s1357
*
* WRITTEN BY : Christophe Rene Birkeland, SINTEF, May 1993.
* REWISED BY : Vibeke Skytt, SINTEF, 0394. Introduced iopen1, iopen2.
*
*********************************************************************
*/
{
int i; /* Loop control parameter */
int maxim; /* Max (im1, im2) */
int kstat=0; /* Status variable */
int kpos=0; /* Position of error */
int newin1, newin2; /* Number of vertices along par. dir. 1 & 2 */
int numpt; /* Needed in call to s1357 */
double start=0; /* Needed in call to s1357 */
double end;
int *typept=SISL_NULL; /* Array needed for call to s1357 */
double *pointpar=SISL_NULL; /* Array needed for call to s1357 */
double *newcoeff=SISL_NULL; /* Array needed for call to s1357 */
SISLCurve *curve1=SISL_NULL, *curve2=SISL_NULL;
/* Allocate necessary array for call to s1357 */
maxim = MAX( im1, im2 );
if((typept = newarray(maxim, INT))==SISL_NULL) goto err101;
for(i=0; iin;
/* Transpose result, store new coefficients in
* array newcoeff */
if( (newcoeff = newarray(idim * im1 * newin2, DOUBLE)) == SISL_NULL )
goto err101;
s6chpar(curve1->ecoef, im1, newin2, idim, newcoeff);
/* Interpolation in first parameter direction */
s1357(newcoeff, im1, idim*newin2, typept, par1, con3, con4, iopen1, order1,
start, &end, &curve2, &pointpar, &numpt, &kstat);
if(kstat < 0) goto error;
if(pointpar != SISL_NULL)
{
freearray(pointpar);
pointpar = SISL_NULL;
}
newin1 = curve2->in;
/* Transpose back coefficients */
if( (newcoeff=increasearray(newcoeff, idim*newin1*newin2, DOUBLE))
== SISL_NULL ) goto err101;
s6chpar(curve2->ecoef, newin2, newin1, idim, newcoeff);
/* Create instance of surface */
if (((*rsurf) = newSurf(newin1, newin2, order1, order2, curve2->et,
curve1->et, newcoeff, 1, idim, 1)) == SISL_NULL)
goto err101;
/* Set periodicity flag. */
(*rsurf)->cuopen_1 = curve2->cuopen;
(*rsurf)->cuopen_2 = curve1->cuopen;
/* Success */
*jstat = 0;
goto out;
/* Allocation error. */
err101:
*jstat = -101;
s6err("s1537",*jstat,kpos);
goto out;
/* Error in lower level routine. */
error: *jstat =kstat;
s6err("s1537",*jstat,kpos);
goto out;
out:
/* Free arrays */
if (newcoeff != SISL_NULL) freearray(newcoeff);
if (typept != SISL_NULL) freearray(typept);
/* Free local SISL-curve objects */
if (curve1 != SISL_NULL) freeCurve(curve1);
if (curve2 != SISL_NULL) freeCurve(curve2);
return;
}