实现K值随深度衰减

做水文地质数值模拟的时候,渗透系数是必不可少的参数,当模型模拟范围达到区域尺度,同时考虑地下水深循环时,深部的岩层在上覆地层的作用力下被压实,地层渗透率会降低,渗透率随深度的增加呈指数式下降,这是渗透率的深度衰减作用。MODFLOW没有描述相应变化的程序包,因此我们将渗透系数从h5文件中提取出来在外部处理,再重新输入回模型。

参考2014年Kuang和Jiao的研究结果,用函数描述渗透系数随深度的变化规律:

def K_decay(Ks,z): 
  
    z=z*0.001# z单位是m,将其转化为km
    rho=0.997074 # 密度 g/cm3
    mu=0.0000011413 # 运动粘度(15℃) 相当于 动力粘度 1.1404e-3 Pa·s
    g=9.8 # 重力加速度 m/s2
    beta=0.25 # 渗透率衰减系数
    kr=10**(-25.4) # 衰减残余渗透率 log(kr)=-25.4
    
    convt=1/24.0/3600.0*mu/g/rho # m/d -> m/s; K=k*rho*g/mu
    ks=Ks*convt
    k=kr*(ks/kr)**((1+z)**(-beta))
    K=k/convt
    return K
    

上述函数实现深度为z处对应K的计算,传入地表渗透系数K和地层深度z,返回该处的渗透系数。接下来要从h5文件中获取 地表的 K 和 z 列表数据,传入上述函数计算。

采用下面代码获取K和z数据,需要项目名称,模型层数。

def read_K_ele(filename_src,NLAY): # MODFLOW项目名称,模型层数
    with h5py.File(filename_src,'r') as f:
        top=np.array(f['Arrays/top1']) # 地表高程
        
        HK1=np.array(f['Arrays/HK1']) # 地表渗透系数,在这里我用的是地层代码,如果HK1是渗透系数,可忽略下面6行代码
        LyrT=np.array(f['Arrays/bot1']) # 当层的顶板高程
        df=pd.DataFrame(HK1,columns=['HK1'])
        K_code=pd.read_table("K_code.csv",sep=',') # 获取地层代码对应的渗透系数
        df=pd.merge(df,K_code,on='HK1') # 在数据表中加入渗透系数,相当于arcgis的join功能
		HK1=df.K.values

        HK=[[0]*len(HK1)]*NLAY # 初始化渗透系数储存数组
        HK[0]=HK1
        
        for k in range(2,NLAY+1):
            
            LyrB=np.array(f['Arrays/bot%i'%k]) # 当层的地板高程
            LyrC=(LyrB+LyrT)*0.5 # 含水层中部高程
            LyrT=LyrB
            z=top-LyrC
            HK[k-1]=K_decay(HK1,z)

    return HK

最后,写入h5副本

def main():
   
    filename='这里替换成文件名' # 文件名
    filename_src=filename+'.h5'
    filename_dst='OP_'+filename_src

    #获取grid属性
    # NLAY NROW NCOL NPER TIMEUNITS LENUNITS
    with open(filename+'.dis','r')as f:
        temp=f.readlines()
        dis_name=temp[3][2:-1].split(' ')
        dis=temp[4][:-1].split(' ')
        dis=list(map(int,dis))
        grid=dict(zip(dis_name,dis))
    print(grid)
    print(grid['NCOL']*grid['NROW']*grid['NLAY'])

    #获取h5文件信息
    with h5py.File(filename_src,'r') as f:
        riv=np.array(f['River/07. Property'])
        rivid=np.array(f['River/02. Cell IDs'])
        top=np.array(f['Arrays/top1'])
        rch=np.array(f['Recharge/07. Property'])
        rch_multi=np.array(f['Recharge/08. Property Multiplier'])
        SpecH=np.array(f['Specified Head/07. Property'])
        SpecHid=np.array(f['Specified Head/02. Cell IDs'])
        ET=np.array(f['ET/07. Property'])
    #改变参数 
    
    HK=read_K_ele(filename_src, 0.25,grid['NLAY'])
    print(HK)
    
    #创建h5文件副本,并写入相关参数    
    shutil.copy(filename_src,filename_dst)
    f=h5py.File(filename_dst,'a')
    
    #写入K
    for k in range(grid['NLAY']):
        del f['Arrays/HK%i'%(k+1)]
        f.create_dataset('Arrays/HK%i'%(k+1),data=HK[k])

    f.close()
    
main()

以上函数是后者调用前者的关系,执行的时候需要在代码相同目录下放入Projectname.h5ProjectName.dis两个文件,执行后产生OP_ProjectName.h5文件,可替换原来MODFLOW的h5文件。

参考文献

Kuang, X., Jiao, J.J., 2014. An Integrated Permeability-Depth Model for Earth’s Crust: Permeability of Earth’s Crust. Geophys. Res. Lett. 41, 7539–7545. https://doi.org/10.1002/2014GL061999

你可能感兴趣的:(python)