/* Functions that calculate the gravitational potential and its first and second derivatives for the MAG_tesseroid. The gravity gradients can be calculated using the general formula of Grombein et al. (2010). The integrals are solved using the Gauss-Legendre Quadrature rule (Asgharzadeh et al., 2007). The derivatives of the potential are made with respect to the local coordinate system x->North, y->East, z->Up (away from center of the Earth). To maintain the standard convention, only for component gz the z axis is inverted, so a positive density results in positive gz. Example ------- To calculate the gzz component due to a MAG_tesseroid on a regular grid: #include #include "glq.h"r #include "constants.h" #include "grav_tess.h" int main() { MAG_TESSEROID tess = {1000, 44, 46, -1, 1, MEAN_EARTH_RADIUS - 100000, MEAN_EARTH_RADIUS}; GLQ *glqlon, *glqlat, *glqr; double lon, lat, r = MEAN_EARTH_RADIUS + 1500000, res; int order = 8; glqlon = glq_new(order, tess.w, tess.e); glqlat = glq_new(order, tess.s, tess.n); glqr = glq_new(order, tess.r1, tess.r2); for(lat = 20; lat <= 70; lat += 0.5) { for(lon = -25; lon <= 25; lon += 0.5) { res = tess_gzz(tess, lon, lat, r, *glqlon, *glqlat, *glqr); printf("%g %g %g\n", lon, lat, res); } } glq_free(glqlon); glq_free(glqlat); glq_free(glqr); return 0; } References ---------- Asgharzadeh, M.F., von Frese, R.R.B., Kim, H.R., Leftwich, T.E. & Kim, J.W. (2007): Spherical prism gravity effects by Gauss-Legendre quadrature integration. Geophysical Journal International, 169, 1-11. Grombein, T.; Seitz, K.; Heck, B. (2010): Untersuchungen zur effizienten Berechnung topographischer Effekte auf den Gradiententensor am Fallbeispiel der Satellitengradiometriemission GOCE. KIT Scientific Reports 7547, ISBN 978-3-86644-510-9, KIT Scientific Publishing, Karlsruhe, Germany. */ #ifndef _MAG_TESSEROIDS_GRAV_TESS_H_ #define _MAG_TESSEROIDS_GRAV_TESS_H_ /* Needed for definition of MAG_TESSEROID */ #include "geometry.h" /* Needed for definition of GLQ */ #include "glq.h" double calc_tess_model(MAG_TESSEROID *model, int size, double lonp, double latp, double rp, GLQ *glq_lon, GLQ *glq_lat, GLQ *glq_r, double (*field)(MAG_TESSEROID, double, double, double, GLQ, GLQ, GLQ)); void calc_tess_model_triple(MAG_TESSEROID *model, int size, double lonp, double latp, double rp, GLQ *glq_lon, GLQ *glq_lat, GLQ *glq_r, void (*field_triple)(MAG_TESSEROID, double, double, double, GLQ, GLQ, GLQ, double*), double *res); double calc_tess_model_adapt(MAG_TESSEROID *model, int size, double lonp, double latp, double rp, GLQ *glq_lon, GLQ *glq_lat, GLQ *glq_r, double (*field)(MAG_TESSEROID, double, double, double, GLQ, GLQ, GLQ), double ratio); double tess_gxx(MAG_TESSEROID tess, double lonp, double latp, double rp, GLQ glq_lon, GLQ glq_lat, GLQ glq_r); double tess_gxy(MAG_TESSEROID tess, double lonp, double latp, double rp, GLQ glq_lon, GLQ glq_lat, GLQ glq_r); double tess_gxz(MAG_TESSEROID tess, double lonp, double latp, double rp, GLQ glq_lon, GLQ glq_lat, GLQ glq_r); double tess_gyy(MAG_TESSEROID tess, double lonp, double latp, double rp, GLQ glq_lon, GLQ glq_lat, GLQ glq_r); double tess_gyz(MAG_TESSEROID tess, double lonp, double latp, double rp, GLQ glq_lon, GLQ glq_lat, GLQ glq_r); double tess_gzz(MAG_TESSEROID tess, double lonp, double latp, double rp, GLQ glq_lon, GLQ glq_lat, GLQ glq_r); void tess_gxz_gyz_gzz(MAG_TESSEROID tess, double lonp, double latp, double rp, GLQ glq_lon, GLQ glq_lat, GLQ glq_r, double *res); void tess_gxx_gxy_gxz(MAG_TESSEROID tess, double lonp, double latp, double rp, GLQ glq_lon, GLQ glq_lat, GLQ glq_r, double *res); void tess_gxy_gyy_gyz(MAG_TESSEROID tess, double lonp, double latp, double rp, GLQ glq_lon, GLQ glq_lat, GLQ glq_r, double *res); #endif