From a58ce452fca67a09c33b1153b6fce01c83f68826 Mon Sep 17 00:00:00 2001
From: Raimon Tolosana-Delgado <tolosa53@fwg206.ad.fz-rossendorf.de>
Date: Tue, 14 Dec 2021 11:16:20 +0100
Subject: [PATCH] turning bands bug in getUnitVec corrected

---
 R/geostats.R     |  6 +++++-
 src/gmGeostats.c | 22 +++++++++++++++++++---
 2 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/R/geostats.R b/R/geostats.R
index 46bed0e..481d333 100644
--- a/R/geostats.R
+++ b/R/geostats.R
@@ -70,7 +70,11 @@ gsi.calcCgram <- function(X,Y,vgram,ijEqual=FALSE) {
   structure(erg$C,dim=c(d*nX,d*nY))
 }
 
-
+gsiGetUnitVec <- function(dimX,ip) {
+    erg = .C("getUnitvecR",dimX=checkInt(dimX,1),ip=checkInt(ip,1),unitvec=numeric(dimX))
+    unitvec = erg$unitvec
+    unitvec
+    }
 
 
 
diff --git a/src/gmGeostats.c b/src/gmGeostats.c
index c2c4cf3..046f544 100644
--- a/src/gmGeostats.c
+++ b/src/gmGeostats.c
@@ -52,7 +52,7 @@ double invBitExp2(int i) {
 }
 
 
-/* invBitExp2
+/* invBitExp
  inverts the sequence of the digits in b-adict representation. 
  this is used for the generation of almost equally space directions in 3D
  
@@ -288,7 +288,7 @@ void fbandExp(int n, /* number of locations */
   /* Find the smallest proj; select a random exponential point "x0" left 
    * from it with lambda "2range" away. Domain = (x0, max(projs)) */
   sign = unif_rand()>0.5? 1 : -1; /* start + or - randomly */
-  effrange = range;  /*  ATTENTION: 3*range, but range is inverted ??? */
+  effrange = range/3.0;  /*  ATTENTION: 3*range, but range is inverted ??? */
   x0 = projs[0];  /* does min exist?? */
   x1 = projs[0];
   for(i=1;i<n;i++) {
@@ -334,7 +334,7 @@ void getUnitvec(
   if(dimX>3)
     error("no expression for unit vectors in dimension larger than 3");
   if( dimX==3) {
-    d1=invBitExp2(ip)*M_2_PI;
+    d1=invBitExp2(ip)*2*M_PI;
     d2=invBitExp(ip,3);
     d3 = sqrt(1-d2*d2); 
     unitvec[2] = d2;
@@ -352,6 +352,20 @@ void getUnitvec(
 
 
 
+static R_NativePrimitiveArgType getUnitvecR_t[] = {  /* INTSXP,REALSXP */
+  /* dimX,    iP,  unitvec */
+  INTSXP,INTSXP,REALSXP
+};
+
+
+void getUnitvecR(int * dimX,
+		 int * ip,
+		 double *unitvec
+		 ) {
+  getUnitvec(*dimX,*ip,unitvec);
+}
+
+
 static R_NativePrimitiveArgType CMVTurningBands_t[] = {  /* INTSXP,REALSXP */
  /* dimX,    X,  dimZ    Z     nBands sqrtNug nCgram  typeCgr   A    sqrtSill moreCgr */
  INTSXP,REALSXP,INTSXP,REALSXP,INTSXP,REALSXP,INTSXP,INTSXP,REALSXP,REALSXP,REALSXP   
@@ -872,9 +886,11 @@ static R_CMethodDef cMethods[] = {
   {"CCondSim", (DL_FUNC) & CCondSim, 18,  CCondSim_t},
   {"anaForwardC", (DL_FUNC) &anaForwardC, 8, anaForwardC_t},
   {"anaBackwardC", (DL_FUNC) &anaBackwardC, 8, anaBackwardC_t},
+  {"getUnitvecR", (DL_FUNC) &getUnitvecR, 3, getUnitvecR_t},
   {NULL, NULL, 0}
 };
 
+
 //{"CMVTurningBands2", (DL_FUNC) &CMVTurningBands2, 11, CMVTurningBands2_t},
 
 
-- 
GitLab