Source Code of the page Earth Gravity Calculator:
#INCLUDE ControlPanel.inc
<style>
#OutputPanel-grel { background-color: #ddf; }
#OutputPanel-w0, #InputPanel-wCal, #OutputPanel-wh, #OutputPanel-dw { background-color: #fed; }
#OutputPanel-g0, #OutputPanel-gh, #OutputPanel-dg { background-color: #dfd; }
</style>
<jscript>
var NumOfDigits = 7;
function CModel() {
// input
this.lat = 0; // deg, latitude
this.lng = 0; // deg, longitude
this.alt = 0; // m, altitude
this.wCal = 100; // units, weight mass in any mass units
this.phi = 0; // rad, latitude (->lat)
this.lamda = 0; // rad, longitude
// output, all values in metric units
this.grel = 0; // gh / g0, relative effective acceleration
this.g0 = 0; // effective acceleration on ground
this.g0r = 0;
this.g0x = 0;
this.g0y = 0;
this.g0z = 0;
this.g0G = 0; // pure gravitational acceleration on ground
this.g0Gr = 0;
this.g0Gx = 0;
this.g0Gy = 0;
this.g0Gz = 0;
this.a0C = 0; // centrifugal acceleration on ground
this.a0Cr = 0;
this.a0Cx = 0;
this.a0Cy = 0;
this.a0Cz = 0;
this.w0 = 0; // weight of mass at sea level
this.wh = 0; // weight of mass at altitude
this.dw = 0; // wh - wCal
this.gh = 0; // effective acceleration at ac altitude
this.ghr = 0;
this.ghx = 0;
this.ghy = 0;
this.ghz = 0;
this.ghG = 0; // pure gravitational acceleration at ac altitude
this.ghGr = 0;
this.ghGx = 0;
this.ghGy = 0;
this.ghGz = 0;
this.ahC = 0; // centrifugal acceleration at altitude
this.ahCr = 0;
this.ahCx = 0;
this.ahCy = 0;
this.ahCz = 0;
this.dg = 0; // (gh-g0)/g0
this.dgG = 0; // ghG - g0G
this.da = 0; // ahC - a0C
this.P0r = 0; // pos at sea level
this.P0x = 0;
this.P0y = 0;
this.P0z = 0;
this.Phr = 0; // pos at altitude
this.Phx = 0;
this.Phy = 0;
this.Phz = 0;
this.R = 0; // dist pos at sea level from earth center
this.Rh = 0; // dist pos at altitude from earth center
this.v = 0; // ac speed wrt geocentric coord sys
this.vRot0 = 0; // tangential earth rotation speed at pos at sea level
this.vRoth = 0; // tangential earth rotation speed at pos and alt
this.vEq = 0; // tangential speed of earth surface at equator
this.omega = 0; // = 2 * pi / T [rad/s], rotation speed of earth
// contstants
// GM = G * Mass of earth without mass of atmosphere:
this.G = 6.67408e-11;
this.M = 5.97236535672e24; // this.GM / this.G;
this.T = 86164.098903691; // s, https://en.wikipedia.org/wiki/Earth
this.Ra = 6378137; // m, http://earth-info.nga.mil/GandG/publications/tr8350.2/wgs84fin.pdf
this.Rb = 6356752.314245; // m, http://earth-info.nga.mil/GandG/publications/tr8350.2/wgs84fin.pdf
this.ge = 9.7803253359; // m/s^2, http://earth-info.nga.mil/GandG/publications/tr8350.2/wgs84fin.pdf
this.gp = 9.8321849378; // m/s^2, http://earth-info.nga.mil/GandG/publications/tr8350.2/wgs84fin.pdf
this.GM = 3.986004418e14; // m^3/s^2, http://earth-info.nga.mil/GandG/publications/tr8350.2/wgs84fin.pdf
// units
this.SpeedUnits = [ 'm/s', 'km/h', 'mph' ];
this.SpeedMults = [ 1, 1/3.6, 0.44704 ];
this.SpeedUnitIx = 1;
this.SpeedUnit = 'km/h';
this.SpeedMult = 1/3.6;
this.AltUnits = [ 'm', 'ft', 'FL' ];
this.AltMults = [ 1, 0.3048, 30.48 ];
this.AltUnitIx = 0;
this.AltUnit = 'm';
this.AltMult = 1;
this.LenUnits = [ 'm', 'km', 'mi' ];
this.LenMults = [ 1, 1000, 1609.344 ];
this.LenUnitIx = 1;
this.LenUnit = 'km';
this.LenMult = 1000;
}
CModel.prototype.Reset = function() {
this.lat = 0; // deg
this.lng = 0; // deg
this.alt = 0; // m
this.calAlt = 0;
this.wCal = 100; // kg
}
CModel.prototype.Update = function() {
// functions
var sin = Math.sin;
var cos = Math.cos;
var sqrt = Math.sqrt;
function sqr( x ) { return x * x; }
function len( x, y ) { return sqrt( sqr(x) + sqr(y) ); }
function rad( a ) { return a * Math.PI / 180; }
function sp( x1, y1, x2, y2 ) { return x1 * x2 + y1 * y2; } // scalar product
// setup units
this.SpeedUnit = this.SpeedUnits[this.SpeedUnitIx];
this.SpeedMult = this.SpeedMults[this.SpeedUnitIx]
this.AltUnit = this.AltUnits[this.AltUnitIx];
this.AltMult = this.AltMults[this.AltUnitIx];
this.LenUnit = this.LenUnits[this.LenUnitIx];
this.LenMult = this.LenMults[this.LenUnitIx];
// limit inputs
if (this.lat < -90) this.lat = -90;
if (this.lat > 90) this.lat = 90;
if (this.alt < 0) this.alt = 0;
if (this.alt > 1000000) this.alt = 1000000;
if (this.wCal < 0) this.wCal = 0;
// angles in radian, omega, GM
this.phi = rad( this.lat );
this.lambda = rad( this.lng );
if (this.T == 0) {
this.omega = 0;
} else {
this.omega = 2 * Math.PI / this.T;
}
var a = this.Ra;
var b = this.Rb;
var cosp = cos( this.phi );
var sinp = sin( this.phi );
var cosl = cos( this.lambda );
var sinl = sin( this.lambda );
var cosp2 = sqr( cosp );
var sinp2 = sqr( sinp );
var a2 = sqr( a );
var b2 = sqr( b );
// positions
var eps = sqrt( a2 - b2 ) / a;
var Nphi = a / sqrt(1 - sqr(eps * sinp));
this.P0r = Nphi * cosp;
this.P0x = this.P0r * cosl;
this.P0y = this.P0r * sinl;
this.P0z = Nphi * (1 - sqr(eps)) * sinp;
this.Phr = (Nphi + this.alt) * cosp;
this.Phx = this.Phr * cosl;
this.Phy = this.Phr * sinl;
this.Phz = (Nphi * (1 - sqr(eps)) + this.alt) * sinp;
this.R = len( this.P0r, this.P0z );
this.Rh = len( this.Phr, this.Phz );
// earth accelerations
this.a0Cr = sqr(this.omega) * this.P0r;
this.a0Cx = this.a0Cr * cosl;
this.a0Cy = this.a0Cr * sinl;
this.a0Cz = 0;
this.a0C = len( this.a0Cr, this.a0Cz );
this.g0 = ( a * this.ge * cosp2 + b * this.gp * sinp2 ) / sqrt( a2 * cosp2 + b2 * sinp2 );
this.g0r = - this.g0 * cosp;
this.g0x = this.g0r * cosl;
this.g0y = this.g0r * sinl;
this.g0z = - this.g0 * sinp;
this.g0Gr = this.g0r - this.a0Cr;
this.g0Gx = this.g0x - this.a0Cx;
this.g0Gy = this.g0y - this.a0Cy;
this.g0Gz = this.g0z - this.a0Cz;
this.g0G = len( this.g0Gr, this.g0Gz );
// rotation speeds
this.vEq = this.omega * a;
this.vRot0 = this.omega * this.P0r;
this.vRoth = this.omega * this.Phr;
// accelerations at altiitude
this.ahC = sqr(this.omega) * this.Phr;
this.ahCr = this.ahC;
this.ahCx = this.ahCr * cosl;
this.ahCy = this.ahCr * sinl;
this.ahCz = 0;
var f = (a - b) / a;
var m = sqr(this.omega * a) * b / this.GM;
this.gh = this.g0 * ( 1 - (2 / a) * ( 1 + f + m - 2 * f * sinp2 ) * this.alt + (3 / a2) * sqr(this.alt) );
this.ghr = - this.gh * cosp;
this.ghx = this.ghr * cosl;
this.ghy = this.ghr * sinl;
this.ghz = - this.gh * sinp;
this.ghGr = this.ghr - this.ahCr;
this.ghGx = this.ghx - this.ahCx;
this.ghGy = this.ghy - this.ahCy;
this.ghGz = this.ghz - this.ahCz;
this.ghG = len( this.ghGr, this.ghGz );
this.dg = this.gh - this.g0;
this.dgG = this.ghG - this.g0G;
this.da = this.ahC - this.a0C;
// relative acceleration
this.grel = (this.gh - this.g0) / this.g0;
// weights
this.w0 = this.wCal;
this.wh = this.w0 * (this.gh / this.g0);
this.dw = this.wh - this.wCal;
}
var Model = new CModel();
function UpdateAll() {
Model.Update();
ControlPanels.Update();
}
function Reset() {
Model.Reset();
UpdateAll();
}
ControlPanels.NewPanel( {
Name: 'InputPanel',
ModelRef: 'Model',
OnModelChange: UpdateAll,
Format: 'std',
Digits: NumOfDigits,
NCols: 2
}
).AddHeader( {
Text: 'Position and Test Weight Data',
ColSpan: 3
}
).AddHeader( {
Text: ControlPanels.ResetButtonR()
}
).AddTextField( {
Name: 'lat',
Label: 'Lat',
Units: '°',
ConvToModelFunc: function(s) { return NumFormatter.DmsStrToNum( s ); },
}
).AddTextField( {
Name: 'lng',
Label: 'Long',
Units: '°',
ConvToModelFunc: function(s) { return NumFormatter.DmsStrToNum( s ); },
}
).AddTextField( {
Name: 'alt',
Label: 'Alt',
UnitsRef: 'AltUnit',
MultRef: 'AltMult'
}
).AddTextField( {
Name: 'wCal',
Label: 'Weight',
Units: 'units',
}
).Render();
ControlPanels.NewPanel( {
Name: 'UnitsPanel',
ModelRef: 'Model',
OnModelChange: UpdateAll,
NCols: 3
}
).AddHeader( {
Text: 'Units',
ColSpan: 6
}
).AddRadiobuttonField( {
Name: 'SpeedUnitIx',
ValueType: 'int',
Label: 'Speed',
NCols: 3,
Items: [
{ Name: 'm/s', Value: '0' },
{ Name: 'km/h', Value: '1' },
{ Name: 'mph', Value: '2' }
]
}
).AddRadiobuttonField( {
Name: 'AltUnitIx',
ValueType: 'int',
Label: 'Alt',
NCols: 3,
Items: [
{ Name: 'm', Value: '0' },
{ Name: 'ft', Value: '1' },
{ Name: 'FL', Value: '2' }
]
}
).AddRadiobuttonField( {
Name: 'LenUnitIx',
ValueType: 'int',
Label: 'Length',
NCols: 3,
Items: [
{ Name: 'm', Value: '0' },
{ Name: 'km', Value: '1' },
{ Name: 'mi', Value: '2' }
]
}
).Render();
ControlPanels.NewPanel( {
Name: 'OutputPanel',
ModelRef: 'Model',
NCols: 3,
Format: 'std',
Digits: NumOfDigits,
ReadOnly: true
}
).AddHeader( {
Text: 'Results',
ColSpan: 6
}
).AddTextField( {
Name: 'w0',
Label: 'W<sub>o</sub>',
Units: 'units'
}
).AddTextField( {
Name: 'wh',
Label: 'W<sub>h</sub>',
Units: 'units'
}
).AddTextField( {
Name: 'dw',
Label: 'W<sub>h</sub> - W<sub>cal</sub>',
Units: 'units'
}
).AddTextField( {
Name: 'g0',
Label: 'g<sub>o</sub>',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'gh',
Label: 'g<sub>h</sub>',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'dg',
Label: 'g<sub>h</sub> - g<sub>o</sub>',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'g0G',
Label: 'g<sub>oG</sub>',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'ghG',
Label: 'g<sub>hG</sub>',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'dgG',
Label: 'g<sub>hG</sub> - g<sub>oG</sub>',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'a0C',
Label: 'a<sub>oC</sub>',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'ahC',
Label: 'a<sub>hC</sub>',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'da',
Label: 'a<sub>hC</sub> - a<sub>oC</sub>',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'vRot0',
Label: 'v<sub>o</sub>',
UnitsRef: 'SpeedUnit',
MultRef: 'SpeedMult'
}
).AddTextField( {
Name: 'vRoth',
Label: 'v<sub>h</sub>',
UnitsRef: 'SpeedUnit',
MultRef: 'SpeedMult'
}
).AddTextField( {
Name: 'vEq',
Label: 'v<sub>eq</sub>',
UnitsRef: 'SpeedUnit',
MultRef: 'SpeedMult'
}
).AddTextField( {
Name: 'R',
Label: 'R<sub>o</sub>',
UnitsRef: 'LenUnit',
MultRef: 'LenMult'
}
).AddTextField( {
Name: 'Rh',
Label: 'R<sub>h</sub>',
UnitsRef: 'LenUnit',
MultRef: 'LenMult'
}
).AddTextField( {
Name: 'grel',
Label: '(g<sub>h</sub>-g<sub>o</sub>)/g<sub>o</sub>',
Mult: 0.01,
Units: '%',
}
).Render();
ControlPanels.NewPanel( {
Name: 'VectorsPanel',
ModelRef: 'Model',
NCols: 3,
Format: 'std',
Digits: NumOfDigits,
ReadOnly: true
}
).AddHeader( {
Text: 'Vector-Results',
ColSpan: 6
}
).AddTextField( {
Name: 'P0x',
Label: 'P<sub>o</sub>: x',
UnitsRef: 'LenUnit',
MultRef: 'LenMult'
}
).AddTextField( {
Name: 'P0y',
Label: 'y',
UnitsRef: 'LenUnit',
MultRef: 'LenMult'
}
).AddTextField( {
Name: 'P0z',
Label: 'z',
UnitsRef: 'LenUnit',
MultRef: 'LenMult'
}
).AddTextField( {
Name: 'Phx',
Label: 'P<sub>h</sub>: x',
UnitsRef: 'LenUnit',
MultRef: 'LenMult'
}
).AddTextField( {
Name: 'Phy',
Label: 'y',
UnitsRef: 'LenUnit',
MultRef: 'LenMult'
}
).AddTextField( {
Name: 'Phz',
Label: 'z',
UnitsRef: 'LenUnit',
MultRef: 'LenMult'
}
).AddTextField( {
Name: 'g0x',
Label: 'g<sub>o</sub>: x',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'g0y',
Label: 'y',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'g0z',
Label: 'z',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'g0Gx',
Label: 'g<sub>oG</sub>: x',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'g0Gy',
Label: 'y',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'g0Gz',
Label: 'z',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'a0Cx',
Label: 'a<sub>oC</sub>: x',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'a0Cy',
Label: 'y',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'a0Cz',
Label: 'z',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'ghx',
Label: 'g<sub>h</sub>: x',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'ghy',
Label: 'y',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'ghz',
Label: 'z',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'ghGx',
Label: 'g<sub>hG</sub>: x',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'ghGy',
Label: 'y',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'ghGz',
Label: 'z',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'ahCx',
Label: 'a<sub>hC</sub>: x',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'ahCy',
Label: 'y',
Units: 'm/s<sup>2</sup>'
}
).AddTextField( {
Name: 'ahCz',
Label: 'z',
Units: 'm/s<sup>2</sup>'
}
).Render();
ControlPanels.NewPanel( {
Name: 'ParameterPanel',
ModelRef: 'Model',
OnModelChange: UpdateAll,
Format: 'std',
Digits: NumOfDigits,
NCols: 2,
ReadOnly: true,
}
).AddHeader( {
Text: 'Earth Parameters',
ColSpan: 4
}
).AddTextField( {
Name: 'M',
Label: 'Mass',
Units: 'kg'
}
).AddTextField( {
Name: 'T',
Label: 'RotPeriod',
Units: 'h',
Mult: 3600,
}
).AddTextField( {
Name: 'Ra',
Label: 'R<sub>eq</sub>',
Units: 'km',
Mult: 1000,
}
).AddTextField( {
Name: 'Rb',
Label: 'R<sub>pol</sub>',
Units: 'km',
Mult: 1000,
}
).AddTextField( {
Name: 'ge',
Label: 'g<sub>eq</sub>',
Units: 'm/s<sup>2</sup>',
}
).AddTextField( {
Name: 'gp',
Label: 'g<sub>pol</sub>',
Units: 'm/s<sup>2</sup>',
}
).Render();
xOnLoad( UpdateAll );
</jscript>