井斜计算的代码备份

不管有多烂,总是需要用的,备份一下 wellbore trajectory computation

我确定用不了三天,我就会忘记了这些东西是怎么捣鼓出来的,特别是乱七八糟的赋值与命名,所以,一定需要备份一下这些个代码,以后需要用的时候直接来扒拉。。。

1.采用校正角平均方法计算井斜

书名=定向钻井设计与计算 (第二版)

作者=韩志勇编

出版日期=2007.11

出版社=中国石油大学出版社

具体算法:校正角平均法见P75页

要特别注意角度与弧度之间的换算

2.内插值(斜深)计算

采用内插一个斜深,得到井斜与方位,然后用上面的校正角平均法重新计算一次,为什么要用这么没道理的方法呢,因为书上讲的那些个方法我算出来的结果差别很大,又找不到原因。。。

3.最简单的输入垂深返回斜深

给一个垂深,按最简单的直线模型算一个斜深、井斜与方位。

<-----------------

以下是这堆烂代码

初始化数据,主要是要避免参与运算时,第一行数据中方位角不要为0

init_data <- function(data){
  if (data[1,1]==0){
    data <- data[-1,]
  }
  data <- rbind(c(0,0,data[1,3]),data)
  return(data)
}

井斜计算-校正角平均法

trajcal <- function(data,H=0,S=0,N=0,E=0){
  depth=data[,1]
  dev=data[,2]
  az=data[,3]
  tmp <- c(depth=0,dev=0,az=az[1],H=H,N=N,E=E,V=0,allaz=0)
  tmp1<- NULL
  for(i in 2:length(depth)){
  delta_len <- depth[i]-depth[i-1]
  delta_dev <- (dev[i]-dev[i-1])*pi/180
  mean_dev <- 0.5*(dev[i]+dev[i-1])*pi/180
  delta_az <- az[i]-az[i-1]
  if (delta_az>180){
      deltaaz <- (deltaaz-360)pi/180
      mean_az <- (az[i]+az[i-1]-360)pi/360
  }else if(deltaaz<(-180)){
      deltaaz <- (deltaaz+360)*pi/180
      meanaz <- (az[i]+az[i-1]+360)pi/360
  }else{
      deltaaz <- deltaazpi/180
      mean_az <- (az[i]+az[i-1])*pi/360
  }

delta_H <- (1-delta_dev^2/24)*delta_len*cos(mean_dev)

deltaS <- (1-deltadev^2/24)delta_lensin(mean_dev)

delta_N <- (1-(delta_dev^2+delta_az^2)/24)*delta_len*sin(mean_dev)*cos(mean_az)
delta_E <- (1-(delta_dev^2+delta_az^2)/24)*delta_len*sin(mean_dev)*sin(mean_az)

H <- H+delta_H
N <- N+delta_N
E <- E+delta_E
V <- sqrt(N^2+E^2)

if (N>0){
 allaz <- atan(E/N)*180/pi
  }else if(N<0){
    allaz <- atan(E/N)*180/pi+180
}
if (allaz<0){
  allaz <- allaz+360
}

tmp1 <- cbind(depth=depth[i],dev=dev[i],az=az[i],H,N,E,V,allaz)
tmp <- rbind(tmp,tmp1)  

} return(tmp) }

内插,给一个或一堆井深,算出对应的垂深与坐标,这样就可以把一堆傻傻的数据换算到垂深尺度上了。

trajint <- function(data,indepth){
  #调用trajcal函数进行初始的井斜计算
  result_data <- trajcal(data)
  tmp <- NULL
  for (i in 1:length(indepth[, 1])) {
#找到插值运算的第一个井深     
      x <- which(data[,1]>indepth[i,1])[1]
      if (is.na(x)){
        break
      }else{           
      deltaL <- indepth[i,1]-data[x-1,1]
      alpha <- data[x-1,2]+deltaL*(data[x,2]-data[x-1,2])/(data[x,1]-data[x-1,1])
  deltaaz <- data[x,3]-data[x-1,3]
az <- data[x-1,3]+deltaL*deltaaz/(data[x,1]-data[x-1,1])

#按这个井斜方位计算一次   
  delta_alpha <- (alpha-data[x-1,2])*pi/180
  mean_alpha <- 0.5*(alpha+data[x-1,2])*pi/180
  delta_az <- az-data[x-1,3]
  if (delta_az > 180){
      delta_az <- (delta_az-360)*pi/180
      mean_az <- (az+data[x-1,3]-360)*pi/360
  }else if(delta_az < (-180)){
      delta_az <- (delta_az+360)*pi/180
      mean_az <- (az+data[x-1,3]+360)*pi/360
  }else{
      delta_az <- delta_az*pi/180
      mean_az <- (az+data[x-1,3])*pi/360
  }

    delta_D <- (1-delta_alpha^2/24)*deltaL*cos(mean_alpha)
#     delta_S <- (1-delta_dev^2/24)*delta_len*sin(mean_dev)
    delta_N <- (1-(delta_alpha^2+delta_az^2)/24)*deltaL*sin(mean_alpha)*cos(mean_az)
    delta_E <- (1-(delta_alpha^2+delta_az^2)/24)*deltaL*sin(mean_alpha)*sin(mean_az)
  
    allH <- result_data[x-1,4]+delta_D
    allN <- result_data[x-1,5]+delta_N
    allE <- result_data[x-1,6]+delta_E
    allV <- sqrt(allN^2+allE^2)

   if (allN>0){
     allAZ <- atan(allE/allN)*180/pi
      }else if(allN<0){
        allAZ <- atan(allE/allN)*180/pi+180
    }
    if (allAZ<0){
      allAZ <- allAZ+360
    }
    tmp <- rbind(tmp, cbind(depth=indepth[i,1],dev=alpha,az=az,TVD=allH,N=allN,E=allE,V=allV,allAZ=allAZ,indepth[i,]))
      }
 }
    return(tmp)
}

插入垂深,反算斜深与坐标

trajinttvd <- function(data,tvd){
  #调用trajcal函数进行初始的井斜计算
  result_data <- trajcal(data)
  x <- which(result_data[,4]>tvd)[1]
  deltaD <- tvd-result_data[x-1,4]
  D <- result_data[x,4]-result_data[x-1,4]
  depth <- result_data[x-1,1]+(result_data[x,1]-result_data[x-1,1])*delta_D/D
  alpha <- result_data[x-1,2]+(result_data[x,2]-result_data[x-1,2])*delta_D/D
  az <- result_data[x-1,3]+(result_data[x,3]-result_data[x-1,3])*delta_D/D
  result <- cbind(depth,alpha,az)
  return(result)
}

范例

setwd("~/code/R_code/hf")

setwd("E:/项目/") awb <- read.table("23.txt") awb[1,3] <- 0

data <- awb

colnames(awb)<-c("Depth","Dev","Az")

初始化数据

awb1 <- init_data(awb)

井斜计算

abcd <- trajcal(awb1)

利用已有的井斜数据,内插值(斜深)计算

xrf <- read.csv("日报表.csv") xrf_data <- trajint(awb1,xrf)

输入垂深,返回该点的斜深

tvd2depth <- trajint_tvd(awb1,3500)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注