mdsumner / ghrsst.coop

0 stars 0 forks source link

explore longitude array problem #2

Open mdsumner opened 7 months ago

mdsumner commented 7 months ago
f <- 360
while(TRUE) {

lon <- seq(-180, 180, length.out = f)
f <- f * 5
if (length(unique(diff(lon)) > 1)) stop() 
}

range(diff(lon))

src <-
"#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector rcpp_double(IntegerVector n){
  NumericVector v(n[0]);
  double start = -180.0; 
  double end = 180.0;
  double dv = (end - start)/n[0]; 
  for(int i=0; i<v.length(); ++i){
    v[i] = start + i * dv; 
  }
  return(v);
}

// [[Rcpp::export]]
NumericVector rcpp_float(IntegerVector n){
  NumericVector v(n[0]);
  double start = -180.0; 
  double end = 180.0;
  float dv = (float)(end - start)/(double)n[0]; 
  for(int i=0; i<v.length(); ++i){
   float val = start + i * dv; 
    v[i] = val; 
  }
  return(v);
}

"
library(Rcpp)
sourceCpp(code = src)
eps <- 4 * (1/1e5) #delta / 500

n_vals <- c(360 * 10^(seq(5, 0, by = -0.5)))
df <- numeric(length(n_vals))
plt <- F
if (plt) par(mfrow = c(length(n_vals), 1L), mar = rep(0, 4))

for (i in seq_along(n_vals)) {
  n <- n_vals[i]
  delta <- 360/n
  lon <- rcpp_double(n)
  lonf <- rcpp_float(n)

  if (plt) {
plot(NA, type = "n", xlab = "", ylab = "", xlim = c(-180, 180), ylim = c(-1, 1) * eps +  delta, main = n, sub = max(range(diff(lonf))))
points(lon[-1], diff(lon), pch = 19, cex = 0.8)
points(lonf[-1], diff(lonf), pch = 19, cex = 0.2, col = "red")
  }
  df[i ] <- max(abs(lon - lonf))
print(sprintf("n: %i, diff: %e, dist: %f", 
              as.integer(n), 
              df[i], geodist::geodist(cbind(lon = c(0, df[i]), lat = 0), measure = "geodesic", sequential = T)))
}