/*--------------------------------*- C++ -*----------------------------------*\
| =========                 |                                                 |
| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
|  \\    /   O peration     | Version:  v2512                                 |
|   \\  /    A nd           | Website:  www.openfoam.com                      |
|    \\/     M anipulation  |                                                 |
\*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      dynamicMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

dynamicFvMesh   dynamicMotionSolverFvMesh;

motionSolver    coded;
name            myMotion;

codeInclude
#{
    #include "transformField.H"
#};

localCode
#{
    // Generate new set of points
    tmp<pointField> twistColumn
    (
        const scalar maxRotAngle,
        const pointField& points
    )
    {
        auto tnewPoints = tmp<pointField>::New(points);
        auto& newPoints = tnewPoints.ref();

        const boundBox bb(points, true);
        const scalar zMin = bb.min().z();
        const scalar zSpan = bb.span().z();

        for (auto& p : newPoints)
        {
            const scalar x = p.x();
            const scalar y = p.y();
            const scalar z = p.z();

            // Scale the angle by height
            const scalar localAngle = maxRotAngle*(z-zMin)/zSpan;

            p.x() = x*cos(localAngle)-y*sin(localAngle);
            p.y() = x*sin(localAngle)+y*cos(localAngle);
        }

        return tnewPoints;
    }
#};

code
#{
    const Time& tm = mesh().time();
    const pointField& p0 = points0();

    // Max twist pi at t=10
    const scalar maxRotAngle =
        constant::mathematical::pi*Foam::sin(degToRad(90.0/10.0*tm.value()));

    return twistColumn(maxRotAngle, p0);
#};


// ************************************************************************* //
