At the suggestion of Gilles Hennenfent, certain RSF programs now recognize unit1=, unit2=, etc keywords in addition to label1=, label2=, etc. This allows for more control on physical dimensionality.
Here is an example of having some fun with physical units:

  1. Create some data.
    bash$ sfspike n1=100 n2=100 > spike.rsf
    bash$ sfin spike.rsf
    spike.rsf:
    in="/var/scratch/spike.rsf@"
    esize=4 type=float form=native
    n1=100         d1=0.004       o1=0          label1="Time" unit1="s"
    n2=100         d2=0.1         o2=0          label2="Distance" unit2="km"
    10000 elements 40000 bytes
    
  2. Convert kilometers to feet:
    bash$ sfunits unit2=ft spike.rsf >> spike.rsf
    Converting "km" to "ft" on axis 2
    bash$ sfin spike.rsf
    spike.rsf:
    in="/var/scratch/spike.rsf@"
    esize=4 type=float form=native
    n1=100         d1=0.004       o1=0          label1="Time" unit1="s"
    n2=100         d2=328.084     o2=0          label2="Distance" unit2="ft"
    10000 elements 40000 bytes
    

    sfunits is a new script for unit conversion. It relies on the Unix units utility.

  3. Apply 2-D FFT transform.
    bash$ < spike.rsf sffft1 | sffft3 axis=2 > fft.rsf
    sffft3: padded to 200
    bash$ sfin fft.rsf
    fft.rsf:
    in="/var/scratch/fft.rsf@"
    esize=8 type=complex form=native
    n1=55          d1=2.31481     o1=0          label1="Frequency" unit1="1/s"
    n2=200         d2=1.524e-05   o2=-0.001524  label2="Wavenumber" unit2="1/ft"
    11000 elements 88000 bytes
    
  4. Transform back.
    bash$ < fft.rsf sffft3 axis=2 inv=y | sffft1 inv=y > back.rsf
    bash$ sfin back.rsf
    back.rsf:
    in="/var/scratch/back.rsf@"
    esize=4 type=float form=native
    n1=100         d1=0.00400001  o1=0          label1="Time" unit1="s"
    n2=100         d2=328.084     o2=0          label2="Distance" unit2="ft"
    10000 elements 40000 bytes
    

Warning: this is a substantial change that affects many programs and examples. Please report any problems.