cdm/src/main/java/ucar/nc2/dataset/conv/Cosmic1Convention.java
public double[] spin(double[] v1, double[] vs, double a) {

    //     implicit real*8(a-h,o-z)
    //     dimension v1(3),vs(3),vsn(3),v2(3),v3(3),s(3,3)
    //     Calculation of the unit vector around which
    //     the rotation should be done.
    double[] v2 = new double[3];
    double[] vsn = new double[3];
    double[] v3 = new double[3];

    double vsabs = Math.sqrt(vs[0] * vs[0] + vs[1] * vs[1]
            + vs[2] * vs[2]);

    for (int i = 0; i < 3; i++) {
      vsn[i] = vs[i] / vsabs;
    }

    // Calculation of the rotation matrix.

    double a1 = Math.cos(a);
    double a2 = 1.0 - a1;
    double a3 = Math.sin(a);
    double[][] s = new double[3][3];

    s[0][0] = a2 * vsn[0] * vsn[0] + a1;
    s[0][1] = a2 * vsn[0] * vsn[1] - a3 * vsn[2];
    s[0][2] = a2 * vsn[0] * vsn[2] + a3 * vsn[1];
    s[1][0] = a2 * vsn[1] * vsn[0] + a3 * vsn[2];
    s[1][1] = a2 * vsn[1] * vsn[1] + a1;
    s[1][2] = a2 * vsn[1] * vsn[2] - a3 * vsn[0];
    s[2][0] = a2 * vsn[2] * vsn[0] - a3 * vsn[1];
    s[2][1] = a2 * vsn[2] * vsn[1] + a3 * vsn[0];
    s[2][2] = a2 * vsn[2] * vsn[2] + a1;

    // Calculation of the rotated vector.

    for (int i = 0; i < 3; i++) {
      v3[i] = s[i][0] * v1[0] + s[i][1] * v1[1] + s[i][2] * v1[2];
    }

    System.arraycopy(v3, 0, v2, 0, 3);

    return v2;
  }
public double[] spin(double[] v1, double[] vs, double a) {

    //     implicit real*8(a-h,o-z)
    //     dimension v1(3),vs(3),vsn(3),v2(3),v3(3),s(3,3)
    //     Calculation of the unit vector around which
    //     the rotation should be done.
    double[] v2 = new double[3];
    double[] vsn = new double[3];
    double[] v3 = new double[3];

    double vsabs = Math.sqrt(vs[0] * vs[0] + vs[1] * vs[1]
            + vs[2] * vs[2]);

    for (int i = 0; i < 3; i++) {
      vsn[i] = vs[i] / vsabs;
    }

    // Calculation of the rotation matrix.

    double a1 = Math.cos(a);
    double a2 = 1.0 - a1;
    double a3 = Math.sin(a);
    double[][] s = new double[3][3];

    s[0][0] = a2 * vsn[0] * vsn[0] + a1;
    s[0][1] = a2 * vsn[0] * vsn[1] - a3 * vsn[2];
    s[0][2] = a2 * vsn[0] * vsn[2] + a3 * vsn[1];
    s[1][0] = a2 * vsn[1] * vsn[0] + a3 * vsn[2];
    s[1][1] = a2 * vsn[1] * vsn[1] + a1;
    s[1][2] = a2 * vsn[1] * vsn[2] - a3 * vsn[0];
    s[2][0] = a2 * vsn[2] * vsn[0] - a3 * vsn[1];
    s[2][1] = a2 * vsn[2] * vsn[1] + a3 * vsn[0];
    s[2][2] = a2 * vsn[2] * vsn[2] + a1;

    // Calculation of the rotated vector.

    for (int i = 0; i < 3; i++) {
      v3[i] = s[i][0] * v1[0] + s[i][1] * v1[1] + s[i][2] * v1[2];
    }

    System.arraycopy(v3, 0, v2, 0, 3);

    return v2;
  }
