/********************************************************************/ /* Copyright (c) 2017 System fugen G.K. and Yuzi Mizuno */ /* All rights reserved. */ /********************************************************************/ #include "MGCLStdAfx.h" #include "mg/Vector.h" #include "mg/PPRep.h" #include "mg/LBRep.h" #include "mg/Tolerance.h" #include "cskernel/bpval2.h" #include "cskernel/bpval.h" #include "cskernel/Blcbpn.h" #if defined(_DEBUG) #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // // Implements MGPPRep class. //Constructor MGPPRep::MGPPRep() //Default constructor. :m_order(0), m_sdim(0),m_nbreak(0), m_coef(0){;} MGPPRep::MGPPRep(int order, int nbreak, int sdim) //Constructor of dummy PPRep of specified size. :m_order(order),m_nbreak(nbreak),m_sdim(sdim), m_break_point(nbreak),m_coef(new double[order*nbreak*sdim]) { if(order*nbreak*sdim==0) m_coef=0; else{ int n=order*nbreak*sdim; for(int i=0; i=2); } //Constructor of dummy PP-Rep(no data except data points) of specified size. MGPPRep::MGPPRep(int order, int sdim, const MGNDDArray& tau) :m_order(order),m_nbreak(tau.length()),m_sdim(sdim), m_break_point(tau),m_coef(new double[order*tau.length()*sdim] ){ if(order*m_nbreak*sdim==0) m_coef=0; else{ int n=order*m_nbreak*sdim; for(int i=0; i=2); } MGPPRep::MGPPRep(const MGLBRep& lbrep) //Constructor to convert from Line B-Representation. :m_order(lbrep.order()), //Order m_nbreak(lbrep.bdim()-m_order+2), //Num of Break points m_sdim(lbrep.sdim()), //Space dimension m_break_point(m_nbreak), //Break point area m_coef(new double[m_order*m_nbreak*m_sdim]) //Coef area { const int irc=lbrep.line_bcoef().capacity(); double* work=new double[m_order*m_order*m_sdim]; //Work array for BLCBP int nbdim= lbrep.bdim(); const double* knotp= lbrep.knot_data(); int nbreak; double* breakp=&(m_break_point(0)); blcbpn_(m_order,nbdim,knotp,lbrep.coef_data(),irc, m_sdim,m_nbreak,work,breakp,&coef(0,0,0),&nbreak); delete[] work; nbreak+=1; //Since ouput nbreak of BLCBP is interval number. if(nbreak=m_order || k>=m_sdim) return 0.0; return m_coef[i+m_order*j+m_order*m_nbreak*k]; } //Change size. Change of sdim not allowed. //Stored data so far will be guarateed to hold in the same id of coef(i,j,k). void MGPPRep::reshape(int nbreak){ if(nbreak==m_nbreak) return ; double* data=new double[m_order*nbreak*m_sdim]; //Reshape of pp coef. int nb=nbreak; if(nb>m_nbreak) nb=m_nbreak; for(int k=0; k