/*
 * Copyright (C) 1997-2006 P. Dular, C. Geuzaine
 *
 * 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 2 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, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 * USA.
 *
 * Please report all bugs and problems to <getdp@geuz.org>.
 */

#ifndef _BF_NODE_H_
#define _BF_NODE_H_

/* Barycentric functions */

#define POI1  ( 1. )
	
#define LIN1  ( 0.5 * (1.-u) )
#define LIN2  ( 0.5 * (1.+u) )
	
#define TRI1  ( 1.-u-v )
#define TRI2  (    u   )
#define TRI3  (      v )
	
#define QUA1  ( 0.25 * (1.-u) * (1.-v) )
#define QUA2  ( 0.25 * (1.+u) * (1.-v) )
#define QUA3  ( 0.25 * (1.+u) * (1.+v) )
#define QUA4  ( 0.25 * (1.-u) * (1.+v) )
	
#define TET1  ( 1.-u-v-w )
#define TET2  (    u     )
#define TET3  (      v   )
#define TET4  (        w )
	
#define HEX1  ( (1.-u) * (1.-v) * (1.-w) * 0.125 )
#define HEX2  ( (1.+u) * (1.-v) * (1.-w) * 0.125 )
#define HEX3  ( (1.+u) * (1.+v) * (1.-w) * 0.125 )
#define HEX4  ( (1.-u) * (1.+v) * (1.-w) * 0.125 )
#define HEX5  ( (1.-u) * (1.-v) * (1.+w) * 0.125 )
#define HEX6  ( (1.+u) * (1.-v) * (1.+w) * 0.125 )
#define HEX7  ( (1.+u) * (1.+v) * (1.+w) * 0.125 )
#define HEX8  ( (1.-u) * (1.+v) * (1.+w) * 0.125 )
	
#define PRI1  ( (1.-u-v) * (1.-w) * 0.5 )
#define PRI2  (     u    * (1.-w) * 0.5 )
#define PRI3  (       v  * (1.-w) * 0.5 )
#define PRI4  ( (1.-u-v) * (1.+w) * 0.5 )
#define PRI5  (     u    * (1.+w) * 0.5 )
#define PRI6  (       v  * (1.+w) * 0.5 )
	
#define PYR1  ( 0.25 * ((1.-u) * (1.-v) - w + r) )
#define PYR2  ( 0.25 * ((1.+u) * (1.-v) - w - r) )
#define PYR3  ( 0.25 * ((1.+u) * (1.+v) - w + r) )
#define PYR4  ( 0.25 * ((1.-u) * (1.+v) - w - r) )
#define PYR5  ( w                                )

/* And their gradients */

#define dLIN1u  ( -0.5 )
#define dLIN2u  (  0.5 )
	 
#define dTRI1u  ( -1. )
#define dTRI1v  ( -1. )
#define dTRI2u  (  1. )
#define dTRI2v  (  0. )
#define dTRI3u  (  0. )
#define dTRI3v  (  1. )
	 
#define dQUA1u  ( -0.25 * (1.-v) )
#define dQUA1v  ( -0.25 * (1.-u) )
#define dQUA2u  (  0.25 * (1.-v) )
#define dQUA2v  ( -0.25 * (1.+u) )
#define dQUA3u  (  0.25 * (1.+v) )
#define dQUA3v  (  0.25 * (1.+u) )
#define dQUA4u  ( -0.25 * (1.+v) )
#define dQUA4v  (  0.25 * (1.-u) )

#define dTET1u  ( -1. )
#define dTET1v  ( -1. )
#define dTET1w  ( -1. )
#define dTET2u  (  1. )
#define dTET2v  (  0. )
#define dTET2w  (  0. )
#define dTET3u  (  0. )
#define dTET3v  (  1. )
#define dTET3w  (  0. )
#define dTET4u  (  0. )
#define dTET4v  (  0. )
#define dTET4w  (  1. )

