#include "MGCLStdAfx.h"
/********************************************************************/
/* Copyright (c) 2017 System fugen G.K. and Yuzi Mizuno          */
/* All rights reserved.                                             */
/********************************************************************/
#include "cskernel/bpval.h"
#include "cskernel/blcpb2.h"

// BLCPB CONVERTS PP-REP(RBRK,PCOEF,L) TO B-REP(T,RCOEF,N). 
// THE PP-REP MUST HAVE THE CONTINUITY K-2 AT EACH BREAK POINT. 
// ***INPUT* 
//    RBRK(L+1)........BREAK POINT SEQUENCE OF PP-REP. 
//    PCOEF(K,IPC,NCD).PP-COEFFICIENTS , I.E. 
//             PCOEF(J,I,,)=D**(J-1)(F(RBRK(I))   1<=I<=L. 
//    L................INDICATES NUM OF INTERVAL OF PP-REP. 
//    K................ORDER OF PP-REP(B-REP) 
//    NCD..............SPACE DIMENSION OF THE PP-REP 
//    IPC..............LENGTH OF 2ND DIMENSIONED ARRAY OF THE VARIALBLE 
//                     PCOEF, MUST BE .GE.L+1 . 
//    IRC..............ROW DIMENSION OF THE VARIABLE RCOEF 
//    IT...............INDICATES WHETHER KNOT VECTOR T(.) IS INPUT 
//                     OR NOT(GENERATED IN THE PREVIOUS CALL OF BLCPB) 
//                        =1  BLCPB GENERATES T 
//                        =2  T IS INPUT(BLCPB NOT GENERATE T) 
//    T(N+K)...........KNOT VECTOR (NECESSARY WHEN IT=2) 
// ***OUTPUT*** 
//    T(N+K)...........KNOT VECTOR OF B-REP(WHEN IT=1) 
//    RCOEF(IRC,NCD)...B-COEFFICIENTS 
//    N................B-REP DIMENSION 
void blcpb_(
	const double *rbrk, double *pcoef, int l, int k, int ncd, int ipc, int irc, int it, 
	double *t, double *rcoef, int *n
){
    // Local variables 
    int i, j;
    int lp1;
	int pcoef_offset, im1;

    // Parameter adjustments 
    --rbrk;
    pcoef_offset = k*(ipc+1)+1;
    pcoef -= pcoef_offset;
    --t;

    // Function Body 
    lp1 = l+1;
    for(i=1; i<=k; ++i){
	    im1 = i-1;
		for(j=1; j<=ncd; ++j){
			pcoef[i+(lp1+j*ipc)*k] =
				bpval_(&rbrk[1],&pcoef[(j*ipc+1)*k+1],l,k,rbrk[lp1],im1);
		}
    }
    *n = l+k-1;
    if(it != 2){
		for(i=1; i<=k; ++i){
		    t[i]=rbrk[1];
			t[*n+i] = rbrk[lp1];
		}
		for (i=2; i<=l; ++i)
			t[i+k-1] = rbrk[i];
    }
// GENERATE B-COEFFICIENTS 
    blcpb2_(&pcoef[pcoef_offset],l,k,*n,&t[1],ncd,ipc,irc,rcoef);
}
