void surfaceTension( const SURFACEQUADRATURE& surfaceQuadrature, SOLVER& solver, const FieldBinder& fieldBinder, const PARAMETER& parameter, const double sigma, const bool inOut = true, const bool plusMinus = true ) { // object to compute the LHS penalty term typedef SurfaceTension<typename SURFACETUPLEBINDER::Tuple> ST; ST surfaceTension( sigma ); // integrator and assembler object typedef base::asmb::ForceIntegrator<SURFACEQUADRATURE,SOLVER, typename SURFACETUPLEBINDER::Tuple> SurfaceForceInt; typename SurfaceForceInt::ForceKernel surfaceForceKernel = boost::bind( &ST::residual, &surfaceTension, _1, _2, _3, _4 ); SurfaceForceInt surfaceForceInt( surfaceForceKernel, surfaceQuadrature, solver ); // apply typename FieldBinder::FieldIterator iter = fieldBinder.elementsBegin(); typename FieldBinder::FieldIterator end = fieldBinder.elementsEnd(); for ( ; iter != end; ++iter ) { const double sign = (plusMinus ? 1.0 : -1.0 ); const double kappa = sign * parameter.energyWeight( iter, not inOut ); //!<!!! surfaceTension.setKappa( kappa ); surfaceForceInt( SURFACETUPLEBINDER::makeTuple( *iter ) ); } return; }
SICALLBACK aaOcean_BeginEvaluate( ICENodeContext& in_ctxt ) { // get ocean pointer from user-data aaOcean *pOcean = (aaOcean *)(CValue::siPtrType)in_ctxt.GetUserData(); // get ICE node input port arrays CDataArrayLong PointID( in_ctxt, ID_IN_PointID); CDataArrayLong resolution( in_ctxt, ID_IN_RESOLUTION); CDataArrayLong seed( in_ctxt, ID_IN_SEED); CDataArrayFloat waveHeight( in_ctxt, ID_IN_WAVE_HEIGHT); CDataArrayFloat waveSpeed( in_ctxt, ID_IN_WAVESPEED); CDataArrayFloat chop( in_ctxt, ID_IN_CHOP); CDataArrayFloat oceanScale( in_ctxt, ID_IN_OCEAN_SCALE ); CDataArrayFloat oceanDepth( in_ctxt, ID_IN_OCEAN_DEPTH ); CDataArrayFloat windDir( in_ctxt, ID_IN_WINDDIR ); CDataArrayFloat cutoff( in_ctxt, ID_IN_CUTOFF); CDataArrayFloat velocity( in_ctxt, ID_IN_WINDVELOCITY); CDataArrayLong windAlign( in_ctxt, ID_IN_WINDALIGN ); CDataArrayFloat damp( in_ctxt, ID_IN_DAMP); CDataArrayBool enableFoam( in_ctxt, ID_IN_ENABLEFOAM); CDataArrayFloat time( in_ctxt, ID_IN_TIME); CDataArrayFloat loopTime( in_ctxt, ID_IN_REPEAT_TIME); CDataArrayFloat surfaceTension( in_ctxt, ID_IN_SURFACE_TENSION); CDataArrayFloat randWeight( in_ctxt, ID_IN_RAND_WEIGHT); pOcean->input(resolution[0], seed[0], oceanScale[0], oceanDepth[0], surfaceTension[0], velocity[0], cutoff[0], windDir[0], windAlign[0], damp[0], waveSpeed[0], waveHeight[0], chop[0], time[0], loopTime[0], enableFoam[0], randWeight[0]); return CStatus::OK; }