public double [ ] spin ( double [ ] v1 , double [ ] vs , double a ) { //     implicit real*8(a-h,o-z)
 //     dimension v1(3),vs(3),vsn(3),v2(3),v3(3),s(3,3)
 //     Calculation of the unit vector around which
 //     the rotation should be done.
 double [ ] v2 = new double [ 3 ] ; double [ ] vsn = new double [ 3 ] ; double [ ] v3 = new double [ 3 ] ; double vsabs = Math . sqrt ( vs [ 0 ] * vs [ 0 ] + vs [ 1 ] * vs [ 1 ] + vs [ 2 ] * vs [ 2 ] ) ; for ( int i = 0 ; i < 3 ; i ++ ) { vsn [ i ] = vs [ i ] / vsabs ; } // Calculation of the rotation matrix.
 double a1 = Math . cos ( a ) ; double a2 = 1.0 - a1 ; double a3 = Math . sin ( a ) ; double [ ] [ ] s = new double [ 3 ] [ 3 ] ; s [ 0 ] [ 0 ] = a2 * vsn [ 0 ] * vsn [ 0 ] + a1 ; s [ 0 ] [ 1 ] = a2 * vsn [ 0 ] * vsn [ 1 ] - a3 * vsn [ 2 ] ; s [ 0 ] [ 2 ] = a2 * vsn [ 0 ] * vsn [ 2 ] + a3 * vsn [ 1 ] ; s [ 1 ] [ 0 ] = a2 * vsn [ 1 ] * vsn [ 0 ] + a3 * vsn [ 2 ] ; s [ 1 ] [ 1 ] = a2 * vsn [ 1 ] * vsn [ 1 ] + a1 ; s [ 1 ] [ 2 ] = a2 * vsn [ 1 ] * vsn [ 2 ] - a3 * vsn [ 0 ] ; s [ 2 ] [ 0 ] = a2 * vsn [ 2 ] * vsn [ 0 ] - a3 * vsn [ 1 ] ; s [ 2 ] [ 1 ] = a2 * vsn [ 2 ] * vsn [ 1 ] + a3 * vsn [ 0 ] ; s [ 2 ] [ 2 ] = a2 * vsn [ 2 ] * vsn [ 2 ] + a1 ; // Calculation of the rotated vector.
 for ( int i = 0 ; i < 3 ; i ++ ) { v3 [ i ] = s [ i ] [ 0 ] * v1 [ 0 ] + s [ i ] [ 1 ] * v1 [ 1 ] + s [ i ] [ 2 ] * v1 [ 2 ] ; } System . arraycopy ( v3 , 0 , v2 , 0 , 3 ) ; return v2 ; }
----------------------------------------------------------------------
file       spin.f
<p/>
This subroutine rotates vector V1 around vector VS
at angle A. V2 is the vector after the rotation.
<p/>
<p/>
parameter  Input parameters:
v1   - Vector to be rotated
vs   - Vector around which to rotate v1
a    - angle of rotation
Output parameters:
v2   - output vector
<p/>
S.V.Sokolovskiy
URL: svn://ursa.cosmic.ucar.edu/trunk/src/roam/spin.f $ $Id: spin.f 10129 2008-07-30 17:10:52Z dhunt $
-----------------------------------------------------------------------

@param v1 - Vector to be rotated
@param vs - Vector around which to rotate v1
@param a  - angle of rotation
@return _more_
---------------------------------------------------------------------- file spin . f <p / > This subroutine rotates vector V1 around vector VS at angle A . V2 is the vector after the rotation . <p / > <p / > parameter Input parameters : v1 - Vector to be rotated vs - Vector around which to rotate v1 a - angle of rotation Output parameters : v2 - output vector <p / > S . V . Sokolovskiy URL : svn : // ursa . cosmic . ucar . edu / trunk / src / roam / spin . f $ $Id : spin . f 10129 2008 - 07 - 30 17 : 10 : 52Z dhunt $ -----------------------------------------------------------------------