重磁异常空间域正演.docx

上传人:b****5 文档编号:29301571 上传时间:2023-07-22 格式:DOCX 页数:17 大小:18.19KB
下载 相关 举报
重磁异常空间域正演.docx_第1页
第1页 / 共17页
重磁异常空间域正演.docx_第2页
第2页 / 共17页
重磁异常空间域正演.docx_第3页
第3页 / 共17页
重磁异常空间域正演.docx_第4页
第4页 / 共17页
重磁异常空间域正演.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

重磁异常空间域正演.docx

《重磁异常空间域正演.docx》由会员分享,可在线阅读,更多相关《重磁异常空间域正演.docx(17页珍藏版)》请在冰豆网上搜索。

重磁异常空间域正演.docx

重磁异常空间域正演

!

对给定的密度体和磁性体计算起伏观测面以及平面上的重力异常、磁力异常以及化极磁力异常。

PROGRAMComplex_body_forward

IMPLICITNONE

CHARACTER*80cmdfile,sourcefile,stationfile,output_grafile,

&output_magfile,output_polfile

INTEGERcomponent,order,plane!

场的分量标识,导数的阶数,观测面的形态标识

INTEGERn_source,n_station,i,j,mpoint,line,cs,cxyz

REALxmin,xmax,ymin,ymax

REAL,ALLOCATABLE:

:

