function [dphidx,dphidy,dphidz,Xi,Yi,Zi,wgi]=CreateGradNURBSBasis3D(mesh_file,p,GaussPts,pscale,frame) if nargin < 3 , GaussPts='Gauss_points';end if nargin < 4 , pscale=1;end if nargin < 5 , frame='parametric';end [pp,filname,ext]=fileparts(mesh_file); if isempty(ext) mesh_file=[mesh_file,'.mat']; end load(mesh_file,'Px','Py','Pz','uo','vo','wo','Nbselems','-mat'); uo=(uo-0.5)*pscale+0.5; vo=(vo-0.5)*pscale+0.5; wo=(wo-0.5)*pscale+0.5; switch GaussPts case 'pixels' error('Not allowed in 3D'); case 'knot' [Yi,Xi,Zi]=meshgrid(vo,uo,wo); Xi=Xi(:);Yi=Yi(:);Zi=Zi(:); wgi=1; case 'nodes' load(mesh_file,'ui','vi','wi','-mat'); Yi=vi; Xi=ui; Zi=wi; wgi=1; case 'Gauss_points' [xgi,wxgi]=GetGaussPointsLine(1+p(1)); [ygi,wygi]=GetGaussPointsLine(1+p(2)); [zgi,wzgi]=GetGaussPointsLine(1+p(3)); [yg,xg,zg]=meshgrid(ygi,xgi,zgi); wg=wxgi*wygi'; wg=wg(:)*wzgi'; xg=xg(:);yg=yg(:);zg=zg(:);wg=wg(:); N=[0.125*(1-xg).*(1-yg).*(1-zg),0.125*(1+xg).*(1-yg).*(1-zg),0.125*(1+xg).*(1+yg).*(1-zg),0.125*(1-xg).*(1+yg).*(1-zg),... 0.125*(1-xg).*(1-yg).*(1+zg),0.125*(1+xg).*(1-yg).*(1+zg),0.125*(1+xg).*(1+yg).*(1+zg),0.125*(1-xg).*(1+yg).*(1+zg)]; N_r=[-0.125*(1-yg).*(1-zg),0.125*(1-yg).*(1-zg),0.125*(1+yg).*(1-zg),-0.125*(1+yg).*(1-zg),... -0.125*(1-yg).*(1+zg),0.125*(1-yg).*(1+zg),0.125*(1+yg).*(1+zg),-0.125*(1+yg).*(1+zg)]; N_s=[-0.125*(1-xg).*(1-zg),-0.125*(1+xg).*(1-zg),0.125*(1+xg).*(1-zg),0.125*(1-xg).*(1-zg),... -0.125*(1-xg).*(1+zg),-0.125*(1+xg).*(1+zg),0.125*(1+xg).*(1+zg),0.125*(1-xg).*(1+zg)]; N_t=[-0.125*(1-xg).*(1-yg),-0.125*(1+xg).*(1-yg),-0.125*(1+xg).*(1+yg),-0.125*(1-xg).*(1+yg),... 0.125*(1-xg).*(1-yg),0.125*(1+xg).*(1-yg),0.125*(1+xg).*(1+yg),0.125*(1-xg).*(1+yg)]; Xi=zeros(prod(Nbselems)*prod(p+1),1); Yi=zeros(prod(Nbselems)*prod(p+1),1); Zi=zeros(prod(Nbselems)*prod(p+1),1); wgi=zeros(prod(Nbselems)*prod(p+1),1); Sel=prod(p+1); np=0; for ix=1:Nbselems(1) for iy=1:Nbselems(2) for iz=1:Nbselems(3) inods=ix+p(1)+[0,1,1,0,0,1,1,0]; jnods=iy+p(2)+[0,0,1,1,0,0,1,1]; knods=iz+p(3)+[0,0,0,0,1,1,1,1]; ui=uo(inods(:))'; vi=vo(jnods(:))'; wi=wo(knods(:))'; dxdr=N_r*ui; dydr=N_r*vi; dzdr=N_r*wi; dxds=N_s*ui; dyds=N_s*vi; dzds=N_s*wi; dxdt=N_t*ui; dydt=N_t*vi; dzdt=N_t*wi; detJ =dxdr.*dyds.*dzdt + dxdt .*dydr.*dzds +... dxds.*dydt.*dzdr - dxdt .*dyds.*dzdr -... dxdr.*dydt.*dzds - dxds .*dydr.*dzdt; indp=np+(1:Sel); Xi(indp)=N*ui; Yi(indp)=N*vi; Zi(indp)=N*wi; wgi(indp)=detJ.*wg; np=np+Sel; end end end end npt=numel(Xi); indp=zeros((p(1)+1)*npt,1); indn=zeros((p(1)+1)*npt,1); val=zeros((p(1)+1)*npt,1); dval=zeros((p(1)+1)*npt,1); Nnx=Nbselems(1)+p(1); nel=0; for ix=1:Nbselems(1) if ix==Nbselems(1) found=find((Xi>=uo(ix+p(1)))&(Xi<=uo(ix+p(1)+1))); else found=find((Xi>=uo(ix+p(1)))&(Xi=vo(iy+p(2)))&(Yi<=vo(iy+p(2)+1))); else found=find((Yi>=vo(iy+p(2)))&(Yi=wo(iz+p(3)))&(Zi<=wo(iz+p(3)+1))); else found=find((Zi>=wo(iz+p(3)))&(Zi