예제 #1
0
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;
}
예제 #2
0
파일: icenode.cpp 프로젝트: oyaGG/aaOcean
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;
}