This file is indexed.

/usr/include/libwildmagic/Wm5MassSpringVolume.h is in libwildmagic-dev 5.13-1ubuntu3.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
// Geometric Tools, LLC
// Copyright (c) 1998-2014
// Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt
// http://www.geometrictools.com/License/Boost/LICENSE_1_0.txt
//
// File Version: 5.0.1 (2010/10/01)

#ifndef WM5MASSSPRINGVOLUME_H
#define WM5MASSSPRINGVOLUME_H

#include "Wm5PhysicsLIB.h"
#include "Wm5ParticleSystem.h"

namespace Wm5
{

template <typename Real, typename TVector>
class WM5_PHYSICS_ITEM MassSpringVolume : public ParticleSystem<Real,TVector>
{
public:
    // Construction and destruction.  This class represents an SxRxC array of
    // masses lying on in a volume and connected by an array of springs.  The
    // masses are indexed by mass[s][r][c] for 0 <= s < S, 0 <= r < R, and
    // 0 <= c < C.  The mass at interior position X[s][r][c] is connected by
    // springs to the masses at positions X[s][r-1][c], X[s][r+1][c],
    // X[s][r][c-1], X[s][r][c+1], X[s-1][r][c], and X[s+1][r][c].  Boundary
    // masses have springs connecting them to the obvious neighbors ("face"
    // mass has 5 neighbors, "edge" mass has 4 neighbors, "corner" mass has 3
    // neighbors).  The masses are arranged in lexicographical order:
    // position[c+C*(r+R*s)] = X[s][r][c] for 0 <= s < S, 0 <= r < R, and
    // 0 <= c < C.  The other arrays are stored similarly.
    MassSpringVolume (int numSlices, int numRows, int numCols, Real step);
    virtual ~MassSpringVolume ();

    int GetNumSlices () const;
    int GetNumRows () const;
    int GetNumCols () const;
    void SetMass (int slice, int row, int col, Real mass);
    Real GetMass (int slice, int row, int col) const;
    TVector*** Positions3D () const;
    TVector& Position (int slice, int row, int col);
    TVector*** Velocities3D () const;
    TVector& Velocity (int slice, int row, int col);

    // Each interior mass at (s,r,c) has 6 adjacent springs.  Face masses
    // have only 5 neighbors, edge masses have only 4 neighbors, and corner
    // masses have only 3 neighbors.  Each mass provides access to 3 adjacent
    // springs at (s,r,c+1), (s,r+1,c), and (s+1,r,c).  The face, edge, and
    // corner masses provide access to only an appropriate subset of these.
    // The caller is responsible for ensuring the validity of the (s,r,c)
    // inputs.
    Real& ConstantS (int slice, int row, int col);  // spring to (s+1,r,c)
    Real& LengthS (int slice, int row, int col);    // spring to (s+1,r,c)
    Real& ConstantR (int slice, int row, int col);  // spring to (s,r+1,c)
    Real& LengthR (int slice, int row, int col);    // spring to (s,r+1,c)
    Real& ConstantC (int slice, int row, int col);  // spring to (s,r,c+1)
    Real& LengthC (int slice, int row, int col);    // spring to (s,r,c+1)

    // Callback for acceleration (ODE solver uses x" = F/m) applied to
    // particle i.  The positions and velocities are not necessarily
    // mPositions and mVelocities since the ODE solver evaluates the
    // impulse function at intermediate positions.
    virtual TVector Acceleration (int i, Real time,
        const TVector* positions, const TVector* velocities);

    // The default external force is zero.  Derive a class from this one to
    // provide nonzero external forces such as gravity, wind, friction,
    // and so on.  This function is called by Acceleration(...) to append the
    // acceleration F/m generated by the external force F.
    virtual TVector ExternalAcceleration (int i, Real time,
        const TVector* positions, const TVector* velocities);

protected:
    using ParticleSystem<Real,TVector>::mInvMasses;
    using ParticleSystem<Real,TVector>::mPositions;
    using ParticleSystem<Real,TVector>::mVelocities;

    int GetIndex (int slice, int row, int col) const;
    void GetCoordinates (int i, int& slice, int& row, int& col) const;

    int mNumSlices;            // S
    int mNumRows;              // R
    int mNumCols;              // C
    int mSliceQuantity;        // R*C
    TVector*** mPositionGrid;  // S-by-R-by-C
    TVector*** mVelocityGrid;  // S-by-R-by-C

    int mNumSlicesM1;          // S-1
    int mNumRowsM1;            // R-1
    int mNumColsM1;            // C-1
    Real*** mConstantsS;       // (S-1)-by-R-by-C
    Real*** mLengthsS;         // (S-1)-by-R-by-C
    Real*** mConstantsR;       // S-by-(R-1)-by-C
    Real*** mLengthsR;         // S-by-(R-1)-by-C
    Real*** mConstantsC;       // S-by-R-by-(C-1)
    Real*** mLengthsC;         // S-by-R-by-(C-1)
};

typedef MassSpringVolume<float,Vector3f> MassSpringVolume3f;
typedef MassSpringVolume<double,Vector3d> MassSpringVolume3d;

}

#endif