@@ -91,6 +91,10 @@ struct GRAVFFT_CTRL {
91
91
bool active ;
92
92
double value ;
93
93
} I ;
94
+ struct GRAVFFT_M { /* -M<mgal_at_45> */
95
+ bool active ;
96
+ double mgal_at_45 ;
97
+ } M ;
94
98
struct GRAVFFT_N { /* -N[f|q|s<n_columns>/<n_rows>][+e|m|n][+t<width>][+w[<suffix>]][+z[p]] */
95
99
bool active ;
96
100
struct GMT_FFT_INFO * info ;
@@ -315,6 +319,10 @@ static int parse (struct GMT_CTRL *GMT, struct GRAVFFT_CTRL *Ctrl, struct GMT_OP
315
319
else
316
320
n_errors += gmt_default_option_error (GMT , opt );
317
321
break ;
322
+ case 'M' : /* Miligals at 45 degrees */
323
+ n_errors += gmt_M_repeated_module_option (API , Ctrl -> M .active );
324
+ sscanf (opt -> arg , "%lf" , & Ctrl -> M .mgal_at_45 );
325
+ break ;
318
326
case 'N' :
319
327
n_errors += gmt_M_repeated_module_option (API , Ctrl -> N .active );
320
328
if (popt && gmt_M_compat_check (GMT , 4 )) { /* Got both old -L and -N; append */
@@ -414,6 +422,8 @@ static int parse (struct GMT_CTRL *GMT, struct GRAVFFT_CTRL *Ctrl, struct GMT_OP
414
422
n_errors += gmt_M_check_condition (GMT , (Ctrl -> misc .from_top || Ctrl -> misc .from_below ) &&
415
423
!(Ctrl -> F .mode == GRAVFFT_FAA || Ctrl -> F .mode == GRAVFFT_GEOID ),
416
424
"Theoretical admittances are only defined for FAA or GEOID.\n" );
425
+
426
+ if (!Ctrl -> M .active ) Ctrl -> M .mgal_at_45 = 980619.9203 ; /* Moritz's 1980 IGF value for gravity in mGal at 45 degrees latitude */
417
427
418
428
return (n_errors ? GMT_PARSE_ERROR : GMT_NOERROR );
419
429
}
@@ -422,7 +432,7 @@ static int usage (struct GMTAPI_CTRL *API, int level) {
422
432
const char * name = gmt_show_name_and_purpose (API , THIS_MODULE_LIB , THIS_MODULE_CLASSIC_NAME , THIS_MODULE_PURPOSE );
423
433
if (level == GMT_MODULE_PURPOSE ) return (GMT_NOERROR );
424
434
GMT_Usage (API , 0 , "usage: %s %s [<ingrid2>] -G%s [-C<n/wavelength/mean_depth/tbw>] "
425
- "[-D<density>] [-E<n_terms>] [-F[f[+s|z]|b|g|v|n|e]] [-I<cbktw>] [-N%s] [-Q] [-S] "
435
+ "[-D<density>] [-E<n_terms>] [-F[f[+s|z]|b|g|v|n|e]] [-I<cbktw>] [-M<mgal_at_45>] [- N%s] [-Q] [-S] "
426
436
"[-T<te/rl/rm/rw>[/<ri>][+m]] [%s] [-W<wd>[k]] [-Z<zm>[/<zl>]] [-fg] [%s]\n" ,
427
437
name , GMT_INGRID , GMT_OUTGRID , GMT_FFT_OPT , GMT_V_OPT , GMT_PAR_OPT );
428
438
@@ -468,6 +478,8 @@ static int usage (struct GMTAPI_CTRL *API, int level) {
468
478
GMT_Usage (API , 3 , "k: Use km or wavelength unit [m]." );
469
479
GMT_Usage (API , 3 , "t: Write a forth column with \"elastic plate\" theoretical admittance." );
470
480
GMT_Usage (API , 3 , "w: Write wavelength instead of wavenumber." );
481
+ GMT_Usage (API , 1 , "\n-M<mgal_at_45>" );
482
+ GMT_Usage (API , -2 , "Value for gravity in mGal at 45 degrees latitude. Default is 980619.9203 mGal (Moritz's 1980 IGF value)." );
471
483
GMT_FFT_Option (API , 'N' , GMT_FFT_DIM , "Choose or inquire about suitable grid dimensions for FFT, and set modifiers." );
472
484
GMT_Usage (API , -2 , "Warning: both -D -T...+m and -Q will implicitly set -N's +h." );
473
485
GMT_Usage (API , 1 , "\n-Q Writes out a grid with the flexural topography (with z positive up) "
@@ -880,7 +892,6 @@ GMT_LOCAL void gravfft_do_isostasy (struct GMT_CTRL *GMT, struct GMT_GRID *Grid,
880
892
}
881
893
}
882
894
883
- #define MGAL_AT_45 980619.9203 /* Moritz's 1980 IGF value for gravity in mGal at 45 degrees latitude */
884
895
GMT_LOCAL void gravfft_do_parker (struct GMT_CTRL * GMT , struct GMT_GRID * Grid , struct GRAVFFT_CTRL * Ctrl , struct GMT_FFT_WAVENUMBER * K , gmt_grdfloat * raised , uint64_t n , double rho ) {
885
896
uint64_t i , k ;
886
897
double f , p , t , mk , kx , ky , v , c ;
@@ -909,7 +920,7 @@ GMT_LOCAL void gravfft_do_parker (struct GMT_CTRL *GMT, struct GMT_GRID *Grid, s
909
920
datac [k + 1 ] += (gmt_grdfloat ) (v * raised [k + 1 ]);
910
921
break ;
911
922
case GRAVFFT_GEOID :
912
- if (mk > 0.0 ) v /= (MGAL_AT_45 * mk );
923
+ if (mk > 0.0 ) v /= (Ctrl -> M . mgal_at_45 * mk );
913
924
datac [k ] += (gmt_grdfloat ) (v * raised [k ]);
914
925
datac [k + 1 ] += (gmt_grdfloat ) (v * raised [k + 1 ]);
915
926
break ;
@@ -921,15 +932,15 @@ GMT_LOCAL void gravfft_do_parker (struct GMT_CTRL *GMT, struct GMT_GRID *Grid, s
921
932
case GRAVFFT_DEFL_EAST :
922
933
if (mk > 0.0 ) { /* Scale tan (xslope) ~ slope to microradians */
923
934
kx = gmt_fft_any_wave (k , GMT_FFT_K_IS_KX , K );
924
- v *= 1.e6 * (- kx / (MGAL_AT_45 * mk ));
935
+ v *= 1.e6 * (- kx / (Ctrl -> M . mgal_at_45 * mk ));
925
936
}
926
937
datac [k ] += (gmt_grdfloat ) (- v * raised [k + 1 ]);
927
938
datac [k + 1 ] += (gmt_grdfloat ) ( v * raised [k ]);
928
939
break ;
929
940
case GRAVFFT_DEFL_NORTH :
930
941
if (mk > 0.0 ) { /* Scale tan (yslope) ~ slope to microradians */
931
942
ky = gmt_fft_any_wave (k , GMT_FFT_K_IS_KY , K );
932
- v *= 1.e6 * (- ky / (MGAL_AT_45 * mk ));
943
+ v *= 1.e6 * (- ky / (Ctrl -> M . mgal_at_45 * mk ));
933
944
}
934
945
datac [k ] += (gmt_grdfloat ) ( v * raised [k + 1 ]);
935
946
datac [k + 1 ] += (gmt_grdfloat ) (- v * raised [k ]);
@@ -1214,15 +1225,15 @@ GMT_LOCAL void gravfft_load_from_top_grid (struct GMT_CTRL *GMT, struct GMT_GRID
1214
1225
case GRAVFFT_DEFL_EAST :
1215
1226
if (mk > 0.0 ) { /* Scale tan (xslope) ~ slope to microradians */
1216
1227
double kx = gmt_fft_any_wave (k , GMT_FFT_K_IS_KX , K );
1217
- t1 *= 1.e6 * (- kx / (MGAL_AT_45 * mk ));
1228
+ t1 *= 1.e6 * (- kx / (Ctrl -> M . mgal_at_45 * mk ));
1218
1229
}
1219
1230
datac [k ] += (gmt_grdfloat ) (- (Ctrl -> T .rho_cw * t1 * t2 ) * t / f * raised [k ]);
1220
1231
datac [k + 1 ] += (gmt_grdfloat ) ((Ctrl -> T .rho_cw * t1 * t2 ) * t / f * raised [k + 1 ]);
1221
1232
break ;
1222
1233
case GRAVFFT_DEFL_NORTH :
1223
1234
if (mk > 0.0 ) { /* Scale tan (yslope) ~ slope to microradians */
1224
1235
double ky = gmt_fft_any_wave (k , GMT_FFT_K_IS_KY , K );
1225
- t1 *= 1.e6 * (- ky / (MGAL_AT_45 * mk ));
1236
+ t1 *= 1.e6 * (- ky / (Ctrl -> M . mgal_at_45 * mk ));
1226
1237
}
1227
1238
datac [k ] += (gmt_grdfloat ) ((Ctrl -> T .rho_cw * t1 * t2 ) * t / f * raised [k ]);
1228
1239
datac [k + 1 ] += (gmt_grdfloat ) (- (Ctrl -> T .rho_cw * t1 * t2 ) * t / f * raised [k + 1 ]);
0 commit comments