SOURCE(:

:

),XYZ(:

:

REAL,ALLOCATABLE:

:

ANOM_GRA(:

),ANOM_MAG(:

),ANOM_POL(:

cmdfile='cmd.dat'

cs=11

cxyz=3

CALLINPUT_CMDFILE(component,order,plane,cmdfile,sourcefile,

&stationfile,output_grafile,output_magfile,output_polfile)

CALLCHECK_CMD(component,order,plane,stationfile)

CALLGET_NUMBER_SOURCE(sourcefile,n_source)

ALLOCATE(SOURCE(1:

n_source,1:

cs))

CALLINPUT_SOURCE(sourcefile,SOURCE,n_source,cs)

CALLGET_n_station(stationfile,plane,xmin,xmax,ymin,ymax,

&mpoint,line,n_station)

ALLOCATE(XYZ(1:

n_station,1:

cxyz))

CALLINPUT_STATION(stationfile,plane,xmin,xmax,ymin,ymax,

&mpoint,line,XYZ,n_station)

ALLOCATE(ANOM_GRA(1:

n_station),ANOM_MAG(1:

n_station))

ALLOCATE(ANOM_POL(1:

n_station))

CALLCAL_ANOM(SOURCE,n_source,cs,XYZ,n_station,cxyz,

&ANOM_GRA,ANOM_MAG,ANOM_POL,component)

CALLOUTPUT(plane,XYZ,ANOM_GRA,ANOM_MAG,ANOM_POL,n_station,xmin

&,xmax,ymin,ymax,mpoint,line,output_grafile,output_magfile

&,output_polfile)

ENDPROGRAM

!

读取场的分量标识、导数的阶数、观测面的形态标识

!

读取场源参数文件名、测点文件名、输出文件名

SUBROUTINEINPUT_CMDFILE(component,order,plane,cmdfile,sourcefile,

&stationfile,output_grafile,output_magfile,output_polfile)

IMPLICITNONE

INTEGERcomponent,order,plane

CHARACTER*80cmdfile,sourcefile,stationfile,output_grafile,

&output_magfile,output_polfile

OPEN(12,FILE=cmdfile,ACTION='READ')

READ(12,*)output_polfile

READ(12,*)output_polfile

READ(12,*)output_polfile

READ(12,*)component

READ(12,*)output_polfile

READ(12,*)order

READ(12,*)output_polfile

READ(12,*)output_polfile

READ(12,*)output_polfile

READ(12,*)output_polfile

READ(12,*)output_polfile

READ(12,*)plane

READ(12,*)output_polfile

READ(12,*)sourcefile

READ(12,*)output_polfile

READ(12,*)stationfile

READ(12,*)output_polfile

READ(12,*)output_grafile

READ(12,*)output_polfile

READ(12,*)output_magfile

READ(12,*)output_polfile

CLOSE(12)

ENDSUBROUTINE

!

检查输入参数是否正确

SUBROUTINECHECK_CMD(component,order,plane,stationfile)

IMPLICITNONE

EXTERNALUPPER

INTEGERcomponent,order,plane,cc

CHARACTER*80stationfile,UPPER

CHARACTERsign

PRINT*,'请确认以下信息是否正确:

'

SELECTCASE(component)

CASE

(1)

PRINT*,'1计算重力或磁力异常'

CASE

(2)

PRINT*,'1计算重力或磁力异常的导数'

CASEDEFAULT

PRINT*,'错误:

场分量类型不合法,请修改参数文件!

'

STOP

ENDSELECT

IF(component==2.AND.order<0)THEN

PRINT*,'错误:

导数阶次不合法,请修改参数文件!

'

STOP

ENDIF

SELECTCASE(plane)

CASE

(1)

PRINT*,'2平面规则网'

CASE

(2)

PRINT*,'2平面非规则网'

CASE(3)

PRINT*,'2曲面规则网'

CASE(4)

PRINT*,'2曲面非规则网'

CASEDEFAULT

PRINT*,'错误:

测网类型不合法,请修改参数文件!

'

STOP

ENDSELECT

cc=LEN_TRIM(stationfile)

IF((plane==1.OR.plane==3).AND.

&(UPPER(stationfile(cc-3:

cc)).ne.'.GRD'))THEN

PRINT*,'错误:

测点文件类型不合法,请修改参数文件!

'

STOP

ENDIF

IF((plane==2.OR.plane==4).AND.

&(UPPER(stationfile(cc-3:

cc)).ne.'.TXT'))THEN

PRINT*,'错误:

测点文件类型不合法,请修改参数文件!

'

STOP

ENDIF

PRINT*,'以上内容是否正确?

(Y/N)'

READ*,sign

IF(UPPER(sign)=='N')THEN

PRINT*,'请重新修改参数文件!

'

STOP

ENDIF

ENDSUBROUTINE

!

字符的小写转大写

FUNCTIONUPPER(string)

IMPLICITNONE

CHARACTER*(*)string,UPPER

INTEGERl,i,ASC

l=LEN(string)

DOi=1,l

ASC=ICHAR(string(i:

i))

IF(ASC>=97.AND.ASC<=122)THEN

ASC=ASC-32

string(i:

i)=CHAR(ASC)

ENDIF

ENDDO

UPPER=string

RETURN

ENDFUNCTION

!

读取场源的个数

SUBROUTINEGET_NUMBER_SOURCE(filename,n)

IMPLICITNONE

INTEGERn

CHARACTER*80filename

CHARACTER*20aa

OPEN(101,file=filename,action='read')

n=0

DO

READ(101,*,END=100,ERR=100)aa

n=n+1

ENDDO

100CLOSE(101)

ENDSUBROUTINE

!

读取场源参数

SUBROUTINEINPUT_SOURCE(sourcefile,SOURCE,m,n)

IMPLICITNONE

INTEGERm,n,i,j

REALax,ay,incline

CHARACTER*80sourcefile

REALSOURCE(1:

m,1:

n)

OPEN(12,FILE=sourcefile,ACTION='READ')

READ(12,*)((SOURCE(i,j),j=1,n),i=1,m)

CLOSE(12)

DOi=1,m

ax=SOURCE(i,4);ay=SOURCE(i,5);incline=SOURCE(i,3)

IF((ax+ay)==90..OR.(ax+ay)==270..OR.ABS(ax-ay)==90.)THEN

ELSE

PRINT*,'错误:

磁化方向参数不正确!

请修改场源参数文件!

'

PRINT*,'出错行:

',i

STOP

ENDIF

IF(incline<-90.OR.incline>90)THEN

PRINT*,'错误:

磁倾角参数不正确!

请修改场源参数文件!

'

PRINT*,'出错行:

',i

STOP

ENDIF

ENDDO

ENDSUBROUTINE

!

读取测量点的个数

SUBROUTINEGET_n_station(stationfile,plane,xmin,xmax,ymin,ymax,

&mpoint,line,n_station)

IMPLICITNONE

INTEGERplane,mpoint,line,n_station

REALxmin,xmax,ymin,ymax

CHARACTER*80stationfile

IF(plane==1.OR.plane==3)THEN

CALLGET_GRID(stationfile,mpoint,line,xmin,xmax,ymin,ymax)

n_station=mpoint*line

ELSE

mpoint=0;line=0;xmin=0;xmax=0;ymin=0;ymax=0

CALLGET_NUMBER_SOURCE(stationfile,n_station)

ENDIF

ENDSUBROUTINE

!

读取规则网测网网格参数

SUBROUTINEGET_GRID(inputfile,mpoint,line,xmin,xmax,ymin,ymax)

IMPLICITNONE

CHARACTER*80inputfile

INTEGERmpoint,line

REALxmin,xmax,ymin,ymax

OPEN(101,FILE=inputfile,ACTION='READ')

READ(101,*)

READ(101,*)mpoint,line,xmin,xmax,ymin,ymax

CLOSE(101)

ENDSUBROUTINE

!

读取测点坐标

SUBROUTINEINPUT_STATION(stationfile,plane,xmin,xmax,ymin,ymax,

&mpoint,line,XYZ,n_station)

IMPLICITNONE

REALxmin,xmax,ymin,ymax,dx,dy,temp

INTEGERplane,mpoint,line,n_station

REALXYZ(1:

n_station,1:

3)

CHARACTER*80stationfile

REALi,j

OPEN(12,FILE=stationfile,ACTION='READ')

IF(plane==1.OR.plane==3)THEN

DOi=1,5,1

READ(12,*)

ENDDO

dx=(xmax-xmin)/(mpoint-1)

dy=(ymax-ymin)/(line-1)

DOj=1,line

DOi=1,mpoint

XYZ((j-1)*mpoint+i,1)=(i-1)*dx+xmin

XYZ((j-1)*mpoint+i,2)=(j-1)*dy+ymin

ENDDO

ENDDO

IF(plane==1)THEN

READ(12,*)XYZ(1,3)

XYZ(:

3)=XYZ(1,3)

ELSE

READ(12,*)XYZ(:

3)

ENDIF

ELSEIF(plane==2.OR.plane==4)THEN

IF(plane==2)THEN

READ(12,*)XYZ(1,:

XYZ(:

3)=XYZ(1,3)

DOi=2,n_station

READ(12,*)XYZ(i,1),XYZ(i,2)

ENDDO

ELSE

DOi=1,n_station

READ(12,*)XYZ(i,:

ENDDO

ENDIF

ELSE

PRINT*,'测网类型不合法!

'

ENDIF

ENDSUBROUTINE

!

计算各测点的异常值

SUBROUTINECAL_ANOM(SOURCE,n_source,cs,XYZ,n_station,cxyz,

&ANOM_GRA,ANOM_MAG,ANOM_POL,component)

IMPLICITNONE

EXTERNALDg,ElementDg,DT

REALDg,ElementDg,dg0,DT,dt0

INTEGERn_source,cs,n_station,cxyz,i,j,component

REALSOURCE(1:

n_source,1:

cs),XYZ(1:

n_station,1:

cxyz)

REALANOM_GRA(1:

n_station),ANOM_MAG(1:

n_station)

REALANOM_POL(1:

n_station)

ANOM_GRA=0.;ANOM_MAG=0.;ANOM_POL=0.

IF(component==1)THEN

DOi=1,n_station,1

DOj=1,n_source

dg0=Dg(XYZ(i,1)*1E6,XYZ(i,2)*1E6,XYZ(i,3)*1E6,SOURCE(j,6:

7)*1E6

&,SOURCE(j,8:

9)*1E6,SOURCE(j,10:

11)*1E6,SOURCE(j,1),

&ElementDg)

ANOM_GRA(i)=ANOM_GRA(i)+dg0

dt0=DT(XYZ(i,1)*1E6,XYZ(i,2)*1E6,XYZ(i,3)*1E6,SOURCE(j,6:

7)*1E6

&,SOURCE(j,8:

9)*1E6,SOURCE(j,10:

11)*1E6,SOURCE(j,2)*1E-6,

&SOURCE(j,3),SOURCE(j,4),SOURCE(j,5))

ANOM_MAG(i)=ANOM_MAG(i)+dt0

dt0=DT(XYZ(i,1)*1E6,XYZ(i,2)*1E6,XYZ(i,3)*1E6,SOURCE(j,6:

7)*1E6

&,SOURCE(j,8:

9)*1E6,SOURCE(j,10:

11)*1E6,SOURCE(j,2)*1E-6,

&90.,SOURCE(j,4),SOURCE(j,5))

ANOM_POL(i)=ANOM_POL(i)+dt0

ENDDO

ENDDO

ELSEIF(component==2)THEN

PRINT*,'重磁异常导数计算程序正在开发中...'

PRINT*,'$目前暂不支持此项功能$'

STOP

ENDIF

ENDSUBROUTINE

!

*******计算某源点在计算点引起的重力异常程序集开始*************

FUNCTIONDg(X,Y,Z,X_Source,Y_Source,Z_Source,Density,ElementDg)

IMPLICITNONE

REALX,Y,Z,X_Source(1:

2),Y_Source(1:

2),Z_Source(1:

2),

&Density,ElementDg

REALDg,ELMT

INTEGERI,J,K,SIGN

Dg=0

ELMT=0

DOI=1,2

DOJ=1,2

DOK=1,2

SIGN=(-1)**(I+J+K)

ELMT=ElementDg(X,Y,Z,X_Source(I),

&Y_Source(J),Z_Source(K),Density)

Dg=Dg+ELMT*SIGN

ENDDO

ENDDO

ENDDO

ENDFUNCTION

!

计算积分表达式中的某一分量

FUNCTIONElementDg(X,Y,Z,X_Source,Y_Source,Z_Source,Density)

IMPLICITNONE

REALG

PARAMETER(G=6.672E-8)

REALElementDg,X,Y,Z,X_Source,Y_Source,Z_Source,Density,R,T1,T2,T3

R=SQRT((X_Source-X)**2+(Y_Source-Y)**2+(Z_Source-Z)**2)

T1=(X_Source-X)*LOG((Y_Source-Y)+R)

T2=(Y_Source-Y)*LOG((X_Source-X)+R)

T3=(Z_Source-Z)*ATAN((X_Source-X)*(Y_Source-Y)/((Z_Source-Z)*R))

ElementDg=-G*Density*(T1+T2-T3)

ENDFUNCTION

!

*******计算某源点在计算点引起的重力异常程序集结束*************

!

*******计算某源点在计算点引起的重力异常程序集开始*************

FUNCTIONDT(x,y,z,X_Source,Y_Source,Z_Source,moment,incline,ax,ay)

IMPLICITNONE

REALx,y,z,moment,incline,ax,ay,DT

REALX_Source(1:

2),Y_Source(1:

2),Z_Source(1:

2)

INTEGERi,j,k,sign

REALhax,hay,za,mx,my,mz,pi,r,xs,ys,zs

pi=3.14159265358

mx=moment*COSD(incline)*COSD(ax)

my=moment*COSD(incline)*COSD(ay)

mz=moment*SIND(incline)

hax=0.;hay=0.;za=0.

DOi=1,2,1

DOj=1,2,1

DOk=1,2,1

sign=(-1)**(i+j+k)

xs=X_Source(i);ys=Y_Source(j);zs=Z_Source(k)

r=SQRT((x-xs)**2+(y-ys)**2+(z-zs)**2)

hax=hax+sign*(-mx*ATAN((xs-x)*(ys-y)/((xs-x)**2+r*(zs-z)+

&(zs-z)**2))+my*LOG(r+zs-z)+mz*LOG(r+ys-y))

hay=hay+sign*(mx*LOG(r+zs-z)-my*ATAN((xs-x)*(ys-y)/(

&(ys-y)**2+r*(zs-z)+(zs-z)**2))+mz*LOG(r+xs-x))

za=za+sign*(mx*LOG(r+ys-y)+my*LOG(r+xs-x)-mz*

&ATAN((xs-x)*(ys-y)/r/(zs-z)))

ENDDO

ENDDO

ENDDO

DT=hax*COSD(incline)*COSD(ax)+hay*COSD(incline)*COSD(ay)+

&za*SIND(incline)

DT=DT/4/pi

ENDFUNCTION

!

*******计算某源点在计算点引起的重力异常程序集结束*************

!

输出重磁异常到外部文件中

SUBROUTINEOUTPUT(plane,XYZ,ANOM_GRA,ANOM_MAG,ANOM_POL,n_station

&,xmin,xmax,ymin,ymax,mpoint,line,output_grafile,output_magfile

&,output_polfile)

INTEGERplane,n_station,mpoint,line,i,j

REALANOM_GRA(1:

n_station),ANOM_MAG(1:

n_station)

REALANOM_POL(1:

n_station),XYZ(1:

n_station,1:

3)

REALxmin,xmax,ymin,ymax,gzmin,gzmax,mzmin,mzmax,pzmin,pzmax

REALeigv

CHARACTER*80output_grafile,output_magfile,output_polfile

eigv=1.7014100091878E+038

OPEN(12,FILE=output_grafile,ACTION='WRITE')

OPEN(13,FILE=output_magfile,ACTION='WRITE')

OPEN(14,FILE=output_polfile,ACTION='WRITE')

IF(plane==1.OR.plane==3)THEN

gzmin=eigv;gzmax=-eigv;mzmin=eigv

mzmax=-eigv;pzmin=eigv;pzmax=-eigv

DOi=1,n_station,1

IF(ANOM_G

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1