#define dHEX1u  ( -0.125 * (1.-v) * (1.-w) )
#define dHEX1v  ( -0.125 * (1.-u) * (1.-w) )
#define dHEX1w  ( -0.125 * (1.-u) * (1.-v) )
#define dHEX2u  (  0.125 * (1.-v) * (1.-w) )
#define dHEX2v  ( -0.125 * (1.+u) * (1.-w) )
#define dHEX2w  ( -0.125 * (1.+u) * (1.-v) )
#define dHEX3u  (  0.125 * (1.+v) * (1.-w) )
#define dHEX3v  (  0.125 * (1.+u) * (1.-w) )
#define dHEX3w  ( -0.125 * (1.+u) * (1.+v) )
#define dHEX4u  ( -0.125 * (1.+v) * (1.-w) )
#define dHEX4v  (  0.125 * (1.-u) * (1.-w) )
#define dHEX4w  ( -0.125 * (1.-u) * (1.+v) )
#define dHEX5u  ( -0.125 * (1.-v) * (1.+w) )
#define dHEX5v  ( -0.125 * (1.-u) * (1.+w) )
#define dHEX5w  (  0.125 * (1.-u) * (1.-v) )
#define dHEX6u  (  0.125 * (1.-v) * (1.+w) )
#define dHEX6v  ( -0.125 * (1.+u) * (1.+w) )
#define dHEX6w  (  0.125 * (1.+u) * (1.-v) )
#define dHEX7u  (  0.125 * (1.+v) * (1.+w) )
#define dHEX7v  (  0.125 * (1.+u) * (1.+w) )
#define dHEX7w  (  0.125 * (1.+u) * (1.+v) )
#define dHEX8u  ( -0.125 * (1.+v) * (1.+w) )
#define dHEX8v  (  0.125 * (1.-u) * (1.+w) )
#define dHEX8w  (  0.125 * (1.-u) * (1.+v) )

#define dPRI1u  (-0.5 * (1.-w)    )
#define dPRI1v  ( -0.5 * (1.-w)   )
#define dPRI1w  ( -0.5 * (1.-u-v) )
#define dPRI2u  (  0.5 * (1.-w)   )
#define dPRI2v  (  0.             )
#define dPRI2w  ( -0.5 * u        )
#define dPRI3u  (  0.             )
#define dPRI3v  (  0.5 * (1.-w)   )
#define dPRI3w  ( -0.5 * v        )
#define dPRI4u  ( -0.5 * (1.+w)   )
#define dPRI4v  ( -0.5 * (1.+w)   )
#define dPRI4w  (  0.5 * (1.-u-v) )
#define dPRI5u  (  0.5 * (1.+w)   )
#define dPRI5v  (  0.             )
#define dPRI5w  (  0.5 * u        )
#define dPRI6u  (  0.             )
#define dPRI6v  (  0.5 * (1.+w)   )
#define dPRI6w  (  0.5 * v        )

#define dPYR1u  ( 0.25 * ( -(1.-v) + v*w/(1.-w) )     )
#define dPYR1v  ( 0.25 * ( -(1.-u) + u*w/(1.-w) )     )      
#define dPYR1w  ( 0.25 * ( -1.     + u*v/DSQU(1.-w) ) )
#define dPYR2u  ( 0.25 * (  (1.-v) + v*w/(1.-w) )     )        
#define dPYR2v  ( 0.25 * ( -(1.+u) + u*w/(1.-w) )     )       
#define dPYR2w  ( 0.25 * ( -1.     + u*v/DSQU(1.-w) ) )
#define dPYR3u  ( 0.25 * (  (1.+v) + v*w/(1.-w) )     )
#define dPYR3v  ( 0.25 * (  (1.+u) + u*w/(1.-w) )     )
#define dPYR3w  ( 0.25 * ( -1.     + u*v/DSQU(1.-w) ) )
#define dPYR4u  ( 0.25 * ( -(1.+v) + v*w/(1.-w) )     )
#define dPYR4v  ( 0.25 * (  (1.-u) + u*w/(1.-w) )     )
#define dPYR4w  ( 0.25 * ( -1.     + u*v/DSQU(1.-w) ) )
#define dPYR5u  ( 0.                                  )
#define dPYR5v  ( 0.                                  )
#define dPYR5w  ( 1.                                  )


#endif


syntax highlighted by Code2HTML, v. 0.9.1